389 lines
17 KiB
C#
389 lines
17 KiB
C#
using Infrastructure.Attribute;
|
|
using DOAN.Service.Mobile.IService;
|
|
using DOAN.Model.MES.mm;
|
|
using DOAN.Model.MES.base_;
|
|
using DOAN.Model.MES.product;
|
|
using DOAN.Model.Mobile.Dto;
|
|
using DOAN.Common.Mobile;
|
|
using Mapster;
|
|
using System;
|
|
using DOAN.Model.MES.product.Dto;
|
|
using DOAN.Infrastructure;
|
|
|
|
|
|
namespace DOAN.Service.Mobile
|
|
{
|
|
[AppService(ServiceType = typeof(IPreparationTaskService), ServiceLifetime = LifeTime.Transient)]
|
|
public class PreparationTaskService : BaseService<MmPreparationTask>, IPreparationTaskService
|
|
{
|
|
public List<BaseWorkRoute> GetLines()
|
|
{
|
|
return Context.Queryable<BaseWorkRoute>().Where(it => it.Status == 1).ToList();
|
|
}
|
|
|
|
|
|
public List<ProWorkorder> GetWorkOrderList(DateTime HandleDate, string route_code)
|
|
{
|
|
HandleDate = HandleDate.ToLocalTime().Date;
|
|
return Context.Queryable<ProWorkorder>().Where(it => it.WorkorderDate == HandleDate)
|
|
.Where(it => it.LineCode == route_code).ToList();
|
|
}
|
|
|
|
public MaterialModel ParseMaterialCode(string materialCode)
|
|
{
|
|
//1 解析原码
|
|
string materialCode_true = null;
|
|
materialCode_true = ParselabelHelper.ParseLabel01(materialCode);
|
|
|
|
//1 返回 物料详情
|
|
BaseMaterialList baseMaterial =
|
|
Context.Queryable<BaseMaterialList>().Where(it => it.Code == materialCode_true).First();
|
|
|
|
TypeAdapterConfig<BaseMaterialList, MaterialModel>.NewConfig()
|
|
.Map(dest => dest.MaterialName, (src) => src.Name)
|
|
.Map(dest => dest.Partnumber, (src) => src.Code)
|
|
.Map(dest => dest.Batchnumber, (src) => "")
|
|
.Map(dest => dest.quantity, (src) => 0)
|
|
.Map(dest => dest.Code, (src) => "")
|
|
.Map(dest => dest.Color, (src) => src.Color)
|
|
.Map(dest => dest.Specification, (src) => src.Specification)
|
|
.Map(dest => dest.Unit, (src) => src.Unit)
|
|
.Map(dest => dest.Description, (src) => src.Description);
|
|
|
|
return baseMaterial.Adapt<MaterialModel>();
|
|
}
|
|
|
|
public List<MmPreparationTask> GetWorkorderTask(string workorder)
|
|
{
|
|
return Context.Queryable<MmPreparationTask>().Where(it => it.FkWorkorder == workorder)
|
|
.OrderBy(it => it.SerialNum).ToList();
|
|
}
|
|
|
|
public List<MmTaskMaterialInfo> GetTaskInfos(string task_code)
|
|
{
|
|
return Context.Queryable<MmTaskMaterialInfo>().Where(it => it.FkTaskCode == task_code).ToList();
|
|
}
|
|
|
|
public int GenerateIngredientTask(IngredientTaskRequestForm form)
|
|
{
|
|
int result = 0;
|
|
// 生成任务
|
|
MmPreparationTask Max_task = Context.Queryable<MmPreparationTask>()
|
|
.Where(it => it.FkWorkorder == form.workorder)
|
|
.OrderByDescending(it => it.SerialNum)
|
|
.First();
|
|
int SerialNumMax = 0;
|
|
if (Max_task != null)
|
|
{
|
|
SerialNumMax = Max_task.SerialNum;
|
|
}
|
|
|
|
MmPreparationTask newMmPreparationTask = new MmPreparationTask();
|
|
newMmPreparationTask.Id = XueHua;
|
|
newMmPreparationTask.SerialNum = SerialNumMax + 1;
|
|
newMmPreparationTask.TaskCode = form.workorder + "_" + newMmPreparationTask.SerialNum;
|
|
newMmPreparationTask.FkWorkorder = form.workorder;
|
|
newMmPreparationTask.PreparationStatus = 2;
|
|
newMmPreparationTask.CreatedBy = "PDA";
|
|
newMmPreparationTask.CreatedTime = DateTime.Now;
|
|
List<MmTaskMaterialInfo> TaskDetailsinserted = new List<MmTaskMaterialInfo>();
|
|
//生成配料任务详情
|
|
if (form.Ingredient_task != null && form.Ingredient_task.Count() > 0)
|
|
{
|
|
foreach (var item in form.Ingredient_task)
|
|
{
|
|
MmTaskMaterialInfo materialInfo = new MmTaskMaterialInfo();
|
|
materialInfo.Id = XueHua;
|
|
materialInfo.FkTaskCode = newMmPreparationTask.TaskCode;
|
|
materialInfo.MaterialCode = item.MaterialCode;
|
|
materialInfo.MaterialName = item.MaterialName;
|
|
materialInfo.Specification = item.Specification;
|
|
materialInfo.Quantity = item.Quantity;
|
|
materialInfo.Unit = item.Unit;
|
|
materialInfo.CreatedBy = "PDA";
|
|
materialInfo.CreatedTime = DateTime.Now;
|
|
|
|
TaskDetailsinserted.Add(materialInfo);
|
|
}
|
|
}
|
|
|
|
UseTran2(() =>
|
|
{
|
|
Context.Insertable(TaskDetailsinserted).ExecuteCommand();
|
|
result = Context.Insertable(newMmPreparationTask).ExecuteCommand();
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
public List<CheckMaterialResult> CheckMaterialIsInDateAndLine(CheckMaterialDto checkMaterial)
|
|
{
|
|
List<CheckMaterialResult> CheckMaterialResultList = new List<CheckMaterialResult>();
|
|
//查询 日期 线 下所有工单
|
|
if (checkMaterial.HandelDate.Kind == DateTimeKind.Utc)
|
|
{
|
|
checkMaterial.HandelDate = checkMaterial.HandelDate.ToLocalTime();
|
|
}
|
|
|
|
checkMaterial.HandelDate = checkMaterial.HandelDate.Date;
|
|
|
|
|
|
// 查询工单下所有bom
|
|
List<BaseMaterialBom> bomss = Context.Queryable<BaseMaterialBom>().Where(ib => SqlFunc
|
|
.Subqueryable<ProWorkorder>().Where(it => it.WorkorderDate == checkMaterial.HandelDate)
|
|
.Where(it => it.LineCode == checkMaterial.LineCode).Where(it => it.ProductionCode == ib.InvCode)
|
|
.Any())
|
|
.ToList();
|
|
if (bomss != null && bomss.Count > 0)
|
|
{
|
|
if (checkMaterial.MatetialCodeArray.Length > 0)
|
|
{
|
|
for (int i = 0; i < checkMaterial.MatetialCodeArray.Length; i++)
|
|
{
|
|
if (bomss.Any(it => it.SubInvCode == checkMaterial.MatetialCodeArray[i]))
|
|
{
|
|
//materialResult.result = true;
|
|
}
|
|
else
|
|
{
|
|
CheckMaterialResult materialResult = new CheckMaterialResult();
|
|
materialResult.MatetialCode = checkMaterial.MatetialCodeArray[i];
|
|
materialResult.result = false;
|
|
CheckMaterialResultList.Add(materialResult);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return CheckMaterialResultList;
|
|
}
|
|
|
|
public bool CheckAnyPerationMaterialRequirement(DateTime handleDate, string line_code)
|
|
{
|
|
handleDate = ConvertDateTime.ConvertLocalDate(handleDate);
|
|
return Context.Queryable<ProWorkorder>().Where(it => it.WorkorderDate == handleDate)
|
|
.Where(it => it.LineCode == line_code).Any();
|
|
}
|
|
|
|
public List<MmPreparationTaskLine> SearchTaskByLine(string lineCode, DateTime hadleDate)
|
|
{
|
|
return Context.Queryable<MmPreparationTaskLine>().Where(it => it.LineCode == lineCode)
|
|
.Where(it => it.TaskDate == hadleDate).OrderBy(it => it.SerialNum).ToList();
|
|
}
|
|
|
|
public List<MmTaskMaterialInfoByLine> GetTaskInfosByLine(string task_code)
|
|
{
|
|
return Context.Queryable<MmTaskMaterialInfoByLine>().Where(it => it.FkTaskCode == task_code).ToList();
|
|
}
|
|
|
|
public int GenerateIngredientTaskByline(IngredientTaskRequestForm2 form)
|
|
{
|
|
int result = 0;
|
|
// 生成任务
|
|
form.HandleDate = form.HandleDate.ToLocalTime().Date;
|
|
MmPreparationTaskLine Max_task = Context.Queryable<MmPreparationTaskLine>()
|
|
.Where(it => it.LineCode == form.lineCode)
|
|
.Where(it => it.TaskDate == form.HandleDate)
|
|
.OrderByDescending(it => it.SerialNum)
|
|
.First();
|
|
int SerialNumMax = 0;
|
|
if (Max_task != null)
|
|
{
|
|
SerialNumMax = Max_task.SerialNum.Value;
|
|
}
|
|
|
|
MmPreparationTaskLine newMmPreparationTask = new MmPreparationTaskLine();
|
|
newMmPreparationTask.Id = XueHua;
|
|
newMmPreparationTask.SerialNum = SerialNumMax + 1;
|
|
newMmPreparationTask.TaskCode = form.HandleDate.ToString("yyyyMMdd") + "_" + form.lineCode + "_" +
|
|
newMmPreparationTask.SerialNum;
|
|
newMmPreparationTask.LineCode = form.lineCode;
|
|
newMmPreparationTask.TaskDate = form.HandleDate;
|
|
newMmPreparationTask.PreparationStatus = 2;
|
|
newMmPreparationTask.CreatedBy = "PDA";
|
|
newMmPreparationTask.CreatedTime = DateTime.Now;
|
|
List<MmTaskMaterialInfoByLine> TaskDetailsinserted = new List<MmTaskMaterialInfoByLine>();
|
|
//生成配料任务详情
|
|
if (form.Ingredient_task != null && form.Ingredient_task.Count() > 0)
|
|
{
|
|
foreach (var item in form.Ingredient_task)
|
|
{
|
|
MmTaskMaterialInfoByLine materialInfo = new MmTaskMaterialInfoByLine();
|
|
materialInfo.Id = XueHua;
|
|
materialInfo.FkTaskCode = newMmPreparationTask.TaskCode;
|
|
materialInfo.MaterialCode = item.MaterialCode;
|
|
materialInfo.MaterialName = item.MaterialName;
|
|
materialInfo.Specification = item.Specification;
|
|
materialInfo.Quantity = item.Quantity;
|
|
materialInfo.Unit = item.Unit;
|
|
materialInfo.CreatedBy = "PDA";
|
|
materialInfo.CreatedTime = DateTime.Now;
|
|
|
|
TaskDetailsinserted.Add(materialInfo);
|
|
}
|
|
}
|
|
|
|
//TODO 线边库入库
|
|
inbound(TaskDetailsinserted, form.lineCode);
|
|
|
|
UseTran2(() =>
|
|
{
|
|
Context.Insertable(TaskDetailsinserted).ExecuteCommand();
|
|
result = Context.Insertable(newMmPreparationTask).ExecuteCommand();
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
public int DeletePreparationMaterialTask(string task_code)
|
|
{
|
|
//TODO 取消入库
|
|
CancelInbound(task_code);
|
|
int rt = 0;
|
|
UseTran2(() =>
|
|
{
|
|
rt = Context.Deleteable<MmPreparationTaskLine>().Where(it => it.TaskCode == task_code).ExecuteCommand();
|
|
Context.Deleteable<MmTaskMaterialInfoByLine>().Where(it => it.FkTaskCode == task_code).ExecuteCommand();
|
|
});
|
|
|
|
return rt;
|
|
}
|
|
|
|
|
|
public int DeletePreparationMaterialInfo(string id)
|
|
{
|
|
//TODO 取消入库
|
|
string task_code = Context.Queryable<MmTaskMaterialInfoByLine>().Where(it => it.Id == id)
|
|
.Select(it => it.FkTaskCode).First();
|
|
CancelInbound(task_code);
|
|
return Context.Deleteable<MmTaskMaterialInfoByLine>().Where(it => it.Id == id).ExecuteCommand();
|
|
}
|
|
|
|
public int UpdatePreParationMaterialNum(string id, decimal num)
|
|
{
|
|
int result= Context.Updateable<MmTaskMaterialInfoByLine>().Where(it => it.Id == id)
|
|
.SetColumns(it => it.Quantity == num).ExecuteCommand();
|
|
// TODO 取消入库
|
|
|
|
string task_code = Context.Queryable<MmTaskMaterialInfoByLine>().Where(it => it.Id == id)
|
|
.Select(it => it.FkTaskCode).First();
|
|
CancelInbound(task_code);
|
|
//TODO 重新入库
|
|
string LineCode= Context.Queryable<MmPreparationTaskLine>().LeftJoin<MmTaskMaterialInfoByLine>((t, i) => t.TaskCode == i.FkTaskCode&&i.Id==id)
|
|
.Select((t,i)=>t.LineCode).First();
|
|
|
|
inbound(Context.Queryable<MmTaskMaterialInfoByLine>(
|
|
).Where(it=>it.Id == id).ToList(),LineCode);
|
|
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 线边库入库
|
|
/// </summary>
|
|
private void inbound(List<MmTaskMaterialInfoByLine> TaskDetailsinserted, string lineCode)
|
|
{
|
|
if (TaskDetailsinserted.Count() > 0)
|
|
{
|
|
string[] inboundMaterialArray = TaskDetailsinserted.Select(it => it.MaterialCode).ToArray();
|
|
|
|
//新增库容
|
|
var InventoryMaterialList = Context.Queryable<MmLinesidebarInventory>()
|
|
.Where(it => it.LineCode == lineCode)
|
|
.Where(it => inboundMaterialArray.Contains(it.MaterialCode))
|
|
.ToList();
|
|
// 入库日志
|
|
// List<MmLinesidebarInventoryOutboundAndInbound> insertMmLinesidebarInventoryInbound = new List<MmLinesidebarInventoryOutboundAndInbound>();
|
|
foreach (var materialInfo in TaskDetailsinserted)
|
|
{
|
|
if (InventoryMaterialList.Where(it => it.MaterialCode == materialInfo.MaterialCode).Any())
|
|
{
|
|
//更新
|
|
Context.Updateable<MmLinesidebarInventory>()
|
|
.SetColumns(it => it.LogicQuantity == it.LogicQuantity + materialInfo.Quantity)
|
|
.Where(it => it.MaterialCode == materialInfo.MaterialCode)
|
|
.Where(it => it.LineCode == lineCode)
|
|
.ExecuteCommand();
|
|
}
|
|
else
|
|
{
|
|
//新增
|
|
MmLinesidebarInventory inventory = new MmLinesidebarInventory();
|
|
inventory.Id = XueHua;
|
|
inventory.MaterialCode = materialInfo.MaterialCode;
|
|
inventory.MaterialName = materialInfo.MaterialName;
|
|
inventory.LogicQuantity = materialInfo.Quantity;
|
|
inventory.LineCode = lineCode;
|
|
inventory.CreatedBy = "PDA";
|
|
inventory.CreatedTime = DateTime.Now;
|
|
|
|
Context.Insertable(inventory).ExecuteCommand();
|
|
}
|
|
|
|
MmLinesidebarInventoryOutboundAndInbound inbound = new MmLinesidebarInventoryOutboundAndInbound();
|
|
inbound.Id = XueHua;
|
|
inbound.LineCode = lineCode;
|
|
inbound.MaterialCode = materialInfo.MaterialCode;
|
|
inbound.MaterialName = materialInfo.MaterialName;
|
|
inbound.Action = 3;
|
|
inbound.TaskCode = materialInfo.FkTaskCode;
|
|
inbound.Quantity = materialInfo.Quantity; //新增入库数量
|
|
inbound.CreatedBy = "PDA";
|
|
inbound.CreatedTime = DateTime.Now;
|
|
|
|
Context.Insertable(inbound).ExecuteCommand();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 取消入库
|
|
/// </summary>
|
|
/// <param name="task_code"></param>
|
|
private void CancelInbound(string task_code)
|
|
{
|
|
//查询日志 ,这个任务下 所有产线 对应 物料
|
|
var result = Context.Queryable<MmPreparationTaskLine>()
|
|
.LeftJoin<MmTaskMaterialInfoByLine>((t, i) => t.TaskCode == i.FkTaskCode)
|
|
.Where((t, i) => t.TaskCode == task_code)
|
|
.Select((t, i) => new
|
|
{
|
|
t.LineCode,
|
|
i.MaterialCode,
|
|
i.MaterialName,
|
|
i.Quantity,
|
|
})
|
|
.ToList();
|
|
if (result.Count() > 0)
|
|
{
|
|
foreach (var item in result)
|
|
{
|
|
MmLinesidebarInventory inventory_Reduce = new MmLinesidebarInventory();
|
|
inventory_Reduce.LineCode = item.LineCode;
|
|
inventory_Reduce.MaterialCode = item.MaterialCode;
|
|
inventory_Reduce.LogicQuantity = item.Quantity;
|
|
|
|
Context.Updateable<MmLinesidebarInventory>()
|
|
.Where(it => it.LineCode == inventory_Reduce.LineCode)
|
|
.Where(it => it.MaterialCode == inventory_Reduce.MaterialCode)
|
|
.SetColumns(it => it.LogicQuantity == it.LogicQuantity - inventory_Reduce.LogicQuantity)
|
|
.ExecuteCommand();
|
|
|
|
MmLinesidebarInventoryOutboundAndInbound inbound = new MmLinesidebarInventoryOutboundAndInbound();
|
|
inbound.Id = XueHua;
|
|
inbound.LineCode = item.LineCode;
|
|
inbound.TaskCode = task_code;
|
|
inbound.MaterialCode = item.MaterialCode;
|
|
inbound.MaterialName = item.MaterialName;
|
|
inbound.Quantity = inventory_Reduce.LogicQuantity;
|
|
inbound.Action = 4;
|
|
inbound.CreatedBy = "PDA";
|
|
inbound.Remark = $"人工删除任务,取消入库,任务号为{task_code}";
|
|
inbound.CreatedTime = DateTime.Now;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |