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

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

@@ -29,13 +29,25 @@ public static class DictConst
/// 工单状态-待排产
/// </summary>
public const string WaitProductId = "25019244276501";
/// <summary>
/// 工单状态-强制接单
/// </summary>
public const string MoCloseId = "25501969636645";
/// <summary>
/// 工单状态 已下发字典Id
/// </summary>
public const string IssueId = "25019232867093";
/// <summary>
/// 工单状态已下发
/// </summary>
public const string MoIssueEnCode = "Issue";
/// <summary>
/// 工单状态-关闭
/// </summary>
public const string MoClosedEnCode = "Close";
/// <summary>
/// 任务单状态-待开工编码
/// </summary>
public const string ToBeStartedEnCode = "ToBeStarted";
@@ -55,6 +67,8 @@ public static class DictConst
/// 任务单状态-待排产
/// </summary>
public const string ToBeScheduledEncode = "ToBeScheduled";
#endregion

View File

@@ -15,5 +15,11 @@ namespace Tnb.ProductionMgr.Entities.Dto
/// 生产工单Id列表
/// </summary>
public List<string> WorkOrderIds { get; set; }
/// <summary>
/// 操作形式
///<br/>Release 下发
///<br/>Closed 强制接单
/// </summary>
public string Behavior { get; set; }
}
}

View File

@@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
{
/// <summary>
/// 生产提报输入参数
/// </summary>
public class PrdReportCrInput
{
/// <summary>
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// Desc:扩展字段
/// Default:
/// Nullable:True
/// </summary>
public string extras { get; set; }
/// <summary>
/// Desc:备注
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string remark { get; set; }
/// <summary>
/// Desc:创建用户
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string create_id { get; set; }
/// <summary>
/// Desc:修改用户
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string modify_id { get; set; }
/// <summary>
/// Desc:生产任务Id
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string icmo_id { get; set; }
/// <summary>
/// Desc:生产数量
/// Default:
/// Nullable:True
/// </summary>
public int prd_qty { get; set; }
/// <summary>
/// Desc:已报工数量
/// Default:
/// Nullable:True
/// </summary>
public int reported_work_qty { get; set; }
/// <summary>
/// Desc:提报数量
/// Default:
/// Nullable:True
/// </summary>
public int reported_qty { get; set; }
/// <summary>
/// Desc:生产任务编码
/// Default:
/// Nullable:True
/// </summary>
public string icmo_code { get; set; }
/// <summary>
/// Desc:生产任务量
/// Default:
/// Nullable:True
/// </summary>
public int icmo_qty { get; set; }
}
}

View File

@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
{
public class PrdReportOutput
{
/// <summary>
/// 任务计划数
/// </summary>
public int? icmo_qty { get; set; }
/// <summary>
/// 已报工数量
/// </summary>
public int? reported_work_qty { get; set; }
/// <summary>
/// 提报数
/// </summary>
public int? reported_qty { get; set; }
/// <summary>
/// 生产数量
/// </summary>
public int? prd_qty { get; set; }
public int? scrap_qty { get; set; }
}
}

View File

@@ -195,6 +195,8 @@ namespace Tnb.ProductionMgr.Entities.Dto
/// </summary>
public string eqp_type_code { get; set; }
}

View File

@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
{
/// <summary>
/// 自检报废输入类
/// </summary>
public class SelfTestScrappedInput
{
/// <summary>
/// Desc:任务单号
/// Default:
/// Nullable:True
/// </summary>
public string icmo_code { get; set; }
/// <summary>
/// Desc:报废数量
/// Default:
/// Nullable:True
/// </summary>
public int scrap_qty { get; set; }
/// <summary>
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
public string remark { get; set; }
/// <summary>
/// 自检报废集合
/// </summary>
public List<SelfTestScrappedInputItem> categoryItems { get; set; }
}
public class SelfTestScrappedInputItem
{
public string defective_category { get; set; }
/// <summary>
/// Desc:分类数量
/// Default:
/// Nullable:True
/// </summary>
public int? category_qty { get; set; }
public List<SelfTestScrappedItem> items { get; set; }
}
}

View File

