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 silkRepository; private readonly IPlcService plcService; private readonly IRepository produceRepository; private readonly IRepository boxRepository; private readonly IPrinterService printerService; private readonly IUnitOfWorkManager unitOfWork; private readonly ILogger logger; private readonly static object _lock = new object(); public DefaultBalanceEventHandle(IRepository silkRepository,IPlcService plcService,IRepository produceRepository,IRepository boxRepository,IPrinterService printerService,IUnitOfWorkManager unitOfWork, ILogger logger) { this.silkRepository = silkRepository; this.plcService = plcService; this.produceRepository = produceRepository; this.boxRepository = boxRepository; this.printerService = printerService; this.unitOfWork = unitOfWork; this.logger = logger; } 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(); } } } /// /// 丝锭称重 /// /// /// public async Task Yanr(decimal weight) { 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 = 1; 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})状态更改为【已称重待装箱】,同时向打印机发送打印标签指令"); } } /// /// 整箱称重 /// /// public async Task Box(decimal weight) { /* PLC未给顶升到位信号则忽略此次事件处理 */ if (!await plcService.IsTop()) return; if (await silkRepository.AnyAsync(e => e.Status == 1 && e.IsDelete == 0)) { var query = await silkRepository.GetQueryableAsync(); query =query.Where(x => x.Status == 1 && x.IsDelete == 0); var count = query.Count(); var produce = await produceRepository.FirstOrDefaultAsync(e => e.IfUse == 1); if (produce is null) throw Oops.Oh("无生产信息,请先设置生产信息再扫码"); if (produce.Qty.Value > count) { throw Oops.Oh("数量未满箱,无法打印标签"); } 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 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), Net_Weight = netWeight, Spec = produce.BoxSpec, Gross_Weight = (double)weight, IsUse = true, IsDelete = 0 }; string content = "#!A1" + "\r\n#N13" + "\r\n#PC1017/0" + "\r\n#IMR104/130" + //"\r\n#HV50" + "\r\n#PR6//" + "\r\n#PO0" + "\r\n#ERNC/1//0.00" + "\r\n#R0/0" + "\r\n#T7.28 #J11.17 #FD/1/L #SS100/BVUN/51X68/0 #VW/L/\"YuLinHengShenXinCaiLiaoYouXianGongSi\"#G" + "\r\n#T13.37 #J40.30 #FD/1/L #SS100/BVUN/46X62/0 #VW/L/\"Yulin Hengshen COLtd\"#G" + "\r\n#T52.15 #J9.14 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"TYPE " + box.Type + "\"#G" + "\r\n#T67.39 #J9.14 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"QTY/PCS " + box.Qty + "\"#G" + "\r\n#T82.63 #J9.14 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"LOT NO. " + box.Lot_No + "\"#G" + "\r\n#T98.97 #J9.14 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"DOM. " + box.Dom_Time.ToString() + "\"#G" + "\r\n#T52.15 #J69.25 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"SPEC " + box.Spec + "\"#G" + "\r\n#T67.39 #J69.25 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"CTY./NO. " + box.Net_Weight + "\"#G" + "\r\n#T81.19 #J69.25 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"LENGTH " + box.Length + "\"#G" + "\r\n#T98.21 #J69.25 #FD/1/L #SS100/BVUN/47X63/0 #VW/L/\"EXP. " + box.Exp_Time.ToString() + "\"#G" + "\r\n#T41.06 #J6.68 #FD/1/L #SB13/ONKP2.0/20.82/5 #VW/L/\"" + box.Code + "\"#G" + "\r\n#Q1#G\r\n#!P1\r\n"; 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 = 2; e.Status_Details = "已装箱"; }); await silkRepository.UpdateManyAsync(silks); await printerService.PrintAsync(2, content); await plcService.ClearTop(); await plcService.BoxTagPrintDoneAsync((short)1); logger.LogInformation($"称重完成,已将数据({box.Id}|{box.Code})插入到box表,同时向打印机发送出标指令"); } } } }