Merge branch 'dev' of https://git.tuotong-tech.com/tnb/tnb.server into dev
This commit is contained in:
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using NPOI.SS.Formula.PTG;
|
||||
using Tnb.QcMgr.Entities.Enums;
|
||||
|
||||
namespace Tnb.QcMgr.Entities.Dto
|
||||
{
|
||||
@@ -17,4 +18,24 @@ namespace Tnb.QcMgr.Entities.Dto
|
||||
public string[]? trievent { get; set; }
|
||||
public string[]? trieventid { get; set; }
|
||||
}
|
||||
public class TriggerPlanEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 物料方案编号
|
||||
/// </summary>
|
||||
public string? materialid { get; set; }
|
||||
/// <summary>
|
||||
/// 工序编号
|
||||
/// </summary>
|
||||
public string? processid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位编号
|
||||
/// </summary>
|
||||
public string? workid { get; set; }
|
||||
/// <summary>
|
||||
/// 触发条件
|
||||
/// </summary>
|
||||
public EnumTriggerEvent? triggerevent { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,4 +12,20 @@ namespace Tnb.QcMgr.Entities.Enums
|
||||
周期触发 = 2,
|
||||
事件触发 = 3
|
||||
}
|
||||
public enum EnumTriggerEvent
|
||||
{
|
||||
首件检换模具 = 1,
|
||||
首件检换物料批号 = 2,
|
||||
首件检换物料编号 = 3,
|
||||
首件检新的生产任务 = 4,
|
||||
首件检生产任务暂停 = 5,
|
||||
出厂检按入厂频次 = 6,
|
||||
入厂检按物料频次 = 7,
|
||||
入厂检按物料编号 = 8,
|
||||
生产检定量 = 9,
|
||||
生产检定码 = 10,
|
||||
生产检产出频次 = 11,
|
||||
生产检固定次数 = 12,
|
||||
生产检按流转卡 = 13
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.JsonSerialization;
|
||||
using JNPF.Systems.Entitys.System;
|
||||
using JNPF.TaskScheduler;
|
||||
using JNPF.TaskScheduler.Entitys.Dto.TaskScheduler;
|
||||
using JNPF.TaskScheduler.Entitys.Model;
|
||||
@@ -21,6 +22,7 @@ using JNPF.VisualDev;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Newtonsoft.Json;
|
||||
using SqlSugar;
|
||||
using Tnb.ProductionMgr.Entities;
|
||||
using Tnb.QcMgr.Entities;
|
||||
using Tnb.QcMgr.Entities.Dto;
|
||||
using Tnb.QcMgr.Entities.Entity;
|
||||
@@ -211,6 +213,8 @@ namespace Tnb.QcMgr
|
||||
QcCheckPlanD.attachment = item.attachment;
|
||||
QcCheckPlanD.isexec = item.isexec;
|
||||
QcCheckPlanD.custom = item.customer;
|
||||
QcCheckPlanD.create_id = _userManager.UserId;
|
||||
QcCheckPlanD.create_time = DateTime.Now;
|
||||
QcCheckPlanDs.Add(QcCheckPlanD);
|
||||
}
|
||||
}
|
||||
@@ -256,5 +260,105 @@ namespace Tnb.QcMgr
|
||||
throw Oops.Oh(ErrorCode.COM1000);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据计划生成任务
|
||||
/// </summary>
|
||||
/// <param name="TriggerPlanEntity"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task CreateTask(TriggerPlanEntity entity)
|
||||
{
|
||||
var Query = _repository.AsSugarClient().Queryable<QcCheckPlanH, QcCheckPlanAdd, QcCheckPlanMaterial, QcCheckPlanProcess, QcCheckPlanWork>
|
||||
((a, b, c, d, e) => new object[] {
|
||||
JoinType.Inner,a.id== b.mainid,
|
||||
JoinType.Left,a.id == c.planid,
|
||||
JoinType.Left,a.id == d.planid,
|
||||
JoinType.Left,a.id == e.planid,
|
||||
});
|
||||
GetQuery(Query, entity.triggerevent);
|
||||
var list = await Query
|
||||
.WhereIF(!string.IsNullOrEmpty(entity.materialid), (a, b, c, d, e) => c.materialid == entity.materialid)
|
||||
.WhereIF(!string.IsNullOrEmpty(entity.processid), (a, b, c, d, e) => d.processid == entity.processid)
|
||||
.WhereIF(!string.IsNullOrEmpty(entity.workid), (a, b, c, d, e) => e.workid == entity.workid).ToListAsync();
|
||||
if (list.Count > 0)
|
||||
await SaveTask(list, entity);
|
||||
}
|
||||
private void GetQuery(ISugarQueryable<QcCheckPlanH, QcCheckPlanAdd, QcCheckPlanMaterial, QcCheckPlanProcess, QcCheckPlanWork> Query, EnumTriggerEvent? enumTriggerEvent)
|
||||
{
|
||||
|
||||
var DictionaryData = _repository.AsSugarClient().Queryable<DictionaryDataEntity, DictionaryTypeEntity>
|
||||
((a, b) => new object[] { JoinType.Left, a.DictionaryTypeId == b.Id, })
|
||||
.Where((a, b) => b.FullName == "质量方案类型").ToList();
|
||||
var TriggerEvent = new QcTriggerEvent();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.首件检换模具)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "首件检").First().Id && p.name == "换模具").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.首件检换物料批号)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "首件检").First().Id && p.name == "换物料批号").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.首件检换物料编号)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "首件检").First().Id && p.name == "换物料编号").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.首件检新的生产任务)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "首件检").First().Id && p.name == "新的生产任务").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.首件检生产任务暂停)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "首件检").First().Id && p.name == "生产任务暂停").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.出厂检按入厂频次)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "出厂检").First().Id && p.name == "按入厂频次").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.入厂检按物料编号)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "入厂检").First().Id && p.name == "按物料编号").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.生产检定量)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "生产检").First().Id && p.name == "定量").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.生产检定码)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "生产检").First().Id && p.name == "定码").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.生产检产出频次)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "生产检").First().Id && p.name == "产出频次").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.生产检固定次数)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "生产检").First().Id && p.name == "固定次数").First();
|
||||
if (enumTriggerEvent == EnumTriggerEvent.生产检按流转卡)
|
||||
TriggerEvent = _repository.AsSugarClient().Queryable<QcTriggerEvent>().Where(p => p.type == DictionaryData.Where(p => p.FullName == "生产检").First().Id && p.name == "按流转卡").First();
|
||||
Query = Query.Where((a, b, c, d, e) => b.triggertype == "3" && b.content!.Contains(TriggerEvent.id));
|
||||
}
|
||||
private async Task SaveTask(List<QcCheckPlanH> planhs, TriggerPlanEntity entity)
|
||||
{
|
||||
var DictionaryData = _repository.AsSugarClient().Queryable<DictionaryDataEntity, DictionaryTypeEntity>
|
||||
((a, b) => new object[] { JoinType.Left, a.DictionaryTypeId == b.Id, })
|
||||
.Where((a, b) => b.FullName == "质检状态" && a.FullName == "待执行").First();
|
||||
var plands = await _repository.AsSugarClient().Queryable<QcCheckPlanD>().Where(p => planhs.Select(p => p.id).ToList().Contains(p.mainid!)).ToListAsync();
|
||||
foreach (var planh in planhs)
|
||||
{
|
||||
var time = DateTime.Now;
|
||||
QcCheckExecH qcCheckExecH = new QcCheckExecH();
|
||||
qcCheckExecH.id = SnowflakeIdHelper.NextId();
|
||||
qcCheckExecH.checktype = planh.checktype;
|
||||
qcCheckExecH.status = DictionaryData.Id;
|
||||
qcCheckExecH.tasktime = time.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
qcCheckExecH.materialid = entity.materialid;
|
||||
qcCheckExecH.processid = entity.processid;
|
||||
qcCheckExecH.workid = entity.workid;
|
||||
qcCheckExecH.create_id = _userManager.UserId;
|
||||
qcCheckExecH.create_time = time;
|
||||
var ExecDs = new List<QcCheckExecD>();
|
||||
foreach (var pland in plands.Where(p => p.mainid == planh.id).ToList())
|
||||
{
|
||||
QcCheckExecD QcCheckExecD = new QcCheckExecD();
|
||||
QcCheckExecD.mainid = qcCheckExecH.id;
|
||||
QcCheckExecD.extype = pland.extype;
|
||||
QcCheckExecD.excontent = pland.excontent;
|
||||
QcCheckExecD.check = pland.check;
|
||||
QcCheckExecD.errorcause = pland.errorcause;
|
||||
QcCheckExecD.errorlevel = pland.errorlevel;
|
||||
QcCheckExecD.remark = pland.remark;
|
||||
QcCheckExecD.attachment = pland.attachment;
|
||||
QcCheckExecD.isexec = pland.isexec;
|
||||
QcCheckExecD.custom = pland.custom;
|
||||
QcCheckExecD.typeid = pland.typeid;
|
||||
QcCheckExecD.itemid = pland.itemid;
|
||||
QcCheckExecD.create_id = _userManager.UserId;
|
||||
QcCheckExecD.create_time = time;
|
||||
ExecDs.Add(QcCheckExecD);
|
||||
}
|
||||
await _repository.AsSugarClient().Insertable(qcCheckExecH).ExecuteCommandAsync();
|
||||
await _repository.AsSugarClient().Insertable(ExecDs).ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,11 +49,6 @@ public partial class WmsCarryunbindCode : BaseEntity<string>
|
||||
/// </summary>
|
||||
public decimal? codeqty { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 行号
|
||||
/// </summary>
|
||||
public int? no { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 子载具ID
|
||||
/// </summary>
|
||||
|
||||
@@ -273,7 +273,7 @@ namespace Tnb.WarehouseMgr
|
||||
//入库取终点 //出库起点
|
||||
var inStockStrategyInput = new InStockStrategyQuery { warehouse_id = instock?.warehouse_id!, Size = 1 };
|
||||
var endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
|
||||
WmsPointH sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == instock.location_id);
|
||||
WmsPointH sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_code == input.instock.location_code);
|
||||
WmsPointH ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
|
||||
|
||||
var carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.carry_code == input.instock.carry_code);
|
||||
|
||||
@@ -50,13 +50,15 @@ namespace Tnb.WarehouseMgr
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task PackSortingByAdd(WmsCarryMat? carryMat)
|
||||
public async Task PackSortingByAdd(WmsCarryMat carryMat)
|
||||
{
|
||||
string firstLocationId = "27010980724501", secondLocationId = "27010987857941";
|
||||
var endLocation = await _db.Queryable<BasLocation>().SingleAsync(it => it.id == secondLocationId);
|
||||
|
||||
var setSortings = await _db.Queryable<WmsSetsortingH>()
|
||||
.Where(a => a.status == WmsWareHouseConst.BILLSTATUS_ADD_ID).OrderBy(a => a.seq)
|
||||
.Where(a => a.status == WmsWareHouseConst.BILLSTATUS_ADD_ID)
|
||||
.Select<WmsSetsortingH>()
|
||||
.OrderBy(a => a.seq)
|
||||
.ToListAsync();
|
||||
var items = await _db.Queryable<WmsSetsortingH>().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).ToListAsync();
|
||||
var onFlag = items?.Count > 0;
|
||||
@@ -64,17 +66,12 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
await _db.Ado.BeginTranAsync();
|
||||
|
||||
var singleSorting = new WmsSetsortingH();
|
||||
if (setSortings?.Count > 0)
|
||||
{
|
||||
singleSorting = setSortings[0];
|
||||
var curCarry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == singleSorting.carry_id);
|
||||
var isMatch = await IsCarryAndLocationMatchByCarryStd(curCarry, endLocation);
|
||||
if (!isMatch) throw new AppFriendlyException("库位与载具规格不匹配", 500);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (setSortings?.Count > 0 && !onFlag)
|
||||
{
|
||||
var singleSorting = setSortings[0];
|
||||
|
||||
var setSortingDList = await _db.Queryable<WmsSetsortingD>().Where(it => it.bill_id == singleSorting.id).ToListAsync();
|
||||
if (setSortingDList?.Count > 0)
|
||||
@@ -83,18 +80,20 @@ namespace Tnb.WarehouseMgr
|
||||
List<WmsCarryCode> carryCodes = new();
|
||||
List<string> carryIds = new();
|
||||
|
||||
var whereExpr = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
|
||||
.And((a, b, c) => a.is_lock == 0)
|
||||
.And((a, b, c) => !string.IsNullOrEmpty(a.location_id))
|
||||
.And((a, b, c) => a.status == (int)EnumCarryStatus.占用);
|
||||
;
|
||||
foreach (var os in setSortingDList)
|
||||
{
|
||||
whereExpr.And((a, b, c) => b.material_id == os.material_id)
|
||||
.And((a, b, c) => c.wh_id == os.warehouse_id)
|
||||
.AndIF(!string.IsNullOrEmpty(os.code_batch), (a, b, c) => b.code_batch == os.code_batch);
|
||||
|
||||
var whereExpr = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
|
||||
.And((a, b, c) => a.is_lock == 0)
|
||||
.And((a, b, c) => !string.IsNullOrEmpty(a.location_id))
|
||||
.And((a, b, c) => a.status == (int)EnumCarryStatus.占用)
|
||||
.And((a, b, c) => b.material_id == os.material_id)
|
||||
.And((a, b, c) => c.wh_id == os.warehouse_id)
|
||||
.AndIF(!string.IsNullOrEmpty(os.code_batch), (a, b, c) => b.code_batch == os.code_batch)
|
||||
.ToExpression();
|
||||
;
|
||||
var carryCodesPart = await _db.Queryable<WmsCarryH>().InnerJoin<WmsCarryCode>((a, b) => a.id == b.carry_id).InnerJoin<BasLocation>((a, b, c) => a.location_id == c.id)
|
||||
.Where(whereExpr.ToExpression())
|
||||
.Where(whereExpr)
|
||||
.Select<WmsCarryCode>()
|
||||
.ToListAsync();
|
||||
if (carryCodesPart?.Count > 0)
|
||||
@@ -152,6 +151,13 @@ namespace Tnb.WarehouseMgr
|
||||
var carrys = await _db.Queryable<WmsCarryH>().Where(it => carryIds.Contains(it.id)).ToArrayAsync();
|
||||
if (carrys?.Length > 0)
|
||||
{
|
||||
if (setSortings?.Count > 0)
|
||||
{
|
||||
|
||||
var curCarry = carrys[^carrys.Length];
|
||||
var isMatch = await IsCarryAndLocationMatchByCarryStd(curCarry, endLocation);
|
||||
if (!isMatch) throw new AppFriendlyException("库位与载具规格不匹配", 500);
|
||||
}
|
||||
List<WmsPretaskH> preTasks = new();
|
||||
List<string> locIds = new();
|
||||
|
||||
|
||||
@@ -54,16 +54,19 @@ namespace Tnb.TaskScheduler.Listener
|
||||
|
||||
var DictionaryType = await repository.AsSugarClient().Queryable<DictionaryTypeEntity>().Where(p => p.FullName == "质检状态").FirstAsync();
|
||||
var DictionaryData = await repository.AsSugarClient().Queryable<DictionaryDataEntity>().Where(p => p.DictionaryTypeId == DictionaryType.Id && p.FullName == "待执行").FirstAsync();
|
||||
var time = DateTime.Now;
|
||||
foreach (var PrdMoTask in PrdMoTasks)
|
||||
{
|
||||
|
||||
QcCheckExecH qcCheckExecH = new QcCheckExecH();
|
||||
qcCheckExecH.id = SnowflakeIdHelper.NextId();
|
||||
qcCheckExecH.checktype = PlanH.checktype;
|
||||
qcCheckExecH.status = DictionaryData.Id;
|
||||
qcCheckExecH.tasktime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
qcCheckExecH.tasktime = time.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
qcCheckExecH.materialid = PrdMoTask.material_id;
|
||||
qcCheckExecH.processid = PrdMoTask.process_id;
|
||||
qcCheckExecH.workid = PrdMoTask.workstation_id;
|
||||
qcCheckExecH.create_time = time;
|
||||
var ExecDs = new List<QcCheckExecD>();
|
||||
foreach (var PlanD in PlanDs)
|
||||
{
|
||||
@@ -80,6 +83,7 @@ namespace Tnb.TaskScheduler.Listener
|
||||
QcCheckExecD.custom = PlanD.custom;
|
||||
QcCheckExecD.typeid = PlanD.typeid;
|
||||
QcCheckExecD.itemid = PlanD.itemid;
|
||||
QcCheckExecD.create_time = time;
|
||||
ExecDs.Add(QcCheckExecD);
|
||||
}
|
||||
await repository.AsSugarClient().Insertable(qcCheckExecH).ExecuteCommandAsync();
|
||||
|
||||
Reference in New Issue
Block a user