From bbcdb7d0fba51f0e3a014fb0e561e97998dcd8a2 Mon Sep 17 00:00:00 2001 From: qianjiawei <1184704771@qq.com> Date: Fri, 25 Aug 2023 17:53:56 +0800 Subject: [PATCH 1/9] 1 --- QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs | 98 ++++++ .../Tnb.QcMgr.Entities/Entity/QcSpcConfig.cs | 4 +- QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcH.cs | 6 +- QcMgr/Tnb.QcMgr.Interfaces/IQcSpcService.cs | 4 +- QcMgr/Tnb.QcMgr/QcSpcService.cs | 302 ++++++++++++++++++ 5 files changed, 408 insertions(+), 6 deletions(-) create mode 100644 QcMgr/Tnb.QcMgr/QcSpcService.cs diff --git a/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs b/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs index 705cfb5a..e5af3a8a 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs @@ -3,10 +3,108 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Spire.Xls.Core.Spreadsheet.Charts; namespace Tnb.QcMgr.Entities { public class SpcDataInput { + /// + /// 主表id + /// + public string? mainid { get; set; } + /// + /// 检验时间 + /// + public string? checktime { get; set; } + + /// + /// 批次 + /// + public string? batch { get; set; } + + /// + /// 数据 + /// + public float[] data { get; set; } + + /// + /// 检查数量 + /// + public int? checknum { get; set; } + + /// + /// 不良品数量 + /// + public int? defectivenum { get; set; } + } + public class XRchart + { + public List xcharts { get; set; } + public List 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 xcharts { get; set; } + public List 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 xmrxcharts { get; set; } + public List 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; } } } diff --git a/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcConfig.cs b/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcConfig.cs index 9312eb96..4cf90a08 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcConfig.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcConfig.cs @@ -28,7 +28,7 @@ namespace Tnb.QcMgr.Entities /// /// 子组容量 /// - public string? subcapacity { get; set; } + public int? subcapacity { get; set; } /// /// 控制图键 @@ -38,7 +38,7 @@ namespace Tnb.QcMgr.Entities /// /// 控制图值 /// - public decimal? spcdata { get; set; } + public float? spcdata { get; set; } } diff --git a/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcH.cs b/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcH.cs index f0e96a3d..2a81b63e 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcH.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Entity/QcSpcH.cs @@ -98,17 +98,17 @@ namespace Tnb.QcMgr.Entities /// /// 规格上限 /// - public decimal? uplimit { get; set; } + public float? uplimit { get; set; } /// /// 目标值 /// - public decimal? target { get; set; } + public float? target { get; set; } /// /// 规格下限 /// - public decimal? lowerlimit { get; set; } + public float? lowerlimit { get; set; } /// /// 子组容量 diff --git a/QcMgr/Tnb.QcMgr.Interfaces/IQcSpcService.cs b/QcMgr/Tnb.QcMgr.Interfaces/IQcSpcService.cs index 1d6b2afb..77097e46 100644 --- a/QcMgr/Tnb.QcMgr.Interfaces/IQcSpcService.cs +++ b/QcMgr/Tnb.QcMgr.Interfaces/IQcSpcService.cs @@ -20,6 +20,8 @@ namespace Tnb.QcMgr.Interfaces /// 保存spcd数据 /// /// - public Task SaveData(SpcDataInput SpcDataInput); + public Task SaveData(List SpcDataInput); + + public Task GetSpcData(string id); } } diff --git a/QcMgr/Tnb.QcMgr/QcSpcService.cs b/QcMgr/Tnb.QcMgr/QcSpcService.cs new file mode 100644 index 00000000..297b6ca7 --- /dev/null +++ b/QcMgr/Tnb.QcMgr/QcSpcService.cs @@ -0,0 +1,302 @@ +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 SqlSugar; +using Tnb.QcMgr.Entities; +using Tnb.QcMgr.Entities.Entity; +using Tnb.QcMgr.Interfaces; + +namespace Tnb.QcMgr +{ + /// + /// spc模块 + /// + [ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 800)] + public class QcSpcService : IQcSpcService, IDynamicApiController, ITransient + { + private readonly ISqlSugarRepository _repository; + private readonly IUserManager _userManager; + public QcSpcService(ISqlSugarRepository repository, IUserManager userManager) + { + _repository = repository; + _userManager = userManager; + } + /// + /// 获取spcd数据 + /// + /// + /// + [HttpPost] + public async Task GetSpcItems(string id) + { + var datas= await _repository.AsSugarClient().Queryable().Where(p => p.mainid == id).ToListAsync(); + List SpcDataInputs=new List(); + 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; + } + /// + /// 保存spcd + /// + /// + /// + [HttpPost] + public async Task SaveData(List SpcDataInput) + { + var db = _repository.AsSugarClient(); + try + { + if (!string.IsNullOrEmpty(SpcDataInput.First().mainid)) + await db.Deleteable(p => p.mainid == SpcDataInput.First().mainid).ExecuteCommandAsync(); + List QcSpcDs = new List(); + + + 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); + } + } + /// + /// 获取spc图表 + /// + /// + /// + [HttpPost] + public async Task GetSpcData(string id) + { + var QcSpcH = await _repository.AsSugarClient().Queryable().Where(p => p.id == id).FirstAsync(); + var QcSpcDs = await _repository.AsSugarClient().Queryable().Where(p => p.mainid == id).ToListAsync(); + var cinfigs = await _repository.AsSugarClient().Queryable().ToListAsync(); + if (QcSpcH.graphtype == "X-R控制图") + { + XRchart XRchart = new XRchart(); + XRchart.xcharts = new List(); + XRchart.rcharts = new List(); + foreach (var QcSpcD in QcSpcDs) + { + List 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(); + XSchart.scharts = new List(); + foreach (var QcSpcD in QcSpcDs) + { + List 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(); + XRchart.rcharts = new List(); + foreach (var QcSpcD in QcSpcDs) + { + List 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(); + XMRchart.xmrmrcharts = new List(); + foreach (var QcSpcD in QcSpcDs) + { + List 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; + } + return null; + } + //标准差计算 + private static float CalculateStdDev(IEnumerable 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 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 values) + { + List floats = new List(); + 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(); + } + } +} From 1c372c6d78d5314c690e2207c4071199a0ab3274 Mon Sep 17 00:00:00 2001 From: qianjiawei <1184704771@qq.com> Date: Mon, 28 Aug 2023 17:27:55 +0800 Subject: [PATCH 2/9] 1 --- QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs | 30 ++++++++++ QcMgr/Tnb.QcMgr/QcSpcService.cs | 79 +++++++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs b/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs index e5af3a8a..d9b3bf7b 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Dto/SpcData.cs @@ -107,4 +107,34 @@ namespace Tnb.QcMgr.Entities 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; } + } } diff --git a/QcMgr/Tnb.QcMgr/QcSpcService.cs b/QcMgr/Tnb.QcMgr/QcSpcService.cs index 297b6ca7..36753845 100644 --- a/QcMgr/Tnb.QcMgr/QcSpcService.cs +++ b/QcMgr/Tnb.QcMgr/QcSpcService.cs @@ -11,6 +11,7 @@ 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; @@ -255,6 +256,84 @@ namespace Tnb.QcMgr }); return XMRchart; } + if (QcSpcH.graphtype == "P图") + { + List pcharts = new List(); + 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 ucharts = new List(); + 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 npcharts = new List(); + 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 ccharts = new List(); + 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; } //标准差计算 From 52b0eb1762263480643b7b812b3e9f4ab86caf72 Mon Sep 17 00:00:00 2001 From: qianjiawei <1184704771@qq.com> Date: Tue, 29 Aug 2023 17:10:50 +0800 Subject: [PATCH 3/9] 1 --- QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs | 10 +++++----- QcMgr/Tnb.QcMgr/QcCheckPlanService.cs | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs index 6a534904..c6d5ccc8 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs @@ -16,15 +16,15 @@ namespace Tnb.QcMgr.Entities.Enums } public enum EnumTriggerEvent { - [Remark("首件检", "换模具")] + [Remark("首检", "换模具")] 首件检换模具 = 1, - [Remark("首件检", "换物料批号")] + [Remark("首检", "换物料批号")] 首件检换物料批号 = 2, - [Remark("首件检", "换物料编号")] + [Remark("首检", "换物料编号")] 首件检换物料编号 = 3, - [Remark("首件检", "新的生产任务")] + [Remark("首检", "新的生产任务")] 首件检新的生产任务 = 4, - [Remark("首件检", "生产任务暂停")] + [Remark("首检", "生产任务暂停")] 首件检生产任务暂停 = 5, [Remark("出厂检", "按入厂频次")] 出厂检按入厂频次 = 6, diff --git a/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs b/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs index 15f413e1..8c6c0a34 100644 --- a/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs +++ b/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs @@ -292,11 +292,12 @@ namespace Tnb.QcMgr { var DictionaryData = _repository.AsSugarClient().Queryable ((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 enumTriggerEvent = entity.triggerevent; var remark = RemarkAttribute.GetRemark(enumTriggerEvent); - TriggerEvent = _repository.AsSugarClient().Queryable().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().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)); } private void Filter(List QcCheckPlanHs, TriggerPlanEntity entity) From 2d6e2a56fc5939b1f6a57ace321156e90eb8b979 Mon Sep 17 00:00:00 2001 From: zhoukeda <1315948824@qq.com> Date: Wed, 30 Aug 2023 16:51:31 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=B3=A8?= =?UTF-8?q?=E5=A1=91=E6=8C=A4=E5=87=BA=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dto/PrdManage/PrdMoFromOneListOutput.cs | 17 +++- .../Entity/AppPrdMoTaskOneListOutput.cs | 26 +++++ .../APP/AppPrdMoTaskOneService.cs | 97 +++++++++++++++++++ .../Tnb.ProductionMgr/PrdMoService.cs | 14 ++- .../Tnb.ProductionMgr/PrdMoTaskService.cs | 40 +++++++- 5 files changed, 189 insertions(+), 5 deletions(-) create mode 100644 ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs create mode 100644 ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromOneListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromOneListOutput.cs index b8de7235..dd579252 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromOneListOutput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromOneListOutput.cs @@ -142,7 +142,7 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage } - public class PrdMoReverseFromMaterialput + public class PrdMoReverseFromMaterialoutput { /// /// 物料ID @@ -153,6 +153,14 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage /// public string material_code { get; set; } /// + /// 物料名称 + /// + public string material_name { get; set; } + /// + /// 物料规格 + /// + public string material_standard { get; set; } + /// /// 批次 /// public string code_batch { get; set;} @@ -208,6 +216,12 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage /// 已投数量 /// public decimal feeding_num { get; set; } + /// + /// 使用状态 + /// + public string use_status { get; set; } + public string supplier_name { get; set; } + public string unit_name { get; set; } } /// @@ -234,6 +248,7 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage /// 投料子表id /// public string feeding_detail_id { get; set; } + public string mo_task_code { get; set; } public string feeding_time { get; set; } public decimal num { get; set; } public string check_conclusion { get; set; } diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs new file mode 100644 index 00000000..bc60501a --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs @@ -0,0 +1,26 @@ +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 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; } + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs new file mode 100644 index 00000000..8f6b2219 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs @@ -0,0 +1,97 @@ +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 +{ + /// + /// 移动端注塑挤出任务管理 + /// + [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 _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 repository, + IUserManager userManager, + IDictionaryDataService dictionaryDataService, + 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 GetList(VisualDevModelListQueryInput input) + { + var db = _repository.AsSugarClient(); + Dictionary queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject>(input.queryJson) : new Dictionary(); + 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() + .LeftJoin((a, b) => a.material_id == b.id) + .LeftJoin((a, b, c) => a.mold_id == c.id) + .LeftJoin((a, b, c, d) => a.eqp_id == d.id) + .LeftJoin((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, + 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.SqlSugarPageResult(result); + } + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs index baffc63b..4f4b9344 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs @@ -873,12 +873,24 @@ namespace Tnb.ProductionMgr } else { - PageResult output = JsonConvert.DeserializeObject>(authResponse.data.ToString(),new Tnb.Common.Utils.DateTimeJsonConverter()); + PageResult output = JsonConvert.DeserializeObject>(authResponse.data.ToString(),new Tnb.Common.Utils.DateTimeJsonConverter()); if (output.list != null && output.list.Count > 0) { + BasMaterial basMaterial = await _db.Queryable().SingleAsync(x=>x.id==output.list[0].material_id); + BasSupplier basSupplier = await _db.Queryable().SingleAsync(x=>x.id==output.list[0].supplier_id); + DictionaryDataEntity unit = await _db.Queryable() + .LeftJoin((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() .LeftJoin((a, b) => a.id == b.material_receipt_detail_id) .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]; } } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index 71dcbc55..53e42bfa 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -2062,7 +2062,7 @@ namespace Tnb.ProductionMgr }); 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); - return result.IsSuccess ? "延期成功" : result.ErrorMessage; + return result.IsSuccess ? "更换成功" : result.ErrorMessage; } @@ -2156,9 +2156,43 @@ namespace Tnb.ProductionMgr }); if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage); - return result.IsSuccess ? "延期成功" : result.ErrorMessage; + return result.IsSuccess ? "更换成功" : result.ErrorMessage; } + + /// + /// 根据id获取任务单相关信息 + /// + /// + [HttpPost] + public async Task GetPrdMoTaskInfoById(Dictionary dic) + { + string id = dic.ContainsKey("id") ? dic["id"] : ""; + if (string.IsNullOrEmpty(id)) return null; + var db = _repository.AsSugarClient(); + return await db.Queryable() + .LeftJoin((a, b) => a.material_id == b.id) + .LeftJoin((a, b, c) => a.mold_id == c.id) + .LeftJoin((a, b, c, d) => a.eqp_id == d.id) + .LeftJoin((a,b,c,d,e)=>e.EnCode==a.mo_task_status && e.DictionaryTypeId==DictConst.PrdTaskStatusTypeId) + .Where((a, b, c, d) => a.id == id) + .Select((a, b, c, d,e) => 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, + equip_code = d.code, + scheduled_qty = a.scheduled_qty, + reported_work_qty = a.reported_work_qty, + scrap_qty = a.scrap_qty, + }).FirstAsync(); + + } } } From 49056a6a53f70c07a69da9a87c69247ef2aa432b Mon Sep 17 00:00:00 2001 From: zhoukeda <1315948824@qq.com> Date: Thu, 31 Aug 2023 11:37:45 +0800 Subject: [PATCH 5/9] =?UTF-8?q?pda=E7=BB=84=E8=A3=85=E5=8C=85=E8=A3=85?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entity/AppPrdMoTaskOneListOutput.cs | 5 + .../APP/AppPrdMoTaskOneService.cs | 2 +- .../APP/AppPrdMoTaskTwoService.cs | 102 ++++++++++++++++++ .../Tnb.ProductionMgr/PrdMoTaskService.cs | 5 +- 4 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs index bc60501a..e5bd8bee 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskOneListOutput.cs @@ -15,6 +15,11 @@ namespace Tnb.ProductionMgr.Entities 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; } diff --git a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs index 8f6b2219..a10453fe 100644 --- a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs @@ -76,7 +76,7 @@ namespace Tnb.ProductionMgr.APP mo_task_code = a.mo_task_code, mo_task_status = e.FullName, material_id_id = a.material_id, - material_id = b.code, + material_id = b.code+"/"+b.name, material_code = b.code, material_name = b.name, mold_id_id = a.mold_id, diff --git a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs new file mode 100644 index 00000000..87130e60 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs @@ -0,0 +1,102 @@ +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 +{ + /// + /// 移动端组装包装任务管理 + /// + [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 _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 repository, + IUserManager userManager, + IDictionaryDataService dictionaryDataService, + 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 GetList(VisualDevModelListQueryInput input) + { + var db = _repository.AsSugarClient(); + Dictionary queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject>(input.queryJson) : new Dictionary(); + 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() + .LeftJoin((a, b) => a.material_id == b.id) + .LeftJoin((a, b, c) => a.mold_id == c.id) + .LeftJoin((a, b, c, d) => a.eqp_id == d.id) + .LeftJoin((a, b, c, d, e) => e.EnCode == a.mo_task_status && e.DictionaryTypeId == DictConst.PrdTaskStatusTypeId) + .LeftJoin((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.SqlSugarPageResult(result); + } + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index 53e42bfa..0f1244ad 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -2175,8 +2175,9 @@ namespace Tnb.ProductionMgr .LeftJoin((a, b, c) => a.mold_id == c.id) .LeftJoin((a, b, c, d) => a.eqp_id == d.id) .LeftJoin((a,b,c,d,e)=>e.EnCode==a.mo_task_status && e.DictionaryTypeId==DictConst.PrdTaskStatusTypeId) + .LeftJoin((a,b,c,d,e,f)=>a.process_id==f.id) .Where((a, b, c, d) => a.id == id) - .Select((a, b, c, d,e) => new + .Select((a, b, c, d,e,f) => new { id = a.id, mo_task_code = a.mo_task_code, @@ -2190,6 +2191,8 @@ namespace Tnb.ProductionMgr scheduled_qty = a.scheduled_qty, reported_work_qty = a.reported_work_qty, scrap_qty = a.scrap_qty, + process_id_id = a.process_id, + process_id = f.process_name, }).FirstAsync(); } From 6642720a7ce95e12716b18a0c236ab2cdb7a4be7 Mon Sep 17 00:00:00 2001 From: zhoukeda <1315948824@qq.com> Date: Thu, 31 Aug 2023 16:29:07 +0800 Subject: [PATCH 6/9] =?UTF-8?q?pda=E4=BB=BB=E5=8A=A1=E5=8D=95=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E8=AE=B0=E5=BD=95=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entity/AppPrdMoTaskLogListOutput.cs | 31 +++++ .../Entity/PrdMoTaskLog.cs | 10 ++ .../APP/AppPrdMoTaskLogService.cs | 125 ++++++++++++++++++ .../APP/AppPrdMoTaskOneService.cs | 1 - .../APP/AppPrdMoTaskTwoService.cs | 1 - 5 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskLogListOutput.cs create mode 100644 ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskLogService.cs diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskLogListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskLogListOutput.cs new file mode 100644 index 00000000..52ad5685 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/AppPrdMoTaskLogListOutput.cs @@ -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; } + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTaskLog.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTaskLog.cs index 602beb67..f10ade62 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTaskLog.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTaskLog.cs @@ -73,5 +73,15 @@ public partial class PrdMoTaskLog : BaseEntity /// 任务单编号 /// public string? mo_task_code { get; set; } + + /// + /// 工位编号 + /// + public string? station_code { get; set; } + + /// + /// 工序编号 + /// + public string? process_code { get; set; } } diff --git a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskLogService.cs b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskLogService.cs new file mode 100644 index 00000000..14186d66 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskLogService.cs @@ -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 +{ + /// + /// 移动端任务单操作记录 + /// + [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 _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 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 GetList(VisualDevModelListQueryInput input) + { + var db = _repository.AsSugarClient(); + Dictionary queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject>(input.queryJson) : new Dictionary(); + 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() + .LeftJoin((a, b) => a.material_id == b.id) + .LeftJoin((a, b, c) => a.mold_id == c.id) + .LeftJoin((a, b, c, d) => a.eqp_id == d.id) + .LeftJoin((a, b, c, d, e) => e.EnCode == a.mo_task_status && e.DictionaryTypeId == DictConst.PrdTaskStatusTypeId) + .LeftJoin((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.SqlSugarPageResult(result); + } + + /// + /// 根据任务单id获取操作记录 + /// + /// + /// + [HttpPost] + public async Task GetLogById(Dictionary dic) + { + string mo_task_id = dic.ContainsKey("mo_task_id") ? dic["mo_task_id"] : ""; + if (string.IsNullOrEmpty(mo_task_id)) return Array.Empty(); + Dictionary statsDic = await _dictionaryDataService.GetDicByTypeId(DictConst.PrdTaskStatusTypeId); + return await _db.Queryable().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(); + } + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs index a10453fe..82f0bedd 100644 --- a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskOneService.cs @@ -37,7 +37,6 @@ namespace Tnb.ProductionMgr.APP public AppPrdMoTaskOneService( ISqlSugarRepository repository, IUserManager userManager, - IDictionaryDataService dictionaryDataService, IRunService runService, IBillRullService billRullService, IVisualDevService visualDevService diff --git a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs index 87130e60..9499db64 100644 --- a/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/APP/AppPrdMoTaskTwoService.cs @@ -37,7 +37,6 @@ namespace Tnb.ProductionMgr.APP public AppPrdMoTaskTwoService( ISqlSugarRepository repository, IUserManager userManager, - IDictionaryDataService dictionaryDataService, IRunService runService, IBillRullService billRullService, IVisualDevService visualDevService From f374ea514bdd25c9e9f553f9ee3c853544235a8c Mon Sep 17 00:00:00 2001 From: zhoukeda <1315948824@qq.com> Date: Fri, 1 Sep 2023 08:56:14 +0800 Subject: [PATCH 7/9] 1 --- ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index 0f1244ad..b43a48a1 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -2187,7 +2187,10 @@ namespace Tnb.ProductionMgr 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, scheduled_qty = a.scheduled_qty, reported_work_qty = a.reported_work_qty, scrap_qty = a.scrap_qty, From 893b0bd95f731ec15531e2b46e0ef6779edb6252 Mon Sep 17 00:00:00 2001 From: zhoukeda <1315948824@qq.com> Date: Fri, 1 Sep 2023 17:12:04 +0800 Subject: [PATCH 8/9] 1 --- ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index b43a48a1..0158bfca 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -2176,8 +2176,9 @@ namespace Tnb.ProductionMgr .LeftJoin((a, b, c, d) => a.eqp_id == d.id) .LeftJoin((a,b,c,d,e)=>e.EnCode==a.mo_task_status && e.DictionaryTypeId==DictConst.PrdTaskStatusTypeId) .LeftJoin((a,b,c,d,e,f)=>a.process_id==f.id) + .LeftJoin((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) => new + .Select((a, b, c, d,e,f,g) => new { id = a.id, mo_task_code = a.mo_task_code, @@ -2191,11 +2192,14 @@ namespace Tnb.ProductionMgr 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_id = a.process_id, - process_id = f.process_name, + process_id = a.process_id, + process_name = f.process_name, }).FirstAsync(); } From 13e2e81d131a8bdb48e980bb8c4b5648035163a3 Mon Sep 17 00:00:00 2001 From: FanLian Date: Mon, 4 Sep 2023 14:19:23 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PDA=E6=89=AB=E7=A0=81?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Consts/ModuleConsts.cs | 5 + .../Consts/WmsWareHouseConst.cs | 12 +- .../Dto/Inputs/InOutStockApplyforUpInput.cs | 2 +- .../Dto/Outputs/InStockDetailOutput.cs | 2 +- .../Entity/WmsInstockCode.cs | 2 +- .../Entity/WmsInstockD.cs | 2 +- .../Entity/WmsPretaskCode.cs | 2 +- .../Tnb.WarehouseMgr/WmsCarryBindService.cs | 1 + .../Tnb.WarehouseMgr/WmsPDAInStockService.cs | 2 +- .../WmsPDAScanInStockService.cs | 290 ++++++++++++++++++ 10 files changed, 313 insertions(+), 7 deletions(-) create mode 100644 WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs index 544ea289..4b209e25 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs @@ -181,4 +181,9 @@ public class ModuleConsts /// public const string MODULE_WMSPOINT_ID = "26099196480805"; + /// + /// 模块标识-PDA寄存出库 + /// + public const string MODULE_WMSSCANCODEINSTOCKPDA_ID = "28576495374869"; + } \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index cb360200..f248d95d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -10,6 +10,13 @@ namespace Tnb.WarehouseMgr.Entities.Consts { public class WmsWareHouseConst { + /// + /// 原材料仓ID + /// + public const string WAREHOUSE_YCL_ID = "1"; + /// + /// 中储仓ID + /// public const string WAREHOUSE_ZC_ID = "2"; /// @@ -250,7 +257,10 @@ namespace Tnb.WarehouseMgr.Entities.Consts /// public const string SYNC_STATUS__SYNCFAILED = "26191354152229"; - + /// + /// 单据类型-来料入库单 + /// + public const string BILLTYPE_MATERIALINSTOCK_ID = "25103338755861"; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/InOutStockApplyforUpInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/InOutStockApplyforUpInput.cs index 2e4da1c2..3f1de637 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/InOutStockApplyforUpInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/InOutStockApplyforUpInput.cs @@ -144,7 +144,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto /// /// 扫描数量 /// - public int scan_qty { get; set; } + public decimal scan_qty { get; set; } /// /// 备注 diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/InStockDetailOutput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/InStockDetailOutput.cs index fb2a09e2..f2602191 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/InStockDetailOutput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/InStockDetailOutput.cs @@ -70,7 +70,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto /// /// 扫描数量 /// - public int scan_qty { get; set; } + public decimal scan_qty { get; set; } /// /// 物品代码 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockCode.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockCode.cs index 468210b8..7b191f25 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockCode.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockCode.cs @@ -70,7 +70,7 @@ public partial class WmsInstockCode : BaseEntity, IInOutStockCode /// /// 条码数量 /// - public int codeqty { get; set; } + public decimal codeqty { get; set; } /// /// 是否锁定 diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockD.cs index 7b676d67..cc4c7996 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInstockD.cs @@ -137,7 +137,7 @@ public partial class WmsInstockD : BaseEntity /// /// 扫描数量 /// - public int scan_qty { get; set; } + public decimal scan_qty { get; set; } /// /// 备注 diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskCode.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskCode.cs index 4fd80461..e55014cf 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskCode.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskCode.cs @@ -47,7 +47,7 @@ public partial class WmsPretaskCode : BaseEntity /// /// 条码数量 /// - public int codeqty { get; set; } + public decimal codeqty { get; set; } /// /// 单位ID diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index fb5460ab..5640c695 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -33,6 +33,7 @@ namespace Tnb.WarehouseMgr [OverideVisualDev(ModuleConsts.MODULE_WMSCARRYBIND_ID)] public class WmsCarryBindService : BaseWareHouseService, IWmsCarryBindService { + private readonly ISqlSugarClient _db; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAInStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAInStockService.cs index 8cb07c4c..178daf7c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAInStockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAInStockService.cs @@ -34,7 +34,7 @@ using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { /// - /// PDA载具移入 + /// PDA一般入库 /// [OverideVisualDev(ModuleConsts.MODULE_WMSINSTOCKPDA_ID)] [ServiceModule(BizTypeId)] diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs new file mode 100644 index 00000000..811b4a8c --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs @@ -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 +{ + /// + /// PDA扫码入库模块 + /// + [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 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 ScanInStock(VisualDevModelDataCrInput input) + { + try + { + await _db.Ado.BeginTranAsync(); + var item = input.data.Adapt(); + if (item.codeqty == 0) throw new AppFriendlyException("请输入入库数量", 500); + var carryCode = item.barcode; + var carry = await _db.Queryable().FirstAsync(it => it.carry_code == carryCode); + if (carry == null) throw new AppFriendlyException("载具有误", 500); + var mat = await _db.Queryable().FirstAsync(it => it.code == item.material_code); + if (mat == null) throw new AppFriendlyException("物料有误", 500); + var loc = await _db.Queryable().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().SingleAsync(it => it.id == endLocations[0].id); + var isMatch = await IsCarryAndLocationMatchByCarryStd(carry, eloc); + if (!isMatch) throw new AppFriendlyException("库位与载具规格不匹配", 500); + ePoint = await _db.Queryable().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().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().SetColumns(it => new WmsInstockCode { is_end = 1 }).Where(it => barCodes.Contains(it.barcode)).ExecuteCommandAsync(); + var instockCodes = await _db.Queryable().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().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().SingleAsync(it => it.id == input.requireId); + if (instock.IsNull()) ArgumentNullException.ThrowIfNull(nameof(instock)); + if (instock.sync_status != WmsWareHouseConst.SYNC_STATUS_NONEEDSYNC) + { + //如果是自动单据,需要回更上层系统 + Dictionary 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().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; + } + } + } +}