@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DbModels;
using Tnb.ProductionMgr.Entities;
namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
{
/// <summary>
/// 提报记录统计明细
/// </summary>
public class SelfTestScrappedOutput
{
/// <summary>
/// Desc:任务单号
/// Default:
/// Nullable:True
/// </summary>
public string icmo_code { get; set; }
/// <summary>
/// Desc:报废数量
/// Default:
/// Nullable:True
/// </summary>
public int scrap_qty { get; set; }
/// <summary>
/// 自检报废集合
/// </summary>
public List<SelfTestScrappedOutputItem> categoryItems { get; set; }
}
public class SelfTestScrappedOutputItem
{
public string defective_category { get; set; }
/// <summary>
/// Desc:分类数量
/// Default:
/// Nullable:True
/// </summary>
public int? category_qty { get; set; }
public List<PrdScrappedDefectiveItem> items { get; set; }
}
}

View File

@@ -0,0 +1,118 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Tnb.ProductionMgr.Entities
{
///<summary>
///生产提报记录
///</summary>
[SugarTable("prd_report")]
public partial class PrdReport
{
public PrdReport(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true)]
public string id {get;set;}
/// <summary>
/// Desc:时间戳
/// Default:
/// Nullable:True
/// </summary>
public DateTime? timestamp {get;set;}
/// <summary>
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? create_time {get;set;}
/// <summary>
/// Desc:修改时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? modify_time {get;set;}
/// <summary>
/// Desc:扩展字段
/// Default:
/// Nullable:True
/// </summary>
public string extras {get;set;}
/// <summary>
/// Desc:备注
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string remark {get;set;}
/// <summary>
/// Desc:创建用户
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string create_id {get;set;}
/// <summary>
/// Desc:修改用户
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string modify_id {get;set;}
/// <summary>
/// Desc:生产任务Id
/// Default:NULL::character varying
/// Nullable:True
/// </summary>
public string icmo_id {get;set;}
/// <summary>
/// Desc:生产数量
/// Default:
/// Nullable:True
/// </summary>
public int prd_qty {get;set;}
/// <summary>
/// Desc:已报工数量
/// Default:
/// Nullable:True
/// </summary>
public int? reported_work_qty {get;set;}
/// <summary>
/// Desc:报工数量
/// Default:
/// Nullable:True
/// </summary>
//public int? reported_qty {get;set;}
/// <summary>
/// Desc:生产任务编码
/// Default:
/// Nullable:True
/// </summary>
public string icmo_code {get;set;}
/// <summary>
/// Desc:生产任务量
/// Default:
/// Nullable:True
/// </summary>
public int? icmo_qty {get;set;}
}
}

View File

@@ -0,0 +1,76 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Tnb.ProductionMgr.Entities
{
///<summary>
///
///</summary>
[SugarTable("prd_report_record")]
public partial class PrdReportRecord
{
public PrdReportRecord(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true)]
public string id {get;set;}
/// <summary>
/// Desc:产品编码
/// Default:
/// Nullable:True
/// </summary>
public string item_code {get;set;}
/// <summary>
/// Desc:产品名称
/// Default:
/// Nullable:True
/// </summary>
public string item_name {get;set;}
/// <summary>
/// Desc:设备编码
/// Default:
/// Nullable:True
/// </summary>
public string eqp_code {get;set;}
/// <summary>
/// Desc:计划开始时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? plan_start_time {get;set;}
/// <summary>
/// Desc:计划结束时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? plan_end_time {get;set;}
/// <summary>
/// Desc:计划生产数量
/// Default:
/// Nullable:True
/// </summary>
public int? plan_qty {get;set;}
/// <summary>
/// Desc:完成数量
/// Default:
/// Nullable:True
/// </summary>
public int? completed_qty {get;set;}
}
}

View File

@@ -0,0 +1,59 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace DbModels
{
///<summary>
///TODO
///</summary>
[SugarTable("prd_self_test_scrapped")]
public class PrdScrapped
{
/// <summary>
/// Desc:编号
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public string id { get; set; }
/// <summary>
/// Desc:任务单号
/// Default:
/// Nullable:True
/// </summary>
public string icmo_code { get; set; }
/// <summary>
/// Desc:报废数量
/// Default:
/// Nullable:True
/// </summary>
public int scrap_qty { get; set; }
/// <summary>
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
public string remark { get; set; }
/// <summary>
/// Desc:创建用户
/// Default:
/// Nullable:True
/// </summary>
public string create_id { get; set; }
/// <summary>
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? create_time { get; set; }
}
}

