|
using Newtonsoft.Json.Serialization;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.APIEnum;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.LocationEnum;
|
using WIDESEA_Common.OtherEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Common.TaskEnum;
|
using WIDESEA_Common.WareHouseEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_DTO.MES;
|
using WIDESEA_ITaskInfoRepository;
|
using WIDESEA_ITaskInfoService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_TaskInfoService
|
{
|
public partial class TaskService
|
{
|
static object lock_out = new object();
|
|
/// <summary>
|
/// 测试架出仓
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
public MesResponseContent TestToolOut(TestToolOutModel model)
|
{
|
lock (lock_out)
|
{
|
MesResponseContent responseContent = new MesResponseContent();
|
try
|
{
|
Dt_Task exsit = Repository.QueryFirst(x => x.TargetAddress == model.TargetAddressCode);
|
if(exsit != null)
|
{
|
return responseContent.Error($"目标地址重复");
|
}
|
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
|
//获取库存记录
|
List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
|
x.WarehouseId == warehouse.WarehouseId &&
|
x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
|
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.ToolCode));
|
if (stockInfo == null)
|
{
|
return responseContent.Error($"测试架:{model.ToolCode}无可用库存");
|
}
|
Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
|
if (exsit2 != null)
|
{
|
return responseContent.Error($"测试架批次号重复");
|
}
|
|
Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode &&
|
x.WarehouseId == stockInfo.WarehouseId &&
|
x.LocationStatus == (int)LocationStatusEnum.InStock &&
|
(x.EnableStatus == (int)EnableStatusEnum.Normal || x.EnableStatus == (int)EnableStatusEnum.OnlyOut));
|
if (locationInfo == null)
|
{
|
return responseContent.Error($"测试架货位:{stockInfo.LocationCode}出库条件不满足");
|
}
|
//生成测试架出库任务 锁定库存 更改货位状态
|
Dt_Task taskOut = new()
|
{
|
CurrentAddress = stockInfo.LocationCode,
|
Grade = 0,
|
PalletCode = stockInfo.PalletCode,
|
NextAddress = "",
|
Roadway = locationInfo.RoadwayNo,
|
SourceAddress = stockInfo.LocationCode,
|
TargetAddress = model.TargetAddressCode,
|
TaskStatus = (int)TaskStatusEnum.New,
|
TaskType = (int)TaskTypeEnum.Outbound,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
PalletType = stockInfo.PalletType,
|
WarehouseId = stockInfo.WarehouseId,
|
};
|
stockInfo.StockStatus = (int)StockStatusEmun.出库锁定;
|
LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus;
|
locationInfo.LocationStatus = (int)LocationStatusEnum.Lock;
|
//判断是否有出库单信息
|
_unitOfWorkManage.BeginTran();
|
//更新库存状态
|
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
//更新货位状态
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
|
//新建任务
|
BaseDal.AddData(taskOut);
|
//加入货位变动记录
|
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", taskOut.TaskNum);
|
_unitOfWorkManage.CommitTran();
|
//将任务推送到WCS
|
PushTasksToWCS(new List<Dt_Task>() { taskOut }, "AGV_CSJ");
|
responseContent.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
responseContent.Error(ex.Message);
|
}
|
return responseContent;
|
}
|
}
|
/// <summary>
|
/// 测试架退库
|
/// </summary>
|
/// <returns></returns>
|
public MesResponseContent TestToolBack(TestToolBackModel backModel)
|
{
|
MesResponseContent responseContent = new MesResponseContent();
|
try
|
{
|
//获取测试架原库存信息
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
|
//获取库存记录
|
List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
|
x.WarehouseId == warehouse.WarehouseId &&
|
x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList();
|
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == backModel.TestToolCode));
|
if (stockInfo == null)
|
{
|
return responseContent.Error($"{backModel.TestToolCode}库存信息不存在");
|
}
|
//生成退库任务
|
Dt_Task taskIn = new()
|
{
|
CurrentAddress = backModel.SourceAddressCode,
|
Grade = 0,
|
PalletCode = stockInfo.PalletCode,
|
NextAddress = "",
|
Roadway = "",
|
SourceAddress = backModel.SourceAddressCode,
|
TargetAddress = "",
|
TaskStatus = (int)TaskStatusEnum.New,
|
TaskType = (int)TaskTypeEnum.ProductionReturn,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
PalletType = stockInfo.PalletType,
|
WarehouseId = stockInfo.WarehouseId,
|
};
|
//更改库存状态
|
stockInfo.StockStatus = StockStatusEmun.退库.ObjToInt();
|
BaseDal.AddData(taskIn);
|
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
//将任务推送到WCS
|
PushTasksToWCS(new List<Dt_Task>() { taskIn }, "AGV_CSJ"); ;
|
responseContent.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
responseContent.Error(ex.Message);
|
}
|
return responseContent;
|
}
|
/// <summary>
|
/// 测试架报废
|
/// </summary>
|
/// <returns></returns>
|
public MesResponseContent TestScrap(TestToolScrap toolScraps)
|
{
|
MesResponseContent responseContent = new MesResponseContent();
|
try
|
{
|
//获取测试架批次号库存
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
|
//获取库存记录
|
List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
|
x.WarehouseId == warehouse.WarehouseId &&
|
x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList();
|
List<Dt_StockInfo> stockInfoUpdates = new List<Dt_StockInfo>();
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
foreach (var item in toolScraps.ToolCodes)
|
{
|
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == item));
|
if (stockInfo == null)
|
{
|
return responseContent.Error($"{item}库存信息不存在");
|
}
|
stockInfoUpdates.Add(stockInfo);
|
stockInfoDetails.Add(stockInfo.Details.FirstOrDefault());
|
}
|
//清除库存信息
|
_unitOfWorkManage.BeginTran();
|
_stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfoUpdates, OperateTypeEnum.自动删除);
|
_stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfoDetails,OperateTypeEnum.自动删除);
|
_unitOfWorkManage.CommitTran();
|
responseContent.OK($"报废成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
responseContent.Error(ex.Message);
|
}
|
return responseContent;
|
}
|
/// <summary>
|
/// 同步测试架寿命
|
/// </summary>
|
/// <param name="toolSynInfo"></param>
|
/// <returns></returns>
|
public WebResponseContent TestSynStock(TestToolSynInfo toolSynInfo)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_TestToolSync.ToString());
|
MESRoot<TestToolSynInfo> root = new MESRoot<TestToolSynInfo>()
|
{
|
From = "WMS",
|
DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
Content = toolSynInfo
|
};
|
JsonSerializerSettings settings = new JsonSerializerSettings
|
{
|
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
};
|
string request = JsonConvert.SerializeObject(root, settings);
|
string response = HttpMesHelper.Post(apiInfo.ApiAddress, request);
|
MesResponseContent mesResponseContent = response.DeserializeObject<MesResponseContent>();
|
//调用接口
|
if (mesResponseContent.BSucc == true)
|
{
|
content.OK(mesResponseContent.StrMsg);
|
}
|
else
|
{
|
content.Error(mesResponseContent.StrMsg);
|
}
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
}
|
}
|