生产管理,新增生产提报,自检报废接口

This commit is contained in:
DEVICE8\12494
2023-05-11 10:21:41 +08:00
parent 208e6258d3
commit 7bfa4eed8c
21 changed files with 1241 additions and 17 deletions

View File

@@ -1,5 +1,7 @@
using System.Reflection.Emit;
using System.Text;
using Aop.Api.Domain;
using DbModels;
using JNPF.Common.Core.Manager;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
@@ -14,13 +16,18 @@ using JNPF.VisualDev;
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging.Abstractions;
using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Crypto.Generators;
using Senparc.Weixin.Work.AdvancedAPIs.MailList;
using SqlSugar;
using Tnb.BasicData;
using Tnb.BasicData.Entities;
using Tnb.BasicData.Entitys.Entity;
using Tnb.EquipMgr.Entities;
using Tnb.ProductionMgr.Entities;
using Tnb.ProductionMgr.Entities.Dto;
using Tnb.ProductionMgr.Entities.Dto.PrdManage;
using Tnb.ProductionMgr.Entities.Enums;
using Tnb.ProductionMgr.Interfaces;
@@ -81,16 +88,16 @@ namespace Tnb.ProductionMgr
public async Task<dynamic> GetMoldListByItemId(string itemId)
{
var db = _repository.AsSugarClient();
var list = await db.Queryable<Molds>().InnerJoin<BasItem>((a, b) => a.item_id == b.id)
var list = await db.Queryable<Molds>().InnerJoin<BasMaterial>((a, b) => a.item_id == b.id)
.Where((a, b) => a.item_id == itemId)
.Select((a, b) => new MoldListOutput
{
mold_id = a.id,
mold_code = a.mold_code,
mold_name = a.mold_name,
item_name = b.product_name,
item_name = b.name,
cavity_qty = a.cavity_qty,
item_code = b.product_code,
item_code = b.code,
})
.ToListAsync();
return list;
@@ -180,6 +187,75 @@ namespace Tnb.ProductionMgr
_repository.AsSugarClient().ThenMapper(data, x => x.statusName = dic.ContainsKey(x.status) ? dic[x.status].ToString() : "");
return data;
}
/// <summary>
/// 根据任务单号获取提报记录明细
/// </summary>
/// <param name="icmoCode">任务单号</param>
/// <remarks>
/// returns:
///<br/> {
///<br/> icmo_qty:任务计划数量
///<br/> reported_work_qty:已报工数量
///<br/> reported_qty:报工数量
///<br/> prd_qty:生产数量
///<br/> }
/// </remarks>
[HttpGet("{icmoCode}")]
public async Task<dynamic> GetPrdReportByIcmoCode(string icmoCode)
{
var db = _repository.AsSugarClient();
var res = await db.Queryable<PrdReport>().Where(it => it.icmo_code == icmoCode).Select(it => new PrdReportOutput
{
icmo_qty = it.icmo_qty,
reported_work_qty = it.reported_work_qty,
//reported_qty = it.reported_qty,
prd_qty = it.prd_qty,
scrap_qty = SqlFunc.Subqueryable<PrdScrapped>().Select(x => x.scrap_qty),
})
.Mapper(it =>
{
it.icmo_qty = it.icmo_qty ?? (db.Queryable<PrdTask>().First(it => it.icmo_code == icmoCode)?.scheduled_qty < 1 ? 0 : it.icmo_qty ?? db.Queryable<PrdTask>().First(it => it.icmo_code == icmoCode).scheduled_qty);
it.reported_work_qty = it.reported_work_qty ?? 0;
//it.reported_qty = it.reported_qty ?? 0;
it.prd_qty = it.prd_qty ?? 0;
it.scrap_qty = it.scrap_qty ?? 0;
})
.FirstAsync();
res ??= new PrdReportOutput
{
icmo_qty = db.Queryable<PrdTask>().First(it => it.icmo_code == icmoCode)?.scheduled_qty,
reported_work_qty = 0,
//reported_qty = 0,
prd_qty = 0,
scrap_qty = 0,
};
return res;
}
/// <summary>
/// 获取提报生产记录
/// </summary>
/// <param name="icmoCode"></param>
/// <returns></returns>
[HttpGet("{icmoCode}")]
public async Task<dynamic> GetReportRecord(string icmoCode)
{
var db = _repository.AsSugarClient();
var output = new SelfTestScrappedOutput();
output.icmo_code = icmoCode;
var scrap = (await db.Queryable<PrdScrapped>().FirstAsync(it => it.icmo_code == icmoCode));
output.scrap_qty = scrap != null ? scrap.scrap_qty : 0;
output.categoryItems = new List<SelfTestScrappedOutputItem>();
var categorys = await db.Queryable<PrdScrappedDefectiveCagetory>().Where(it => it.icmo_code == icmoCode).ToListAsync();
foreach (var category in categorys)
{
var categoryItem = category.Adapt<SelfTestScrappedOutputItem>();
categoryItem.items = new List<PrdScrappedDefectiveItem>();
var items = await db.Queryable<PrdScrappedDefectiveItem>().Where(it => it.defective_cagetory_id == category.id).ToListAsync();
categoryItem.items.AddRange(items);
output.categoryItems.Add(categoryItem);
}
return output;
}
#endregion
@@ -197,6 +273,10 @@ namespace Tnb.ProductionMgr
{
throw new ArgumentNullException(nameof(input));
}
if (input.Behavior.IsNullOrWhiteSpace())
{
throw new ArgumentException($"{nameof(input.Behavior)},not be null or empty");
}
var db = _repository.AsSugarClient();
//获取同组工单的Id一起下发
@@ -207,8 +287,26 @@ namespace Tnb.ProductionMgr
input.WorkOrderIds = input.WorkOrderIds.Concat(moIds).ToList();
}
Tuple<string, string> getMoStatus(MoBehavior behavior)
{
Tuple<string, string> multi = null;
switch (behavior)
{
case MoBehavior.Release:
multi = Tuple.Create(DictConst.IssueId, DictConst.ToBeScheduledEncode);
break;
case MoBehavior.Closed:
multi = Tuple.Create(DictConst.MoCloseId, DictConst.ClosedEnCode);
break;
}
return multi!;
}
var behavior = input.Behavior.ToEnum<MoBehavior>();
var multi = getMoStatus(behavior);
var row = await db.Updateable<PrdMo>()
.SetColumns(it => new PrdMo { mo_status = DictConst.IssueId, icmo_status = DictConst.ToBeScheduledEncode })
.SetColumns(it => new PrdMo { mo_status = multi.Item1, icmo_status = multi.Item2 })
.Where(it => input.WorkOrderIds.Contains(it.id))
.ExecuteCommandAsync();
return (row > 0);
@@ -309,6 +407,7 @@ namespace Tnb.ProductionMgr
entity.create_id = _userManager.UserId;
entity.create_time = DateTime.Now;
entity.prd_task_id = input.id;
var db = _repository.AsSugarClient();
try
{
@@ -368,6 +467,26 @@ namespace Tnb.ProductionMgr
}
else
{
if (!input.mo_code.IsNullOrEmpty())
{
var icmoCode = await db.Queryable<PrdTask>().Where(it => !string.IsNullOrEmpty(it.icmo_code) && it.icmo_code.Contains(input.mo_code)).OrderByDescending(it => it.icmo_code).Select(it => it.icmo_code).FirstAsync();
if (icmoCode.IsNullOrEmpty())
{
entity.icmo_code = $"{input.mo_code}-01";
}
else
{
var pos = icmoCode.IndexOf("-", StringComparison.Ordinal);
if (pos > -1)
{
var sb = new StringBuilder();
var num = icmoCode.AsSpan().Slice(pos + 1).ToString().ParseToInt();
var code = icmoCode.AsSpan().Slice(pos + 1).ToString();
var n = (num + 1).ToString().PadLeft(2, '0');
entity.icmo_code = sb.Append(code).Append(n).ToString();
}
}
}
row = await db.Storageable(entity).ExecuteCommandAsync();
var taskLogEntity = input.Adapt<PrdTaskLog>();
taskLogEntity.id ??= SnowflakeIdHelper.NextId();
@@ -454,7 +573,7 @@ namespace Tnb.ProductionMgr
}
catch (Exception ex)
{
Log.Error("生产任务发布时发生错误", ex);
JNPF.Logging.Log.Error("生产任务发布时发生错误", ex);
await db.Ado.RollbackTranAsync();
}
}
@@ -483,18 +602,18 @@ namespace Tnb.ProductionMgr
{
throw new ArgumentException($"{nameof(input.Behavior)} not be null or empty");
}
string SetTaskStatus(Behavior behavior) => behavior switch
string SetTaskStatus(PrdTaskBehavior behavior) => behavior switch
{
Behavior.Release => DictConst.ToBeStartedEnCode,
Behavior.Start => DictConst.InProgressEnCode,
Behavior.Closed => DictConst.ClosedEnCode,
Behavior.Compled => DictConst.ComplatedEnCode,
PrdTaskBehavior.Release => DictConst.ToBeStartedEnCode,
PrdTaskBehavior.Start => DictConst.InProgressEnCode,
PrdTaskBehavior.Closed => DictConst.ClosedEnCode,
PrdTaskBehavior.Compled => DictConst.ComplatedEnCode,
_ => throw new NotImplementedException(),
};
Behavior behavior = input.Behavior.ToEnum<Behavior>();
PrdTaskBehavior behavior = input.Behavior.ToEnum<PrdTaskBehavior>();
var status = SetTaskStatus(behavior);
var db = _repository.AsSugarClient();
if (behavior == Behavior.Compled)
if (behavior == PrdTaskBehavior.Compled)
{
var list = await db.Queryable<PrdTask>().Where(it => input.TaskIds.Contains(it.id)).Select(it => it).ToListAsync();
if (list?.Count > 0)
@@ -508,9 +627,9 @@ namespace Tnb.ProductionMgr
}
}
row = await db.Updateable<PrdTask>()
.SetColumns(it => new PrdTask { status = status })
.Where(it => input.TaskIds.Contains(it.id))
.ExecuteCommandAsync();
.SetColumns(it => new PrdTask { status = status })
.Where(it => input.TaskIds.Contains(it.id))
.ExecuteCommandAsync();
return (row > 0);
}
@@ -551,6 +670,166 @@ namespace Tnb.ProductionMgr
row = await db.Updateable(icmoItem).ExecuteCommandAsync();
return (row > 0);
}
/// <summary>
/// 生产提报
/// </summary>
/// <param name="input"></param>
/// <remarks>
/// input:
/// <br/>{
/// <br/> icmo_id:生产任务ID
/// <br/> icmo_code:任务单号
/// <br/> prd_qty生产数量
/// <br/> reported_work_qty已报工数量
/// <br/> reported_qty提报数量
/// <br/> icmo_qty生产任务量
/// <br/>}
/// </remarks>
[HttpPost]
public async Task<dynamic> PrdReport(PrdReportCrInput input)
{
var row = -1;
var db = _repository.AsSugarClient();
var report = await db.Queryable<PrdReport>().FirstAsync(it => it.icmo_code == input.icmo_code);
if (report is not null)
{
report.reported_work_qty += input.reported_qty;
report.prd_qty += input.reported_qty;
}
else
{
report = input.Adapt<PrdReport>();
report.id = SnowflakeIdHelper.NextId();
report.reported_work_qty = input.reported_qty;
report.prd_qty = input.reported_qty;
}
row = await db.Storageable(report).ExecuteCommandAsync();
var prdTask = await db.Queryable<PrdTask>().FirstAsync(it => it.icmo_code == input.icmo_code);
var record = prdTask.Adapt<PrdReportRecord>();
if (prdTask != null)
{
record.eqp_code = (await db.Queryable<EqpEquipment>().FirstAsync(it => it.id == prdTask.eqp_id))?.eqp_code;
record.completed_qty = input.reported_qty;
row = await db.Insertable(record).ExecuteCommandAsync();
}
return row > 0;
}
/// <summary>
/// 自检报废提交
/// </summary>
/// <param name="input">自检报废输入参数</param>
/// <returns>true/false</returns>
/// <remarks>
/// input:
///<br/>{
///<br/> "icmo_code": 任务单号,
///<br/> "scrap_qty": 报废数量,
///<br/> "remark": 备注,
///<br/> "categoryItems": [
///<br/> {
///<br/> "defective_category":次品分类,
///<br/> "category_qty": 分类数量,
///<br/> "items": [
///<br/> {
///<br/> "defective_item": 次品项,
///<br/> "defective_item_qty": 次品项数量
///<br/> }
///<br/> ]
///<br/> }
///<br/> ]
///<br/>}
/// </remarks>
[HttpPost]
public async Task<dynamic> SelfTestScrapped(SelfTestScrappedInput input)
{
var db = _repository.AsSugarClient();
var prdScrapped = await db.Queryable<PrdScrapped>().FirstAsync(it => it.icmo_code == input.icmo_code);
if (prdScrapped is null)
{
prdScrapped = input.Adapt<PrdScrapped>();
prdScrapped.id = SnowflakeIdHelper.NextId();
prdScrapped.create_id = _userManager.UserId;
prdScrapped.create_time = DateTime.Now;
}
var result = await db.Ado.UseTranAsync(async () =>
{
var categorys = new List<PrdScrappedDefectiveCagetory>();
foreach (var categoryItem in input.categoryItems)
{
categorys = await db.Queryable<PrdScrappedDefectiveCagetory>().Where(it => it.icmo_code == input.icmo_code).ToListAsync();
if (categorys?.Count > 0)
{
foreach (var category in categorys)
{
var defectiveItems = categoryItem.items?.Select(x => x.defective_item).ToList();
var list = await db.Queryable<PrdScrappedDefectiveItem>().Where(it => defectiveItems!.Contains(it.defective_item)).ToListAsync();
category.category_qty = list?.Sum(it => it.defective_item_qty) + categoryItem.items.Sum(x => x.defective_item_qty);
if (list?.Count > 0)
{
if (categoryItem.items?.Count > 0)
{
foreach (var x in categoryItem.items)
{
var item = list.Find(f => f.defective_item == x.defective_item);
if (item != null)
{
item.defective_item_qty += x.defective_item_qty;
}
}
await db.Updateable(list).ExecuteCommandAsync();
}
}
}
await db.Updateable(categorys).ExecuteCommandAsync();
}
else
{
var category = categoryItem.Adapt<PrdScrappedDefectiveCagetory>();
category.id = SnowflakeIdHelper.NextId();
category.icmo_code = input.icmo_code;
category.create_id = _userManager.UserId;
category.create_time = DateTime.Now;
category.category_qty = categoryItem.items?.Sum(x => x.defective_item_qty);
categorys!.Add(category);
var items = new List<PrdScrappedDefectiveItem>();
if (categoryItem.items?.Count > 0)
{
foreach (var item in categoryItem.items)
{
var defectiveItem = item.Adapt<PrdScrappedDefectiveItem>();
defectiveItem.id = SnowflakeIdHelper.NextId();
defectiveItem.defective_cagetory_id = category.id;
items.Add(defectiveItem);
}
await db.Insertable(items).ExecuteCommandAsync();
}
await db.Insertable(category).ExecuteCommandAsync();
}
}
//var scrapQty = await db.Queryable<PrdScrappedDefectiveItem>().SumAsync(it => it.defective_item_qty);
//prdScrapped.scrap_qty = scrapQty;
var report = await db.Queryable<PrdReport>().FirstAsync(it => it.icmo_code == input.icmo_code);
if (report != null)
{
report.prd_qty += input.scrap_qty;
await db.Updateable<PrdReport>(report).ExecuteCommandAsync();
}
await db.Storageable(prdScrapped).ExecuteCommandAsync();
var prdTask = await db.Queryable<PrdTask>().FirstAsync(it => it.icmo_code == input.icmo_code);
var record = prdTask.Adapt<PrdSelfTestScrappedRecord>();
if (prdTask != null)
{
record.eqp_code = (await db.Queryable<EqpEquipment>().FirstAsync(it => it.id == prdTask.eqp_id))?.eqp_code;
record.scrap_qty = input.scrap_qty;
await db.Insertable(record).ExecuteCommandAsync();
}
});
return result.IsSuccess;
}
#endregion