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;
+ }
+ }
+ }
+}