Merge branch 'dev' of https://git.tuotong-tech.com/tnb/tnb.server into dev
This commit is contained in:
@@ -142,7 +142,7 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PrdMoReverseFromMaterialput
|
public class PrdMoReverseFromMaterialoutput
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 物料ID
|
/// 物料ID
|
||||||
@@ -153,6 +153,14 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string material_code { get; set; }
|
public string material_code { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// 物料名称
|
||||||
|
/// </summary>
|
||||||
|
public string material_name { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 物料规格
|
||||||
|
/// </summary>
|
||||||
|
public string material_standard { get; set; }
|
||||||
|
/// <summary>
|
||||||
/// 批次
|
/// 批次
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string code_batch { get; set;}
|
public string code_batch { get; set;}
|
||||||
@@ -208,6 +216,12 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
|
|||||||
/// 已投数量
|
/// 已投数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal feeding_num { get; set; }
|
public decimal feeding_num { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 使用状态
|
||||||
|
/// </summary>
|
||||||
|
public string use_status { get; set; }
|
||||||
|
public string supplier_name { get; set; }
|
||||||
|
public string unit_name { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -234,6 +248,7 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
|
|||||||
/// 投料子表id
|
/// 投料子表id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string feeding_detail_id { get; set; }
|
public string feeding_detail_id { get; set; }
|
||||||
|
public string mo_task_code { get; set; }
|
||||||
public string feeding_time { get; set; }
|
public string feeding_time { get; set; }
|
||||||
public decimal num { get; set; }
|
public decimal num { get; set; }
|
||||||
public string check_conclusion { get; set; }
|
public string check_conclusion { get; set; }
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
namespace Tnb.ProductionMgr.Entities.Entity
|
||||||
|
{
|
||||||
|
public class AppPrdMoTaskLogListOutput
|
||||||
|
{
|
||||||
|
public string id { get; set; }
|
||||||
|
public string mo_task_code { get; set; }
|
||||||
|
public string mo_task_status { get; set; }
|
||||||
|
public string material_id { get; set; }
|
||||||
|
public string material_id_id { get; set; }
|
||||||
|
public string material_code { get; set; }
|
||||||
|
public string material_name { get; set; }
|
||||||
|
public string mold_id { get; set; }
|
||||||
|
public string mold_id_id { get; set; }
|
||||||
|
public string mold_code { get; set; }
|
||||||
|
public string eqp_id { get; set; }
|
||||||
|
public string eqp_id_id { get; set; }
|
||||||
|
public string equip_code { get; set; }
|
||||||
|
|
||||||
|
public string process_id { get; set; }
|
||||||
|
public string process_id_id { get; set; }
|
||||||
|
public string process_code { get; set; }
|
||||||
|
public string mbom_process_id { get; set; }
|
||||||
|
public int? scheduled_qty { get; set; }
|
||||||
|
public int? reported_work_qty { get; set; }
|
||||||
|
public int? scrap_qty { get; set; }
|
||||||
|
|
||||||
|
public string plan_start_date { get; set; }
|
||||||
|
|
||||||
|
public string plan_end_date { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
namespace Tnb.ProductionMgr.Entities
|
||||||
|
{
|
||||||
|
public class AppPrdMoTaskOneListOutput
|
||||||
|
{
|
||||||
|
public string id { get; set; }
|
||||||
|
public string mo_task_code { get; set; }
|
||||||
|
public string mo_task_status { get; set; }
|
||||||
|
public string material_id { get; set; }
|
||||||
|
public string material_id_id { get; set; }
|
||||||
|
public string material_code { get; set; }
|
||||||
|
public string material_name { get; set; }
|
||||||
|
public string mold_id { get; set; }
|
||||||
|
public string mold_id_id { get; set; }
|
||||||
|
public string mold_code { get; set; }
|
||||||
|
public string eqp_id { get; set; }
|
||||||
|
public string eqp_id_id { get; set; }
|
||||||
|
public string equip_code { get; set; }
|
||||||
|
|
||||||
|
public string process_id { get; set; }
|
||||||
|
public string process_id_id { get; set; }
|
||||||
|
public string process_code { get; set; }
|
||||||
|
public string mbom_process_id { get; set; }
|
||||||
|
public int? scheduled_qty { get; set; }
|
||||||
|
public int? reported_work_qty { get; set; }
|
||||||
|
public int? scrap_qty { get; set; }
|
||||||
|
|
||||||
|
public string plan_start_date { get; set; }
|
||||||
|
|
||||||
|
public string plan_end_date { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -74,4 +74,14 @@ public partial class PrdMoTaskLog : BaseEntity<string>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string? mo_task_code { get; set; }
|
public string? mo_task_code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工位编号
|
||||||
|
/// </summary>
|
||||||
|
public string? station_code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工序编号
|
||||||
|
/// </summary>
|
||||||
|
public string? process_code { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
125
ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskLogService.cs
Normal file
125
ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskLogService.cs
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
using COSXML.Model.Tag;
|
||||||
|
using JNPF.Common.Core.Manager;
|
||||||
|
using JNPF.Common.Filter;
|
||||||
|
using JNPF.DependencyInjection;
|
||||||
|
using JNPF.DynamicApiController;
|
||||||
|
using JNPF.Systems.Entitys.System;
|
||||||
|
using JNPF.Systems.Interfaces.System;
|
||||||
|
using JNPF.VisualDev;
|
||||||
|
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
|
||||||
|
using JNPF.VisualDev.Interfaces;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using SqlSugar;
|
||||||
|
using Tnb.ProductionMgr.Entities;
|
||||||
|
using Tnb.BasicData.Entities;
|
||||||
|
using Tnb.EquipMgr.Entities;
|
||||||
|
using Tnb.BasicData;
|
||||||
|
|
||||||
|
namespace Tnb.ProductionMgr.APP
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 移动端任务单操作记录
|
||||||
|
/// </summary>
|
||||||
|
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)]
|
||||||
|
[Route("api/[area]/[controller]/[action]")]
|
||||||
|
[OverideVisualDev(ModuleId)]
|
||||||
|
public class AppPrdMoTaskLogService : IOverideVisualDevService, IDynamicApiController, ITransient
|
||||||
|
{
|
||||||
|
private const string ModuleId = "28491200142101";
|
||||||
|
private readonly ISqlSugarRepository<PrdMoTask> _repository;
|
||||||
|
private readonly IDictionaryDataService _dictionaryDataService;
|
||||||
|
private readonly IUserManager _userManager;
|
||||||
|
private readonly IRunService _runService;
|
||||||
|
private readonly IVisualDevService _visualDevService;
|
||||||
|
private readonly ISqlSugarClient _db;
|
||||||
|
private readonly IBillRullService _billRuleService;
|
||||||
|
|
||||||
|
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||||||
|
public AppPrdMoTaskLogService(
|
||||||
|
ISqlSugarRepository<PrdMoTask> repository,
|
||||||
|
IDictionaryDataService dictionaryDataService,
|
||||||
|
IUserManager userManager,
|
||||||
|
IRunService runService,
|
||||||
|
IBillRullService billRullService,
|
||||||
|
IVisualDevService visualDevService
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_repository = repository;
|
||||||
|
_userManager = userManager;
|
||||||
|
_runService = runService;
|
||||||
|
_visualDevService = visualDevService;
|
||||||
|
_db = _repository.AsSugarClient();
|
||||||
|
OverideFuncs.GetListAsync = GetList;
|
||||||
|
_dictionaryDataService = dictionaryDataService;
|
||||||
|
_billRuleService = billRullService;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<dynamic> GetList(VisualDevModelListQueryInput input)
|
||||||
|
{
|
||||||
|
var db = _repository.AsSugarClient();
|
||||||
|
Dictionary<string, string> queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(input.queryJson) : new Dictionary<string, string>();
|
||||||
|
string mo_task_code = queryJson.ContainsKey("mo_task_code") ? queryJson["mo_task_code"].ToString() : "";
|
||||||
|
string material_code = queryJson.ContainsKey("material_id") ? queryJson["material_id"].ToString() : "";
|
||||||
|
string equip_code = queryJson.ContainsKey("eqp_id") ? queryJson["eqp_id"].ToString() : "";
|
||||||
|
var result = await db.Queryable<PrdMoTask>()
|
||||||
|
.LeftJoin<BasMaterial>((a, b) => a.material_id == b.id)
|
||||||
|
.LeftJoin<ToolMolds>((a, b, c) => a.mold_id == c.id)
|
||||||
|
.LeftJoin<EqpEquipment>((a, b, c, d) => a.eqp_id == d.id)
|
||||||
|
.LeftJoin<DictionaryDataEntity>((a, b, c, d, e) => e.EnCode == a.mo_task_status && e.DictionaryTypeId == DictConst.PrdTaskStatusTypeId)
|
||||||
|
.LeftJoin<BasProcess>((a,b,c,d,e,f)=>a.process_id==f.id)
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(mo_task_code), (a, b, c, d, e) => a.mo_task_code.Contains(mo_task_code))
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e) => b.code.Contains(material_code) || b.name.Contains(material_code))
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(equip_code), (a, b, c, d, e) => d.code.Contains(equip_code) || d.name.Contains(equip_code))
|
||||||
|
.OrderByDescending(a => a.create_time)
|
||||||
|
.Select((a, b, c, d, e,f) => new AppPrdMoTaskOneListOutput
|
||||||
|
{
|
||||||
|
id = a.id,
|
||||||
|
mo_task_code = a.mo_task_code,
|
||||||
|
mo_task_status = e.FullName,
|
||||||
|
material_id_id = a.material_id,
|
||||||
|
material_id = b.code+"/"+b.name,
|
||||||
|
material_code = b.code,
|
||||||
|
material_name = b.name,
|
||||||
|
mold_id_id = a.mold_id,
|
||||||
|
mold_id = c.mold_code,
|
||||||
|
mold_code = c.mold_code,
|
||||||
|
eqp_id_id = a.eqp_id,
|
||||||
|
eqp_id = d.code,
|
||||||
|
equip_code = d.code,
|
||||||
|
process_id_id = a.process_id,
|
||||||
|
process_id = f.process_name,
|
||||||
|
process_code = f.process_code,
|
||||||
|
mbom_process_id = a.mbom_process_id,
|
||||||
|
scheduled_qty = a.scheduled_qty,
|
||||||
|
reported_work_qty = a.reported_work_qty,
|
||||||
|
scrap_qty = a.scrap_qty,
|
||||||
|
plan_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString("yyyy-MM-dd"),
|
||||||
|
plan_end_date = a.plan_end_date==null ? "" : a.plan_end_date.Value.ToString("yyyy-MM-dd"),
|
||||||
|
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||||
|
return PageResult<AppPrdMoTaskOneListOutput>.SqlSugarPageResult(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据任务单id获取操作记录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dic"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<dynamic> GetLogById(Dictionary<string, string> dic)
|
||||||
|
{
|
||||||
|
string mo_task_id = dic.ContainsKey("mo_task_id") ? dic["mo_task_id"] : "";
|
||||||
|
if (string.IsNullOrEmpty(mo_task_id)) return Array.Empty<string>();
|
||||||
|
Dictionary<string,object> statsDic = await _dictionaryDataService.GetDicByTypeId(DictConst.PrdTaskStatusTypeId);
|
||||||
|
return await _db.Queryable<PrdMoTaskLog>().Where(x=>x.mo_task_id==mo_task_id)
|
||||||
|
.OrderBy(x=>x.create_time)
|
||||||
|
.Mapper(x =>
|
||||||
|
{
|
||||||
|
if (statsDic.ContainsKey(x.status))
|
||||||
|
{
|
||||||
|
x.status = statsDic[x.status].ToString();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
using COSXML.Model.Tag;
|
||||||
|
using JNPF.Common.Core.Manager;
|
||||||
|
using JNPF.Common.Filter;
|
||||||
|
using JNPF.DependencyInjection;
|
||||||
|
using JNPF.DynamicApiController;
|
||||||
|
using JNPF.Systems.Entitys.System;
|
||||||
|
using JNPF.Systems.Interfaces.System;
|
||||||
|
using JNPF.VisualDev;
|
||||||
|
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
|
||||||
|
using JNPF.VisualDev.Interfaces;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using SqlSugar;
|
||||||
|
using Tnb.ProductionMgr.Entities;
|
||||||
|
using Tnb.BasicData.Entities;
|
||||||
|
using Tnb.EquipMgr.Entities;
|
||||||
|
using Tnb.BasicData;
|
||||||
|
|
||||||
|
namespace Tnb.ProductionMgr.APP
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 移动端注塑挤出任务管理
|
||||||
|
/// </summary>
|
||||||
|
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)]
|
||||||
|
[Route("api/[area]/[controller]/[action]")]
|
||||||
|
[OverideVisualDev(ModuleId)]
|
||||||
|
public class AppPrdMoTaskOneService : IOverideVisualDevService, IDynamicApiController, ITransient
|
||||||
|
{
|
||||||
|
private const string ModuleId = "27890354204949";
|
||||||
|
private readonly ISqlSugarRepository<PrdMoTask> _repository;
|
||||||
|
private readonly IUserManager _userManager;
|
||||||
|
private readonly IRunService _runService;
|
||||||
|
private readonly IVisualDevService _visualDevService;
|
||||||
|
private readonly ISqlSugarClient _db;
|
||||||
|
private readonly IBillRullService _billRuleService;
|
||||||
|
|
||||||
|
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||||||
|
public AppPrdMoTaskOneService(
|
||||||
|
ISqlSugarRepository<PrdMoTask> repository,
|
||||||
|
IUserManager userManager,
|
||||||
|
IRunService runService,
|
||||||
|
IBillRullService billRullService,
|
||||||
|
IVisualDevService visualDevService
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_repository = repository;
|
||||||
|
_userManager = userManager;
|
||||||
|
_runService = runService;
|
||||||
|
_visualDevService = visualDevService;
|
||||||
|
_db = _repository.AsSugarClient();
|
||||||
|
OverideFuncs.GetListAsync = GetList;
|
||||||
|
_billRuleService = billRullService;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<dynamic> GetList(VisualDevModelListQueryInput input)
|
||||||
|
{
|
||||||
|
var db = _repository.AsSugarClient();
|
||||||
|
Dictionary<string, string> queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(input.queryJson) : new Dictionary<string, string>();
|
||||||
|
string mo_task_code = queryJson.ContainsKey("mo_task_code") ? queryJson["mo_task_code"].ToString() : "";
|
||||||
|
string material_code = queryJson.ContainsKey("material_id") ? queryJson["material_id"].ToString() : "";
|
||||||
|
string equip_code = queryJson.ContainsKey("eqp_id") ? queryJson["eqp_id"].ToString() : "";
|
||||||
|
var result = await db.Queryable<PrdMoTask>()
|
||||||
|
.LeftJoin<BasMaterial>((a, b) => a.material_id == b.id)
|
||||||
|
.LeftJoin<ToolMolds>((a, b, c) => a.mold_id == c.id)
|
||||||
|
.LeftJoin<EqpEquipment>((a, b, c, d) => a.eqp_id == d.id)
|
||||||
|
.LeftJoin<DictionaryDataEntity>((a, b, c, d, e) => e.EnCode == a.mo_task_status && e.DictionaryTypeId == DictConst.PrdTaskStatusTypeId)
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(mo_task_code), (a, b, c, d, e) => a.mo_task_code.Contains(mo_task_code))
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e) => b.code.Contains(material_code) || b.name.Contains(material_code))
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(equip_code), (a, b, c, d, e) => d.code.Contains(equip_code) || d.name.Contains(equip_code))
|
||||||
|
.Where(a => a.schedule_type == 1)
|
||||||
|
.Where(a => (a.mo_task_status==DictConst.ToBeStartedEnCode || a.mo_task_status==DictConst.InProgressEnCode || a.mo_task_status==DictConst.MoStatusExceptionCode || a.mo_task_status==DictConst.MoStatusPauseCode || a.mo_task_status==DictConst.ComplatedEnCode))
|
||||||
|
.OrderByDescending(a => a.create_time)
|
||||||
|
.Select((a, b, c, d, e) => new AppPrdMoTaskOneListOutput
|
||||||
|
{
|
||||||
|
id = a.id,
|
||||||
|
mo_task_code = a.mo_task_code,
|
||||||
|
mo_task_status = e.FullName,
|
||||||
|
material_id_id = a.material_id,
|
||||||
|
material_id = b.code+"/"+b.name,
|
||||||
|
material_code = b.code,
|
||||||
|
material_name = b.name,
|
||||||
|
mold_id_id = a.mold_id,
|
||||||
|
mold_id = c.mold_code,
|
||||||
|
mold_code = c.mold_code,
|
||||||
|
eqp_id_id = a.eqp_id,
|
||||||
|
eqp_id = d.code,
|
||||||
|
equip_code = d.code,
|
||||||
|
scheduled_qty = a.scheduled_qty,
|
||||||
|
reported_work_qty = a.reported_work_qty,
|
||||||
|
scrap_qty = a.scrap_qty,
|
||||||
|
plan_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString("yyyy-MM-dd"),
|
||||||
|
plan_end_date = a.plan_end_date==null ? "" : a.plan_end_date.Value.ToString("yyyy-MM-dd"),
|
||||||
|
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||||
|
return PageResult<AppPrdMoTaskOneListOutput>.SqlSugarPageResult(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
101
ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs
Normal file
101
ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
using COSXML.Model.Tag;
|
||||||
|
using JNPF.Common.Core.Manager;
|
||||||
|
using JNPF.Common.Filter;
|
||||||
|
using JNPF.DependencyInjection;
|
||||||
|
using JNPF.DynamicApiController;
|
||||||
|
using JNPF.Systems.Entitys.System;
|
||||||
|
using JNPF.Systems.Interfaces.System;
|
||||||
|
using JNPF.VisualDev;
|
||||||
|
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
|
||||||
|
using JNPF.VisualDev.Interfaces;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using SqlSugar;
|
||||||
|
using Tnb.ProductionMgr.Entities;
|
||||||
|
using Tnb.BasicData.Entities;
|
||||||
|
using Tnb.EquipMgr.Entities;
|
||||||
|
using Tnb.BasicData;
|
||||||
|
|
||||||
|
namespace Tnb.ProductionMgr.APP
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 移动端组装包装任务管理
|
||||||
|
/// </summary>
|
||||||
|
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)]
|
||||||
|
[Route("api/[area]/[controller]/[action]")]
|
||||||
|
[OverideVisualDev(ModuleId)]
|
||||||
|
public class AppPrdMoTaskTwoService : IOverideVisualDevService, IDynamicApiController, ITransient
|
||||||
|
{
|
||||||
|
private const string ModuleId = "28486997557781";
|
||||||
|
private readonly ISqlSugarRepository<PrdMoTask> _repository;
|
||||||
|
private readonly IUserManager _userManager;
|
||||||
|
private readonly IRunService _runService;
|
||||||
|
private readonly IVisualDevService _visualDevService;
|
||||||
|
private readonly ISqlSugarClient _db;
|
||||||
|
private readonly IBillRullService _billRuleService;
|
||||||
|
|
||||||
|
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||||||
|
public AppPrdMoTaskTwoService(
|
||||||
|
ISqlSugarRepository<PrdMoTask> repository,
|
||||||
|
IUserManager userManager,
|
||||||
|
IRunService runService,
|
||||||
|
IBillRullService billRullService,
|
||||||
|
IVisualDevService visualDevService
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_repository = repository;
|
||||||
|
_userManager = userManager;
|
||||||
|
_runService = runService;
|
||||||
|
_visualDevService = visualDevService;
|
||||||
|
_db = _repository.AsSugarClient();
|
||||||
|
OverideFuncs.GetListAsync = GetList;
|
||||||
|
_billRuleService = billRullService;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<dynamic> GetList(VisualDevModelListQueryInput input)
|
||||||
|
{
|
||||||
|
var db = _repository.AsSugarClient();
|
||||||
|
Dictionary<string, string> queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(input.queryJson) : new Dictionary<string, string>();
|
||||||
|
string mo_task_code = queryJson.ContainsKey("mo_task_code") ? queryJson["mo_task_code"].ToString() : "";
|
||||||
|
string material_code = queryJson.ContainsKey("material_id") ? queryJson["material_id"].ToString() : "";
|
||||||
|
string equip_code = queryJson.ContainsKey("eqp_id") ? queryJson["eqp_id"].ToString() : "";
|
||||||
|
var result = await db.Queryable<PrdMoTask>()
|
||||||
|
.LeftJoin<BasMaterial>((a, b) => a.material_id == b.id)
|
||||||
|
.LeftJoin<ToolMolds>((a, b, c) => a.mold_id == c.id)
|
||||||
|
.LeftJoin<EqpEquipment>((a, b, c, d) => a.eqp_id == d.id)
|
||||||
|
.LeftJoin<DictionaryDataEntity>((a, b, c, d, e) => e.EnCode == a.mo_task_status && e.DictionaryTypeId == DictConst.PrdTaskStatusTypeId)
|
||||||
|
.LeftJoin<BasProcess>((a,b,c,d,e,f)=>a.process_id==f.id)
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(mo_task_code), (a, b, c, d, e) => a.mo_task_code.Contains(mo_task_code))
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e) => b.code.Contains(material_code) || b.name.Contains(material_code))
|
||||||
|
.WhereIF(!string.IsNullOrEmpty(equip_code), (a, b, c, d, e) => d.code.Contains(equip_code) || d.name.Contains(equip_code))
|
||||||
|
.Where(a => a.schedule_type == 2)
|
||||||
|
.Where(a => (a.mo_task_status==DictConst.ToBeStartedEnCode || a.mo_task_status==DictConst.InProgressEnCode || a.mo_task_status==DictConst.MoStatusExceptionCode || a.mo_task_status==DictConst.MoStatusPauseCode || a.mo_task_status==DictConst.ComplatedEnCode))
|
||||||
|
.OrderByDescending(a => a.create_time)
|
||||||
|
.Select((a, b, c, d, e,f) => new AppPrdMoTaskOneListOutput
|
||||||
|
{
|
||||||
|
id = a.id,
|
||||||
|
mo_task_code = a.mo_task_code,
|
||||||
|
mo_task_status = e.FullName,
|
||||||
|
material_id_id = a.material_id,
|
||||||
|
material_id = b.code+"/"+b.name,
|
||||||
|
material_code = b.code,
|
||||||
|
material_name = b.name,
|
||||||
|
mold_id_id = a.mold_id,
|
||||||
|
mold_id = c.mold_code,
|
||||||
|
mold_code = c.mold_code,
|
||||||
|
eqp_id_id = a.eqp_id,
|
||||||
|
eqp_id = d.code,
|
||||||
|
equip_code = d.code,
|
||||||
|
process_id_id = a.process_id,
|
||||||
|
process_id = f.process_name,
|
||||||
|
process_code = f.process_code,
|
||||||
|
mbom_process_id = a.mbom_process_id,
|
||||||
|
scheduled_qty = a.scheduled_qty,
|
||||||
|
reported_work_qty = a.reported_work_qty,
|
||||||
|
scrap_qty = a.scrap_qty,
|
||||||
|
plan_start_date = a.estimated_start_date==null ? "" : a.estimated_start_date.Value.ToString("yyyy-MM-dd"),
|
||||||
|
plan_end_date = a.plan_end_date==null ? "" : a.plan_end_date.Value.ToString("yyyy-MM-dd"),
|
||||||
|
}).ToPagedListAsync(input.currentPage, input.pageSize);
|
||||||
|
return PageResult<AppPrdMoTaskOneListOutput>.SqlSugarPageResult(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -873,12 +873,24 @@ namespace Tnb.ProductionMgr
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PageResult<PrdMoReverseFromMaterialput> output = JsonConvert.DeserializeObject<PageResult<PrdMoReverseFromMaterialput>>(authResponse.data.ToString(),new Tnb.Common.Utils.DateTimeJsonConverter());
|
PageResult<PrdMoReverseFromMaterialoutput> output = JsonConvert.DeserializeObject<PageResult<PrdMoReverseFromMaterialoutput>>(authResponse.data.ToString(),new Tnb.Common.Utils.DateTimeJsonConverter());
|
||||||
if (output.list != null && output.list.Count > 0)
|
if (output.list != null && output.list.Count > 0)
|
||||||
{
|
{
|
||||||
|
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().SingleAsync(x=>x.id==output.list[0].material_id);
|
||||||
|
BasSupplier basSupplier = await _db.Queryable<BasSupplier>().SingleAsync(x=>x.id==output.list[0].supplier_id);
|
||||||
|
DictionaryDataEntity unit = await _db.Queryable<DictionaryTypeEntity>()
|
||||||
|
.LeftJoin<DictionaryDataEntity>((a,b)=>a.Id==b.DictionaryTypeId)
|
||||||
|
.Where((a,b)=>a.EnCode==DictConst.MeasurementUnit && b.EnCode==output.list[0].unit_id)
|
||||||
|
.Select((a,b)=>b)
|
||||||
|
.FirstAsync();
|
||||||
output.list[0].feeding_num = await _db.Queryable<PrdMaterialReceiptD>()
|
output.list[0].feeding_num = await _db.Queryable<PrdMaterialReceiptD>()
|
||||||
.LeftJoin<PrdFeedingD>((a, b) => a.id == b.material_receipt_detail_id)
|
.LeftJoin<PrdFeedingD>((a, b) => a.id == b.material_receipt_detail_id)
|
||||||
.Where((a, b) => a.barcode == barcode).SumAsync((a, b) => b.num);
|
.Where((a, b) => a.barcode == barcode).SumAsync((a, b) => b.num);
|
||||||
|
output.list[0].material_name = basMaterial.name;
|
||||||
|
output.list[0].material_standard = basMaterial.material_standard;
|
||||||
|
output.list[0].supplier_name = basSupplier.supplier_name;
|
||||||
|
output.list[0].unit_name = unit.FullName;
|
||||||
|
|
||||||
return output.list[0];
|
return output.list[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2062,7 +2062,7 @@ namespace Tnb.ProductionMgr
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
|
if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
|
||||||
return result.IsSuccess ? "延期成功" : result.ErrorMessage;
|
return result.IsSuccess ? "更换成功" : result.ErrorMessage;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2109,7 +2109,7 @@ namespace Tnb.ProductionMgr
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
|
if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
|
||||||
return result.IsSuccess ? "延期成功" : result.ErrorMessage;
|
return result.IsSuccess ? "更换成功" : result.ErrorMessage;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2156,7 +2156,51 @@ namespace Tnb.ProductionMgr
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
|
if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
|
||||||
return result.IsSuccess ? "延期成功" : result.ErrorMessage;
|
return result.IsSuccess ? "更换成功" : result.ErrorMessage;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据id获取任务单相关信息
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<dynamic> GetPrdMoTaskInfoById(Dictionary<string,string> dic)
|
||||||
|
{
|
||||||
|
string id = dic.ContainsKey("id") ? dic["id"] : "";
|
||||||
|
if (string.IsNullOrEmpty(id)) return null;
|
||||||
|
var db = _repository.AsSugarClient();
|
||||||
|
return await db.Queryable<PrdMoTask>()
|
||||||
|
.LeftJoin<BasMaterial>((a, b) => a.material_id == b.id)
|
||||||
|
.LeftJoin<ToolMolds>((a, b, c) => a.mold_id == c.id)
|
||||||
|
.LeftJoin<EqpEquipment>((a, b, c, d) => a.eqp_id == d.id)
|
||||||
|
.LeftJoin<DictionaryDataEntity>((a,b,c,d,e)=>e.EnCode==a.mo_task_status && e.DictionaryTypeId==DictConst.PrdTaskStatusTypeId)
|
||||||
|
.LeftJoin<BasProcess>((a,b,c,d,e,f)=>a.process_id==f.id)
|
||||||
|
.LeftJoin<OrganizeEntity>((a,b,c,d,e,f,g)=>a.workstation_id==g.Id)
|
||||||
|
.Where((a, b, c, d) => a.id == id)
|
||||||
|
.Select((a, b, c, d,e,f,g) => new
|
||||||
|
{
|
||||||
|
id = a.id,
|
||||||
|
mo_task_code = a.mo_task_code,
|
||||||
|
mo_task_status = e.FullName,
|
||||||
|
material_id = a.material_id,
|
||||||
|
material_code = b.code,
|
||||||
|
material_name = b.name,
|
||||||
|
mold_id = a.mold_id,
|
||||||
|
mold_code = c.mold_code,
|
||||||
|
mold_name = c.mold_name,
|
||||||
|
schedule_type = a.schedule_type,
|
||||||
|
equip_code = d.code,
|
||||||
|
equip_name = d.name,
|
||||||
|
workstation_id = a.workstation_id,
|
||||||
|
workstation_code = g.EnCode,
|
||||||
|
workstation_name = g.FullName,
|
||||||
|
scheduled_qty = a.scheduled_qty,
|
||||||
|
reported_work_qty = a.reported_work_qty,
|
||||||
|
scrap_qty = a.scrap_qty,
|
||||||
|
process_id = a.process_id,
|
||||||
|
process_name = f.process_name,
|
||||||
|
}).FirstAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,138 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Spire.Xls.Core.Spreadsheet.Charts;
|
||||||
|
|
||||||
namespace Tnb.QcMgr.Entities
|
namespace Tnb.QcMgr.Entities
|
||||||
{
|
{
|
||||||
public class SpcDataInput
|
public class SpcDataInput
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 主表id
|
||||||
|
/// </summary>
|
||||||
|
public string? mainid { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 检验时间
|
||||||
|
/// </summary>
|
||||||
|
public string? checktime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 批次
|
||||||
|
/// </summary>
|
||||||
|
public string? batch { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据
|
||||||
|
/// </summary>
|
||||||
|
public float[] data { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查数量
|
||||||
|
/// </summary>
|
||||||
|
public int? checknum { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 不良品数量
|
||||||
|
/// </summary>
|
||||||
|
public int? defectivenum { get; set; }
|
||||||
|
}
|
||||||
|
public class XRchart
|
||||||
|
{
|
||||||
|
public List<XRxchart> xcharts { get; set; }
|
||||||
|
public List<XRrchart> rcharts { get; set; }
|
||||||
|
}
|
||||||
|
public class XRxchart
|
||||||
|
{
|
||||||
|
public float? x { get; set; }
|
||||||
|
public float? jc { get; set; }
|
||||||
|
public float? usl { get; set; }
|
||||||
|
public float? cl { get; set; }
|
||||||
|
public float? lsl { get; set; }
|
||||||
|
public float? uclx { get; set; }
|
||||||
|
public float? clx { get; set; }
|
||||||
|
public float? lclx { get; set; }
|
||||||
|
}
|
||||||
|
public class XRrchart
|
||||||
|
{
|
||||||
|
public float? r { get; set; }
|
||||||
|
public float? uclr { get; set; }
|
||||||
|
public float? clr { get; set; }
|
||||||
|
public float? lclr { get; set; }
|
||||||
|
}
|
||||||
|
public class XSchart
|
||||||
|
{
|
||||||
|
public List<XSxchart> xcharts { get; set; }
|
||||||
|
public List<XSschart> scharts { get; set; }
|
||||||
|
}
|
||||||
|
public class XSxchart
|
||||||
|
{
|
||||||
|
public float? x { get; set; }
|
||||||
|
public float? bzc { get; set; }
|
||||||
|
public float? usl { get; set; }
|
||||||
|
public float? cl { get; set; }
|
||||||
|
public float? lsl { get; set; }
|
||||||
|
public float? uclx { get; set; }
|
||||||
|
public float? clx { get; set; }
|
||||||
|
public float? lclx { get; set; }
|
||||||
|
}
|
||||||
|
public class XSschart
|
||||||
|
{
|
||||||
|
public float? s { get; set; }
|
||||||
|
public float? ucls { get; set; }
|
||||||
|
public float? cls { get; set; }
|
||||||
|
public float? lcls { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class XMRchart
|
||||||
|
{
|
||||||
|
public List<XMRxchart> xmrxcharts { get; set; }
|
||||||
|
public List<XMRmrschart> xmrmrcharts { get; set; }
|
||||||
|
}
|
||||||
|
public class XMRxchart
|
||||||
|
{
|
||||||
|
public float? x { get; set; }
|
||||||
|
public float? usl { get; set; }
|
||||||
|
public float? cl { get; set; }
|
||||||
|
public float? lsl { get; set; }
|
||||||
|
public float? uclx { get; set; }
|
||||||
|
public float? clx { get; set; }
|
||||||
|
public float? lclx { get; set; }
|
||||||
|
}
|
||||||
|
public class XMRmrschart
|
||||||
|
{
|
||||||
|
public float? mr { get; set; }
|
||||||
|
public float? uclmr { get; set; }
|
||||||
|
public float? clmr { get; set; }
|
||||||
|
public float? lclmr { get; set; }
|
||||||
|
}
|
||||||
|
public class Pchart
|
||||||
|
{
|
||||||
|
public float? p { get; set; }
|
||||||
|
public float? n { get; set; }
|
||||||
|
public float? ucl { get; set; }
|
||||||
|
public float? cl { get; set; }
|
||||||
|
public float? lcl { get; set; }
|
||||||
|
}
|
||||||
|
public class Uchart
|
||||||
|
{
|
||||||
|
public float? u { get; set; }
|
||||||
|
public float? n { get; set; }
|
||||||
|
public float? ucl { get; set; }
|
||||||
|
public float? cl { get; set; }
|
||||||
|
public float? lcl { get; set; }
|
||||||
|
}
|
||||||
|
public class NPchart
|
||||||
|
{
|
||||||
|
public float? np { get; set; }
|
||||||
|
public float? ucl { get; set; }
|
||||||
|
public float? cl { get; set; }
|
||||||
|
public float? lcl { get; set; }
|
||||||
|
}
|
||||||
|
public class Cchart
|
||||||
|
{
|
||||||
|
public float? c { get; set; }
|
||||||
|
public float? ucl { get; set; }
|
||||||
|
public float? cl { get; set; }
|
||||||
|
public float? lcl { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace Tnb.QcMgr.Entities
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 子组容量
|
/// 子组容量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? subcapacity { get; set; }
|
public int? subcapacity { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 控制图键
|
/// 控制图键
|
||||||
@@ -38,7 +38,7 @@ namespace Tnb.QcMgr.Entities
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 控制图值
|
/// 控制图值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal? spcdata { get; set; }
|
public float? spcdata { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,17 +98,17 @@ namespace Tnb.QcMgr.Entities
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 规格上限
|
/// 规格上限
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal? uplimit { get; set; }
|
public float? uplimit { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 目标值
|
/// 目标值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal? target { get; set; }
|
public float? target { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 规格下限
|
/// 规格下限
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal? lowerlimit { get; set; }
|
public float? lowerlimit { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 子组容量
|
/// 子组容量
|
||||||
|
|||||||
@@ -16,15 +16,15 @@ namespace Tnb.QcMgr.Entities.Enums
|
|||||||
}
|
}
|
||||||
public enum EnumTriggerEvent
|
public enum EnumTriggerEvent
|
||||||
{
|
{
|
||||||
[Remark("首件检", "换模具")]
|
[Remark("首检", "换模具")]
|
||||||
首件检换模具 = 1,
|
首件检换模具 = 1,
|
||||||
[Remark("首件检", "换物料批号")]
|
[Remark("首检", "换物料批号")]
|
||||||
首件检换物料批号 = 2,
|
首件检换物料批号 = 2,
|
||||||
[Remark("首件检", "换物料编号")]
|
[Remark("首检", "换物料编号")]
|
||||||
首件检换物料编号 = 3,
|
首件检换物料编号 = 3,
|
||||||
[Remark("首件检", "新的生产任务")]
|
[Remark("首检", "新的生产任务")]
|
||||||
首件检新的生产任务 = 4,
|
首件检新的生产任务 = 4,
|
||||||
[Remark("首件检", "生产任务暂停")]
|
[Remark("首检", "生产任务暂停")]
|
||||||
首件检生产任务暂停 = 5,
|
首件检生产任务暂停 = 5,
|
||||||
[Remark("出厂检", "按入厂频次")]
|
[Remark("出厂检", "按入厂频次")]
|
||||||
出厂检按入厂频次 = 6,
|
出厂检按入厂频次 = 6,
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ namespace Tnb.QcMgr.Interfaces
|
|||||||
/// 保存spcd数据
|
/// 保存spcd数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public Task SaveData(SpcDataInput SpcDataInput);
|
public Task SaveData(List<SpcDataInput> SpcDataInput);
|
||||||
|
|
||||||
|
public Task<dynamic> GetSpcData(string id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -292,11 +292,12 @@ namespace Tnb.QcMgr
|
|||||||
{
|
{
|
||||||
var DictionaryData = _repository.AsSugarClient().Queryable<DictionaryDataEntity, DictionaryTypeEntity>
|
var DictionaryData = _repository.AsSugarClient().Queryable<DictionaryDataEntity, DictionaryTypeEntity>
|
||||||
((a, b) => new object[] { JoinType.Left, a.DictionaryTypeId == b.Id, })
|
((a, b) => new object[] { JoinType.Left, a.DictionaryTypeId == b.Id, })
|
||||||
.Where((a, b) => b.FullName == "质量方案类型").ToList();
|
.Where((a, b) => b.FullName == "质检类型选择").ToList();
|
||||||
var TriggerEvent = new QcTriggerEvent();
|
var TriggerEvent = new QcTriggerEvent();
|
||||||
var enumTriggerEvent = entity.triggerevent;
|
var enumTriggerEvent = entity.triggerevent;
|
||||||
var remark = RemarkAttribute.GetRemark(enumTriggerEvent);
|
var remark = RemarkAttribute.GetRemark(enumTriggerEvent);
|
||||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == remark.CheckType).First().Id && p.name == remark.CheckContent).First();
|
var type = DictionaryData.Where(p => p.FullName == remark.CheckType).First().Id;
|
||||||
|
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == type && p.name == remark.CheckContent).First();
|
||||||
Query = Query.Where((a, b, c, d, e) => b.triggertype == "3" && b.content!.Contains(TriggerEvent.id));
|
Query = Query.Where((a, b, c, d, e) => b.triggertype == "3" && b.content!.Contains(TriggerEvent.id));
|
||||||
}
|
}
|
||||||
private void Filter(List<QcCheckPlanH> QcCheckPlanHs, TriggerPlanEntity entity)
|
private void Filter(List<QcCheckPlanH> QcCheckPlanHs, TriggerPlanEntity entity)
|
||||||
|
|||||||
381
QcMgr/Tnb.QcMgr/QcSpcService.cs
Normal file
381
QcMgr/Tnb.QcMgr/QcSpcService.cs
Normal file
@@ -0,0 +1,381 @@
|
|||||||
|
using System;
|
||||||
|
using System.ArrayExtensions;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Aspose.Cells.Drawing;
|
||||||
|
using JNPF.Common.Core.Manager;
|
||||||
|
using JNPF.Common.Enums;
|
||||||
|
using JNPF.DependencyInjection;
|
||||||
|
using JNPF.DynamicApiController;
|
||||||
|
using JNPF.FriendlyException;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Spire.Xls.Core;
|
||||||
|
using SqlSugar;
|
||||||
|
using Tnb.QcMgr.Entities;
|
||||||
|
using Tnb.QcMgr.Entities.Entity;
|
||||||
|
using Tnb.QcMgr.Interfaces;
|
||||||
|
|
||||||
|
namespace Tnb.QcMgr
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// spc模块
|
||||||
|
/// </summary>
|
||||||
|
[ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 800)]
|
||||||
|
public class QcSpcService : IQcSpcService, IDynamicApiController, ITransient
|
||||||
|
{
|
||||||
|
private readonly ISqlSugarRepository<QcSpcH> _repository;
|
||||||
|
private readonly IUserManager _userManager;
|
||||||
|
public QcSpcService(ISqlSugarRepository<QcSpcH> repository, IUserManager userManager)
|
||||||
|
{
|
||||||
|
_repository = repository;
|
||||||
|
_userManager = userManager;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取spcd数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<dynamic> GetSpcItems(string id)
|
||||||
|
{
|
||||||
|
var datas= await _repository.AsSugarClient().Queryable<QcSpcD>().Where(p => p.mainid == id).ToListAsync();
|
||||||
|
List<SpcDataInput> SpcDataInputs=new List<SpcDataInput>();
|
||||||
|
datas.ForEach(p =>
|
||||||
|
{
|
||||||
|
SpcDataInput SpcDataInput = new SpcDataInput();
|
||||||
|
SpcDataInput.mainid = p.mainid;
|
||||||
|
SpcDataInput.checktime = p.checktime;
|
||||||
|
SpcDataInput.batch = p.batch;
|
||||||
|
SpcDataInput.data = Array.ConvertAll(p.data!.Split(","),float.Parse);
|
||||||
|
SpcDataInput.checknum = p.checknum;
|
||||||
|
SpcDataInput.defectivenum = p.defectivenum;
|
||||||
|
SpcDataInputs.Add(SpcDataInput);
|
||||||
|
});
|
||||||
|
return SpcDataInputs;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 保存spcd
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="CheckItemInput"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task SaveData(List<SpcDataInput> SpcDataInput)
|
||||||
|
{
|
||||||
|
var db = _repository.AsSugarClient();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(SpcDataInput.First().mainid))
|
||||||
|
await db.Deleteable<QcSpcD>(p => p.mainid == SpcDataInput.First().mainid).ExecuteCommandAsync();
|
||||||
|
List<QcSpcD> QcSpcDs = new List<QcSpcD>();
|
||||||
|
|
||||||
|
|
||||||
|
SpcDataInput.ForEach(p =>
|
||||||
|
{
|
||||||
|
QcSpcD QcSpcD=new QcSpcD();
|
||||||
|
QcSpcD.mainid = p.mainid;
|
||||||
|
QcSpcD.checktime = p.checktime;
|
||||||
|
QcSpcD.batch = p.batch;
|
||||||
|
QcSpcD.data = string.Join(",", p.data);
|
||||||
|
QcSpcD.checknum = p.checknum;
|
||||||
|
QcSpcD.defectivenum = p.defectivenum;
|
||||||
|
QcSpcD.create_id = _userManager.UserId;
|
||||||
|
QcSpcD.create_time=DateTime.Now;
|
||||||
|
QcSpcDs.Add(QcSpcD);
|
||||||
|
});
|
||||||
|
await db.Ado.BeginTranAsync();
|
||||||
|
await db.Insertable(QcSpcDs).ExecuteCommandAsync();
|
||||||
|
await db.Ado.CommitTranAsync();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
await db.Ado.RollbackTranAsync();
|
||||||
|
throw Oops.Oh(ErrorCode.COM1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取spc图表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<dynamic> GetSpcData(string id)
|
||||||
|
{
|
||||||
|
var QcSpcH = await _repository.AsSugarClient().Queryable<QcSpcH>().Where(p => p.id == id).FirstAsync();
|
||||||
|
var QcSpcDs = await _repository.AsSugarClient().Queryable<QcSpcD>().Where(p => p.mainid == id).ToListAsync();
|
||||||
|
var cinfigs = await _repository.AsSugarClient().Queryable<QcSpcConfig>().ToListAsync();
|
||||||
|
if (QcSpcH.graphtype == "X-R控制图")
|
||||||
|
{
|
||||||
|
XRchart XRchart = new XRchart();
|
||||||
|
XRchart.xcharts = new List<XRxchart>();
|
||||||
|
XRchart.rcharts = new List<XRrchart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
List<float> datas = Array.ConvertAll(QcSpcD.data!.Split(",", StringSplitOptions.RemoveEmptyEntries), float.Parse).ToList();
|
||||||
|
XRxchart xchart = new XRxchart();
|
||||||
|
xchart.x = datas.Average();
|
||||||
|
xchart.jc = datas.Max() - datas.Min();
|
||||||
|
xchart.usl = QcSpcH.uplimit;
|
||||||
|
xchart.cl = QcSpcH.target;
|
||||||
|
xchart.lsl = QcSpcH.lowerlimit;
|
||||||
|
XRrchart rchart = new XRrchart();
|
||||||
|
rchart.r = datas.Max() - datas.Min();
|
||||||
|
XRchart.xcharts.Add(xchart);
|
||||||
|
XRchart.rcharts.Add(rchart);
|
||||||
|
}
|
||||||
|
var xAverage = XRchart.xcharts.Select(p => p.x).Average();
|
||||||
|
var num = XRchart.xcharts.Select(p => p.jc).Average() * cinfigs.Where(p => p.spctype == "X-R图" && p.spckey == "A2" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
XRchart.xcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.uclx = xAverage + num;
|
||||||
|
p.clx = xAverage;
|
||||||
|
p.lclx = xAverage - num;
|
||||||
|
});
|
||||||
|
var D4 = cinfigs.Where(p => p.spctype == "X-R图" && p.spckey == "D4" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
var D3 = cinfigs.Where(p => p.spctype == "X-R图" && p.spckey == "D3" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
var rAverage = XRchart.rcharts.Select(p => p.r).Average();
|
||||||
|
XRchart.rcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.uclr = rAverage * D4;
|
||||||
|
p.clr = rAverage;
|
||||||
|
p.lclr = rAverage * D3;
|
||||||
|
});
|
||||||
|
return XRchart;
|
||||||
|
}
|
||||||
|
if (QcSpcH.graphtype == "X-S控制图")
|
||||||
|
{
|
||||||
|
XSchart XSchart = new XSchart();
|
||||||
|
XSchart.xcharts = new List<XSxchart>();
|
||||||
|
XSchart.scharts = new List<XSschart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
List<float> datas = Array.ConvertAll(QcSpcD.data!.Split(",", StringSplitOptions.RemoveEmptyEntries), float.Parse).ToList();
|
||||||
|
XSxchart xchart = new XSxchart();
|
||||||
|
xchart.x = datas.Average();
|
||||||
|
xchart.bzc = CalculateStdDev(datas);
|
||||||
|
xchart.usl = QcSpcH.uplimit;
|
||||||
|
xchart.cl = QcSpcH.target;
|
||||||
|
xchart.lsl = QcSpcH.lowerlimit;
|
||||||
|
XSschart schart = new XSschart();
|
||||||
|
schart.s = CalculateStdDev(datas);
|
||||||
|
XSchart.xcharts.Add(xchart);
|
||||||
|
XSchart.scharts.Add(schart);
|
||||||
|
}
|
||||||
|
var xAverage = XSchart.xcharts.Select(p => p.x).Average();
|
||||||
|
var num = XSchart.xcharts.Select(p => p.bzc).Average() * cinfigs.Where(p => p.spctype == "X-S图" && p.spckey == "A3" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
XSchart.xcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.uclx = xAverage + num;
|
||||||
|
p.clx = xAverage;
|
||||||
|
p.lclx = xAverage - num;
|
||||||
|
});
|
||||||
|
var B4 = cinfigs.Where(p => p.spctype == "X-S图" && p.spckey == "B4" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
var B3 = cinfigs.Where(p => p.spctype == "X-S图" && p.spckey == "B3" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
var sAverage = XSchart.scharts.Select(p => p.s).Average();
|
||||||
|
XSchart.scharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.ucls = sAverage * B4;
|
||||||
|
p.cls = sAverage;
|
||||||
|
p.lcls = sAverage * B3;
|
||||||
|
});
|
||||||
|
return XSchart;
|
||||||
|
}
|
||||||
|
if (QcSpcH.graphtype == "X中位数-R图")
|
||||||
|
{
|
||||||
|
XRchart XRchart = new XRchart();
|
||||||
|
XRchart.xcharts = new List<XRxchart>();
|
||||||
|
XRchart.rcharts = new List<XRrchart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
List<float> datas = Array.ConvertAll(QcSpcD.data!.Split(",", StringSplitOptions.RemoveEmptyEntries), float.Parse).ToList();
|
||||||
|
XRxchart xchart = new XRxchart();
|
||||||
|
xchart.x = CalculateMedian(datas);
|
||||||
|
xchart.jc = datas.Max() - datas.Min();
|
||||||
|
xchart.usl = QcSpcH.uplimit;
|
||||||
|
xchart.cl = QcSpcH.target;
|
||||||
|
xchart.lsl = QcSpcH.lowerlimit;
|
||||||
|
XRrchart rchart = new XRrchart();
|
||||||
|
rchart.r = datas.Max() - datas.Min();
|
||||||
|
XRchart.xcharts.Add(xchart);
|
||||||
|
XRchart.rcharts.Add(rchart);
|
||||||
|
}
|
||||||
|
var xAverage = XRchart.xcharts.Select(p => p.x).Average();
|
||||||
|
var num = XRchart.xcharts.Select(p => p.jc).Average() * cinfigs.Where(p => p.spctype == "中位数图" && p.spckey == "A2" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
XRchart.xcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.uclx = xAverage + num;
|
||||||
|
p.clx = xAverage;
|
||||||
|
p.lclx = xAverage - num;
|
||||||
|
});
|
||||||
|
var D4 = cinfigs.Where(p => p.spctype == "中位数图" && p.spckey == "D4" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
var D3 = cinfigs.Where(p => p.spctype == "中位数图" && p.spckey == "D3" && p.subcapacity == QcSpcH.samplesize).Select(p => p.spcdata).First();
|
||||||
|
var rAverage = XRchart.rcharts.Select(p => p.r).Average();
|
||||||
|
XRchart.rcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.uclr = rAverage * D4;
|
||||||
|
p.clr = rAverage;
|
||||||
|
p.lclr = rAverage * D3;
|
||||||
|
});
|
||||||
|
return XRchart;
|
||||||
|
}
|
||||||
|
if (QcSpcH.graphtype == "X-MR控制图")
|
||||||
|
{
|
||||||
|
XMRchart XMRchart = new XMRchart();
|
||||||
|
XMRchart.xmrxcharts = new List<XMRxchart>();
|
||||||
|
XMRchart.xmrmrcharts = new List<XMRmrschart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
List<float> datas = Array.ConvertAll(QcSpcD.data!.Split(",", StringSplitOptions.RemoveEmptyEntries), float.Parse).ToList();
|
||||||
|
XMRxchart xchart = new XMRxchart();
|
||||||
|
xchart.x = datas.Average();
|
||||||
|
xchart.usl = QcSpcH.uplimit;
|
||||||
|
xchart.cl = QcSpcH.target;
|
||||||
|
xchart.lsl = QcSpcH.lowerlimit;
|
||||||
|
if (XMRchart.xmrxcharts.Count > 0)
|
||||||
|
{
|
||||||
|
XMRmrschart rchart = new XMRmrschart();
|
||||||
|
rchart.mr = Math.Abs((float)(xchart.x - XMRchart.xmrxcharts.Last().x)!);
|
||||||
|
XMRchart.xmrmrcharts.Add(rchart);
|
||||||
|
}
|
||||||
|
XMRchart.xmrxcharts.Add(xchart);
|
||||||
|
}
|
||||||
|
var xAverage = XMRchart.xmrxcharts.Select(p => p.x).Average();
|
||||||
|
var mrAverage = XMRchart.xmrmrcharts.Select(p => p.mr).Average();
|
||||||
|
XMRchart.xmrxcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.uclx = xAverage + (float)(2.66 * mrAverage)!;
|
||||||
|
p.clx = xAverage;
|
||||||
|
p.lclx = xAverage - (float)(2.66 * mrAverage)!;
|
||||||
|
});
|
||||||
|
XMRchart.xmrmrcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.uclmr = (float)(mrAverage * 3.267)!;
|
||||||
|
p.clmr = mrAverage;
|
||||||
|
p.lclmr = 0;
|
||||||
|
});
|
||||||
|
return XMRchart;
|
||||||
|
}
|
||||||
|
if (QcSpcH.graphtype == "P图")
|
||||||
|
{
|
||||||
|
List<Pchart> pcharts = new List<Pchart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
Pchart pchart = new Pchart();
|
||||||
|
pchart.p = QcSpcD.defectivenum / QcSpcD.checknum;
|
||||||
|
pchart.n = QcSpcD.checknum;
|
||||||
|
|
||||||
|
pcharts.Add(pchart);
|
||||||
|
}
|
||||||
|
var pAverage = (pcharts.Select(p => p.n * p.p).Sum()) / (pcharts.Select(p => p.n).Sum());
|
||||||
|
var nAverage = pcharts.Select(p => p.n).Average();
|
||||||
|
pcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.cl = pAverage;
|
||||||
|
p.ucl = pAverage + (float)(3 * Math.Sqrt((double)(pAverage * (1 - pAverage))!) / Math.Sqrt((double)nAverage!));
|
||||||
|
p.lcl = pAverage - (float)(3 * Math.Sqrt((double)(pAverage * (1 - pAverage))!) / Math.Sqrt((double)nAverage!)) < 0 ? 0 : pAverage - (float)(3 * Math.Sqrt((double)(pAverage * (1 - pAverage))!) / Math.Sqrt((double)nAverage!));
|
||||||
|
});
|
||||||
|
return pcharts;
|
||||||
|
}
|
||||||
|
if (QcSpcH.graphtype == "U图")
|
||||||
|
{
|
||||||
|
List<Uchart> ucharts = new List<Uchart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
Uchart uchart = new Uchart();
|
||||||
|
uchart.u = QcSpcD.defectivenum / QcSpcD.checknum;
|
||||||
|
uchart.n = QcSpcD.checknum;
|
||||||
|
ucharts.Add(uchart);
|
||||||
|
}
|
||||||
|
var uAverage = (ucharts.Select(p => p.u).Sum()) / (ucharts.Count());
|
||||||
|
var nAverage = ucharts.Select(p => p.n).Average();
|
||||||
|
ucharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.cl = uAverage;
|
||||||
|
p.ucl = uAverage + (float)(3 * Math.Sqrt((double)(uAverage / nAverage)!));
|
||||||
|
p.lcl = uAverage - (float)(3 * Math.Sqrt((double)(uAverage / nAverage)!)) < 0 ? 0 : uAverage - (float)(3 * Math.Sqrt((double)(uAverage / nAverage)!));
|
||||||
|
});
|
||||||
|
return ucharts;
|
||||||
|
}
|
||||||
|
if (QcSpcH.graphtype == "nP图")
|
||||||
|
{
|
||||||
|
List<NPchart> npcharts = new List<NPchart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
NPchart npchart = new NPchart();
|
||||||
|
npchart.np = QcSpcD.defectivenum;
|
||||||
|
npcharts.Add(npchart);
|
||||||
|
}
|
||||||
|
var npAverage = (npcharts.Select(p => p.np).Sum()) / (npcharts.Count());
|
||||||
|
var pAverage = npcharts.Select(p => p.np).Sum() / (npcharts.Count() * QcSpcH.subcapacity);
|
||||||
|
npcharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.cl = npAverage;
|
||||||
|
p.ucl = npAverage + (float)(3 * Math.Sqrt((double)(npAverage * (1 - pAverage))!));
|
||||||
|
p.lcl = npAverage - (float)(3 * Math.Sqrt((double)(npAverage * (1 - pAverage))!)) < 0 ? 0 : npAverage - (float)(3 * Math.Sqrt((double)(npAverage * (1 - pAverage))!));
|
||||||
|
});
|
||||||
|
return npcharts;
|
||||||
|
}
|
||||||
|
if (QcSpcH.graphtype == "C图")
|
||||||
|
{
|
||||||
|
List<Cchart> ccharts = new List<Cchart>();
|
||||||
|
foreach (var QcSpcD in QcSpcDs)
|
||||||
|
{
|
||||||
|
Cchart cchart = new Cchart();
|
||||||
|
cchart.c = QcSpcD.defectivenum;
|
||||||
|
ccharts.Add(cchart);
|
||||||
|
}
|
||||||
|
var cAverage = (ccharts.Select(p => p.c).Sum()) / (ccharts.Count());
|
||||||
|
ccharts.ForEach(p =>
|
||||||
|
{
|
||||||
|
p.cl = cAverage;
|
||||||
|
p.ucl = cAverage + (float)(3 * Math.Sqrt((double)cAverage!));
|
||||||
|
p.lcl = cAverage - (float)(3 * Math.Sqrt((double)cAverage!)) < 0 ? 0 : cAverage - (float)(3 * Math.Sqrt((double)cAverage!));
|
||||||
|
});
|
||||||
|
return ccharts;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
//标准差计算
|
||||||
|
private static float CalculateStdDev(IEnumerable<float> values)
|
||||||
|
{
|
||||||
|
double ret = 0;
|
||||||
|
if (values.Count() > 0)
|
||||||
|
{
|
||||||
|
// 计算平均数
|
||||||
|
double avg = values.Average();
|
||||||
|
// 计算各数值与平均数的差值的平方,然后求和
|
||||||
|
double sum = values.Sum(d => Math.Pow(d - avg, 2));
|
||||||
|
// 除以数量,然后开方
|
||||||
|
ret = Math.Sqrt(sum / values.Count());
|
||||||
|
}
|
||||||
|
return (float)ret;
|
||||||
|
}
|
||||||
|
//中位数计算
|
||||||
|
private static float CalculateMedian(IEnumerable<float> values)
|
||||||
|
{
|
||||||
|
float ret = 0;
|
||||||
|
var floats = values.OrderBy(d => d).ToArray();
|
||||||
|
if (floats.Count() % 2 == 0)
|
||||||
|
{
|
||||||
|
ret = (floats[floats.Count() / 2 - 1] + floats[(floats.Count() + 2) / 2 - 1]) / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = floats[(floats.Count() + 1) / 2 - 1];
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
//移动极差平均值计算
|
||||||
|
private static float CalculateMovRange(IEnumerable<float> values)
|
||||||
|
{
|
||||||
|
List<float> floats = new List<float>();
|
||||||
|
var arr=values.ToArray();
|
||||||
|
for (int i = 0; i < arr.Length-1; i++)
|
||||||
|
{
|
||||||
|
floats.Add(Math.Abs((arr[i + 1] - arr[i])));
|
||||||
|
}
|
||||||
|
return floats.Average();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -181,4 +181,9 @@ public class ModuleConsts
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const string MODULE_WMSPOINT_ID = "26099196480805";
|
public const string MODULE_WMSPOINT_ID = "26099196480805";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 模块标识-PDA寄存出库
|
||||||
|
/// </summary>
|
||||||
|
public const string MODULE_WMSSCANCODEINSTOCKPDA_ID = "28576495374869";
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,13 @@ namespace Tnb.WarehouseMgr.Entities.Consts
|
|||||||
{
|
{
|
||||||
public class WmsWareHouseConst
|
public class WmsWareHouseConst
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 原材料仓ID
|
||||||
|
/// </summary>
|
||||||
|
public const string WAREHOUSE_YCL_ID = "1";
|
||||||
|
/// <summary>
|
||||||
|
/// 中储仓ID
|
||||||
|
/// </summary>
|
||||||
public const string WAREHOUSE_ZC_ID = "2";
|
public const string WAREHOUSE_ZC_ID = "2";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -250,7 +257,10 @@ namespace Tnb.WarehouseMgr.Entities.Consts
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const string SYNC_STATUS__SYNCFAILED = "26191354152229";
|
public const string SYNC_STATUS__SYNCFAILED = "26191354152229";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 单据类型-来料入库单
|
||||||
|
/// </summary>
|
||||||
|
public const string BILLTYPE_MATERIALINSTOCK_ID = "25103338755861";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 扫描数量
|
/// 扫描数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int scan_qty { get; set; }
|
public decimal scan_qty { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 备注
|
/// 备注
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 扫描数量
|
/// 扫描数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int scan_qty { get; set; }
|
public decimal scan_qty { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 物品代码
|
/// 物品代码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public partial class WmsInstockCode : BaseEntity<string>, IInOutStockCode
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 条码数量
|
/// 条码数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int codeqty { get; set; }
|
public decimal codeqty { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否锁定
|
/// 是否锁定
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ public partial class WmsInstockD : BaseEntity<string>
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 扫描数量
|
/// 扫描数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int scan_qty { get; set; }
|
public decimal scan_qty { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 备注
|
/// 备注
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public partial class WmsPretaskCode : BaseEntity<string>
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 条码数量
|
/// 条码数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int codeqty { get; set; }
|
public decimal codeqty { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 单位ID
|
/// 单位ID
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
[OverideVisualDev(ModuleConsts.MODULE_WMSCARRYBIND_ID)]
|
[OverideVisualDev(ModuleConsts.MODULE_WMSCARRYBIND_ID)]
|
||||||
public class WmsCarryBindService : BaseWareHouseService, IWmsCarryBindService
|
public class WmsCarryBindService : BaseWareHouseService, IWmsCarryBindService
|
||||||
{
|
{
|
||||||
|
|
||||||
private readonly ISqlSugarClient _db;
|
private readonly ISqlSugarClient _db;
|
||||||
private readonly IRunService _runService;
|
private readonly IRunService _runService;
|
||||||
private readonly IVisualDevService _visualDevService;
|
private readonly IVisualDevService _visualDevService;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ using Tnb.WarehouseMgr.Interfaces;
|
|||||||
namespace Tnb.WarehouseMgr
|
namespace Tnb.WarehouseMgr
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// PDA载具移入
|
/// PDA一般入库
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[OverideVisualDev(ModuleConsts.MODULE_WMSINSTOCKPDA_ID)]
|
[OverideVisualDev(ModuleConsts.MODULE_WMSINSTOCKPDA_ID)]
|
||||||
[ServiceModule(BizTypeId)]
|
[ServiceModule(BizTypeId)]
|
||||||
|
|||||||
290
WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs
Normal file
290
WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Aop.Api.Domain;
|
||||||
|
using JNPF.Common.Core.Manager;
|
||||||
|
using JNPF.Common.Dtos.VisualDev;
|
||||||
|
using JNPF.Common.Extension;
|
||||||
|
using JNPF.Common.Security;
|
||||||
|
using JNPF.FriendlyException;
|
||||||
|
using JNPF.Systems.Interfaces.System;
|
||||||
|
using JNPF.VisualDev;
|
||||||
|
using Mapster;
|
||||||
|
using SqlSugar;
|
||||||
|
using Tnb.BasicData.Entities;
|
||||||
|
using Tnb.ProductionMgr.Interfaces;
|
||||||
|
using Tnb.WarehouseMgr.Entities;
|
||||||
|
using Tnb.WarehouseMgr.Entities.Attributes;
|
||||||
|
using Tnb.WarehouseMgr.Entities.Consts;
|
||||||
|
using Tnb.WarehouseMgr.Entities.Dto;
|
||||||
|
using Tnb.WarehouseMgr.Interfaces;
|
||||||
|
|
||||||
|
namespace Tnb.WarehouseMgr
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// PDA扫码入库模块
|
||||||
|
/// </summary>
|
||||||
|
[OverideVisualDev(ModuleConsts.MODULE_WMSSCANCODEINSTOCKPDA_ID)]
|
||||||
|
[ServiceModule(BizTypeId)]
|
||||||
|
public class WmsPDAScanInStockService : BaseWareHouseService, IPdaStroage
|
||||||
|
{
|
||||||
|
private const string BizTypeId = "26191496816421";
|
||||||
|
private readonly ISqlSugarClient _db;
|
||||||
|
private readonly IDictionaryDataService _dictionaryDataService;
|
||||||
|
private readonly IUserManager _userManager;
|
||||||
|
private readonly IWareHouseService _wareHouseService;
|
||||||
|
private readonly IBillRullService _billRullService;
|
||||||
|
private readonly IPrdInstockService _prdInstockService;
|
||||||
|
public WmsPDAScanInStockService(
|
||||||
|
ISqlSugarRepository<WmsInstockH> repository,
|
||||||
|
IDictionaryDataService dictionaryDataService,
|
||||||
|
IUserManager userManager,
|
||||||
|
IBillRullService billRullService,
|
||||||
|
IWareHouseService wareHouseService,
|
||||||
|
IPrdInstockService prdInstockService,
|
||||||
|
ITaskMessageNotify taskMessageNotify
|
||||||
|
) : base(taskMessageNotify.Writer)
|
||||||
|
{
|
||||||
|
_db = repository.AsSugarClient();
|
||||||
|
_dictionaryDataService = dictionaryDataService;
|
||||||
|
_userManager = userManager;
|
||||||
|
_billRullService = billRullService;
|
||||||
|
_wareHouseService = wareHouseService;
|
||||||
|
_prdInstockService = prdInstockService;
|
||||||
|
OverideFuncs.CreateAsync = ScanInStock;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<dynamic> ScanInStock(VisualDevModelDataCrInput input)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _db.Ado.BeginTranAsync();
|
||||||
|
var item = input.data.Adapt<WmsInstockCode>();
|
||||||
|
if (item.codeqty == 0) throw new AppFriendlyException("请输入入库数量", 500);
|
||||||
|
var carryCode = item.barcode;
|
||||||
|
var carry = await _db.Queryable<WmsCarryH>().FirstAsync(it => it.carry_code == carryCode);
|
||||||
|
if (carry == null) throw new AppFriendlyException("载具有误", 500);
|
||||||
|
var mat = await _db.Queryable<BasMaterial>().FirstAsync(it => it.code == item.material_code);
|
||||||
|
if (mat == null) throw new AppFriendlyException("物料有误", 500);
|
||||||
|
var loc = await _db.Queryable<BasLocation>().FirstAsync(it => it.location_code == item.extras);
|
||||||
|
if (loc == null) throw new AppFriendlyException("库位有误", 500);
|
||||||
|
|
||||||
|
WmsInstockH instock = new()
|
||||||
|
{
|
||||||
|
id = SnowflakeIdHelper.NextId(),
|
||||||
|
org_id = _userManager.UserId,
|
||||||
|
carry_code = carryCode,
|
||||||
|
carry_id = carry.id,
|
||||||
|
location_id = loc.id,
|
||||||
|
bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_INSTOCK_ENCODE).GetAwaiter().GetResult(),
|
||||||
|
bill_type = WmsWareHouseConst.BILLTYPE_MATERIALINSTOCK_ID,
|
||||||
|
biz_type = WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID,
|
||||||
|
bill_date = DateTime.Today,
|
||||||
|
warehouse_id = "26103372441637",
|
||||||
|
status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
|
||||||
|
generate_type = "1",
|
||||||
|
sync_status = "0",
|
||||||
|
print_status = "0",
|
||||||
|
is_check = 1,
|
||||||
|
create_id = _userManager.UserId,
|
||||||
|
create_time = DateTime.Now,
|
||||||
|
};
|
||||||
|
WmsInstockD instockD = new()
|
||||||
|
{
|
||||||
|
id = SnowflakeIdHelper.NextId(),
|
||||||
|
bill_id = instock.id,
|
||||||
|
line_status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
|
||||||
|
material_id = mat.id,
|
||||||
|
material_code = mat.code,
|
||||||
|
unit_id = mat.unit_id,
|
||||||
|
pr_qty = item.codeqty,
|
||||||
|
qty = 0,
|
||||||
|
warehouse_id = "26103372441637",
|
||||||
|
print_qty = item.codeqty,
|
||||||
|
scan_qty = item.codeqty,
|
||||||
|
print_id = "",
|
||||||
|
create_id = _userManager.UserId,
|
||||||
|
create_time = DateTime.Now,
|
||||||
|
};
|
||||||
|
WmsInstockCode instockCode = new()
|
||||||
|
{
|
||||||
|
id = SnowflakeIdHelper.NextId(),
|
||||||
|
bill_id = instock.id,
|
||||||
|
bill_d_id = instockD.id,
|
||||||
|
line_status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
|
||||||
|
material_id = mat.id,
|
||||||
|
material_code = mat.code,
|
||||||
|
unit_id = mat.unit_id,
|
||||||
|
barcode = carryCode,
|
||||||
|
code_batch = item.code_batch,
|
||||||
|
codeqty = item.codeqty,
|
||||||
|
is_lock = 0,
|
||||||
|
is_end = 0,
|
||||||
|
create_id = _userManager.UserId,
|
||||||
|
create_time = DateTime.Now,
|
||||||
|
};
|
||||||
|
|
||||||
|
await _db.Insertable(instock).ExecuteCommandAsync();
|
||||||
|
await _db.Insertable(instockD).ExecuteCommandAsync();
|
||||||
|
await _db.Insertable(instockCode).ExecuteCommandAsync();
|
||||||
|
|
||||||
|
var inStockStrategyInput = new InStockStrategyQuery { warehouse_id = "26103372441637", Size = 1 };
|
||||||
|
var endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
|
||||||
|
WmsPointH sPoint = new();
|
||||||
|
WmsPointH ePoint = new();
|
||||||
|
if (endLocations?.Count > 0)
|
||||||
|
{
|
||||||
|
var eloc = await _db.Queryable<BasLocation>().SingleAsync(it => it.id == endLocations[0].id);
|
||||||
|
var isMatch = await IsCarryAndLocationMatchByCarryStd(carry, eloc);
|
||||||
|
if (!isMatch) throw new AppFriendlyException("库位与载具规格不匹配", 500);
|
||||||
|
ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sPoint != null && ePoint != null)
|
||||||
|
{
|
||||||
|
var points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
||||||
|
if (points.Count <= 2) throw new AppFriendlyException("该路径不存在", 500);
|
||||||
|
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
||||||
|
if (points?.Count > 0)
|
||||||
|
{
|
||||||
|
var preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
|
||||||
|
{
|
||||||
|
var sPoint = it.FirstOrDefault();
|
||||||
|
var ePoint = it.LastOrDefault();
|
||||||
|
|
||||||
|
WmsPretaskH preTask = new();
|
||||||
|
preTask.org_id = _userManager.User.OrganizeId!;
|
||||||
|
preTask.startlocation_id = sPoint?.location_id!;
|
||||||
|
preTask.startlocation_code = sPoint?.location_code!;
|
||||||
|
preTask.endlocation_id = ePoint?.location_id!;
|
||||||
|
preTask.endlocation_code = ePoint?.location_code!;
|
||||||
|
preTask.start_floor = sPoint?.floor.ToString();
|
||||||
|
preTask.end_floor = ePoint?.floor.ToString();
|
||||||
|
preTask.startpoint_id = sPoint?.id!;
|
||||||
|
preTask.startpoint_code = sPoint?.point_code!;
|
||||||
|
preTask.endpoint_id = ePoint?.id!;
|
||||||
|
preTask.endpoint_code = ePoint?.point_code!;
|
||||||
|
preTask.bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult();
|
||||||
|
preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID;
|
||||||
|
preTask.biz_type = WmsWareHouseConst.BIZTYPE_CARRYMOVEINSTOCK_ID;
|
||||||
|
preTask.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
|
||||||
|
preTask.carry_id = carry.id;
|
||||||
|
preTask.carry_code = carry.carry_code;
|
||||||
|
preTask.area_id = sPoint?.area_id!;
|
||||||
|
preTask.area_code = it.Key;
|
||||||
|
preTask.require_id = instock.id;
|
||||||
|
preTask.require_code = instock.bill_code;
|
||||||
|
preTask.create_id = _userManager.UserId;
|
||||||
|
preTask.create_time = DateTime.Now;
|
||||||
|
return preTask;
|
||||||
|
}).ToList();
|
||||||
|
var isOk = await _wareHouseService.GenPreTask(preTasks, null!);
|
||||||
|
if (isOk)
|
||||||
|
{
|
||||||
|
var preTaskUpInput = new GenPreTaskUpInput();
|
||||||
|
preTaskUpInput.RquireId = instock.id;
|
||||||
|
preTaskUpInput.CarryId = carry.id;
|
||||||
|
preTaskUpInput.CarryStartLocationId = points.FirstOrDefault()!.location_id!;
|
||||||
|
preTaskUpInput.CarryStartLocationCode = points.FirstOrDefault()!.location_code!;
|
||||||
|
preTaskUpInput.LocationIds = points.Select(x => x.location_id).ToList()!;
|
||||||
|
|
||||||
|
WmsHandleH handleH = new();
|
||||||
|
handleH.org_id = _userManager.User.OrganizeId;
|
||||||
|
handleH.startlocation_id = loc.id;
|
||||||
|
handleH.endlocation_id = endLocations![0].id;
|
||||||
|
handleH.bill_code = instock.bill_code;
|
||||||
|
handleH.biz_type = instock.biz_type;
|
||||||
|
handleH.carry_id = carry.id;
|
||||||
|
handleH.carry_code = carry.carry_code;
|
||||||
|
handleH.require_id = instock.id;
|
||||||
|
handleH.require_code = instock.bill_code;
|
||||||
|
handleH.create_id = _userManager.UserId;
|
||||||
|
handleH.create_time = DateTime.Now;
|
||||||
|
preTaskUpInput.PreTaskRecord = handleH;
|
||||||
|
//根据载具移入Id,回更单据状态
|
||||||
|
await _db.Updateable<WmsInstockH>().SetColumns(it => new WmsInstockH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
|
||||||
|
|
||||||
|
await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
|
||||||
|
it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode },
|
||||||
|
it => new BasLocation { is_lock = 1 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await _db.Ado.CommitTranAsync();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
await _db.Ado.RollbackTranAsync();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
return Task.FromResult(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task ModifyAsync(WareHouseUpInput input)
|
||||||
|
{
|
||||||
|
if (input == null) throw new ArgumentNullException(nameof(input));
|
||||||
|
//更具distaskCode的barcode 更新 instockcode 的 is_end 为 1
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _db.Ado.BeginTranAsync();
|
||||||
|
|
||||||
|
if (input.distaskCodes?.Count > 0)
|
||||||
|
{
|
||||||
|
var barCodes = input.distaskCodes.Select(x => x.barcode);
|
||||||
|
await _db.Updateable<WmsInstockCode>().SetColumns(it => new WmsInstockCode { is_end = 1 }).Where(it => barCodes.Contains(it.barcode)).ExecuteCommandAsync();
|
||||||
|
var instockCodes = await _db.Queryable<WmsInstockCode>().Where(it => barCodes.Contains(it.barcode)).Select(it => new
|
||||||
|
{
|
||||||
|
id = it.bill_d_id,
|
||||||
|
barcode_qty = it.codeqty,
|
||||||
|
}).ToListAsync();
|
||||||
|
var dic = instockCodes.GroupBy(g => g.id).ToDictionary(x => x.Key, x => x.Select(d => d.barcode_qty).ToList());
|
||||||
|
var ids = instockCodes.Select(it => it.id).ToList();
|
||||||
|
var instockDetails = await _db.Queryable<WmsInstockD>().Where(it => ids.Contains(it.id)).ToListAsync();
|
||||||
|
|
||||||
|
foreach (var item in instockDetails)
|
||||||
|
{
|
||||||
|
if (dic.ContainsKey(item.id))
|
||||||
|
{
|
||||||
|
item.qty += dic[item.id].Sum(x => x);
|
||||||
|
if (item.qty >= item.pr_qty)
|
||||||
|
{
|
||||||
|
item.line_status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await _db.Updateable(instockDetails).ExecuteCommandAsync();
|
||||||
|
var instock = await _db.Queryable<WmsInstockH>().SingleAsync(it => it.id == input.requireId);
|
||||||
|
if (instock.IsNull()) ArgumentNullException.ThrowIfNull(nameof(instock));
|
||||||
|
if (instock.sync_status != WmsWareHouseConst.SYNC_STATUS_NONEEDSYNC)
|
||||||
|
{
|
||||||
|
//如果是自动单据,需要回更上层系统
|
||||||
|
Dictionary<string, string> pars = new() { { nameof(WmsInstockH.source_id), instock?.source_id ?? string.Empty } };
|
||||||
|
var callBackRes = await _prdInstockService.SyncInstock(pars);
|
||||||
|
instock!.sync_status = callBackRes == true ? WmsWareHouseConst.SYNC_STATUS__SYNCCOMPLETE : WmsWareHouseConst.SYNC_STATUS__SYNCFAILED;
|
||||||
|
await _db.Updateable(instock).UpdateColumns(it => it.sync_status).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
var allInstockDetails = await _db.Queryable<WmsInstockD>().Where(it => it.bill_id == input.requireId).ToListAsync();
|
||||||
|
if (allInstockDetails.All(x => x.line_status == WmsWareHouseConst.BILLSTATUS_COMPLETE_ID))
|
||||||
|
{
|
||||||
|
instock.status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//任务没有结束,更新状态为工作中
|
||||||
|
instock.status = WmsWareHouseConst.BILLSTATUS_ON_ID;
|
||||||
|
}
|
||||||
|
await _db.Updateable(instock).UpdateColumns(it => it.status).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
await _db.Ado.CommitTranAsync();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
await _db.Ado.RollbackTranAsync();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user