using Infrastructure.Attribute; using SqlSugar; using System; using System.Linq; using System.Text.RegularExpressions; using ZR.Model; using ZR.Model.Business; using ZR.Model.MES.pro; using ZR.Model.MES.qc; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; using ZR.Repository; using ZR.Service.mes.wms.IService; namespace ZR.Service.mes.wms { /// /// 一次合格品仓库记录表Service业务层处理 /// [AppService( ServiceType = typeof(IWmOneTimeRecordService), ServiceLifetime = LifeTime.Transient )] public class WmOneTimeRecordService : BaseService, IWmOneTimeRecordService { /// /// 查询一次合格品仓库记录表列表 /// /// /// public PagedInfo GetList(WmOneTimeRecordQueryDto parm) { var predicate = Expressionable .Create() .AndIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.Partnumber == parm.Partnumber ) .AndIF(!string.IsNullOrEmpty(parm.Remark), it => it.Remark.Contains(parm.Remark)) .AndIF(!string.IsNullOrEmpty(parm.Code), it => it.Code.Contains(parm.Code)) /*.AndIF( !string.IsNullOrEmpty(parm.FkInventoryId), it => it.FkInventoryId == parm.FkInventoryId )*/ .AndIF(!string.IsNullOrEmpty(parm.Id), it => it.Id == parm.Id) .AndIF(parm.ChangeType > -1, it => it.ChangeType == parm.ChangeType) .AndIF( parm.StartActionTime != null, it => parm.StartActionTime.Value.ToLocalTime() <= it.ActionTime ) .AndIF( parm.EndActionTime != null, it => parm.EndActionTime.Value.ToLocalTime() >= it.ActionTime ); var response = Queryable() .Where(predicate.ToExpression()) .ToPage(parm); return response; } /// /// 获取详情 /// /// /// public WmOneTimeRecord GetInfo(string Id) { var response = Queryable().Where(x => x.Id == Id).First(); return response; } /// /// 添加一次合格品仓库记录表 /// /// /// public WmOneTimeRecord AddWmOneTimeRecord(WmOneTimeRecord model) { return Context.Insertable(model).ExecuteReturnEntity(); } /// /// 修改一次合格品仓库记录表 /// /// /// public int UpdateWmOneTimeRecord(WmOneTimeRecord model) { //var response = Update(w => w.Id == model.Id, it => new WmOneTimeRecord() //{ // Code = model.Code, // Partnumber = model.Partnumber, // BlankNum = model.BlankNum, // ChangeType = model.ChangeType, // ChangeQuantity = model.ChangeQuantity, // ActionTime = model.ActionTime, // Status = model.Status, // Remark = model.Remark, // CreatedBy = model.CreatedBy, // CreatedTime = model.CreatedTime, // UpdatedBy = model.UpdatedBy, // UpdatedTime = model.UpdatedTime, //}); //return response; return Update(model, true); } /// /// 自动生成一次合格仓库记录日志 /// /// /// /// public int GenerateWmOneTimeRecord(WmOneTimeRecordGenerateDto parm) { if (parm == null || parm.StartTime == null || parm.StartTime.Value == DateTime.MinValue) { return -1; } else { #region 查询需要的数据 //TODO 入库条件1 产线合格品qc_quality_statistics_first,合格数,其中去除(倒车雷达) List qcQualityStatisticsFirsts = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.FinishedPartNumber == parm.Partnumber ) .Where(it => !it.ProductDescription.Contains("倒车雷达")) .Where(it => it.StartTime >= parm.StartTime) .Where(it => it.QualifiedNumber > 0) .Where(it => it.Remark == "抛光") .ToList(); //TODO 入库条件2 抛光合格品 wm_polish_work_quality_statistics 合格数 List wmPolishWorkQualityStatistics = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.Partnumber == parm.Partnumber ) .Where(it => it.StartTime >= parm.StartTime) .ToList(); //TODO 出库条件1 GP12 (新) 触摸屏 qc_gp12_service_statistics 投入数 List qcGp12ServiceStatistics = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.PartNumber == parm.Partnumber ) .Where(it => it.StartTime >= parm.StartTime) .Where(it => it.GroupSort == 1) .ToList(); //TODO 出库条件2 后道 wm_polish_quality_statistics 投入数 List wmPolishQualityStatistics = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.Partnumber == parm.Partnumber ) .Where(it => it.StartTime >= parm.StartTime) .ToList(); #endregion #region 组装 WmOneTimeRecord 实体 List wmOneTimeRecords = new List(); foreach (var item in qcQualityStatisticsFirsts) { wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = item.FinishedPartNumber, ChangeType = 1, ChangeQuantity = item.QualifiedNumber, ActionTime = item.StartTime, Status = 1, Remark = "产线报表合格品自动入库,来源工单号:" + item.WorkorderId } ); } foreach (var item in wmPolishWorkQualityStatistics) { wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = item.Partnumber, ChangeType = 1, ChangeQuantity = item.QualifiedNumber, ActionTime = item.StartTime, Status = 1, Remark = "抛光报表合格品自动入库" } ); } foreach (var item in qcGp12ServiceStatistics) { wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = item.PartNumber, ChangeType = 2, ChangeQuantity = item.RequireNumber, ActionTime = item.StartTime, Status = 1, Remark = "GP12触摸屏报表投入自动出库" } ); } foreach (var item in wmPolishQualityStatistics) { wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = item.Partnumber, ChangeType = 2, ChangeQuantity = item.RequireNumber, ActionTime = item.StartTime, Status = 1, Remark = "后道报表自动出库" } ); } #endregion //如果有这个时间段的数据,要删除 List delwmOneTimeRecords = Context .Queryable() .Where(it => it.Code == "自动") .Where(it => it.ActionTime >= parm.StartTime) .ToList(); Context.Deleteable(delwmOneTimeRecords).ExecuteCommand(); if (wmOneTimeRecords.Any()) { Context.Insertable(wmOneTimeRecords).ExecuteCommand(); } return wmOneTimeRecords.Count; // 返回插入的记录数 } } /// /// 自动生成一次合格仓库记录日志 (后道自动化版本) /// /// /// public int GenerateWmOneTimeRecord02(WmOneTimeRecordGenerateDto parm) { if (parm == null || parm.StartTime == null || parm.StartTime.Value == DateTime.MinValue) { return -1; } int result = 0; try { // 开始事务 Context.Ado.BeginTran(); #region 查询需要的数据 // 入库条件1 产线合格品qc_quality_statistics_first,合格数,其中去除(倒车雷达) List qcQualityStatisticsFirsts = Context .Queryable() .LeftJoin((qsf, wo) => qsf.WorkorderId == wo.ClientWorkorder) .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), (qsf, wo) => qsf.FinishedPartNumber == parm.Partnumber ) .Where((qsf, wo) => !qsf.ProductDescription.Contains("倒车雷达")) .Where((qsf, wo) => qsf.StartTime >= parm.StartTime) .Where((qsf, wo) => qsf.QualifiedNumber > 0) .Where((qsf, wo) => qsf.Remark == "抛光") //XXX过滤维修件 //.Where((qsf, wo) => wo != null || !wo.Remark1.Contains("维修")) .ToList(); // 入库条件2 抛光合格品 wm_polish_work_quality_statistics 合格数 List wmPolishWorkQualityStatistics = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.Partnumber == parm.Partnumber ) .Where(it => it.StartTime >= parm.StartTime) .ToList(); // 出库条件1 GP12 (新) 触摸屏 qc_gp12_service_statistics 投入数 List qcGp12ServiceStatistics = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.PartNumber == parm.Partnumber ) .Where(it => it.StartTime >= parm.StartTime) .Where(it => it.GroupSort == 1) .ToList(); // 出库条件2 后道 wm_polish_quality_statistics 投入数 List qcBackEndQualityStatistics = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.PartNumber == parm.Partnumber ) .Where(it => it.StartTime >= parm.StartTime) .Where(it => it.GroupSort == 1) // .Where(it => it.IsOut == 1) 待定 现在暂时都是直接出库 .ToList(); List wmPolishQualityStatistics = Context .Queryable() .WhereIF( !string.IsNullOrEmpty(parm.Partnumber), it => it.Partnumber == parm.Partnumber ) .Where(it => it.StartTime >= parm.StartTime) .ToList(); #endregion #region 组装 WmOneTimeRecord 实体 List wmOneTimeRecords = new List(); foreach (var item in qcQualityStatisticsFirsts) { // TODO 零件号二次处理 string partNumber = item.FinishedPartNumber; // 使用正则表达式匹配并移除特殊后缀 string processedPartnumber = Regex.Replace( partNumber, @"-(FL|FR|RR|RL)$", "", RegexOptions.IgnoreCase ); wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = processedPartnumber, ChangeType = 1, ChangeQuantity = item.QualifiedNumber, ActionTime = item.StartTime, Status = 1, Remark = "产线-报表合格品自动入库,来源工单号:" + item.WorkorderId } ); } foreach (var item in wmPolishWorkQualityStatistics) { // TODO 零件号二次处理 string partNumber = item.Partnumber; // 使用正则表达式匹配并移除特殊后缀 string processedPartnumber = Regex.Replace( partNumber, @"-(FL|FR|RR|RL)$", "", RegexOptions.IgnoreCase ); wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = processedPartnumber, ChangeType = 1, ChangeQuantity = item.QualifiedNumber, ActionTime = item.StartTime, Status = 1, Remark = "抛光-报表合格品自动入库" } ); } foreach (var item in qcGp12ServiceStatistics) { // TODO 零件号二次处理 string partNumber = item.PartNumber; // 使用正则表达式匹配并移除特殊后缀 string processedPartnumber = Regex.Replace( partNumber, @"-(FL|FR|RR|RL)$", "", RegexOptions.IgnoreCase ); wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = processedPartnumber, ChangeType = 2, ChangeQuantity = item.RequireNumber, ActionTime = item.StartTime, Status = 1, Remark = "GP12触摸屏-报表投入自动出库" } ); } foreach (var item in qcBackEndQualityStatistics) { // TODO 零件号二次处理 string partNumber = item.PartNumber; // 使用正则表达式匹配并移除特殊后缀 string processedPartnumber = Regex.Replace( partNumber, @"-(FL|FR|RR|RL)$", "", RegexOptions.IgnoreCase ); wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = processedPartnumber, ChangeType = 2, ChangeQuantity = item.RequireNumber, ActionTime = item.StartTime, Status = 1, Remark = "后道触摸屏-报表自动出库" } ); } //XXX 20250613 后道触摸屏与手填报表同时统计 foreach (var item in wmPolishQualityStatistics) { // TODO 零件号二次处理 string partNumber = item.Partnumber; // 使用正则表达式匹配并移除特殊后缀 string processedPartnumber = Regex.Replace( partNumber, @"-(FL|FR|RR|RL)$", "", RegexOptions.IgnoreCase ); wmOneTimeRecords.Add( new WmOneTimeRecord { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = item.Id, Code = "自动", Partnumber = processedPartnumber, ChangeType = 2, ChangeQuantity = item.RequireNumber, ActionTime = item.StartTime, Status = 1, Remark = "后道报表-手填报表出库" } ); } #endregion // 直接删除旧数据,避免先查询再删除的并发问题 Context .Deleteable() .Where(it => it.Code == "自动") .Where(it => it.ActionTime >= parm.StartTime) .ExecuteCommand(); if (wmOneTimeRecords.Any()) { // 分批插入数据,避免一次插入过多数据 const int batchSize = 1000; var batches = wmOneTimeRecords.Chunk(batchSize); foreach (var batch in batches) { Context.Insertable(batch.ToList()).ExecuteCommand(); } } result = wmOneTimeRecords.Count; Context.Ado.CommitTran(); return result; // 返回插入的记录数 } catch (Exception) { Context.Ado.RollbackTran(); return -1; } } } }