Files
wcs/WCS.WebApi/Controllers/PDAProductionLineCallOutController.cs
hehaibing-1996 43b34b7980 1.优化库位冲突问题
2.优化PDA文字提示
2025-03-25 14:54:58 +08:00

448 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using System;
using WCS.BLL.DbModels;
using WCS.BLL.Manager;
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.LocationInfo;
using WCS.Model.ApiModel.MatBaseInfo;
using WCS.Model.ApiModel.MatDetailCurrentInfo;
using WCS.Model.ApiModel.MatDetailHistoryInfo;
using WCS.Model.ApiModel.PDAProductionLineCallIn;
using WCS.Model.ApiModel.PDAProductionLineCallOut;
using WCS.Model.ApiModel.PDAShelfLocationBindUnbind;
using WCS.Model.ApiModel.Stocktaking;
using WCS.Model.ApiModel.StoreInfo;
namespace WCS.WebApi.Controllers
{
/// <summary>
/// PDA产线呼叫功能
/// </summary>
[ApiController]
[Route("[controller]")]
public class PDAProductionLineCallOutController : ControllerBase
{
public PDAProductionLineCallOutController(IStockTakingService stockTakingService)
{
}
/// <summary>
/// 获取当前货架、当前货架的工位、当前工位可以作为起点可以到的目标区域
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("getShelfInfoForCallOut")]
[HttpPost(Name = "getShelfInfoForCallOut")]
public async Task<ResponseCommon> getShelfInfoForCallOut(GetShelfInfoForCallOutRequest request)
{
try
{
//校验参数
if (string.IsNullOrEmpty(request.ShelfCode))
{
return new ResponseCommon()
{
Code = 201,
Message = "参数错误,请重新扫描货架码!",
Data = null,
};
}
//通过货架编码获取货架
var shelfInfo = await DbHelp.db.Queryable<ShelfInfo>()
.Where(t => t.ShelfCode == request.ShelfCode)
.Where(t => t.IsEnable)
.FirstAsync();
if (shelfInfo == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"货架{request.ShelfCode}不存在或已被禁用!",
Data = null,
};
}
//货架不处于静止状态
if (shelfInfo.TransStatus == TransStatusEnum.)
{
return new ResponseCommon()
{
Code = 201,
Message = $"货架{request.ShelfCode}处于运输中!",
Data = null,
};
}
//货架未绑定位置信息
if (string.IsNullOrEmpty(shelfInfo.CurrentLocaiotnCode) || shelfInfo.CurrentLocationId == 0)
{
return new ResponseCommon()
{
Code = 201,
Message = $"货架{request.ShelfCode}未绑定位置信息!",
Data = null,
};
}
//位置校验
var locationInfo = await DbHelp.db.Queryable<LocationInfo>()
.Where(t => t.Id == shelfInfo.CurrentLocationId)
.Where(t => t.IsEnable)
.FirstAsync();
if (locationInfo == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"工位{shelfInfo.CurrentLocaiotnCode}不存在或已被禁用!",
Data = null,
};
}
//获取工位作为起点 可以放置的目标区域
var locationAreas = await DbHelp.db.Queryable<LocationAreaInfo>()
.WhereIF(locationInfo.AllowDestinationLocationArea != null && locationInfo.AllowDestinationLocationArea.Count > 0, t => locationInfo.AllowDestinationLocationArea.Contains(t.Id))
.Select(t => new LocationAreaInfoModel()
{
Id = t.Id,
LocationAreaName = t.LocationAreaName,
})
.ToListAsync();
locationAreas = locationAreas.Append(new LocationAreaInfoModel() { Id = 0, LocationAreaName = "请选择" })
.OrderBy(t => t.Id).ToList();
return new ResponseCommon()
{
Code = 200,
Message = "success",
Data = new GetShelfInfoForCallOutResponseData()
{
ShelfId = shelfInfo.Id,
ShelfCode = shelfInfo.ShelfCode,
LocationId = locationInfo.Id,
LocationCode = locationInfo.LocationCode,
LocationAreas = locationAreas
}
};
}
catch (Exception ex)
{
return new ResponseCommon()
{
Code = 201,
Message = ex.Message,
Data = null,
};
}
}
/// <summary>
/// 货架送回修改数量
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("updateMatDetailCurrentInfoForCallOut")]
[HttpPost(Name = "updateMatDetailCurrentInfoForCallOut")]
public async Task<ResponseCommon<object>> updateMatDetailCurrentInfoForCallOut(UpdateMatDetailCurrentInForCallOutRequest request)
{
try
{
var matDetailCurrentInfo = await DbHelp.db.Queryable<MatDetailCurrentInfo>() //.Where(t => t.MatDetailCurrentCode == request.MatDetailCurrentInfo.MatDetailCurrentCode)
.Where(t => t.Id == request.MatDetailCurrentInfoId)
.FirstAsync();
if (matDetailCurrentInfo == null)
{
return new ResponseCommon<Object>
{
Code = 205,
Message = $"更新库存信息失败:此条数据不存在,请确认!",
Data = null
};
}
DbHelp.db.BeginTran();
//新增数据修改记录表
var historyInfo = new MatDetailHistoryInfo()
{
ShlefId = matDetailCurrentInfo.ShelfId,
ShelfType = matDetailCurrentInfo.ShelfType,
ShelfCode = matDetailCurrentInfo.ShelfCode,
MatCode = matDetailCurrentInfo.MatCode,
MatName = matDetailCurrentInfo.MatName,
MatBatch = matDetailCurrentInfo.MatBatch,
MatSpec = matDetailCurrentInfo.MatSpec,
MatCustomer = matDetailCurrentInfo?.MatCustomer,
MatSupplier = matDetailCurrentInfo?.MatSupplier,
BeforeQty = matDetailCurrentInfo.MatQty,
AfterQty = request.MatQty,
ModifyTime = DateTime.Now,
ModifyUser = request.UserName,
RecordType = RecordTypeEnum.,
FunctionType = FunctionTypeEnum.PDA货架送回,
};
await DbHelp.db.Insertable(historyInfo).ExecuteCommandAsync();
//更新货架存量数据
matDetailCurrentInfo.MatQty = request.MatQty;
matDetailCurrentInfo.ModifyUser = request.UserName;
matDetailCurrentInfo.ModifyTime = DateTime.Now;
var rowNum = await DbHelp.db.Updateable(matDetailCurrentInfo).ExecuteCommandAsync();
if (rowNum == 0)
{
DbHelp.db.RollbackTran();
return new ResponseCommon<Object>
{
Code = 201,
Message = $"更新货架存量信息失败:请重试!",
Data = null
};
}
else
{
DbHelp.db.CommitTran();
DataProcessManager.UpdateShelfStatus();
return new ResponseCommon<Object>
{
Code = 200,
Message = $"更新货架存量信息成功!",
Data = null
};
}
}
catch (Exception ex)
{
DbHelp.db.RollbackTran();
var response = new ResponseCommon<Object>
{
Code = 300,
Message = $"操作失败:{ex.Message}",
Data = null
};
return response;
}
}
/// <summary>
/// 货架送回 通过 货架ID 目标区域 是否为空货架等参数 将货架送回
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("callOut")]
[HttpPost(Name = "callOut")]
public async Task<ResponseCommon> callOut(CallOutRequest request)
{
try
{
#region
if (request.LocationId == 0)
{
return new ResponseCommon()
{
Code = 201,
Message = $"送回失败:请重新扫描货架码!",
Data = null,
};
}
//获取当前工位-起点工位
var startLocation = await DbHelp.db.Queryable<LocationInfo>()
.Where(t => t.Id == request.LocationId)
.FirstAsync();
if (startLocation == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"当前工位{request.LocationCode}不存在!",
Data = null,
};
}
if (startLocation.IsEnable == false)
{
return new ResponseCommon()
{
Code = 201,
Message = $"当前工位{startLocation.LocationCode}已被禁用!",
Data = null,
};
}
#endregion
#region
var shelfInfo = await DbHelp.db.Queryable<ShelfInfo>()
.Where(t => t.Id == request.ShelfId)
.Where(t => t.IsEnable)
.FirstAsync();
if (shelfInfo == null)
{
return new ResponseCommon()
{
Code = 301,
Message = $"当前货架{request.ShelfCode}不存在或已被禁用!",
Data = null,
};
}
if (shelfInfo.TransStatus == TransStatusEnum.)
{
return new ResponseCommon()
{
Code = 201,
Message = $"当前货架{shelfInfo.ShelfCode}已有任务在运输中!",
Data = null,
};
}
if (shelfInfo.CurrentLocationId != startLocation.Id)
{
return new ResponseCommon()
{
Code = 201,
Message = $"当前货架{shelfInfo.ShelfCode}已不在工位{startLocation.LocationCode}上!",
Data = null,
};
}
#endregion
#region
if (request.ShelfTypeStr == "空货架" || request.ShelfTypeStr == "empty")
{
var matCurrentInfos = await DbHelp.db.Queryable<MatDetailCurrentInfo>()
.Where(t => t.ShelfId == shelfInfo.Id)
.ToListAsync();
//库存更新记录
//执行删除
try
{
DbHelp.db.BeginTran();
//新增数据删除记录
foreach (var matDetailCurrentInfo in matCurrentInfos)
{
var historyInfo = new MatDetailHistoryInfo()
{
ShlefId = matDetailCurrentInfo.ShelfId,
ShelfType = matDetailCurrentInfo.ShelfType,
ShelfCode = matDetailCurrentInfo.ShelfCode,
MatCode = matDetailCurrentInfo.MatCode,
MatName = matDetailCurrentInfo.MatName,
MatBatch = matDetailCurrentInfo.MatBatch,
MatSpec = matDetailCurrentInfo.MatSpec,
MatCustomer = matDetailCurrentInfo?.MatCustomer,
MatSupplier = matDetailCurrentInfo?.MatSupplier,
BeforeQty = matDetailCurrentInfo.MatQty,
AfterQty = 0,//删除数据 为0
ModifyTime = DateTime.Now,
ModifyUser = request.UserName,
RecordType = RecordTypeEnum.,
FunctionType = FunctionTypeEnum.PDA货架送回,
};
await DbHelp.db.Insertable(historyInfo).ExecuteCommandAsync();
}
DbHelp.db.Deleteable(matCurrentInfos).ExecuteCommand();
DbHelp.db.CommitTran();
DataProcessManager.UpdateShelfStatus();
}
catch (Exception ex)
{
DbHelp.db.RollbackTran();
return new ResponseCommon
{
Code = 300,
Message = $"操作失败:{ex.Message}",
Data = null
};
}
}
//如果不是非空货架 那么就清除数量为0的库存
else
{
var matCurrentInfos = await DbHelp.db.Queryable<MatDetailCurrentInfo>()
.Where(t => t.ShelfId == shelfInfo.Id)
.Where(t => t.MatQty == 0)
.ToListAsync();
//库存更新记录
//全部删除 删除数量为0的
DbHelp.db.Deleteable(matCurrentInfos).ExecuteCommand();
DataProcessManager.UpdateShelfStatus();
}
#endregion
//根据选择的区域信息获取终点
var endLocation = await DbHelp.db.Queryable<LocationInfo>()
.LeftJoin<ShelfInfo>((li, si) => (li.Id == si.CurrentLocationId) || (li.Id == si.DestinationLocationId && si.TransStatus == TransStatusEnum.))
.Where((li, si) => li.LocationAreaId == request.DestinationLocationAreaId)
.Where((li, si) => li.IsEnable == true)
.Where((li, si) => li.Id != shelfInfo.CurrentLocationId)
.Where((li, si) => si.Id == null)
.Select((li, si) => li)
.FirstAsync();
if (endLocation == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"目标库区[{request.DestinationLocationAreaName}]不存在空闲位置!",
Data = null,
};
}
#region AGV接口
//TO DO 调用AGV接口开始呼叫 呼叫成功更新运输状态和目标库位
var response = AGVManager.GenAgvSchedulingTask(startLocation, endLocation, shelfInfo.ShelfCode, request.UserName);
if (response.code == "0" && response.message == "成功")
{
//更新货架位置信息
shelfInfo.TransStatus = TransStatusEnum.;
shelfInfo.CurrentTaskCode = response.data;
shelfInfo.DestinationLocationId = endLocation.Id;
shelfInfo.DestinationLocaiotnCode = endLocation.LocationCode;
DbHelp.db.Updateable(shelfInfo).ExecuteCommand();
return new ResponseCommon()
{
Code = 200,
Message = "success",
Data = null,
};
}
else if (response.code == "-999")
{
return new ResponseCommon()
{
Code = 201,
Message = $"{response.message}\r\n请重试或等待上一个任务完成",
Data = null,
};
}
else
{
return new ResponseCommon()
{
Code = 201,
Message = $"海康RCS返回{response.message}",
Data = null,
};
}
#endregion
}
catch (Exception ex)
{
return new ResponseCommon()
{
Code = 201,
Message = ex.Message,
Data = null,
};
}
}
}
}