using DOAN.Infrastructure.Helper; using DOAN.Model; using DOAN.Model.MES.base_; using DOAN.Model.MES.mm; using DOAN.Model.MES.product; using DOAN.Model.MES.product.Dto; using DOAN.Model.MES.recipe; using DOAN.Repository; using DOAN.Service.MES.mm.line; using DOAN.Service.Mobile.IService; using Infrastructure.Attribute; namespace DOAN.Service.Mobile { [AppService(ServiceType = typeof(IPADReportWorkService), ServiceLifetime = LifeTime.Transient)] public class PADReportWorkService : BaseService, IPADReportWorkService { /// /// 不防错直接报工 /// /// /// /// public int NoErrorProofingAndReportingReport(string wokorder, int reportNum) { int result = 0; var selected_workorder = Context.Queryable().Where(it => it.FkWorkorder == wokorder) .First(); if (selected_workorder != null) { //修改 result = Context.Updateable().Where(it => it.FkWorkorder == wokorder) .SetColumns(it => it.FinishedNum == reportNum) .SetColumns(it => it.UpdatedTime == DateTime.Now) .SetColumns(it => it.UpdatedBy == "PDA") .ExecuteCommand(); } else { //新增 var handle_workorder= Context.Queryable().Where(it => it.Workorder == wokorder).First(); var reportWork = new ProReportwork(); reportWork.Id = XueHua; reportWork.FkWorkorder = wokorder; reportWork.DispatchNum = handle_workorder.DeliveryNum; reportWork.FinishedNum = reportNum; reportWork.GroupCode = handle_workorder.GroupCode; reportWork.LineCode = handle_workorder.LineCode; reportWork.CreatedTime = DateTime.Now; reportWork.CreatedBy = "PDA"; result = Context.Insertable(reportWork).ExecuteCommand(); } /* // TODO 线边库出库(PDA) try { // 工单信息查询 var workorderInfo = Context.Queryable().Where(it => it.Workorder == wokorder).First(); // 计算Bom表 string InvCode = workorderInfo.ProductionCode; // 查看需要的子件 var bomList = Context.Queryable().Where(it => it.InvCode == InvCode).ToList(); foreach (BaseMaterialBom bom in bomList) { int quantity = 0; if (int.TryParse(bom.Iusequantity, out int res)) { quantity = res; } MmLineInventoryService mmLineInventoryService = new MmLineInventoryService(); mmLineInventoryService.outboundLineMaterial(1, workorderInfo.LineCode, bom.SubInvCode, workorderInfo.Workorder, workorderInfo.LineCode, quantity); } } catch (Exception) { throw; }*/ return result; } public List GetAllRoute() { return Context.Queryable().ToList(); } public List GetGroupList() { return Context.Queryable().Where(it => it.Status == 1).ToList(); } public ProWorkorderDto4 GetWorkOrderDetail(string workorder) { var query = Context.Queryable() .Where(it => it.Workorder == workorder); return Context.Queryable(query) .LeftJoin((q, r) => q.Workorder == r.FkWorkorder) .Select((q, r) => new ProWorkorderDto4 { FinishNum = r.FinishedNum }, true).First(); } public List GetWorkOrderStatusList(string group_code, int status, DateTime handleDate) { var query = Context.Queryable().Where(it => it.GroupCode == group_code) .Where(it => it.Status == status) .Where(it => it.WorkorderDate == handleDate); return Context.Queryable(query) .LeftJoin((w, r) => w.Workorder == r.FkWorkorder) .Select((w, r) => new ProReportworkDto { Id = r.Id, ProductionCode = w.ProductionCode, ProductionName = w.ProductionName, Specification = w.Specification, QualifiedNumber = r.QualifiedNumber, UnqualifiedNumber = r.UnqualifiedNumber, ReworkNumber = r.ReworkNumber, ScrapNumber = r.ScrapNumber, Remark = r.Remark, Difference = r.QualifiedNumber - r.FinishedNum ?? 0, FkWorkorder = w.Workorder, GroupCode = w.GroupCode, LineCode = w.LineCode, DispatchNum = w.DeliveryNum ?? 0, Priority = w.Priority, Status = w.Status, Beat = w.Beat }, true).ToList(); } /// /// 修改报工表 /// /// /// public int UpdateProReportwork(ProReportwork model) { //var response = Update(w => w.Id == model.Id, it => new ProReportwork() //{ // FkWorkorder = model.FkWorkorder, // DispatchNum = model.DispatchNum, // FinishedNum = model.FinishedNum, // GroupCode = model.GroupCode, // LineCode = model.LineCode, // CreatedBy = model.CreatedBy, // CreatedTime = model.CreatedTime, // UpdatedBy = model.UpdatedBy, // UpdatedTime = model.UpdatedTime, //}); //return response; return Update(model, true); } public async Task StartWorkOrder(string workorder) { var result = 0; // 获取同一天 同一组 同一线 的所有工单 把状态2 设为init 1 var handleWorkorder = Context.Queryable().Where(it => it.Workorder == workorder).First(); UseTran2(() => { Context.Updateable().SetColumns(it => it.Status == 1) .Where(it => it.Status == 2) .Where(it => it.WorkorderDate == handleWorkorder.WorkorderDate) .Where(it => it.GroupCode == handleWorkorder.GroupCode) .Where(it => it.LineCode == handleWorkorder.LineCode) .ExecuteCommand(); result = Context.Updateable().SetColumns(it => it.Status == 2) .SetColumns(it => it.StartTime == DateTime.Now) .Where(it => it.Workorder == workorder).ExecuteCommand(); }); //TODO 拼接MQTT消息,发送给设备,工单信息和配方信息 var spec = handleWorkorder.Specification; var RecipeMesg = Context.Queryable() .LeftJoin((rpr, r) => rpr.RecipeCode == r.RecipeCode) .Where((rpr, r) => SqlFunc.Like(spec, rpr.RecipeCode + "%")) .Where((rpr, r) => r.Status == 1) .Select((rpr, r) => new { RecipeCode = r.RecipeCode, Version = r.Version, ParamList = SqlFunc.Subqueryable() .Where(it => it.RecipeCode == r.RecipeCode && it.Version == r.Version) .ToList(), // 添加匹配长度用于排序 MatchLength = rpr.RecipeCode.Length }) .MergeTable() .OrderByDescending(x => x.MatchLength) // 按匹配长度降序排列 .First(); // 取第一个(匹配最长的) // 合并两个对象为匿名对象 var combinedObject = new { WorkorderInfo = handleWorkorder, RecipeInfo = RecipeMesg }; string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(combinedObject, Newtonsoft.Json.Formatting.Indented); //插入配方派发日志 if (RecipeMesg != null && !string.IsNullOrEmpty(RecipeMesg.RecipeCode)) { PfRecipeIssueLog pfRecipeIssueLog = new PfRecipeIssueLog(); pfRecipeIssueLog.RecipeCode = RecipeMesg.RecipeCode; pfRecipeIssueLog.Version = RecipeMesg.Version; pfRecipeIssueLog.IssueTime = DateTime.Now; pfRecipeIssueLog.Workorder = handleWorkorder.Workorder; pfRecipeIssueLog.Productcode = handleWorkorder.ProductionCode; pfRecipeIssueLog.Productname = handleWorkorder.ProductionName; pfRecipeIssueLog.CreatedBy = "PDA"; pfRecipeIssueLog.CreatedTime = DateTime.Now; Context.Insertable(pfRecipeIssueLog).ExecuteCommand(); } MqttHelper _mqttHelper = new MqttHelper("192.168.50.163", 1883); // 连接 await _mqttHelper.ConnectAsync(); // 发送多条消息 string line = handleWorkorder.LineCode == null ? "-1" : handleWorkorder.LineCode; await _mqttHelper.PublishMessageAsync("MES/Workorder/Start/handleWorkorder/" + line, jsonString); // 断开连接 await _mqttHelper.DisconnectAsync(); return result; } public int FinishWorkOrder(string workorder) { return Context.Updateable() .SetColumns(it => it.Status == 3) .SetColumns(it => it.EndTime == DateTime.Now) .Where(it => it.Workorder == workorder).ExecuteCommand(); } /// /// 查询报工表列表 /// /// /// public PagedInfo GetList(ProReportworkQueryDto parm) { if (parm.TimeRange != null && parm.TimeRange.Length == 2) { parm.TimeRange[0] = parm.TimeRange[0].Date; // parm.TimeRange[1] = parm.TimeRange[1].Date.AddDays(1); parm.TimeRange[1] = parm.TimeRange[1].Date; } var predicate = Expressionable.Create() .AndIF(!string.IsNullOrEmpty(parm.FkWorkorder), (w, r) => w.Workorder.Contains(parm.FkWorkorder)) .AndIF(!string.IsNullOrEmpty(parm.GroupCode), (w, r) => w.GroupCode == parm.GroupCode) .AndIF(!string.IsNullOrEmpty(parm.LineCode), (w, r) => w.LineCode == parm.LineCode) .AndIF(parm.WarehouseconfirmationNum > 0, (w, r) => r.QualifiedNumber > 0) .AndIF( parm.TimeRange != null && parm.TimeRange.Length == 2 && parm.TimeRange[0] > DateTime.MinValue, (w, r) => w.WorkorderDate >= parm.TimeRange[0]) .AndIF( parm.TimeRange != null && parm.TimeRange.Length == 2 && parm.TimeRange[1] > DateTime.MinValue, (w, r) => w.WorkorderDate <= parm.TimeRange[1]) .AndIF(parm.Status > 0, (w, r) => w.Status == parm.Status) ; var response = Context.Queryable() .LeftJoin((w, r) => w.Workorder == r.FkWorkorder) .Where(predicate.ToExpression()) .Select((w, r) => new ProReportworkDto { Id = r.Id, ProductionCode = w.ProductionCode, ProductionName = w.ProductionName, Specification = w.Specification, QualifiedNumber = r.QualifiedNumber, UnqualifiedNumber = r.UnqualifiedNumber, ReworkNumber = r.ReworkNumber, ScrapNumber = r.ScrapNumber, Remark = r.Remark, Difference = r.QualifiedNumber - r.FinishedNum ?? 0, FkWorkorder = w.Workorder, GroupCode = w.GroupCode, LineCode = w.LineCode, DispatchNum = w.DeliveryNum ?? 0, Priority = w.Priority, Status = w.Status, Beat = w.Beat }, true).ToPage_NO_Convert(parm); return response; } } }