291 lines
13 KiB
C#
Raw Normal View History

using Microsoft.Extensions.Logging;
using NUglify.Helpers;
using Seyounth.Auto.Hs.Runtime.Balances;
using Seyounth.Auto.Hs.Runtime.Plc;
using Seyounth.Auto.Hs.Runtime.Printer;
using Syc.Abp.Application.Contracts;
using Syc.Basic.Web.WMS.Entitys;
using Syc.Basic.Web.WMS.Service;
using Syc.Basic.Web.WMS.WebSocket;
using Syc.Core.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Uow;
namespace Syc.Basic.Web.WMS.DeviceEventHandle
{
public class DefaultBalanceEventHandle : IBalanceEventHandle
{
private readonly IRepository<Silk> silkRepository;
private readonly IPlcService plcService;
private readonly IRepository<Produce> produceRepository;
private readonly IRepository<Box> boxRepository;
private readonly IPrinterService printerService;
private readonly IUnitOfWorkManager unitOfWork;
private readonly ILogger<DefaultBalanceEventHandle> logger;
2025-10-31 09:56:25 +08:00
private readonly IRepository<AutoLabel> autoRepository;
2025-11-11 09:20:17 +08:00
private readonly IRepository<Values> valueRepository;
private readonly static object _lock = new object();
2025-11-11 09:20:17 +08:00
public DefaultBalanceEventHandle(IRepository<Silk> silkRepository, IPlcService plcService, IRepository<Produce> produceRepository, IRepository<Box> boxRepository, IPrinterService printerService, IUnitOfWorkManager unitOfWork, ILogger<DefaultBalanceEventHandle> logger, IRepository<AutoLabel> autoRepository, IRepository<Values> valueRepository)
{
this.silkRepository = silkRepository;
this.plcService = plcService;
this.produceRepository = produceRepository;
this.boxRepository = boxRepository;
this.printerService = printerService;
this.unitOfWork = unitOfWork;
this.logger = logger;
2025-10-31 09:56:25 +08:00
this.autoRepository = autoRepository;
2025-11-11 09:20:17 +08:00
this.valueRepository = valueRepository;
}
2025-10-31 09:56:25 +08:00
public async Task ExecAsync(decimal weight, int id)
{
2025-10-31 09:56:25 +08:00
using (var uow = unitOfWork.Reserve(UnitOfWork.UnitOfWorkReservationName))
{
try
{
if (weight <= 0)
return;
//logger.LogInformation($"重量稳定:{weight}");
if (id == 1)
await Yanr(weight);
else
await Box(weight);
await uow.CompleteAsync();
}
catch (Exception ex) when (ex is FriendlyException friendlyException)
{
logger.LogError(ex.GetBaseException(), "称重报错");
await WebSocketManager.SocketManager.BroadcastAsync(friendlyException.Message);
await uow.RollbackAsync();
}
catch (Exception ex)
{
logger.LogError(ex.GetBaseException(), "称重报错");
await uow.RollbackAsync();
}
2025-10-31 09:56:25 +08:00
}
}
/// <summary>
/// 丝锭称重
/// </summary>
/// <param name="weight"></param>
/// <returns></returns>
public async Task Yanr(decimal weight)
{
2025-10-31 09:56:25 +08:00
#region
//要扫码称重的
//if (await silkRepository.AnyAsync(e => e.Status == 0 && e.IsDelete == 0))
//{
// var silk = await silkRepository.FirstOrDefaultAsync(e => e.Status == 0 && e.IsDelete == 0);//QueueManage.YarnBalanceQueue.Dequeue();
// silk.Status = (int)SilkStatus.已称重;
// silk.Status_Details = "已称重";
// silk.Net_Weight = (double)weight;
// await silkRepository.UpdateAsync(silk);
// string content = "#!A1" +
// "\r\n#N13" +
// "\r\n#PC1017/0" +
// "\r\n#IMR44/46" +
// //"\r\n#HV50" +
// "\r\n#PR6//" +
// "\r\n#PO0" +
// "\r\n#ERNC/1//0.00" +
// "\r\n#R0/0" +
// "\r\n#T3.64 #J43.18 #FD/0/L #SS100/BVUN/21X21/0 #VW/L/\"YuLinHengShenXinCaiLiaoYouXianGongSi\"#G" +
// "\r\n#T11.85 #J40.47 #FD/0/L #SS100/BVUN/19X19/0 #VW/L/\"Yulin Hengshen COLtd\"#G" +
// "\r\n#T2.28 #J25.31 #FD/0/L #SS100/BVUN/20X20/0 #VW/L/\"Name " + silk.Name +"\"#G" +
// "\r\n#T2.28 #J20.91 #FD/0/L #SS100/BVUN/20X20/0 #VW/L/\"Type " +silk.Type+ "\"#G" +
// "\r\n#T2.28 #J16.51 #FD/0/L #SS100/BVUN/20X20/0 #VW/L/\"Net Weight "+silk.Net_Weight+ "\"#G" +
// "\r\n#T2.28 #J12.61 #FD/0/L #SS100/BVUN/20X20/0 #VW/L/\"Length "+silk.Length+ "\"#G" +
// "\r\n#T2.28 #J7.95 #FD/0/L #SS100/BVUN/20X20/0 #VW/L/\"Date "+silk.Date.ToString()+ "\"#G" +
// "\r\n#T2.28 #J3.89 #FD/0/L #SS100/BVUN/20X20/0 #VW/L/\"Lot No "+silk.Lot_No+ "\"#G" +
// "\r\n#T11.51 #J29.54 #FD/0/L #SB13/ONKP2.0/8.80/2 #VW/L/\"" + silk.Code+"\"#G" +
// "\r\n#Q1#G" +
// "\r\n#!P1" +
// "\r\n";
// await printerService.PrintAsync(1, content);
// logger.LogInformation($"Silk({silk.Id}|{silk.Code})状态更改为【已称重待装箱】,同时向打印机发送打印标签指令");
//}
#endregion
//不扫码称重
logger.LogInformation("称重的体重为" + weight);
if ((double)weight < 0.2)
return;
var produce = await produceRepository.FirstOrDefaultAsync(x => x.IfUse == 1 && x.IsDelete == 0);
2025-11-11 09:20:17 +08:00
var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1);
var keys = values.Key1.Split(',');
2025-10-31 09:56:25 +08:00
if (produce == null)
throw Oops.Oh("没有生产设置");
var date = DateOnly.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
var autolabel = await autoRepository.FirstOrDefaultAsync(x => x.Date == date && x.Type == (int)AutoLabelType.);
var timestr = DateTime.Now.ToString("yyyyMMddHHmmss");
if (autolabel == null)
{
2025-10-31 09:56:25 +08:00
autolabel = await autoRepository.InsertAsync(new AutoLabel()
{
Date = date,
Sort = 0,
Mark = timestr,
Type = (int)AutoLabelType.
}, true);
}
2025-10-31 09:56:25 +08:00
autolabel.Sort += 1;
logger.LogInformation(timestr + autolabel.Sort.ToString().PadLeft(4, '0'));
await autoRepository.UpdateAsync(autolabel);
var silk = new Silk()
{
Status = (int)SilkStatus.,
Status_Details = "已称重",
Net_Weight = (double)weight,
Code = timestr + autolabel.Sort.ToString().PadLeft(4, '0'),
Createtime = DateTime.Now,
IsDelete = 0,
2025-11-11 09:20:17 +08:00
Color = keys[int.Parse(values.Value)],
2025-10-31 09:56:25 +08:00
Date = DateTime.Now,
Name = produce.Type,
Length = produce.Length,
Lot_No = produce.Lot_No,
Type = produce.Spec
};
var data = await silkRepository.InsertAsync(silk, true);
//打印丝锭小标签
BarTenderHelper.SilkPrint(silk);
logger.LogInformation($"Silk({data.Id}|{silk.Code})状态更改为【已称重】,同时向打印机发送打印标签指令");
}
/// <summary>
/// 整箱称重
/// </summary>
/// <param name="weight"></param>
public async Task Box(decimal weight)
{
/* PLC未给顶升到位信号则忽略此次事件处理 */
2025-10-31 09:56:25 +08:00
if (!await plcService.IsTop())
{
var a = await plcService.IsTop();
logger.LogInformation($"上顶的状态{a}");
return;
}
if (await silkRepository.AnyAsync(e => e.Status == 1 && e.IsDelete == 0))
2025-10-31 09:56:25 +08:00
{
var produce = await produceRepository.FirstOrDefaultAsync(e => e.IfUse == 1 && e.IsDelete == 0);
var query = await silkRepository.GetQueryableAsync();
query = query.Where(x => x.Status == 1 && x.IsDelete == 0 && x.Type == produce.Spec && x.Name == produce.Type && x.Length == produce.Length && x.Lot_No == produce.Lot_No);
2025-11-11 09:20:17 +08:00
var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1);
var keys = values.Key1.Split(',');
var count = query.Count();
2025-10-31 09:56:25 +08:00
if (produce is null)
2025-10-31 09:56:25 +08:00
throw Oops.Oh("无生产信息,请先设置生产信息再称重");
if (produce.Qty.Value > count)
{
2025-10-31 09:56:25 +08:00
throw Oops.Oh($"{produce.Type}数量未满箱,无法打印标签");
}
2025-10-31 09:56:25 +08:00
logger.LogInformation($"当前生产信息:{produce.Name}|{produce.Spec}|{produce.Lot_No}|{produce.BoxSpec}|{produce.Qty}");
//var netWeight = query.FirstOrDefault(e => e.Code == QueueManage.BoxQueue.FirstOrDefault()).Net_Weight * produce.Qty.Value;
var takeQuery = query.Take(produce.Qty.Value);
var netWeight = takeQuery.Sum(e => e.Net_Weight);
2025-10-31 09:56:25 +08:00
var date = DateOnly.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
var autolabel = await autoRepository.FirstOrDefaultAsync(x => x.Date == date && x.Type == (int)AutoLabelType.);
var timestr = DateTime.Now.ToString("yyyyMMddHHmmss");
if (autolabel == null)
{
autolabel = await autoRepository.InsertAsync(new AutoLabel()
{
Date = date,
Sort = 0,
Mark = timestr,
Type = (int)AutoLabelType.
}, true);
}
autolabel.Sort += 1;
logger.LogInformation("成箱流水号:" + timestr + autolabel.Sort.ToString().PadLeft(4, '0'));
await autoRepository.UpdateAsync(autolabel);
var box = new Box()
{
Dom_Time = DateTime.Now,
Type = produce.Type,
Exp_Time = produce.Exp_Time,
Qty = produce.Qty,
Length = produce.Length,
Lot_No = produce.Lot_No,
2025-10-31 09:56:25 +08:00
//Code = Guid.NewGuid().ToString().Substring(9, 18),
2025-11-11 09:20:17 +08:00
Color = keys[int.Parse(values.Value)],
2025-10-31 09:56:25 +08:00
Code = timestr + autolabel.Sort.ToString().PadLeft(4, '0'),
Net_Weight = netWeight,
2025-10-31 09:56:25 +08:00
Spec = produce.Spec,
Gross_Weight = (double)weight,
IsUse = true,
2025-10-31 09:56:25 +08:00
IsDelete = 0,
DataType = (int)BoxDataType.,
Create_Time = DateTime.Now,
Mark = "已称重装箱打印标签,箱子内装单品数量" + produce.Qty
};
2025-10-31 09:56:25 +08:00
//打印成箱大标签
BarTenderHelper.BoxPrint(box);
logger.LogInformation($"打印条码{box.Code},成箱码垛标签打印成功");
var entity = await boxRepository.InsertAsync(box, true);
var silks = takeQuery.ToList();
var codes = silks.Select(e => e.Code);
logger.LogInformation($"从数据库中待装箱编号:{string.Join(";", codes)}");
silks.ForEach(e =>
{
logger.LogInformation($"{e.Code}已装箱");
e.BoxId = entity.Id;
2025-10-31 09:56:25 +08:00
e.Status = (int)SilkStatus.;
e.Status_Details = "已装箱";
});
await silkRepository.UpdateManyAsync(silks);
2025-10-31 09:56:25 +08:00
await plcService.ClearTop();
2025-10-31 09:56:25 +08:00
await plcService.ClearData();
await plcService.BoxTagPrintDoneAsync((short)1);
2025-10-31 09:56:25 +08:00
await plcService.PrintEnd();
logger.LogInformation($"称重完成,已将数据({entity.Id}|{box.Code})插入到box表同时向打印机发送出标指令");
}
}
}
}