2025-11-11 09:20:17 +08:00

291 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
private readonly IRepository<AutoLabel> autoRepository;
private readonly IRepository<Values> valueRepository;
private readonly static object _lock = new object();
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;
this.autoRepository = autoRepository;
this.valueRepository = valueRepository;
}
public async Task ExecAsync(decimal weight, int id)
{
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();
}
}
}
/// <summary>
/// 丝锭称重
/// </summary>
/// <param name="weight"></param>
/// <returns></returns>
public async Task Yanr(decimal weight)
{
#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);
var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1);
var keys = values.Key1.Split(',');
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)
{
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 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,
Color = keys[int.Parse(values.Value)],
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未给顶升到位信号则忽略此次事件处理 */
if (!await plcService.IsTop())
{
var a = await plcService.IsTop();
logger.LogInformation($"上顶的状态{a}");
return;
}
if (await silkRepository.AnyAsync(e => e.Status == 1 && e.IsDelete == 0))
{
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);
var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1);
var keys = values.Key1.Split(',');
var count = query.Count();
if (produce is null)
throw Oops.Oh("无生产信息,请先设置生产信息再称重");
if (produce.Qty.Value > count)
{
throw Oops.Oh($"{produce.Type}数量未满箱,无法打印标签");
}
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);
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,
//Code = Guid.NewGuid().ToString().Substring(9, 18),
Color = keys[int.Parse(values.Value)],
Code = timestr + autolabel.Sort.ToString().PadLeft(4, '0'),
Net_Weight = netWeight,
Spec = produce.Spec,
Gross_Weight = (double)weight,
IsUse = true,
IsDelete = 0,
DataType = (int)BoxDataType.,
Create_Time = DateTime.Now,
Mark = "已称重装箱打印标签,箱子内装单品数量" + produce.Qty
};
//打印成箱大标签
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;
e.Status = (int)SilkStatus.;
e.Status_Details = "已装箱";
});
await silkRepository.UpdateManyAsync(silks);
await plcService.ClearTop();
await plcService.ClearData();
await plcService.BoxTagPrintDoneAsync((short)1);
await plcService.PrintEnd();
logger.LogInformation($"称重完成,已将数据({entity.Id}|{box.Code})插入到box表同时向打印机发送出标指令");
}
}
}
}