/*
|
*所有关于VV_ContainerInfo类的业务代码应在此处编写
|
*可使用repository.调用常用方法,获取EF/Dapper等信息
|
*如果需要事务请使用repository.DbContextBeginTransaction
|
*也可使用DBServerProvider.手动获取数据库相关信息
|
*用户信息、权限、角色等使用UserContext.Current操作
|
*VV_ContainerInfoService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
|
*/
|
|
using WIDESEA.Core.BaseProvider;
|
using WIDESEA.Core.Extensions.AutofacManager;
|
using WIDESEA.Entity.DomainModels;
|
using System.Linq;
|
using WIDESEA.Core.Utilities;
|
using System.Linq.Expressions;
|
using WIDESEA.Core.Extensions;
|
using Microsoft.EntityFrameworkCore;
|
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.AspNetCore.Http;
|
using WIDESEA.Services.IRepositories;
|
using System.Collections.Generic;
|
using System;
|
using WIDESEA.Services.Repositories;
|
using WIDESEA.Common.CustomModels;
|
using WIDESEA.Common;
|
using Newtonsoft.Json;
|
using WIDESEA.Services.IServices;
|
using WIDESEA.Common.EquipEnum;
|
using WIDESEA.Core.EFDbContext;
|
using WIDESEA_Common.LogEnum;
|
using WIDESEA.Core.ManageUser;
|
using WIDESEA_Services;
|
using WIDESEA.Core.Services;
|
using System.Text.RegularExpressions;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Database;
|
using System.Reflection.Metadata;
|
using NewLife.Reflection;
|
using NPOI.Util.Collections;
|
using WIDESEA.Core.Enums;
|
using System.Reflection;
|
using WIDESEA.Core.Const;
|
|
namespace WIDESEA.Services.Services
|
{
|
public partial class VV_ContainerInfoService
|
{
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IVV_ContainerInfoRepository _repository;//访问数据库
|
|
[ActivatorUtilitiesConstructor]
|
public VV_ContainerInfoService(
|
IVV_ContainerInfoRepository dbRepository,
|
IHttpContextAccessor httpContextAccessor
|
)
|
: base(dbRepository)
|
{
|
_httpContextAccessor = httpContextAccessor;
|
_repository = dbRepository;
|
//多租户会用到这init代码,其他情况可以不用2
|
//base.Init(dbRepository);
|
}
|
public override WebResponseContent Export(PageDataOptions pageData)
|
{
|
return base.Export(pageData);
|
}
|
|
public override WebResponseContent Update(SaveModel saveModel)
|
{
|
|
if (null != saveModel.Extra)
|
{
|
string updateType = saveModel.Extra.ToString();
|
DateTime dateTime = DateTime.Now;
|
string userName = UserContext.Current.UserTrueName;
|
List<Guid> keys = saveModel.DelKeys.Select(r => Guid.Parse(r.ToString())).ToList();
|
List<Dt_container_detail> containerList = Dt_container_detailRepository.Instance.Find(r => keys.Contains(r.containerdtl_id));
|
|
if (containerList.Count == 0) return WebResponseContent.Instance.Error("未找到该数据");
|
|
List<string> groupedStats = containerList.GroupBy(item => item.containerdtl_lotNumber).Select(group => group.Key).ToList();
|
|
//收货确认
|
if ("takeGoogsCheck".Equal(updateType))
|
{
|
|
foreach (string item in groupedStats)
|
{
|
List<Dt_container_detail> contadata = Dt_container_detailRepository.Instance.Find(r => r.containerdtl_lotNumber == item && r.containerdtl_takeGoogsCheck != true);
|
|
if (containerList.Count == 0) continue;
|
|
foreach (var cont in contadata)
|
{
|
cont.containerdtl_takeGoogsCheck = true;
|
cont.containerdtl_takeGoogsCheckTime = dateTime;
|
cont.containerdtl_takeGoogsCheckUser = userName;
|
}
|
|
Dt_container_detailRepository.Instance.UpdateRange(contadata, x => new { x.containerdtl_takeGoogsCheck, x.containerdtl_takeGoogsCheckTime, x.containerdtl_takeGoogsCheckUser }, true);
|
}
|
|
|
|
|
}//质检确认
|
else if ("qualityCheck".Equal(updateType))
|
{
|
foreach (string item in groupedStats)
|
{
|
List<Dt_container_detail> contadata = Dt_container_detailRepository.Instance.Find(r => r.containerdtl_lotNumber == item && r.containerdtl_qualityCheck != true);
|
// List<VV_ContainerInfo> contadat = VV_ContainerInfoRepository.Instance.Find(r => r.containerdtl_lotNumber == item && r.containerdtl_qualityCheck != true);
|
|
if (containerList.Count == 0) continue;
|
foreach (var cont in contadata)
|
{
|
|
cont.containerdtl_qualityCheck = true;
|
cont.containerdtl_qualityCheckTime = dateTime;
|
cont.containerdtl_qualityCheckUser = userName;
|
|
}
|
Dt_container_detailRepository.Instance.UpdateRange(contadata, x => new { x.containerdtl_qualityCheck, x.containerdtl_qualityCheckTime, x.containerdtl_qualityCheckUser }, true);
|
}
|
}
|
return WebResponseContent.Instance.OK("确认成功.");
|
}
|
else
|
{
|
//2024年9月4日更新 新增修改测量结果数据
|
IDt_container_detailRepository detailRepository = Dt_container_detailRepository.Instance;
|
|
Guid detID = saveModel.MainData["containerdtl_id"].ToGuid();
|
string testResult = saveModel.MainData["containerdtl_text3"].ToString();
|
string containerdtl_goodsWeight = saveModel.MainData["containerdtl_goodsWeight"].ToString();
|
string containerdtl_standardResult = saveModel.MainData["containerdtl_standardResult"].ToString();
|
|
Dt_container_detail container_Detail = detailRepository.FindFirst(x => x.containerdtl_id == detID);
|
container_Detail.containerdtl_text3 = testResult;
|
container_Detail.containerdtl_goodsWeight = containerdtl_goodsWeight;
|
container_Detail.containerdtl_standardResult = decimal.Parse(containerdtl_standardResult);
|
|
detailRepository.Update(container_Detail, true);
|
return WebResponseContent.Instance.OK("修改成功.");
|
}
|
|
}
|
|
public override WebResponseContent Del(object[] keys, bool delList = true)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (keys.Length > 9999)
|
return content.Error("一次最多删除5条库存记录");
|
content = repository.DbContextBeginTransaction(() =>
|
{
|
foreach (var item in keys)
|
{
|
Guid id = new Guid(item.ToString());
|
VV_ContainerInfo containerInfo = repository.FindFirst(x => x.containerdtl_id == id);
|
if (null != containerInfo)
|
{
|
Dt_taskinfo task = Dt_taskinfoRepository.Instance.FindFirst(r => r.task_barcode == containerInfo.containerdtl_barcode);
|
if (null != task)
|
return content.Error($"托盘号{task.task_barcode}存在未完成的任务,请先确认。");
|
|
Dt_container_head container_Head = Dt_container_headRepository.Instance.FindFirst(x => x.containerhead_barcode == containerInfo.containerhead_barcode);
|
Dt_container_detail container_Detail = Dt_container_detailRepository.Instance.FindFirst(x => x.containerdtl_id == id);
|
//将库存数据一到到历史表 head、detail
|
CommonFunction.AddContainerHeadToHistory(container_Head);
|
CommonFunction.AddContainerDetailToHistory(container_Detail);
|
|
//barcodeinfo数据移动到历史
|
Dt_barcodeinfo barcodeinfo = Dt_barcodeinfoRepository.Instance.FindFirst(x => x.barcode_value == containerInfo.containerhead_barcode);
|
CommonFunction.AddBarcodeInfoToHistory(barcodeinfo, UserContext.Current.UserTrueName);
|
|
//恢复空货位状态
|
Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == containerInfo.location_id);
|
CommonFunction.ChangeLocationState(locationinfo, LocationState.LocationState_Empty.ToString());
|
}
|
}
|
return content.OK("删除库存成功.");
|
});
|
}
|
catch (Exception ex)
|
{
|
return content.OK("删除库存失败." + ex.Message);
|
}
|
finally
|
{
|
Logger.AddLog(Core.Enums.LoggerType.Del, keys, content, content);
|
}
|
return content;
|
}
|
|
|
/// <summary>
|
/// 前端调用的轴承手动指定出库功能
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent BoxOutboundByManual(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (saveModel.DelKeys.Count > 0)
|
{
|
var contianerList = saveModel.DelKeys;
|
string workStation = saveModel.MainData["workStation"].ToString();
|
|
//if (workStation != "入库口")
|
// throw new Exception("::Error::=> 出库线体还在安装中,无法新建!");
|
|
List<string> listBarcode = new List<string>();
|
string outboundType = saveModel.MainData["outboundType"].ToString();
|
|
List<VV_ContainerInfo> listContainer = new List<VV_ContainerInfo>();
|
string taskType = TaskType.TaskType_Box_Pallet_Outbound.ToString();
|
if ("Empty".Equal(outboundType))
|
{
|
foreach (var constr in contianerList)
|
{
|
VV_ContainerInfo_EmptyPallet container = JsonConvert.DeserializeObject<VV_ContainerInfo_EmptyPallet>(constr.ToString());
|
listBarcode.Add(container.containerdtl_barcode);
|
if (container.location_state != LocationState.LocationState_Stored.ToString())
|
throw new Exception($"选择的库存中包含正在执行任务的状态,请重新选择.托盘号:{container.containerdtl_barcode}");
|
|
if (container.location_islocked)
|
return content.Error($"选择的库存饱含锁定库存,请重新选择.托盘号:{container.containerhead_barcode}");
|
|
Dt_taskinfo taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == container.containerhead_barcode);
|
if (taskInfo != null)
|
return content.Error($"选择的库存中包含已经下发的任务,请勿重复下发.托盘号:{container.containerhead_barcode}");
|
Dt_container_head head = Dt_container_headRepository.Instance.FindFirst(r => r.containerhead_barcode == container.containerhead_barcode);
|
listContainer.Add(new VV_ContainerInfo()
|
{
|
containerhead_barcode = container.containerhead_barcode,
|
materiel_id = container.materiel_id,
|
location_id = container.location_id,
|
containerdtl_type = container.containerdtl_type,
|
containerdtl_goodsWeight = head.containerhead_palletweight
|
});
|
}
|
taskType = TaskType.TaskType_Empty_Pallet_Outbound.ToString();
|
}
|
else
|
{
|
foreach (var constr in contianerList)
|
{
|
VV_ContainerInfo container = JsonConvert.DeserializeObject<VV_ContainerInfo>(constr.ToString());
|
listBarcode.Add(container.containerdtl_barcode);
|
if (container.location_state != LocationState.LocationState_Stored.ToString() && container.location_state != LocationState.LocationState_Error.ToString())
|
throw new Exception($"选择的库存中包含正在执行任务的状态,请重新选择.托盘号:{container.containerhead_barcode}");
|
|
if (container.location_islocked)
|
return content.Error($"选择的库存饱含锁定库存,请重新选择.托盘号:{container.containerdtl_barcode}");
|
|
Dt_taskinfo taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == container.containerhead_barcode);
|
if (taskInfo != null)
|
return content.Error($"选择的库存中包含已经下发的任务,请勿重复下发.托盘号:{container.containerhead_barcode}");
|
listContainer.Add(container);
|
}
|
}
|
|
IDt_taskinfoRepository taskinfoRepository = Dt_taskinfoRepository.Instance;
|
Dt_general_info general_Info = Dt_general_infoRepository.Instance.FindFirst(x => true);
|
if ("应急模式".Equals(general_Info.general_inline_current_model))
|
{
|
Dt_taskinfo task = Dt_taskinfoRepository.Instance.FindFirst(r => LayerToStation.inboundStations.Contains(r.task_endstation)
|
|| LayerToStation.outboundStations.Contains(r.task_beginstation));
|
if (null != task || listContainer.Count > 1)
|
return content.Error("应急模式只能出1个任务.");
|
}
|
// string direction = "";
|
content = taskinfoRepository.DbContextBeginTransaction(() =>
|
{
|
List<Dt_taskinfo> listTask = new List<Dt_taskinfo>();
|
string locationState = taskType.Equal(TaskType.TaskType_Empty_Pallet_Outbound.ToString()) ? LocationState.LocationState_Empty_OutBound_Wait_Executing.ToString()
|
: LocationState.LocationState_Box_OutBound_Wait_Executing.ToString();
|
foreach (var item in listContainer)
|
{
|
Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == item.location_id);
|
|
CommonFunction.ChangeLocationState(locationinfo, locationState);
|
Dt_taskinfo taskinfo = new Dt_taskinfo();
|
//表示将轴承出到入库口
|
if (workStation == "20101")
|
{
|
string target = CommonFunction.GetOutboundAddress(general_Info, locationinfo.location_layer);
|
taskinfo.task_id = Guid.NewGuid();
|
taskinfo.task_type = taskType;
|
taskinfo.task_state = TaskState.TaskState_Create.ToString();
|
taskinfo.task_barcode = item.containerhead_barcode;
|
taskinfo.task_materielid = item.materiel_id;
|
//起始货位
|
taskinfo.task_fromlocationid = item.location_id;
|
//目的货位,即出库口
|
taskinfo.task_tolocationid = target;
|
//起始站台,也是出库口
|
taskinfo.task_beginstation = target;
|
//目的站台
|
taskinfo.task_endstation = "20101";
|
taskinfo.task_grade = 0;
|
taskinfo.task_isunpacked = false;
|
taskinfo.task_creator = UserContext.Current.UserTrueName;
|
taskinfo.task_createtime = DateTime.Now;
|
taskinfo.task_materielType = item.containerdtl_type;
|
taskinfo.task_weight = item.containerdtl_goodsWeight;
|
}
|
else
|
{
|
//if ("left".Equals(direction))
|
// direction = "right";
|
//else
|
// direction = "left";
|
taskinfo.task_id = Guid.NewGuid();
|
taskinfo.task_type = taskType;
|
taskinfo.task_state = TaskState.TaskState_Create.ToString();
|
taskinfo.task_barcode = item.containerhead_barcode;
|
taskinfo.task_materielid = item.materiel_id;
|
//起始货位
|
taskinfo.task_fromlocationid = item.location_id;
|
//目的货位,即出库口
|
taskinfo.task_tolocationid = LayerToStation.OutAreaLayerToStation(locationinfo.location_layer);
|
//起始站台,也是出库口
|
taskinfo.task_beginstation = LayerToStation.OutAreaLayerToStation(locationinfo.location_layer);
|
//目的站台,即压装工位
|
taskinfo.task_endstation = workStation;// LayerToStation.GetOutboundStation(workStation, direction);
|
taskinfo.task_grade = 0;
|
taskinfo.task_isunpacked = false;
|
taskinfo.task_creator = UserContext.Current.UserTrueName;
|
taskinfo.task_createtime = DateTime.Now;
|
taskinfo.task_materielType = item.containerdtl_type;
|
taskinfo.task_weight = item.containerdtl_goodsWeight;
|
}
|
listTask.Add(taskinfo);
|
}
|
|
taskinfoRepository.AddRange(listTask, true);
|
|
//下发出库任务给WCS
|
content = WCSApi.SendTaskToWCS(listTask);
|
if (content.Status)
|
content.OK($"指定出库任务下发给WCS成功.");
|
else
|
content.Error($"指定出库任务下发给WCS失败,原因 => {content.Message}");
|
|
return content;
|
});
|
}
|
else
|
content.Error(message: "请选择出库库存");
|
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
finally
|
{
|
Logger.AddLog(Core.Enums.LoggerType.Add, null, content, content);
|
}
|
return content;
|
}
|
|
|
/// <summary>
|
/// 锁定或者取消锁定库存
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent UpdateLockStateForContianer(SaveModel saveModel)
|
{
|
WebResponseContent responseContent = new WebResponseContent();
|
try
|
{
|
bool islock = Convert.ToBoolean(saveModel.Extra);
|
List<Dt_locationinfo> listLocation = new List<Dt_locationinfo>();
|
foreach (var item in saveModel.DelKeys)
|
{
|
Guid id = new Guid(item.ToString());
|
VV_ContainerInfo containerInfo = repository.FindFirst(x => x.containerdtl_id == id);
|
if (containerInfo.location_state != LocationState.LocationState_Stored.ToString())
|
throw new Exception("只能操作有货状态的库存");
|
Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == containerInfo.location_id);
|
locationinfo.location_islocked = islock;
|
listLocation.Add(locationinfo);
|
}
|
|
responseContent = repository.DbContextBeginTransaction(() =>
|
{
|
Dt_locationinfoRepository.Instance.UpdateRange(listLocation, x => x.location_islocked, true);
|
return responseContent.OK("修改货位锁定状态成功.");
|
});
|
}
|
catch (Exception ex)
|
{
|
responseContent.Error("解锁货位失败:" + ex.Message);
|
}
|
finally
|
{
|
Logger.AddLog(Core.Enums.LoggerType.Edit, saveModel, responseContent, responseContent);
|
}
|
return responseContent;
|
}
|
|
|
/// <summary>
|
/// 供前端的库存平面图调用,获取数据
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent SelectContainerList(SaveModel saveModel)
|
{
|
return CommonFunction.SelectContainerList(saveModel);
|
}
|
/// <summary>
|
/// 查询大屏数据
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent QueryHomeInfo(SaveModel saveModel)
|
{
|
return CommonFunction.QueryHomeInfo(saveModel);
|
}
|
|
|
//public WebResponseContent SelectContainerList(SaveModel saveModel)
|
//{
|
// WebResponseContent content = new WebResponseContent();
|
// try
|
// {
|
// string line = saveModel.MainData["layer"].ToString();
|
// List<List<object>> lists = new List<List<object>>();
|
// for (int i = Convert.ToInt32(line); i < line.ToInt32() + 2; i++)
|
// {
|
// List<Dt_locationinfo> locationinfos = Dt_locationinfoRepository.Instance.Find(x => x.location_line == i && x.location_layer <= 8)
|
// .OrderByDescending(x => x.location_layer).ThenBy(x => x.location_column).ToList();
|
// List<object> list = new List<object>();
|
|
// for (int j = 8; j > 0; j--)
|
// {
|
// List<object> layerlist = new List<object>();
|
// foreach (var item in locationinfos)
|
// {
|
// if (item.location_layer == j)
|
// {
|
// VV_ContainerInfo containerInfo = VV_ContainerInfoRepository.Instance.FindFirst(x => x.location_id == item.location_id);
|
// VV_ContainerInfo_EmptyPallet emptyPalletContainer = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.location_id == item.location_id);
|
// Dt_locationinfo _Locationinfo = Dt_locationinfoRepository.Instance.FindFirst(d => d.location_id == item.location_id);
|
// if (containerInfo != null)
|
// {
|
// containerInfo.location_state = locationstate(_Locationinfo, item.location_islocked, true);
|
// }
|
// else if (emptyPalletContainer != null)
|
// {
|
// emptyPalletContainer.location_state = locationstate(_Locationinfo, item.location_islocked, true);
|
// }
|
// else
|
// {
|
// _Locationinfo.location_state = locationstate(_Locationinfo, item.location_islocked, false);
|
// }
|
// if (containerInfo != null)
|
// {
|
// layerlist.Add(new
|
// {
|
// color = "success",
|
// id = item.location_id,
|
// src = LocationStausImage(_Locationinfo, item.location_islocked, true),
|
// form = containerInfo,
|
// form2 = _Locationinfo
|
// });
|
// }
|
// else if (emptyPalletContainer != null)
|
// {
|
// layerlist.Add(new
|
// {
|
// color = "success",
|
// id = item.location_id,
|
// src = LocationStausImage(_Locationinfo, item.location_islocked, true),
|
// form = emptyPalletContainer,
|
// form2 = _Locationinfo
|
// });
|
// }
|
// else
|
// {
|
// layerlist.Add(new
|
// {
|
// color = "success",
|
// id = item.location_id,
|
// src = LocationStausImage(_Locationinfo, item.location_islocked, false),
|
// form = containerInfo,
|
// form2 = _Locationinfo
|
// }); ;
|
// }
|
// }
|
// }
|
// list.Add(layerlist);
|
// }
|
// lists.Add(list);
|
// }
|
// content.OK("成功", lists);
|
// }
|
// catch (Exception ex)
|
// {
|
// content.Error(ex.Message);
|
// }
|
// return content;
|
//}
|
|
|
public string locationstate(Dt_locationinfo locationinfo, bool isLocked, bool flag)
|
{
|
string state = "";
|
if (isLocked == true && flag == true)
|
return "有货被锁定";
|
if (isLocked == true && flag == false)
|
return "空货位被锁定";
|
if (flag == false)
|
return "空货位";
|
|
string locationId = locationinfo.location_id;
|
List<Dt_taskinfo> taskList = Dt_taskinfoRepository.Instance.Find(x => true);
|
foreach (Dt_taskinfo taskinfo in taskList)
|
{
|
if (taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString() &&
|
taskinfo.task_tolocationid == locationId)
|
{
|
state = "空托盘入库中";
|
break;
|
}
|
else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Inbound.ToString() &&
|
taskinfo.task_tolocationid == locationId)
|
{
|
state = "轴承入库中";
|
break;
|
}
|
else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString() &&
|
taskinfo.task_tolocationid == locationId)
|
{
|
state = "测量回库中";
|
break;
|
}
|
else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() &&
|
taskinfo.task_fromlocationid == locationId)
|
{
|
state = "测量出库中";
|
break;
|
}
|
else if (taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() &&
|
taskinfo.task_fromlocationid == locationId)
|
{
|
state = "空托出库中";
|
break;
|
}
|
else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() &&
|
taskinfo.task_fromlocationid == locationId)
|
{
|
state = "轴承出库中";
|
break;
|
}
|
}
|
|
//说明库存没有对应进行的任务
|
if (string.IsNullOrEmpty(state))
|
{
|
VV_ContainerInfo_EmptyPallet emptyPalletContainer = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.location_id == locationId);
|
if (emptyPalletContainer != null)
|
{
|
state = "空托盘";
|
}
|
else
|
{
|
VV_ContainerInfo boxContainer = VV_ContainerInfoRepository.Instance.FindFirst(x => x.location_id == locationId);
|
if (boxContainer != null && string.IsNullOrEmpty(boxContainer.csize_in_result))
|
{
|
state = "等待测量";
|
}
|
else if (boxContainer != null)
|
{
|
state = "已测量";
|
}
|
}
|
}
|
return state;
|
}
|
|
|
|
|
|
|
//显示货位状态
|
public string locationinfomatching(string location_state, bool isLocked, string containerdtl_state)
|
{
|
string img = "NewEmpty.png";
|
if (containerdtl_state == MaterielState.Error.ToString())
|
{
|
img = "abnormal.png";
|
}
|
if (containerdtl_state == MaterielState.Freeze.ToString())
|
{
|
img = "freeze.png";
|
}
|
if (containerdtl_state == MaterielState.GoodProduct.ToString())
|
{
|
img = "NewStored.png";
|
}
|
if (containerdtl_state == MaterielState.Pedding.ToString())
|
{
|
img = "inspected.png";
|
}
|
if (containerdtl_state == MaterielState.GoodProduct.ToString() && isLocked)
|
{
|
img = "NewLock.png";
|
}
|
if (containerdtl_state == MaterielState.Freeze.ToString() && isLocked)
|
{
|
img = "freelock.png";
|
}
|
if (containerdtl_state == MaterielState.Pedding.ToString() && isLocked)
|
{
|
img = "Transfer_Executing.png";
|
}
|
if (containerdtl_state == MaterielState.Error.ToString() && isLocked)
|
{
|
img = "InWaveComputing.png";
|
}
|
return img;
|
}
|
|
public string LocationStausImage(Dt_locationinfo locationinfo, bool isLocked, bool flag)
|
{
|
string img = "";
|
if (isLocked == true)
|
return "NewLock.png";
|
if (flag == false)
|
return "NewEmpty.png";
|
|
string locationId = locationinfo.location_id;
|
List<Dt_taskinfo> taskList = Dt_taskinfoRepository.Instance.Find(x => true);
|
foreach (Dt_taskinfo taskinfo in taskList)
|
{
|
if ((taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString() ||
|
taskinfo.task_type == TaskType.TaskType_Box_Pallet_Inbound.ToString()) &&
|
taskinfo.task_tolocationid == locationId)
|
{
|
img = "NewInbound.png";
|
break;
|
}
|
else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString() &&
|
taskinfo.task_tolocationid == locationId)
|
{
|
img = "Measureing.png";
|
break;
|
}
|
else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() &&
|
taskinfo.task_fromlocationid == locationId)
|
{
|
img = "Measureing.png";
|
break;
|
}
|
else if ((taskinfo.task_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() ||
|
taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString()) &&
|
taskinfo.task_fromlocationid == locationId)
|
{
|
img = "NewOutbound.png";
|
break;
|
}
|
}
|
|
//说明库存没有对应进行的任务
|
if (string.IsNullOrEmpty(img))
|
{
|
VV_ContainerInfo_EmptyPallet emptyPalletContainer = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.location_id == locationId);
|
if (emptyPalletContainer != null)
|
{
|
img = "EmptyPallet.png";
|
}
|
else
|
{
|
VV_ContainerInfo boxContainer = VV_ContainerInfoRepository.Instance.FindFirst(x => x.location_id == locationId);
|
if (boxContainer != null && !string.IsNullOrEmpty(boxContainer.csize_in_result))
|
{
|
img = "HadMeasure.png";
|
}
|
else if (boxContainer != null)
|
{
|
img = "WaitMeasure.png";
|
}
|
}
|
|
}
|
return img;
|
}
|
|
|
/// <summary>
|
/// 添加一条库存记录
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent addGoodsRecord(SaveModel saveModel)
|
{
|
WebResponseContent responseContent = new WebResponseContent();
|
string barcode = "", locationid = "";
|
try
|
{
|
barcode = saveModel.MainData["add_barcode"].ToString();
|
locationid = saveModel.MainData["add_locationid"].ToString();
|
if (barcode.Length != 6)
|
throw new Exception("托盘号不符合规则");
|
if (locationid.Length != 12)
|
throw new Exception("货位编号输入有误,请按该格式输入:01-01-008-01");
|
//查询条码值是否已经存在
|
VV_ContainerInfo tmpInfo = VV_ContainerInfoRepository.Instance.FindFirst(x => x.containerhead_barcode == barcode);
|
if (tmpInfo != null)
|
throw new Exception("该条码值已经存在");
|
|
//查询货位是否是空货位
|
Dt_locationinfo tmpLoc = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == locationid);
|
if (tmpLoc == null)
|
throw new Exception("输入的货位号不存在");
|
if (tmpLoc.location_state != LocationState.LocationState_Empty.ToString())
|
throw new Exception("输入的货位号已被使用");
|
|
responseContent = VV_ContainerInfoRepository.Instance.DbContextBeginTransaction(() =>
|
{
|
|
Guid containerHeadID = Guid.NewGuid();
|
Dt_container_head conHead = new Dt_container_head();
|
conHead.containerhead_id = Guid.NewGuid();
|
conHead.containerhead_barcode = barcode;
|
conHead.containerhead_creator = UserContext.Current.UserTrueName;
|
conHead.containerhead_createtime = DateTime.Now;
|
conHead.containerhead_palletweight = "0";
|
Dt_container_headRepository.Instance.Add(conHead, true);
|
|
Dt_container_detail conDetail = new Dt_container_detail();
|
conDetail.containerdtl_id = Guid.NewGuid();
|
conDetail.containerdtl_headid = conHead.containerhead_id.ToString();
|
conDetail.containerdtl_materielid = "100";
|
conDetail.containerdtl_qty = "1";
|
conDetail.containerdtl_creator = UserContext.Current.UserTrueName;
|
conDetail.containerdtl_createtime = DateTime.Now;
|
Dt_container_detailRepository.Instance.Add(conDetail, true);
|
|
Dt_barcodeinfo barcodeinfo = new Dt_barcodeinfo();
|
barcodeinfo.barcodeinfo_id = Guid.NewGuid();
|
barcodeinfo.barcode_value = barcode;
|
barcodeinfo.barcode_intime = DateTime.Now;
|
barcodeinfo.barcode_locationid = locationid;
|
barcodeinfo.barcode_creator = UserContext.Current.UserTrueName;
|
barcodeinfo.barcode_createtime = DateTime.Now;
|
Dt_barcodeinfoRepository.Instance.Add(barcodeinfo, true);
|
|
Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == locationid);
|
locationinfo.location_state = LocationState.LocationState_Stored.ToString();
|
Dt_locationinfoRepository.Instance.Update(locationinfo, true);
|
|
return responseContent.OK($"执行添加空托库存操作成功,货位号 :{locationid},条码值:{barcode}");
|
});
|
}
|
catch (Exception ex)
|
{
|
responseContent.Error($"执行添加空托库存操作成功,货位号 :{locationid},条码值:{barcode},异常信息:{ex.Message}");
|
}
|
finally
|
{
|
Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, responseContent, responseContent);
|
}
|
return responseContent;
|
}
|
|
|
/// <summary>
|
/// 手动指定添加一条测量记录(手动选中的测量轴承不计算时间)
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
///
|
|
|
public WebResponseContent addMeasureTaskByMannual(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
List<VV_ContainerInfo> listContainer = new List<VV_ContainerInfo>();
|
try
|
{
|
|
Dt_general_info general_Info = Dt_general_infoRepository.Instance.FindFirst(x => true);
|
if ("应急模式".Equals(general_Info.general_inline_current_model))
|
{
|
Dt_taskinfo task = Dt_taskinfoRepository.Instance.FindFirst(r => LayerToStation.inboundStations.Contains(r.task_endstation)
|
|| LayerToStation.outboundStations.Contains(r.task_beginstation));
|
if (null != task || saveModel.DelKeys.Count > 1)
|
return content.Error("应急模式只能出1个任务.");
|
}
|
foreach (var item in saveModel.DelKeys)
|
{
|
Guid id = new Guid(item.ToString());
|
VV_ContainerInfo containerInfo = repository.FindFirst(x => x.containerdtl_id == id);
|
if (null != containerInfo)
|
{
|
if ((containerInfo.location_state != LocationState.LocationState_Error.ToString() && containerInfo.location_state != LocationState.LocationState_Stored.ToString()) || containerInfo.location_islocked)
|
throw new Exception($"只能测量异常状态,有货状态和解锁的库存,货位号:{containerInfo.location_id}");
|
|
if (containerInfo.location_state == LocationState.LocationState_Error.ToString())
|
{
|
Dt_container_detail dt_Container_Detail = Dt_container_detailRepository.Instance.FindFirst(x => x.containerdtl_id == id);
|
dt_Container_Detail.containerdtl_isError = "1";
|
Dt_container_detailRepository.Instance.Update(dt_Container_Detail, true);
|
}
|
listContainer.Add(containerInfo);
|
}
|
}
|
content = repository.DbContextBeginTransaction(() =>
|
{
|
foreach (var containerInfo in listContainer)
|
{
|
//更改货位状态
|
Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == containerInfo.location_id);
|
locationinfo.location_state = LocationState.LocationState_Box_Measure_Out_Wait_Executing.ToString();
|
Dt_locationinfoRepository.Instance.Update(locationinfo, true);
|
|
string target = CommonFunction.GetInboundAddress(general_Info, locationinfo.location_layer);
|
//生成WMS任务
|
Dt_taskinfo taskinfo = new Dt_taskinfo();
|
taskinfo.task_id = Guid.NewGuid();
|
taskinfo.task_type = TaskType.TaskType_Box_Pallet_Measure_Out.ToString();
|
taskinfo.task_state = TaskState.TaskState_Create.ToString();
|
taskinfo.task_barcode = containerInfo.containerdtl_barcode;
|
taskinfo.task_materielid = containerInfo.materiel_id;
|
taskinfo.task_weight = containerInfo.containerdtl_goodsWeight;
|
taskinfo.task_sn = containerInfo.containerdtl_goodsCode;
|
taskinfo.task_materielType = containerInfo.containerdtl_type;
|
//起始货位
|
taskinfo.task_fromlocationid = containerInfo.location_id;
|
//目的货位,应该是穿梭车的放货站台 (50301-50308)
|
taskinfo.task_tolocationid = target;
|
//测量出库任务穿梭车的放货站台(50301-50308)
|
taskinfo.task_beginstation = target;
|
//目的站台
|
taskinfo.task_endstation = "10301";
|
taskinfo.task_grade = 0;
|
taskinfo.task_isunpacked = false;
|
taskinfo.task_creator = UserContext.Current.UserTrueName;
|
taskinfo.task_createtime = DateTime.Now;
|
taskinfo.task_isunpacked = true;
|
Dt_taskinfoRepository.Instance.Add(taskinfo, true);
|
LogRecord.WriteLog((int)LogEnum.Measure, $"{UserContext.Current.UserName}【手动添加测量任务】给货位:【{locationinfo.location_id}】、托盘号:【{containerInfo.containerdtl_barcode}】的轴承添加了测量任务");
|
}
|
return content.OK("手动增加测量任务成功.");
|
});
|
}
|
catch (Exception ex)
|
{
|
content.Error("手动增加测量任务失败." + ex.Message);
|
}
|
finally
|
{
|
Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, content, content);
|
}
|
return content;
|
}
|
|
|
/// <summary>
|
/// 移库出库
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent MoveContainerAction(SaveModel saveModel)
|
{
|
return CommonFunction.MoveContainerAction(saveModel);
|
}
|
|
|
/// <summary>
|
/// 出库复核
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent AddCheckTaskAction(SaveModel saveModel)
|
{
|
return CommonFunction.AddCheckTaskAction(saveModel);
|
}
|
|
|
public WebResponseContent Getgqrkts()
|
{
|
WebResponseContent webResponseContent = new WebResponseContent();
|
int goodscount = repository.Find(x => x.containerdtl_text3 == "不合格").Count();
|
int standarcount = repository.Find(x => x.containerdtl_standardResult == 0).Count();
|
|
// 使用AsEnumerable()切换到客户端评估
|
int dateDiffResultcount = repository.Find(x => true)
|
.AsEnumerable()
|
.Count(x =>
|
{
|
if (string.IsNullOrEmpty(x.DateDiffResult))
|
return false;
|
|
var match = Regex.Match(x.DateDiffResult, @"(\d+)\s*天");
|
return match.Success &&
|
int.TryParse(match.Groups[1].Value, out int days) &&
|
days >= 180;
|
});
|
webResponseContent.Data = new
|
{
|
goodscount = goodscount,
|
standarcount = standarcount,
|
dateDiffResultcount = dateDiffResultcount,
|
};
|
|
return webResponseContent.OK();
|
}
|
|
public virtual PageGridData<VV_ContainerInfo> GetPageData(PageDataOptions options)
|
{
|
|
|
|
|
options = ValidatePageOptions(options, out IQueryable<VV_ContainerInfo> queryable);
|
//获取排序字段
|
Dictionary<string, QueryOrderBy> orderbyDic = GetPageDataSort(options, TProperties);
|
|
PageGridData<VV_ContainerInfo> pageGridData = new PageGridData<VV_ContainerInfo>();
|
if (QueryRelativeExpression != null)
|
{
|
queryable = QueryRelativeExpression.Invoke(queryable);
|
}
|
if (options.Export)
|
{
|
pageGridData.rows = queryable.GetIQueryableOrderBy(orderbyDic).Take(Limit).ToList();
|
}
|
else
|
{
|
if (options.Wheres.Contains("超期") || options.Wheres.Contains("未超期") || options.Wheres.Contains("未登记收货确认时间") || options.Wheres.Contains("未登记确认时间"))
|
{
|
pageGridData.rows = repository.IQueryablePage(queryable,
|
1,
|
99999,
|
out int rowCount,
|
orderbyDic).ToList();
|
pageGridData.total = rowCount;
|
}
|
else
|
{
|
pageGridData.rows = repository.IQueryablePage(queryable,
|
options.Page,
|
options.Rows,
|
out int rowCount,
|
orderbyDic).ToList();
|
pageGridData.total = rowCount;
|
}
|
|
if (options.Wheres.Contains("超期"))
|
{
|
if (options.Wheres.Contains("未超期"))
|
{
|
for (int i = pageGridData.rows.Count - 1; i >= 0; i--)
|
{
|
var item = pageGridData.rows[i];
|
Match match = Regex.Match(item.DateDiffResult, @"^\d+");
|
if (match.Success && int.TryParse(match.Value, out int days))
|
{
|
if (days >= 180)
|
{
|
pageGridData.rows.RemoveAt(i); // 按索引删除
|
}
|
}
|
}
|
}
|
else
|
{
|
for (int i = pageGridData.rows.Count - 1; i >= 0; i--)
|
{
|
var item = pageGridData.rows[i];
|
Match match = Regex.Match(item.DateDiffResult, @"^\d+");
|
if (match.Success && int.TryParse(match.Value, out int days))
|
{
|
if (days < 180)
|
{
|
pageGridData.rows.RemoveAt(i); // 按索引删除
|
}
|
}
|
}
|
}
|
|
pageGridData.total = pageGridData.rows.Count;
|
pageGridData.rows = pageGridData.rows.Skip((options.Page - 1) * options.Rows).Take(options.Rows).ToList();
|
|
}
|
|
|
if (options.Wheres.Contains("确认时间"))
|
{
|
if (options.Wheres.Contains("未登记收货确认时间"))
|
{
|
for (int i = pageGridData.rows.Count - 1; i >= 0; i--)
|
{
|
var item = pageGridData.rows[i];
|
if (item.containerdtl_takeGoogsCheckTime!=null)
|
{
|
pageGridData.rows.RemoveAt(i); // 按索引删除
|
}
|
}
|
}
|
else
|
{
|
for (int i = pageGridData.rows.Count - 1; i >= 0; i--)
|
{
|
var item = pageGridData.rows[i];
|
if (item.containerdtl_qualityCheckTime != null)
|
{
|
pageGridData.rows.RemoveAt(i); // 按索引删除
|
}
|
}
|
}
|
|
pageGridData.total = pageGridData.rows.Count;
|
pageGridData.rows = pageGridData.rows.Skip((options.Page - 1) * options.Rows).Take(options.Rows).ToList();
|
}
|
|
|
//查询界面统计求等字段
|
if (SummaryExpress != null)
|
{
|
pageGridData.summary = SummaryExpress.Invoke(queryable);
|
//Func<T, T> groupExpress = x =>x;
|
//pageGridData.summary = queryable.GroupBy(groupExpress).Select(SummaryExpress).FirstOrDefault();
|
}
|
}
|
|
|
GetPageDataOnExecuted?.Invoke(pageGridData);
|
|
return pageGridData;
|
}
|
}
|
|
|
}
|