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#
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);
|
|
}
|
|
}
|
|
}
|