2022-10-27 20:39:48 +08:00

794 lines
41 KiB
C#
Raw Permalink 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 System;
using System.Threading.Tasks;
using System.Collections.Generic;
using WaterCloud.Code;
using Chloe;
using WaterCloud.Domain.MaterialManage;
using WaterCloud.Domain.ProcessManage;
using WaterCloud.Domain.ClassTask;
using WaterCloud.Service.ClassTask;
using WaterCloud.Domain.EquipmentManage;
using System.Net.Http;
using WaterCloud.Domain.QualityManage;
using System.Linq;
using System.IO;
using WaterCloud.Domain.PlanManage;
using WaterCloud.Service.SystemManage;
using NPOI.SS.Formula.Functions;
namespace WaterCloud.Service.MaterialManage
{
/// <summary>
/// 创 建:超级管理员
/// 日 期2020-12-16 13:38
/// 描 述:出库管理服务类
/// </summary>
public class StorageService : DataFilterService<StorageEntity>, IDenpendency
{
private ControlJobService jobApp;
private LocationService locationApp;
private ItemsDataService itemsApp;
public StorageService(IDbContext context, IHttpClientFactory httpClientFactory) : base(context)
{
jobApp = new ControlJobService(context, httpClientFactory);
locationApp = new LocationService(context);
itemsApp = new ItemsDataService(context);
}
#region
public async Task<List<StorageEntity>> GetList(string keyword = "")
{
var data = repository.IQueryable();
if (!string.IsNullOrEmpty(keyword))
{
data = data.Where(t => t.F_LocationCode.Contains(keyword) || t.F_TransferBoxCode.Contains(keyword) || t.F_MaterialName.Contains(keyword) || t.F_MaterialCode.Contains(keyword) || t.F_MaterialBatch.Contains(keyword));
}
return data.OrderByDesc(t => t.F_CreatorTime).ToList();
}
public async Task<List<StorageEntity>> GetLookList(string keyword = "")
{
var query = repository.IQueryable().Where(a => a.F_IsCheckout == true);
if (!string.IsNullOrEmpty(keyword))
{
query = query.Where(t => t.F_LocationCode.Contains(keyword) || t.F_TransferBoxCode.Contains(keyword) || t.F_MaterialName.Contains(keyword) || t.F_MaterialCode.Contains(keyword) || t.F_MaterialBatch.Contains(keyword));
}
query = GetDataPrivilege("u", "", query);
return query.OrderByDesc(t => t.F_CreatorTime).ToList();
}
public async Task<object> GetEqpScanJson(string keyValue)
{
//获取领料申请前3条
var eqpUseJob = uniwork.IQueryable<ControlJobEntity>(a => a.F_NeedEqpId == keyValue && a.F_JobType == 0 && a.F_JobState < 3).OrderByDesc(a => a.F_CreatorTime).Take(3).ToList();
foreach (var item in eqpUseJob)
{
var material = await uniwork.FindEntity<MaterialEntity>(item.F_NeedId);
item.F_MaterialName = material.F_MaterialName;
}
//设备名称、值班人、产出物料、产量、当前班次
var eqp = await uniwork.FindEntity<EquipmentEntity>(keyValue);
var workorders = uniwork.IQueryable<WorkOrderDetailEqpBandingEntity>(a => a.F_EqpId == keyValue).InnerJoin<WorkOrderDetailEntity>((a, b) => a.F_WorkOrderDetailId == b.F_Id && b.F_WorkOrderState == 1)
.InnerJoin<MaterialEntity>((a, b, c) => b.F_MaterialId == c.F_Id)
.Select((a, b, c) => new
{
F_Id = b.F_Id,
F_PlanNum = b.F_PlanNum,
F_DoneNum = b.F_DoneNum,
F_MaterialName = c.F_MaterialName,
}).ToList();
var details = workorders.Select(a => a.F_Id).ToList();
var materials = workorders.Select(a => a.F_MaterialName).ToList();
var workusers = uniwork.IQueryable<WorkDetailTimeBandingEntity>(a => details.Contains(a.F_WorkOrderDetailId)).InnerJoin<EqpWorkTimeEntity>((a, b) => a.F_EqpWorkTimeId == b.F_Id).Select((a, b) => b.F_UserName).Distinct().ToList();
//当前领用物料名称,数量
var eqpUse = uniwork.IQueryable<EqpMaterialUseEntity>(a => a.F_EqpId == keyValue && a.F_Num != a.F_DoneNum).GroupBy(a => a.F_MaterialName).Select(a => new { a.F_MaterialName, Num = Sql.Sum(a.F_Num - a.F_DoneNum) }).ToList();
string dateClass = "";
var classNums = await itemsApp.GetItemList("Mes_ClassNumber");
var classStartTime = TimeSpan.Parse(classNums.FirstOrDefault().F_Description.Split("-")[0]);
var tempStartTime = classStartTime.TotalMinutes;
var tempEndTime = TimeSpan.Parse(classNums[0].F_Description.Split("-")[1]).TotalMinutes;
var currentTime = DateTime.Now.TimeOfDay;
var checkdate = DateTime.Now.Date;
if (classNums.Count == 0)
{
dateClass = checkdate.ToString("yyyyMMdd") + classNums[0].F_ItemName;
}
else
{
if (TimeSpan.Compare(currentTime, classStartTime) < 0)
{
checkdate = checkdate.AddDays(-1);
}
tempEndTime = tempStartTime;
for (int i = 0; i < classNums.Count(); i++)
{
var startTime = TimeSpan.Parse(classNums[i].F_Description.Split("-")[0]).TotalMinutes;
var endTime = TimeSpan.Parse(classNums[i].F_Description.Split("-")[1]).TotalMinutes;
if (endTime > startTime)
{
tempEndTime += endTime - startTime;
}
else
{
tempEndTime += endTime + 24 * 60 - startTime;
}
if (checkdate.AddMinutes(tempStartTime) < DateTime.Now && checkdate.AddMinutes(tempEndTime) >= DateTime.Now)
{
dateClass = checkdate.ToString("yyyyMMdd") + classNums[i].F_ItemName;
}
tempStartTime = tempEndTime;
}
}
var transferbox = uniwork.IQueryable<ReadyTransferBoxEntity>(a => a.F_EqpId == eqp.F_Id).OrderBy(a => a.F_CreatorTime).FirstOrDefault();
var data = new
{
F_EqpName = eqp.F_EqpName,
eqpUseJob,
workusers = string.Join(',', workusers),
eqpUse,
workorders,
dateClass,
transferbox
};
//容器产出计数
return data;
}
public async Task<List<StorageOutExtend>> getStorageOutBoard()
{
List<StorageOutExtend> list = new List<StorageOutExtend>();
var materials = uniwork.IQueryable<MaterialEntity>(a => a.F_MaterialType == 2 && a.F_EnabledMark == true && a.F_DeleteMark == false).ToList();
var cuurentdate = DateTime.Now.Date;
foreach (var item in materials)
{
StorageOutExtend entity = new StorageOutExtend();
entity.F_MaterialCode = item.F_MaterialCode;
entity.F_MaterialName = item.F_MaterialName;
var storage = uniwork.IQueryable<StorageEntity>(a => a.F_MaterialId == item.F_Id).Sum(a => a.F_Num)??0;
entity.F_Num = storage;
var outplan0 = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2&&a.F_PlanTime== cuurentdate).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field0 = outplan0;
var outplan1= uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2 && a.F_PlanTime == cuurentdate.AddDays(1) && a.F_IsUserEdit == true).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field1 = outplan1;
var outplan2 = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2 && a.F_PlanTime == cuurentdate.AddDays(2) && a.F_IsUserEdit == true).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field2 = outplan2;
var outplan3 = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2 && a.F_PlanTime == cuurentdate.AddDays(3) && a.F_IsUserEdit == true).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field3 = outplan3;
var outplan4 = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2 && a.F_PlanTime == cuurentdate.AddDays(4) && a.F_IsUserEdit == true).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field4 = outplan4;
var outplan5 = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2 && a.F_PlanTime == cuurentdate.AddDays(5) && a.F_IsUserEdit == true).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field5 = outplan5;
var outplan6 = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2 && a.F_PlanTime == cuurentdate.AddDays(6) && a.F_IsUserEdit == true).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field6 = outplan6;
var outplan7 = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_OutStorageState < 2 && a.F_PlanTime == cuurentdate.AddDays(7) && a.F_IsUserEdit == true).Sum(a => a.F_Num - a.F_DoneNum) ?? 0;
entity.field7 = outplan7;
list.Add(entity);
}
return list.OrderBy(a => a.F_MaterialCode).ToList() ;
}
public async Task<List<StorageEntity>> GetLookList(SoulPage<StorageEntity> pagination, string keyword = "", string id = "")
{
//获取数据权限
var query = repository.IQueryable();
if (!string.IsNullOrEmpty(keyword))
{
query = query.Where(t => t.F_LocationCode.Contains(keyword) || t.F_TransferBoxCode.Contains(keyword) || t.F_MaterialName.Contains(keyword) || t.F_MaterialCode.Contains(keyword) || t.F_MaterialBatch.Contains(keyword));
}
if (!string.IsNullOrEmpty(id))
{
query = query.Where(u => u.F_Id == id);
}
query = GetDataPrivilege("u", "", query);
return await repository.OrderList(query, pagination);
}
public async Task<StorageEntity> GetTransferInfo(string transferBoxCode)
{
var data = repository.IQueryable(a => a.F_TransferBoxCode == transferBoxCode && a.F_IsCheckout == true && a.F_EnabledMark == true && a.F_Num > 0).FirstOrDefault();
return data;
}
public async Task<StorageEntity> GetStorageByOutStorage(string keyValue)
{
var outNote = await uniwork.FindEntity<OutStorageEntity>(a => a.F_OutStorageCode == keyValue);
var data = repository.IQueryable(a => a.F_MaterialId == outNote.F_MaterialId && a.F_IsCheckout == true && a.F_EnabledMark == true && a.F_Num > 0).OrderBy(a => a.F_CreatorTime).FirstOrDefault();
return data;
}
public async Task<StorageEntity> GetForm(string keyValue)
{
var data = await repository.FindEntity(keyValue);
return data;
}
public async Task<List<StorageEntity>> GetStorageByMaterial(string code, string eqpName, bool isAll = false)
{
var outinfos = uniwork.IQueryable<OutStorageInfoEntity>(a => a.F_IsTemp == true).Select(a => a.F_TransferBoxCode).ToList();
var realStorage = uniwork.IQueryable<StorageEntity>(a => a.F_MaterialCode == code && a.F_IsCheckout == true && !outinfos.Contains(a.F_TransferBoxCode)).OrderBy(a => a.F_MaterialBatch.Substring(4)).ToList();
if (realStorage == null || realStorage.Count() == 0)
{
return realStorage;
}
var id = realStorage.OrderBy(a => a.F_CreatorTime).ToList()[0].F_MaterialId;
var creatorTime = ((DateTime)realStorage[0].F_CreatorTime).Date;
if (string.IsNullOrEmpty(eqpName))
{
return realStorage;
}
realStorage = realStorage.Where(a => a.F_CreatorTime >= creatorTime && a.F_CreatorTime < creatorTime.AddDays(1)).OrderBy(a => a.F_LocationCode).ToList();
//根据设备获取工单,需要的物料
var eqp = await uniwork.FindEntity<EquipmentEntity>(a => a.F_EqpName == eqpName);
//是否不需要先出
var area = uniwork.IQueryable<LocationEntity>(a => a.F_LocationCode == realStorage[0].F_LocationCode).InnerJoin<AreaEntity>((a, b) => a.F_AreaCode == b.F_AreaCode).Select((a, b) => b).FirstOrDefault();
if ((area != null && area.F_NeedRule == false) || isAll)
{
realStorage = uniwork.IQueryable<StorageEntity>(a => a.F_MaterialCode == code && a.F_IsCheckout == true).OrderBy(a => a.F_LocationCode).ToList();
}
var work1 = uniwork.IQueryable<WorkOrderDetailEqpBandingEntity>(a => a.F_EqpId == eqp.F_Id)
.InnerJoin<WorkOrderDetailEntity>((a, b) => a.F_WorkOrderDetailId == b.F_Id && b.F_WorkOrderState == 1).Select((a,b)=>b);
var work=work1.InnerJoin<WorkOrderDetailProcessBandingEntity>((a, b) => a.F_Id == b.F_WorkOrderDetailId)
.InnerJoin<BomFormEntity>((a, b, c) => a.F_MaterialId == c.F_MaterialId&&c.F_ProcessId==b.F_ProcessId && c.F_BomType == 1 && c.F_SonMaterialId == id)
.InnerJoin<ProcessFlowEntity>((a, b, c, d) => c.F_ProcessId == d.F_Id)
.InnerJoin<WorkOrderEntity>((a, b, c, d, e) => a.F_WorkOrderId == e.F_Id)
.Select((a, b, c, d, e) => new WorkOrderDetailEntity
{
F_BadNum = a.F_BadNum,
F_CreatorTime = a.F_CreatorTime,
F_CreatorUserId = a.F_CreatorUserId,
F_DeleteMark = a.F_DeleteMark,
F_Description = a.F_Description,
F_DoneNum = a.F_DoneNum,
F_EnabledMark = a.F_EnabledMark,
F_Id = a.F_Id,
F_MaterialId = a.F_MaterialId,
F_PlanEndTime = a.F_PlanEndTime,
F_PlanNum = a.F_PlanNum,
F_PlanStartTime = a.F_PlanStartTime,
F_RunSort = a.F_RunSort,
F_SonMaterialId = c.F_SonMaterialId,
F_SonNum = a.F_PlanNum * c.F_Num,
F_WorkOrderId = a.F_WorkOrderId,
F_WorkOrderState = a.F_WorkOrderState,
F_ProcessId = c.F_ProcessId,
F_ProcessName = d.F_ProcessFlowName,
F_WorkOrderCode = e.F_WorkOrderCode
}).FirstOrDefault();
if (work == null)
{
throw new Exception("该设备不需要此物料");
}
//是否多工序作业
if (work.F_RunSort != 1)
{
if (uniwork.IQueryable<OutPutInfoEntity>(a => a.F_WorkOrderId == work.F_WorkOrderId && a.F_MaterialId == id && a.F_IsTemp != true).Count() > 0)
{
realStorage = uniwork.IQueryable<OutPutInfoEntity>(a => a.F_WorkOrderId == work.F_WorkOrderId && a.F_MaterialId == id && a.F_IsTemp != true)
.InnerJoin<StorageEntity>((a, b) => a.F_MaterialId == b.F_MaterialId
&& a.F_MaterialBatch == b.F_MaterialBatch).Select((a, b) => b).OrderBy(a => a.F_LocationCode).ToList();
//按规则只取最先批次
if (area == null || area.F_NeedRule == true || isAll == false)
{
var first = realStorage.FirstOrDefault();
var firstTime = ((DateTime)first.F_CreatorTime).Date;
realStorage = realStorage.Where(a => creatorTime >= firstTime && creatorTime < firstTime.AddDays(1)).OrderBy(a => a.F_LocationCode).ToList();
}
}
}
foreach (var item in realStorage)
{
item.F_AreaCode = area.F_AreaCode;
}
return realStorage;
}
public async Task<StorageEntity> GetLookForm(object keyValue)
{
var data = await repository.FindEntity(keyValue);
return GetFieldsFilterData(data);
}
public async Task<List<MaterialEntity>> GetCurrentClassNumStorage()
{
DateTime checkdate = DateTime.Now.Date;
DateTime starttime = DateTime.Now.Date;
DateTime endtime = DateTime.Now.Date;
string classNum = "";
var classNums = await itemsApp.GetItemList("Mes_ClassNumber");
var classStartTime = TimeSpan.Parse(classNums.FirstOrDefault().F_Description.Split("-")[0]);
var classEndTime = TimeSpan.Parse(classNums.FirstOrDefault().F_Description.Split("-")[1]);
var tempStartTime = classStartTime.TotalMinutes;
var tempEndTime = classEndTime.TotalMinutes;
var currentTime = DateTime.Now.TimeOfDay;
if (classNums.Count() == 1)
{
classNum = classNums[0].F_ItemCode;
starttime = checkdate.AddMinutes(tempStartTime);
endtime = checkdate.AddMinutes(tempEndTime);
}
else
{
if (TimeSpan.Compare(currentTime, classStartTime) < 0)
{
checkdate = DateTime.Now.Date.AddDays(-1);
}
tempEndTime = tempStartTime;
for (int j = 0; j < classNums.Count(); j++)
{
var startTime = TimeSpan.Parse(classNums[j].F_Description.Split("-")[0]).TotalMinutes;
var endTime = TimeSpan.Parse(classNums[j].F_Description.Split("-")[1]).TotalMinutes;
if (endTime > startTime)
{
tempEndTime += endTime - startTime;
}
else
{
tempEndTime += endTime + 24 * 60 - startTime;
}
if (DateTime.Now > checkdate.AddMinutes(tempStartTime) && DateTime.Now <= checkdate.AddMinutes(tempEndTime))
{
classNum = classNums[j].F_ItemCode;
starttime = checkdate.AddMinutes(tempStartTime);
endtime = checkdate.AddMinutes(tempEndTime);
break;
}
tempStartTime = tempEndTime;
}
}
var materials = uniwork.GetDbContext().Query<MaterialEntity>(a => a.F_EnabledMark == true && a.F_DeleteMark == false).OrderByDesc(a => a.F_MaterialType).ToList();
foreach (var item in materials)
{
var CurrentNum = uniwork.IQueryable<StorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_IsCheckout != false).Sum(a => a.F_Num) ?? 0;
var instoragenote = uniwork.IQueryable<InStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_PlanTime == checkdate && a.F_InStorageState <= 2).ToList();
var innoteids = instoragenote.Select(a => a.F_Id).ToList();
var tempinstorage = uniwork.IQueryable<InStorageInfoEntity>(a => a.F_IsTemp == true && a.F_MaterialId == item.F_Id && !innoteids.Contains(a.F_InStorageId)).Sum(a => a.F_Num) ?? 0;
var outstoragenote = uniwork.IQueryable<OutStorageEntity>(a => a.F_MaterialId == item.F_Id && a.F_PlanTime == checkdate && a.F_OutStorageState <= 2).ToList();
var tempoutput = uniwork.IQueryable<OutPutInfoEntity>(a => a.F_IsTemp == true && a.F_MaterialId == item.F_Id).Sum(a => a.F_Num) ?? 0;
item.F_Num = CurrentNum + tempinstorage + tempoutput;
item.F_StorageNum = CurrentNum + tempinstorage + tempoutput;
item.F_ReturnNum = 0;
item.F_DoneNum = 0;
}
return materials;
}
#endregion
public async Task DoChange()
{
var datetime = DateTime.Now.Date.AddDays(-1);
datetime = datetime.AddHours(8);
var storages = uniwork.IQueryable<StorageEntity>(a => a.F_MaterialCode == "B01000004" && a.F_CreatorTime<= datetime).ToList();
foreach (var item in storages)
{
StorageChangeInfoEntity entity = new StorageChangeInfoEntity();
entity.F_TransferBoxCode = item.F_TransferBoxCode;
entity.F_Num = item.F_Num;
entity.F_ChangeType = 2;
await StorageChange(entity, false);
}
}
#region
public async Task StorageChange(StorageChangeInfoEntity entity, bool isAttr = true, bool IsCommit = true)
{
var storage = uniwork.IQueryable<StorageEntity>(a => a.F_TransferBoxCode == entity.F_TransferBoxCode).FirstOrDefault();
if (storage == null)
{
throw new Exception($"流转箱{entity.F_TransferBoxCode}没有库存");
}
if (entity.F_ChangeType == 0 && entity.F_NewTransferBoxCode == entity.F_TransferBoxCode)
{
throw new Exception("流转箱不能相同数量");
}
if (entity.F_ChangeType == 1 && entity.F_NewLocationCode == storage.F_LocationCode)
{
throw new Exception("转移前后库位号不能相同");
}
if (uniwork.IQueryable<NeedCheckEntity>(a => a.F_TransferBoxCode == entity.F_TransferBoxCode && a.F_IsCheck == false).Count() > 0)
{
throw new Exception("物料正在检验,无法使用");
}
if (entity.F_ChangeType == 2)
{
entity.F_NewLocationCode = null;
entity.F_NewTransferBoxCode = null;
}
entity.F_Id = 0;
entity.F_StorageId = storage.F_Id;
entity.F_CreatorUserId = currentuser.UserCode;
entity.F_CreatorUserName = currentuser.UserName;
entity.F_CreatorTime = DateTime.Now;
entity.F_EnabledMark = true;
entity.F_MaterialCode = storage.F_MaterialCode;
entity.F_MaterialName = storage.F_MaterialName;
entity.F_MaterialType = storage.F_MaterialType;
entity.F_MaterialUnit = storage.F_MaterialUnit;
entity.F_MaterialBatch = storage.F_MaterialBatch;
entity.F_MaterialId = storage.F_MaterialId;
entity.F_LocationCode = storage.F_LocationCode;
entity.F_TransferBoxCode = storage.F_TransferBoxCode;
if (entity.F_Num > storage.F_Num)
{
throw new Exception("转移数量超出库存数量,请核对数量");
}
//流转箱判断
bool isMerge = false;
var newstorage = new StorageEntity();
if (!string.IsNullOrEmpty(entity.F_NewTransferBoxCode))
{
var transfer = uniwork.IQueryable<TransferBoxEntity>(a => a.F_TransferCode == entity.F_NewTransferBoxCode && a.F_EnabledMark == true && a.F_DeleteMark == false).FirstOrDefault();
if (transfer != null)
{
if (transfer.F_TransferType != "0" && uniwork.IQueryable<TransferTypeMaterialBandingEntity>(a => a.F_TransferType == transfer.F_TransferType && a.F_MaterialId == storage.F_MaterialId).Count() == 0)
{
throw new Exception($"流转箱{entity.F_NewTransferBoxCode}不可用");
}
if (transfer.F_TransferState == 0)
{
if (transfer.F_TransferMaxNum < entity.F_Num)
{
throw new Exception($"流转箱{entity.F_NewTransferBoxCode}不可用");
}
}
else if (transfer.F_TransferState == 2)
{
newstorage = await uniwork.FindEntity<StorageEntity>(a => a.F_TransferBoxCode == entity.F_NewTransferBoxCode && a.F_MaterialId == storage.F_MaterialId && a.F_MaterialBatch == storage.F_MaterialBatch && a.F_IsCheckout == storage.F_IsCheckout);
if (newstorage == null)
{
throw new Exception($"流转箱{entity.F_NewTransferBoxCode}不可用");
}
if (transfer.F_TransferMaxNum < entity.F_Num + newstorage.F_Num)
{
throw new Exception($"流转箱{entity.F_NewTransferBoxCode}可存放数量超出");
}
isMerge = true;
}
else
{
throw new Exception($"流转箱{entity.F_NewTransferBoxCode}不可用");
}
}
}
if (isAttr)
{
if (!string.IsNullOrEmpty(entity.F_NewLocationCode) && entity.F_NewLocationCode != entity.F_LocationCode && !IsUseLocation(entity.F_NewLocationCode, entity.F_MaterialCode))
{
throw new Exception($"库位{entity.F_NewLocationCode}不可用");
}
}
else
{
if (!string.IsNullOrEmpty(entity.F_NewLocationCode) && entity.F_NewLocationCode != entity.F_LocationCode && uniwork.IQueryable<LocationEntity>(a => a.F_LocationCode == entity.F_NewLocationCode && a.F_LocationState == true).Count() > 0)
{
throw new Exception($"库位{entity.F_NewLocationCode}不可用");
}
}
if (!isMerge)
{
newstorage.Create();
newstorage.F_CreatorTime = storage.F_CreatorTime;
newstorage.F_Num = entity.F_Num;
newstorage.F_MaterialCode = storage.F_MaterialCode;
newstorage.F_MaterialName = storage.F_MaterialName;
newstorage.F_MaterialType = storage.F_MaterialType;
newstorage.F_MaterialUnit = storage.F_MaterialUnit;
newstorage.F_MaterialBatch = storage.F_MaterialBatch;
newstorage.F_MaterialId = storage.F_MaterialId;
newstorage.F_EnabledMark = true;
newstorage.F_IsCheckout = storage.F_IsCheckout;
newstorage.F_TransferBoxCode = string.IsNullOrEmpty(entity.F_NewTransferBoxCode) ? entity.F_TransferBoxCode : entity.F_NewTransferBoxCode;
}
else
{
newstorage.F_Num += entity.F_Num;
}
newstorage.F_LocationCode = string.IsNullOrEmpty(entity.F_NewLocationCode) ? entity.F_LocationCode : entity.F_NewLocationCode;
uniwork.BeginTrans();
//更新库存
int resultId = await uniwork.Update<StorageEntity>(a => a.F_Id == storage.F_Id && a.F_Num >= entity.F_Num, a => new StorageEntity
{
F_Num = a.F_Num - entity.F_Num
});
if (resultId == 0)
{
throw new Exception("库存更新失败");
}
//删除0的库存
resultId = await uniwork.Delete<StorageEntity>(a => a.F_Id == storage.F_Id && a.F_Num == 0);
//更新库位状态
//更新流转箱状态
if (resultId == 0)
{
if (!string.IsNullOrEmpty(entity.F_NewTransferBoxCode))
{
await uniwork.Update<TransferBoxEntity>(a => a.F_TransferCode == entity.F_NewTransferBoxCode, a => new TransferBoxEntity
{
F_TransferState = 2,
F_LocationCode = string.IsNullOrEmpty(entity.F_NewLocationCode) ? entity.F_LocationCode : entity.F_NewLocationCode
});
}
if (!string.IsNullOrEmpty(entity.F_NewLocationCode))
{
await uniwork.Update<LocationEntity>(a => a.F_LocationCode == entity.F_NewLocationCode, a => new LocationEntity
{
F_LocationState = true
});
}
}
else
{
//修改流转箱状态
await uniwork.Update<TransferBoxEntity>(a => a.F_TransferCode == entity.F_TransferBoxCode, a => new TransferBoxEntity
{
F_TransferState = 0,
F_LocationCode = null
});
//如果临时容器转移,删除临时托盘
if (newstorage.F_TransferBoxCode != storage.F_TransferBoxCode)
{
await uniwork.Delete<TransferBoxEntity>(a => a.F_TransferCode == entity.F_TransferBoxCode && a.F_TransferState == 0 && a.F_IsTemp == true);
}
await uniwork.Update<LocationEntity>(a => a.F_LocationCode == entity.F_LocationCode, a => new LocationEntity
{
F_LocationState = false
});
if (storage.F_LocationCode != newstorage.F_LocationCode || storage.F_TransferBoxCode != newstorage.F_TransferBoxCode)
{
await uniwork.Update<TransferBoxEntity>(a => a.F_TransferCode == newstorage.F_TransferBoxCode, a => new TransferBoxEntity
{
F_TransferState = 2,
F_LocationCode = newstorage.F_LocationCode
});
await uniwork.Update<LocationEntity>(a => a.F_LocationCode == newstorage.F_LocationCode, a => new LocationEntity
{
F_LocationState = true
});
}
}
//增加变动信息
await uniwork.Insert(entity);
if (storage.F_LocationCode != newstorage.F_LocationCode || storage.F_TransferBoxCode != newstorage.F_TransferBoxCode)
{
//增加库存信息
if (!isMerge)
{
await uniwork.Insert(newstorage);
}
else
{
await uniwork.Update<StorageEntity>(a => a.F_Id == newstorage.F_Id, a => new StorageEntity
{
F_Num = a.F_Num + entity.F_Num,
F_LocationCode = newstorage.F_LocationCode
});
}
}
//更新任务
var job = uniwork.IQueryable<ControlJobEntity>(a => a.F_NeedId == storage.F_Id && a.F_JobType == 4 && a.F_FinishTime == null).FirstOrDefault();
if (job != null)
{
await jobApp.FinishJob(job.F_Id);
}
if (IsCommit)
{
uniwork.Commit();
}
}
/// <summary>
/// 判断库位是否可用
/// </summary>
/// <param name="locationCode"></param>
/// <returns></returns>
public bool IsUseLocation(string locationCode, string materialCode)
{
bool result = false;
if (!string.IsNullOrEmpty(locationCode))
{
var location = uniwork.IQueryable<LocationEntity>(a => a.F_LocationCode == locationCode && a.F_EnabledMark == true && a.F_DeleteMark == false && a.F_LocationState == false).FirstOrDefault();
if (location != null)
{
var area = uniwork.IQueryable<AreaEntity>(a => a.F_Id == location.F_AreaId).FirstOrDefault();
//先用绑定库位,然后使用非绑定库位
if (area.F_StackType != true)
{
var last = uniwork.IQueryable<LocationMaterialBandingEntity>(a => a.F_MaterialCode == materialCode).InnerJoin<LocationEntity>((a, b) => b.F_AreaId == area.F_Id && b.F_EnabledMark == true && b.F_DeleteMark == false && b.F_LocationState == false && a.F_LocationId == b.F_Id).Select((a, b) => b).OrderBy(a => a.F_SortCode).FirstOrDefault();
var list = new List<string>();
if (last != null)
{
list = uniwork.IQueryable<LocationMaterialBandingEntity>(a => a.F_MaterialCode == materialCode).InnerJoin<LocationEntity>((a, b) => b.F_AreaId == area.F_Id && b.F_EnabledMark == true && b.F_DeleteMark == false && b.F_LocationState == false && a.F_LocationId == b.F_Id && b.F_SortCode == last.F_SortCode).Select((a, b) => b).Select(a => a.F_LocationCode).ToList();
}
else
{
last = uniwork.IQueryable<LocationEntity>(a => a.F_AreaId == area.F_Id && a.F_EnabledMark == true && a.F_DeleteMark == false && a.F_LocationState == false && (a.F_MaterialName == null || a.F_MaterialName == "")).OrderBy(a => a.F_SortCode).FirstOrDefault();
list = uniwork.IQueryable<LocationEntity>(a => a.F_AreaId == area.F_Id && a.F_EnabledMark == true && a.F_DeleteMark == false && a.F_LocationState == false && (a.F_MaterialName == null || a.F_MaterialName == "") && a.F_SortCode == last.F_SortCode).OrderBy(a => a.F_SortCode).Select(a => a.F_LocationCode).ToList();
}
if (list.Contains(locationCode))
{
result = true;
}
}
else
{
var list = uniwork.IQueryable<LocationEntity>(a => a.F_AreaId == area.F_Id && a.F_EnabledMark == true && a.F_DeleteMark == false && a.F_LocationState == false).InnerJoin<LocationMaterialBandingEntity>((a, b) => a.F_Id == b.F_LocationId && b.F_MaterialCode == materialCode).Select((a, b) => a.F_LocationCode).ToList();
if (list != null && list.Count() > 0)
{
if (list.Contains(locationCode))
{
result = true;
}
}
else
{
list = uniwork.IQueryable<LocationEntity>(a => a.F_AreaId == area.F_Id && a.F_EnabledMark == true && a.F_DeleteMark == false && a.F_LocationState == false && (a.F_MaterialName == null || a.F_MaterialName == "")).Select(a => a.F_LocationCode).ToList();
if (list.Contains(locationCode))
{
result = true;
}
}
}
}
}
return result;
}
public async Task<List<StorageEntity>> CheckFile(string fileFullName)
{
if (!FileHelper.IsExcel(fileFullName))
{
throw new Exception("文件不是有效的Excel文件!");
}
//文件解析
var list = new ExcelHelper<StorageEntity>().ImportFromExcel(fileFullName);
//删除文件
File.Delete(fileFullName);
foreach (var item in list)
{
item.Create();
item.F_EnabledMark = true;
List<string> str = new List<string>();
if (string.IsNullOrEmpty(item.F_TransferBoxCode))
{
item.F_EnabledMark = false;
item.ErrorMsg = "流转箱编号不存在";
continue;
}
else if (repository.IQueryable(a => a.F_TransferBoxCode == item.F_TransferBoxCode).Count() > 0 || list.Where(a => a.F_TransferBoxCode == item.F_TransferBoxCode).Count() > 1)
{
str.Add("编号重复");
item.F_EnabledMark = false;
}
if (string.IsNullOrEmpty(item.F_MaterialCode))
{
item.F_EnabledMark = false;
str.Add("物料编号不存在");
continue;
}
if (item.F_Num == null)
{
item.F_EnabledMark = false;
str.Add("数量不存在");
continue;
}
if (item.F_EnabledMark == false)
{
item.ErrorMsg = string.Join(',', str.ToArray());
}
}
return list;
}
public async Task ImportForm(List<StorageEntity> filterList)
{
uniwork.BeginTrans();
int count = 1;
var now = DateTime.Now.ToString("yyyyMMddHHmmss");
now = "TMP-" + now.Substring(2, now.Length - 2);
foreach (var item in filterList)
{
//创建对象
item.Create();
var transfer = uniwork.IQueryable<TransferBoxEntity>(a => a.F_TransferCode == item.F_TransferBoxCode).FirstOrDefault();
if (transfer == null)
{
transfer = new TransferBoxEntity();
transfer.Create();
transfer.F_TransferCode = item.F_TransferBoxCode;
transfer.F_TransferMaxNum = item.F_Num;
transfer.F_IsTemp = true;
transfer.F_TransferState = 0;
transfer.F_TransferType = "0";
transfer.F_DeleteMark = false;
transfer.F_EnabledMark = true;
await uniwork.Insert(transfer);
}
if (transfer.F_TransferState != 0)
{
throw new Exception($"流转箱{item.F_TransferBoxCode}已被使用");
}
var material = uniwork.IQueryable<MaterialEntity>(a => a.F_MaterialCode == item.F_MaterialCode).FirstOrDefault();
if (material == null)
{
throw new Exception($"物料编号{item.F_MaterialCode}不存在物料");
}
if (count > 99)
{
item.F_MaterialBatch = now + count;
}
else if (count > 9)
{
item.F_MaterialBatch = now + "0" + count;
}
else
{
item.F_MaterialBatch = now + "00" + count;
}
count++;
item.F_MaterialCode = material.F_MaterialCode;
item.F_MaterialId = material.F_Id;
item.F_MaterialName = material.F_MaterialName;
item.F_MaterialType = material.F_MaterialType;
item.F_MaterialUnit = material.F_MaterialUnit;
item.F_IsCheckout = true;
if (string.IsNullOrEmpty(item.F_LocationCode))
{
var areaCode = "";
if (item.F_MaterialType == 0)
{
areaCode = uniwork.IQueryable<AreaEntity>(a => a.F_AreaType == 0).FirstOrDefault().F_AreaCode;
}
else
{
areaCode = uniwork.IQueryable<BomFormEntity>(a => a.F_MaterialId == item.F_MaterialId)
.InnerJoin<ProcessEqpBandingEntity>((a, b) => a.F_ProcessId == b.F_ProcessId)
.InnerJoin<EqpAreaBandingEntity>((a, b, c) => b.F_EqpId == c.F_EqpId)
.InnerJoin<AreaEntity>((a, b, c, d) => c.F_AreaId == d.F_Id).Select((a, b, c, d) => d.F_AreaCode).FirstOrDefault();
}
var locations = await locationApp.GetLocationList("", areaCode, material.F_MaterialCode);
var location = locations.Where(a => a.F_LocationState == false).FirstOrDefault();
item.F_LocationCode = location.F_LocationCode;
}
//创建入库记录
InStorageInfoEntity info = new InStorageInfoEntity();
info.F_Id = 0;
info.F_CreatorTime = DateTime.Now;
info.F_BandingTime = DateTime.Now;
info.F_CreatorUserId = currentuser.UserId;
info.F_BandingUserId = currentuser.UserId;
info.F_BandingUserName = currentuser.UserName;
info.F_CreatorUserName = currentuser.UserName;
info.F_Num = item.F_Num;
info.F_LocationCode = item.F_LocationCode;
info.F_IsTemp = false;
info.F_MaterialBatch = item.F_MaterialBatch;
info.F_MaterialCode = item.F_MaterialCode;
info.F_MaterialId = item.F_MaterialId;
info.F_MaterialName = item.F_MaterialName;
info.F_MaterialType = item.F_MaterialType;
info.F_MaterialUnit = item.F_MaterialUnit;
info.F_TransferBoxCode = item.F_TransferBoxCode;
info.F_EnabledMark = true;
info.F_OriginalBatch = item.F_MaterialBatch;
await uniwork.Insert(info);
await uniwork.Insert(item);
await uniwork.Update<TransferBoxEntity>(a => a.F_TransferCode == item.F_TransferBoxCode, a => new TransferBoxEntity
{
F_TransferState = 2,
F_LocationCode = item.F_LocationCode,
});
var result = await uniwork.Update<LocationEntity>(a => a.F_LocationCode == item.F_LocationCode && a.F_LocationState == false, a => new LocationEntity
{
F_LocationState = true,
});
if (result == 0)
{
throw new Exception("库位已被使用,请检查");
}
}
uniwork.Commit();
}
#endregion
}
}