You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

460 lines
21 KiB
C#

using AUCMA.STORE.Business.Interface;
using AUCMA.STORE.Common;
using AUCMA.STORE.Entity.DAO;
using AUCMA.STORE.Entity.DTO;
using AUCMA.STORE.Entity.Enums;
using AUCMA.STORE.SqlSugar;
using AUCMA.STORE.SqlSugar.serviceImpl;
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace AUCMA.STORE.Business.Implements
{
/// <summary>
/// 入库业务逻辑
/// </summary>
public class InStoreBusinessImpl : IInStoreBusiness
{
public delegate void InStoreTaskRefresh(List<RecordTask> instoretasklist);
public static event InStoreTaskRefresh InStoreTaskRefreshEvent;
/// <summary>
/// 保存物料信息
/// </summary>
/// <param name="baseMaterialDTO"></param>
/// <returns></returns>
public async Task<int> SaveMaterialInfo(BaseMaterialDTO baseMaterialDTO)
{
try
{
BaseMaterialInfo materialInfo = new BaseMaterialInfo();
materialInfo.objid = System.Guid.NewGuid().ToString();
materialInfo.materialCode = baseMaterialDTO.materialCode;
materialInfo.materialName = baseMaterialDTO.materialName;
materialInfo.materialType = baseMaterialDTO.materialType;
materialInfo.deleteFlag = DeleteFlag.No;
materialInfo.recordTime = DateTime.Now;
return await new BaseServices<BaseMaterialInfo>().Add(materialInfo);
}catch(Exception ex)
{
LogHelper.Error("保存手持上传的物料信息异常", ex);
return 0;
}
}
/// <summary>
/// 判断有无空库位
/// </summary>
/// <param name="baseMaterialInfo"></param>
/// <returns></returns>
public async Task<List<BaseLocationInfo>> IsOrNotEmptyLocation(BaseMaterialDTO baseMaterialDTO)
{
List<BaseLocationInfo> locations = new List<BaseLocationInfo>();
List<BaseLocationInfo> locationInfo = new List<BaseLocationInfo>();
try
{
//取所有空库
Expression<Func<BaseLocationInfo, bool>> exp = s1 => true;
exp = exp.And(s1 => s1.locationArea == baseMaterialDTO.InStoreArea && s1.locationStatus == LocationStatus.UnUsed && s1.storeCode == ConfigHelper.GetConfig("storeCode"));
locations = await new BaseServices<BaseLocationInfo>().Query(exp);
LogHelper.record("筛选入库库位:" + JsonChange.ModeToJson(locations));
if (locations.Count() > 0)
{
//取同类型物料的空库
locationInfo = locations.Where(x => x.materialType == baseMaterialDTO.materialCode).ToList();
if (locationInfo.Count() > 0)
{
return locationInfo;
}
else
{
//同种类型库位已满,求各类别空库数量,取剩余空库数量最多的库位
try
{
LogHelper.record("同种类型库位已满,求各类别空库数量,取剩余空库数量最多的库位");
return locations.GroupBy(x => x.materialType).ToList().OrderByDescending(x => x.Key).FirstOrDefault().ToList();
}
catch (Exception e)
{
LogHelper.record("同种类型库位已满:筛选别的库位异常"+e.Message);
LogHelper.Error("同种类型库位已满:筛选别的库位异常", e);
return locations;
}
}
}
else
{
LogHelper.record("查询所有库位,剩余库位数量:" + locations.Count());
return new List<BaseLocationInfo>();
}
}catch(Exception ex)
{
LogHelper.Error("入库筛选空库位异常:物料条码:"+ baseMaterialDTO.materialCode+"查询结果:"+JsonChange.ModeToJson(locations)+"筛选结果:"+JsonChange.ModeToJson(locationInfo), ex);
return new List<BaseLocationInfo>();
}
}
/// <summary>
/// 筛选最优库位
/// </summary>
/// <param name="baseLocationInfos"></param>
/// <param name="baseMaterialDTO"></param>
/// <returns></returns>
public BaseLocationInfo FiltrateLocation(List<BaseLocationInfo> baseLocationInfos)
{
BaseLocationInfo baseLocationInfo = baseLocationInfos.OrderByDescending(x => x.efficiency).FirstOrDefault();
return baseLocationInfo;
}
/// <summary>
/// 创建入库任务
/// </summary>
/// <param name="baseLocationInfos"></param>
/// <param name="baseMaterialDTO"></param>
/// <returns></returns>
public async Task<TaskDTO> CreateInStoreTask(BaseLocationInfo baseLocationInfo, BaseMaterialDTO baseMaterialDTO,OperationType operationType)
{
string taskCode = "";
TaskDTO task = new TaskDTO();
Expression<Func<RecordTask, bool>> exp = s1 => true;
string code = DateTime.Now.ToString("yyMMdd").Substring(1);
exp = exp.And(s1 => s1.taskCode.Contains(code));
List<RecordTask> recordTasks = await new BaseServices<RecordTask>().Query(exp);
if (recordTasks.Count() == 0)
{
taskCode = DateTime.Now.ToString("yyMMdd").Substring(1).Trim() + "0001";
//taskCode = taskCode.Substring(1, 9);
}
else
{
var info = recordTasks.OrderByDescending(x => x.recordTime).FirstOrDefault().taskCode.Substring(5).ToInt() + 1;
taskCode = DateTime.Now.ToString("yyMMdd").Substring(1).Trim() + info.ToString().PadLeft(4,'0');
//taskCode = taskCode.Substring(1, 9);
}
Expression<Func<RecordTask, bool>> taskexp = s1 => true;
taskexp = taskexp.And(s1 => s1.taskCode.Contains(taskCode));
List<RecordTask> recordTaskInfo = await new BaseServices<RecordTask>().Query(taskexp);
if (recordTaskInfo.Count() > 0)
{
Random random = new Random();
taskCode = random.Next(100000000, 999999999).ToString();
}
task.taskCode = taskCode;
task.locationCode = baseLocationInfo.locationCode;
task.locationArea = baseLocationInfo.locationArea;
task.row = baseLocationInfo.locationRow;
task.line = baseLocationInfo.locationLine;
task.tier = baseLocationInfo.locationTier;
task.taskType = TaskType.InStore;
task.storeCode = baseLocationInfo.storeCode;
task.materialCode = baseMaterialDTO.materialCode;
task.materialType = baseMaterialDTO.materialCode;
task.operationType = operationType;
task.taskStatus = Entity.Enums.TaskStatus.Await;
task.beginTime = DateTime.Now;
task.recordTime = DateTime.Now;
task.locationIndex = baseLocationInfo.objid;
//获取堆垛机编号
Expression<Func<BasePlcInfo, bool>> expression = s1 => true;
expression = expression.And(x => x.plcArea == baseLocationInfo.locationArea && x.storeCode == ConfigHelper.GetConfig("storeCode") && x.deleteFlag == DeleteFlag.No);
List<BasePlcInfo> basePlcInfos = await new BaseServices<BasePlcInfo>().Query(expression);
task.pilerCode = basePlcInfos.FirstOrDefault().plcCode.ToString();
//PLC指令
task.pilerTaskCode = Convert.ToInt32(task.taskCode.Substring(0, 9));
task.pilerTaskType = 1;
//task.pilerClaimGoodsRows = Convert.ToInt32(baseLocationInfo.locationArea);
if (baseLocationInfo.locationArea == LocationArea.Location_Left)
{
if (ConfigHelper.GetConfig("storeCode") == "A") task.pilerClaimGoodsRows = 1;
if (ConfigHelper.GetConfig("storeCode") == "B") task.pilerClaimGoodsRows = 2;
}
if (baseLocationInfo.locationArea == LocationArea.Location_Right)
{
if (ConfigHelper.GetConfig("storeCode") == "A") task.pilerClaimGoodsRows = 2;
if (ConfigHelper.GetConfig("storeCode") == "B") task.pilerClaimGoodsRows = 1;
}
task.plcCode = Convert.ToInt32(task.pilerCode);
task.pilerClaimGoodsLine = 1;
task.pilerClaimGoodsTier = 2;
task.pilerUnloadRows = baseLocationInfo.locationRow;
task.pilerUnloadLine = baseLocationInfo.locationLine;
task.pilerUnloadTier = baseLocationInfo.locationTier;
//创建入库任务
try
{
RecordTask recordTask = new RecordTask();
recordTask.objid = System.Guid.NewGuid().ToString();
recordTask.taskCode = task.taskCode;
recordTask.taskStatus = task.taskStatus;
recordTask.taskType = task.taskType;
recordTask.materialCode = task.materialCode;
recordTask.locationArea = task.locationArea;
recordTask.locationCode = task.locationCode;
recordTask.materialType = task.materialType;
recordTask.operationType = task.operationType;
recordTask.returnFlag = task.returnFlag;
recordTask.beginTime = task.beginTime;
recordTask.recordTime = DateTime.Now;
recordTask.storeCode = ConfigHelper.GetConfig("storeCode");
await new BaseServices<RecordTask>().Add(recordTask);
}catch(Exception ex)
{
LogHelper.Error("入库任务创建异常",ex);
}
return task;
}
/// <summary>
/// 创建待入库记录
/// </summary>
/// <param name="prepareInstoreInfo"></param>
/// <returns></returns>
public async Task<int> CreatePrepareInStore(TaskDTO taskDTO)
{
try
{
Mapper.Initialize(cret => cret.CreateMap<TaskDTO, PrepareInStoreInfo>());
PrepareInStoreInfo prepareInStoreInfo = Mapper.Map<PrepareInStoreInfo>(taskDTO);
prepareInStoreInfo.objid = System.Guid.NewGuid().ToString();
prepareInStoreInfo.intStoreStatus = InStoreStatus.Being;
prepareInStoreInfo.storeCode = ConfigHelper.GetConfig("storeCode");
return await new BaseServices<PrepareInStoreInfo>().Add(prepareInStoreInfo);
}catch(Exception ex)
{
throw;
}
}
/// <summary>
/// 查询库位状态
/// </summary>
/// <param name="locationArea"></param>
/// <param name="locationcode"></param>
/// <returns></returns>
public virtual async Task<bool> selectLocationStatus(string locationArea, string locationcode)
{
LocationArea m_locationArea;
bool iFlag = false;
if (locationArea == "1#库")
{
m_locationArea = LocationArea.Location_Left;
}
else
{
m_locationArea = LocationArea.Location_Right;
}
Expression<Func<BaseLocationInfo, bool>> exp = s1 => true;
exp = exp.And(x => x.locationArea == m_locationArea && x.locationCode == locationcode && x.storeCode == ConfigHelper.GetConfig("storeCode"));
BaseLocationInfo baseLocationInfo = await new BaseServices<BaseLocationInfo>().QuerySingle(exp);
if (baseLocationInfo.locationStatus == LocationStatus.Occupy)
{
iFlag = true;
}
else
{
iFlag = false;
}
return iFlag;
}
/// <summary>
/// 修改库位状态
/// </summary>
/// <param name="baseLocationInfo"></param>
/// <param name="locationStatus"></param>
/// <returns></returns>
public async Task<bool> updateLocationStatus(LocationStatus locationStatus, TaskDTO task)
{
Expression<Func<BaseLocationInfo, bool>> exp = s1 => true;
if (task.locationIndex != null)
{
//x => x.objid == task.locationIndex
exp = exp.And(x => x.objid == task.locationIndex);
}
exp = exp.And(x => x.locationArea == task.locationArea && x.locationCode == task.locationCode && x.storeCode == ConfigHelper.GetConfig("storeCode"));
BaseLocationInfo baseLocationInfo = await new BaseServices<BaseLocationInfo>().QuerySingle(exp);
baseLocationInfo.locationStatus = locationStatus;
baseLocationInfo.recordTime = DateTime.Now;
if (baseLocationInfo.materialType != task.materialCode)
{
baseLocationInfo.materialType = task.materialCode;
}
return await new BaseServices<BaseLocationInfo>().Update(baseLocationInfo);
}
/// <summary>
/// 修改库位状态为锁库
/// </summary>
/// <param name="locationStatus"></param>
/// <param name="task"></param>
/// <returns></returns>
public virtual async Task<bool> updateLocationState(string locationArea, string locationcode,LocationStatus locationStatus)
{
Expression<Func<BaseLocationInfo, bool>> exp = s1 => true;
LocationArea m_locationArea;
if (locationArea == "1#库")
{
m_locationArea = LocationArea.Location_Left;
}
else
{
m_locationArea = LocationArea.Location_Right;
}
exp = exp.And(x => x.locationArea == m_locationArea && x.locationCode == locationcode && x.storeCode == ConfigHelper.GetConfig("storeCode"));
BaseLocationInfo baseLocationInfo = await new BaseServices<BaseLocationInfo>().QuerySingle(exp);
baseLocationInfo.locationStatus = locationStatus;
baseLocationInfo.recordTime = DateTime.Now;
return await new BaseServices<BaseLocationInfo>().Update(baseLocationInfo);
}
/// <summary>
/// 修改入库任务状态
/// </summary>
/// <param name="taskDTO"></param>
/// <returns></returns>
public async Task<bool> UpdateInStoreTaskStatus(TaskDTO taskDTO)
{
//修改入库任务状态
Expression<Func<RecordTask, bool>> exp = s1 => true;
exp = exp.And(s1 => s1.taskCode == taskDTO.taskCode);
List<RecordTask> recordTask = await new BaseServices<RecordTask>().Query(exp);
recordTask.ForEach(x => {
x.taskStatus = taskDTO.taskStatus;
x.endTime = DateTime.Now;
x.storeCode = ConfigHelper.GetConfig("storeCode");
x.recordTime = DateTime.Now;
});
return await new BaseServices<RecordTask>().Update(recordTask);
}
/// <summary>
/// 修改待入库任务状态
/// </summary>
/// <param name="prepareInstoreInfo"></param>
/// <returns></returns>
public async Task<bool> UpdatePrePareInStoreStatus(TaskDTO taskDTO)
{
//修改待入库任务状态
Expression<Func<PrepareInStoreInfo, bool>> expression = s1 => true;
expression = expression.And(s1 => s1.taskCode == taskDTO.taskCode);
//PrepareInStoreInfo prepareInStoreInfo = await new BaseServices<PrepareInStoreInfo>().QuerySingle(expression);
var prepareInStoreInfo = await new BaseServices<PrepareInStoreInfo>().Query(expression);
try
{
prepareInStoreInfo.ForEach(async x =>
{
x.intStoreStatus = InStoreStatus.Achieve;
x.endTime = DateTime.Now;
x.storeCode = ConfigHelper.GetConfig("storeCode");
x.recordTime = DateTime.Now;
await new BaseServices<PrepareInStoreInfo>().Update(x);
});
return true;
}catch(Exception ex)
{
LogHelper.Error("修改待入库任务状态失败", ex);
return false;
}
}
/// <summary>
/// 保存入库记录
/// </summary>
/// <param name="recordInStore"></param>
/// <returns></returns>
public async Task<int> SaveInStoreRecord(TaskDTO taskDTO)
{
try
{
RecordInStore recordInStore = new RecordInStore();
recordInStore.objid = System.Guid.NewGuid().ToString();
recordInStore.materialCode = taskDTO.materialCode;
recordInStore.materialType = taskDTO.materialType;
recordInStore.storeCode = ConfigHelper.GetConfig("storeCode");
recordInStore.locationCode = taskDTO.locationCode;
recordInStore.operationType = taskDTO.operationType;
recordInStore.inStoreStatus = InStoreStatus.Achieve;
recordInStore.beginTime = taskDTO.beginTime;
recordInStore.endTime = DateTime.Now;
recordInStore.recordTime = DateTime.Now;
LogHelper.record("保存入库记录" + JsonChange.ModeToJson(recordInStore));
return await new BaseServices<RecordInStore>().Add(recordInStore);
}
catch (Exception ex)
{
LogHelper.Error("保存入库记录异常", ex);
return 0;
}
}
/// <summary>
/// 记录物料与库位绑定记录
/// </summary>
/// <param name="taskDTO"></param>
/// <returns></returns>
public async Task<int> SaveMaterialLocation(TaskDTO taskDTO)
{
Mapper.Initialize(cret => cret.CreateMap<TaskDTO, BaseMaterialStore>());
BaseMaterialStore materialStore = Mapper.Map<BaseMaterialStore>(taskDTO);
materialStore.objid = System.Guid.NewGuid().ToString();
materialStore.locationStatus = LocationStatus.InUse;
materialStore.deleteFlag = DeleteFlag.No;
materialStore.recordTime = DateTime.Now;
materialStore.storeCode = ConfigHelper.GetConfig("storeCode");
return await new BaseServices<BaseMaterialStore>().Add(materialStore);
}
/// <summary>
/// 更新物料库存
/// </summary>
/// <param name="baseMaterialInfo"></param>
public async Task<int> UpdateStock(BaseMaterialDTO baseMaterial)
{
Expression<Func<BaseLocationInfo, bool>> exp = s1 => true;
exp = exp.And(s1 => s1.materialType == baseMaterial.materialType && s1.locationStatus == LocationStatus.InUse && s1.storeCode == ConfigHelper.GetConfig("storeCode"));
List<BaseLocationInfo> baseLocationInfos = await new BaseServices<BaseLocationInfo>().Query(exp);
return baseLocationInfos.Count();
}
/// <summary>
/// 保存入库操作指令记录
/// </summary>
/// <param name="recordDirectiveOperation"></param>
/// <returns></returns>
public async Task<int> SaveInStoreDirecticeOperation(RecordDirectiveOperation recordDirectiveOperation)
{
recordDirectiveOperation.objid = System.Guid.NewGuid().ToString("N");
return await new BaseServices<RecordDirectiveOperation>().Add(recordDirectiveOperation);
}
public virtual async Task<bool> updateLocationStateInfo(BaseLocationInfo location)
{
Expression<Func<BaseLocationInfo, bool>> exp2 = (BaseLocationInfo s1) => true;
exp2 = ExpressionExtensions.And<Func<BaseLocationInfo, bool>>(exp2, (Expression<Func<BaseLocationInfo, bool>>)((BaseLocationInfo x) => (int)x.locationArea == (int)location.locationArea && x.locationCode == location.locationCode && x.storeCode == ConfigHelper.GetConfig("storeCode")));
BaseLocationInfo baseLocationInfo = await new BaseServices<BaseLocationInfo>().QuerySingle(exp2);
baseLocationInfo.locationStatus = location.locationStatus;
baseLocationInfo.materialType = location.materialType;
baseLocationInfo.recordTime = DateTime.Now;
return await new BaseServices<BaseLocationInfo>().Update(baseLocationInfo);
}
}
}