View File

@@ -0,0 +1,60 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace DbModels
{
///<summary>
///TODO
///</summary>
[SugarTable("prd_self_test_scrapped_defective_cagetory")]
public partial class PrdScrappedDefectiveCagetory
{
/// <summary>
/// Desc:编号
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public string id { get; set; }
/// <summary>
/// Desc:任务单号
/// Default:
/// Nullable:True
/// </summary>
public string icmo_code { get; set; }
/// <summary>
/// Desc:次品分类
/// Default:
/// Nullable:True
/// </summary>
public string defective_category { get; set; }
/// <summary>
/// Desc:分类数量
/// Default:
/// Nullable:True
/// </summary>
public int? category_qty { get; set; }
/// <summary>
/// Desc:创建用户
/// Default:
/// Nullable:True
/// </summary>
public string create_id { get; set; }
/// <summary>
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? create_time { get; set; }
}
}

View File

@@ -0,0 +1,45 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace DbModels
{
///<summary>
///TODO
///</summary>
[SugarTable("prd_self_test_scrapped_defective_item")]
public partial class PrdScrappedDefectiveItem
{
/// <summary>
/// Desc:编号
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true)]
public string id {get;set;}
/// <summary>
/// Desc:自检报废id
/// Default:
/// Nullable:True
/// </summary>
public string defective_cagetory_id { get;set;}
/// <summary>
/// Desc:次品项
/// Default:
/// Nullable:True
/// </summary>
public string defective_item {get;set;}
/// <summary>
/// Desc:次品项数量
/// Default:
/// Nullable:True
/// </summary>
public int defective_item_qty {get;set;}
}
}

View File

@@ -0,0 +1,104 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Tnb.ProductionMgr.Entities
{
///<summary>
///
///</summary>
[SugarTable("prd_self_test_scrapped_record")]
public partial class PrdSelfTestScrappedRecord
{
public PrdSelfTestScrappedRecord(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true)]
public string id {get;set;}
/// <summary>
/// Desc:产品编码
/// Default:
/// Nullable:True
/// </summary>
public string item_code {get;set;}
/// <summary>
/// Desc:产品名称
/// Default:
/// Nullable:True
/// </summary>
public string item_name {get;set;}
/// <summary>
/// Desc:设备编码
/// Default:
/// Nullable:True
/// </summary>
public string eqp_code {get;set;}
/// <summary>
/// Desc:模具名称
/// Default:
/// Nullable:True
/// </summary>
public string mold_name {get;set;}
/// <summary>
/// Desc:预计开始时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? estimated_start_date {get;set;}
/// <summary>
/// Desc:预计结束时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? estimated_end_date {get;set;}
/// <summary>
/// Desc:计划生产数量
/// Default:
/// Nullable:True
/// </summary>
public int? plan_qty {get;set;}
/// <summary>
/// Desc:报废数量
/// Default:
/// Nullable:True
/// </summary>
public int scrap_qty { get;set;}
/// <summary>
/// Desc:生产任务单状态
/// Default:
/// Nullable:True
/// </summary>
public string status {get;set;}
/// <summary>
/// Desc:创建人Id
/// Default:
/// Nullable:True
/// </summary>
public string create_id {get;set;}
/// <summary>
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? create_time {get;set;}
}
}

View File

@@ -232,6 +232,10 @@ namespace Tnb.ProductionMgr.Entities
/// 同组标识
/// </summary>
public string group_flag { get; set; }
/// <summary>
/// 任务单号
/// </summary>
public string icmo_code { get; set; }
}
}

View File

