syc_zhaoqianyan 66fc5b3b19 1.扫码枪实现
2.体重秤实现
3.打印机实现
2025-07-01 14:20:07 +08:00

201 lines
9.7 KiB
C#
Raw Permalink 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 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)
{
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();
}
}
}
/// <summary>
/// 丝锭称重
/// </summary>
/// <param name="weight"></param>
/// <returns></returns>
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})状态更改为【已称重待装箱】,同时向打印机发送打印标签指令");
}
}
/// <summary>
/// 整箱称重
/// </summary>
/// <param name="weight"></param>
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表同时向打印机发送出标指令");
}
}
}
}