@@ -0,0 +1,73 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Tnb.ProductionMgr.Entities
{
///<summary>
/// 自检报废
///</summary>
[SugarTable("self_test_scrapped")]
public partial class SelfTestScrapped
{
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public string id { get; set; }
/// <summary>
/// Desc:任务单号
/// Default:
/// Nullable:True
/// </summary>
public string icmo_code { get; set; }
/// <summary>
/// Desc:次品分类
/// Default:
/// Nullable:True
/// </summary>
public string defective_category { get; set; }
/// <summary>
/// Desc:分类数量
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnName = "category_qty")]
public int? category_qty { get; set; }
/// <summary>
/// Desc:报废数量
/// Default:
/// Nullable:True
/// </summary>
public int? scrap_qty { get; set; }
/// <summary>
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
public string remark { get; set; }
/// <summary>
/// Desc:创建人
/// Default:
/// Nullable:True
/// </summary>
public string create_id { get; set; }
/// <summary>
/// Desc:创建时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? create_time { get; set; }
}
}

View File

@@ -0,0 +1,44 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Tnb.ProductionMgr.Entities
{
///<summary>
///自检报废子表项
///</summary>
[SugarTable("self_test_scrapped_item")]
public partial class SelfTestScrappedItem
{
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public string id { get; set; }
/// <summary>
/// Desc:自检报废id
/// Default:
/// Nullable:True
/// </summary>
public string defective_cagetory_id { get; set; }
/// <summary>
/// Desc:次品项
/// Default:
/// Nullable:True
/// </summary>
public string defective_item { get; set; }
/// <summary>
/// Desc:次品项数量
/// Default:
/// Nullable:True
/// </summary>
public int defective_item_qty { get; set; }
}
}

View File

@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Spire.License;
namespace Tnb.ProductionMgr.Entities.Enums
{
public enum MoBehavior
{
/// <summary>
/// 下发
/// </summary>
Release=1,
/// <summary>
/// 强制结单
/// </summary>
Closed=2,
}
}

View File

@@ -1,6 +1,6 @@
namespace Tnb.ProductionMgr.Entities.Enums
{
public enum Behavior
public enum PrdTaskBehavior
{
/// <summary>
/// 任务下发

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

View File

@@ -0,0 +1,67 @@
using JNPF.Common.Const;
using JNPF.Common.Contracts;
using SqlSugar;
namespace JNPF.VisualDev.Entitys;
/// <summary>
/// 门户表.
/// </summary>
[SugarTable("base_hmi")]
[Tenant(ClaimConst.TENANTID)]
public class HmiEntity : CLDEntityBase
{
/// <summary>
/// 描述.
/// </summary>
[SugarColumn(ColumnName = "F_DESCRIPTION")]
public string Description { get; set; }
/// <summary>
/// 排序码.
/// </summary>
[SugarColumn(ColumnName = "F_SORTCODE")]
public long? SortCode { get; set; }
/// <summary>
/// 名称.
/// </summary>
[SugarColumn(ColumnName = "F_FULLNAME")]
public string FullName { get; set; }
/// <summary>
/// 编码.
/// </summary>
[SugarColumn(ColumnName = "F_ENCODE")]
public string EnCode { get; set; }
/// <summary>
/// 分类(数据字典维护).
/// </summary>
[SugarColumn(ColumnName = "F_CATEGORY")]
public string Category { get; set; }
/// <summary>
/// 表单配置JSON.
/// </summary>
[SugarColumn(ColumnName = "F_FORMDATA")]
public string FormData { get; set; }
/// <summary>
/// 类型(0-页面设计,1-自定义路径).
/// </summary>
[SugarColumn(ColumnName = "F_Type")]
public int? Type { get; set; }
/// <summary>
/// 静态页面路径.
/// </summary>
[SugarColumn(ColumnName = "F_CustomUrl")]
public string CustomUrl { get; set; }
/// <summary>
/// 链接类型(0-页面,1-外链).
/// </summary>
[SugarColumn(ColumnName = "F_LinkType")]
public int? LinkType { get; set; }
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aspose.Cells;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using Microsoft.AspNetCore.Mvc;
namespace Tnb.VisualDev
{
/// <summary>
/// 业务实现:人机界面
/// </summary>
[ApiDescriptionSettings(Tag = "VisualDev", Name = "Hmi", Order = 173)]
[Route("api/visualdev/[controller]")]
public class HmiService : IDynamicApiController, ITransient
{
}
}