diff --git a/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs b/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs index 84749afb..473334bb 100644 --- a/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs +++ b/BasicData/Tnb.BasicData.Entities/Consts/CodeTemplateConst.cs @@ -54,6 +54,31 @@ namespace Tnb.BasicData /// 料仓原料条码单 /// public const string PRDRAWMATERIALBARCODE_CODE = "PrdRawMaterialBarcode"; + + /// + /// 首检单号 + /// + public const string SHOUJIAN_CODE = "shoujian"; + + /// + /// 巡检单号 + /// + public const string XUNJIAN_CODE = "xunjian"; + + /// + /// 末检单号 + /// + public const string MOJIAN_CODE = "mojian"; + + /// + /// 零部件最终检验单号 + /// + public const string LINGBUJIANZUIZHONGJIANYAN_CODE = "lingbujianzuizhongjianyan"; + + /// + /// 成品检验单号 + /// + public const string CHENGPINJIANYAN_CODE = "chengpinjianyan"; } } \ No newline at end of file diff --git a/BasicData/Tnb.BasicData.Interfaces/IBasWorkgroupService.cs b/BasicData/Tnb.BasicData.Interfaces/IBasWorkgroupService.cs new file mode 100644 index 00000000..546fd66c --- /dev/null +++ b/BasicData/Tnb.BasicData.Interfaces/IBasWorkgroupService.cs @@ -0,0 +1,26 @@ +namespace Tnb.BasicData.Interfaces +{ + public interface IBasWorkgroupService + { + /// + /// 根据workGroupId获取员工ids + /// + /// + /// + public Task> GetEmployeeIds(string workGroupId); + + // /// + // /// 根据获取同组员工的ids + // /// + // /// + // /// + // public Task> GetEmployeeIdsByUserId(string userId); + + /// + /// 根据获取员工的班组ids + /// + /// + /// + public Task> GetWorkgroupIdsByUserId(string userId); + } +} \ No newline at end of file diff --git a/BasicData/Tnb.BasicData/BasWorkgroupService.cs b/BasicData/Tnb.BasicData/BasWorkgroupService.cs new file mode 100644 index 00000000..491a31ca --- /dev/null +++ b/BasicData/Tnb.BasicData/BasWorkgroupService.cs @@ -0,0 +1,49 @@ +using JNPF.Common.Core.Manager; +using JNPF.DependencyInjection; +using JNPF.DynamicApiController; +using JNPF.Systems.Interfaces.System; +using Microsoft.AspNetCore.Mvc; +using SqlSugar; +using Tnb.BasicData.Entities; +using Tnb.BasicData.Interfaces; + +namespace Tnb.BasicData +{ + /// + /// 班组服务 + /// + [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1102)] + [Route("api/[area]/[controller]/[action]")] + public class BasWorkgroupService : IBasWorkgroupService, IDynamicApiController, ITransient + { + private readonly ISqlSugarRepository _repository; + private readonly DataBaseManager _dbManager; + private readonly IDictionaryDataService _dictionaryDataService; + + public BasWorkgroupService( + ISqlSugarRepository repository, DataBaseManager dbManager, IDictionaryDataService dictionaryDataService) + { + _repository = repository; + _dbManager = dbManager; + _dictionaryDataService = dictionaryDataService; + } + + public async Task> GetEmployeeIds(string workGroupId) + { + return await _repository.AsSugarClient().Queryable() + .InnerJoin((a, b) => a.id == b.group_id) + .Where((a,b)=>a.id==workGroupId) + .Select((a, b) => b.employee_id) + .ToListAsync(); + } + + public async Task> GetWorkgroupIdsByUserId(string userId) + { + return await _repository.AsSugarClient().Queryable() + .InnerJoin((a, b) => a.group_id == b.id) + .Where((a,b)=>a.employee_id==userId) + .Select((a, b) => b.id) + .ToListAsync(); + } + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/CheckCompleteInput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/CheckCompleteInput.cs new file mode 100644 index 00000000..76dc45a5 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/CheckCompleteInput.cs @@ -0,0 +1,29 @@ +namespace Tnb.ProductionMgr.Entities.Dto.PrdManage +{ + public class CheckCompleteInput + { + /// + /// 提报id + /// + public string report_id { get; set; } + /// + /// 合格数 + /// + public decimal pqty { get; set; } + /// + /// 不合格数 + /// + public decimal rqty { get; set; } + + /// + /// 质检结果 + /// + public string check_result { get; set; } + + /// + /// 视觉记录 + /// + public List records { get; set; } = null; + + } +} diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs index 1cce769e..a4c7475a 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs @@ -83,6 +83,26 @@ public string workstation_name { get; set; } public string worker_name { get; set; } + + /// + /// 白班人员id/白班前人员id/ + /// + public string dayshift_worker_id { get; set; } + + /// + /// 夜班人员id/夜班前人员id/ + /// + public string nightshift_worker_id { get; set; } + + /// + /// 白班后人员id/ + /// + public string dayshiftafter_worker_id { get; set; } + + /// + /// 夜班后人员id/ + /// + public string nightshiftafter_worker_id { get; set; } } } diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoTaskIssueListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoTaskIssueListOutput.cs index 3250ca4e..d7bd3437 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoTaskIssueListOutput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoTaskIssueListOutput.cs @@ -13,5 +13,25 @@ namespace Tnb.ProductionMgr.Entities.Dto public string create_time { get; set; } public string workstation_id { get; set; } public string worker_id { get; set; } + + /// + /// 白班人员id/白班前人员id/ + /// + public string dayshift_worker_id { get; set; } + + /// + /// 夜班人员id/夜班前人员id/ + /// + public string nightshift_worker_id { get; set; } + + /// + /// 白班后人员id/ + /// + public string dayshiftafter_worker_id { get; set; } + + /// + /// 夜班后人员id/ + /// + public string nightshiftafter_worker_id { get; set; } } } \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/WorkOrderAdjustmentListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/WorkOrderAdjustmentListOutput.cs index ff06053e..ec8f2a0a 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/WorkOrderAdjustmentListOutput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/WorkOrderAdjustmentListOutput.cs @@ -25,5 +25,25 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage public string create_time { get; set; } public int? schedule_type { get; set; } + + /// + /// 白班人员id/白班前人员id/ + /// + public string dayshift_worker_id { get; set; } + + /// + /// 夜班人员id/夜班前人员id/ + /// + public string nightshift_worker_id { get; set; } + + /// + /// 白班后人员id/ + /// + public string dayshiftafter_worker_id { get; set; } + + /// + /// 夜班后人员id/ + /// + public string nightshiftafter_worker_id { get; set; } } } \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs index 4add2ad2..93b74557 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs @@ -207,8 +207,38 @@ public partial class PrdMoTask : BaseEntity /// public string? pause_reason { get; set; } /// - /// 分配员工id + /// 分配员工id 废弃 /// public string worker_id { get; set; } + + /// + /// 是否已末检 + /// + public int has_last_check { get; set; } + + /// + /// 排班类型 + /// + public string scheduling_class_type { get; set; } + + /// + /// 白班人员id/白班前人员id + /// + public string dayshift_worker_id { get; set; } + + /// + /// 夜班人员id/夜班前人员id + /// + public string nightshift_worker_id { get; set; } + + /// + /// 白班后人员id + /// + public string dayshiftafter_worker_id { get; set; } + + /// + /// 夜班后人员id + /// + public string nightshiftafter_worker_id { get; set; } } diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdReport.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdReport.cs index bcba6563..3b411656 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdReport.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdReport.cs @@ -154,5 +154,10 @@ public partial class PrdReport : BaseEntity /// 称重重量 /// public decimal weight { get; set; } + + /// + /// 质检结果 + /// + public string check_result { get; set; } } diff --git a/ProductionMgr/Tnb.ProductionMgr.Interfaces/IPrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr.Interfaces/IPrdMoTaskService.cs index af11e706..29d1af13 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Interfaces/IPrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Interfaces/IPrdMoTaskService.cs @@ -53,5 +53,11 @@ namespace Tnb.ProductionMgr.Interfaces Task PrdReport(PrdReportCrInput input); + /// + /// 提报的质检任务执行完成后 + /// + /// + /// + Task ReportInstock(CheckCompleteInput input); } } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs index 3d793d74..d4d1f6b7 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs @@ -28,6 +28,7 @@ using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Interfaces; using Tnb.WarehouseMgr.Entities.Dto.Outputs; +using Tnb.BasicData.Interfaces; namespace Tnb.ProductionMgr { @@ -46,6 +47,7 @@ namespace Tnb.ProductionMgr private readonly IBillRullService _billRullService; private readonly IPrdMoTaskService _prdMoTaskService; private readonly IWmsCarryQueryService _wmsCarryQueryService; + private readonly IBasWorkgroupService _basWorkgroupService; public PrdMaterialReceiptService( ISqlSugarRepository repository, @@ -53,6 +55,7 @@ namespace Tnb.ProductionMgr IOrganizeService organizeService, IPrdMoTaskService prdMoTaskService, IWmsCarryQueryService wmsCarryQueryService, + IBasWorkgroupService basWorkgroupService, IUserManager userManager ) { @@ -62,6 +65,7 @@ namespace Tnb.ProductionMgr _billRullService = billRullService; _prdMoTaskService = prdMoTaskService; _wmsCarryQueryService = wmsCarryQueryService; + _basWorkgroupService = basWorkgroupService; } @@ -430,7 +434,12 @@ namespace Tnb.ProductionMgr List insertHList = new List(); List insertDList = new List(); string orgId = WmsWareHouseConst.AdministratorOrgId; - string userId = moTask.worker_id; + // string userId = moTask.worker_id; + string userId = WmsWareHouseConst.AdministratorUserId; + if (_userManager != null && !string.IsNullOrEmpty(_userManager.UserId)) + { + userId = _userManager.UserId; + } foreach(string carryId in input.carryIds) { WmsCarryH carry = await db.Queryable().SingleAsync(x => x.id == carryId); diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskIssueService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskIssueService.cs index 4987103d..ab426301 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskIssueService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskIssueService.cs @@ -105,11 +105,11 @@ namespace Tnb.ProductionMgr .LeftJoin((a, b, c, d, e, f) => a.mo_id == f.id) .LeftJoin((a, b, c, d, e, f, g) => g.id == a.eqp_id) .LeftJoin((a, b, c, d, e, f, g,h)=>a.workstation_id==h.Id) - .LeftJoin((a, b, c, d, e, f, g,h,i)=>a.worker_id==i.Id) + //.LeftJoin((a, b, c, d, e, f, g,h,i)=>a.worker_id==i.Id) .WhereIF(!string.IsNullOrEmpty(moTaskCode), (a, b, c, d) => a.mo_task_code.Contains(moTaskCode)) .WhereIF(!string.IsNullOrEmpty(moTaskStatus), (a, b, c, d) => a.mo_task_status == moTaskStatus) .Where((a, b, c, d, e, f) => a.schedule_type == 1) - .Select((a, b, c, d, e, f, g,h,i) => new PrdMoTaskIssueListOutput + .Select((a, b, c, d, e, f, g,h) => new PrdMoTaskIssueListOutput { id = a.id, mo_task_code = a.mo_task_code, @@ -118,11 +118,28 @@ namespace Tnb.ProductionMgr eqp_id = g.code + "/" + g.name, mo_task_status = d.FullName, workstation_id = h.FullName, - worker_id = i.RealName, + // worker_id = i.RealName, plan_qty = f.plan_qty, scheduled_qty = a.scheduled_qty, create_time = a.create_time == null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS), + dayshift_worker_id = a.dayshift_worker_id, + dayshiftafter_worker_id = a.dayshiftafter_worker_id, + nightshift_worker_id = a.nightshift_worker_id, + nightshiftafter_worker_id = a.nightshiftafter_worker_id, }).OrderByDescending(a => a.create_time).ToPagedListAsync(input.currentPage, input.pageSize); + + List userIdList = result.list.Select(x => x.dayshift_worker_id).Distinct().ToList(); + userIdList.AddRange(result.list.Select(x => x.dayshiftafter_worker_id).Distinct().ToList()); + userIdList.AddRange(result.list.Select(x => x.nightshift_worker_id).Distinct().ToList()); + userIdList.AddRange(result.list.Select(x => x.nightshiftafter_worker_id).Distinct().ToList()); + List userEntities = await db.Queryable().Where(x=>userIdList.Contains(x.Id)).ToListAsync(); + foreach (var item in result.list) + { + item.dayshift_worker_id = userEntities.Find(x=>x.Id==item.dayshift_worker_id)?.RealName ?? item.dayshift_worker_id; + item.dayshiftafter_worker_id = userEntities.Find(x=>x.Id==item.dayshiftafter_worker_id)?.RealName ?? item.dayshiftafter_worker_id; + item.nightshift_worker_id = userEntities.Find(x=>x.Id==item.nightshift_worker_id)?.RealName ?? item.nightshift_worker_id; + item.nightshiftafter_worker_id = userEntities.Find(x=>x.Id==item.nightshiftafter_worker_id)?.RealName ?? item.nightshiftafter_worker_id; + } return PageResult.SqlSugarPageResult(result); } } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index 38d4470f..05219fcd 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -49,6 +49,7 @@ using Tnb.WarehouseMgr.Interfaces; using Tnb.WarehouseMgr; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.ProductionMgr.Entities.Entity; +using Tnb.ProductionMgr.Helpers; // using Tnb.PerMgr.Entities; @@ -444,9 +445,9 @@ namespace Tnb.ProductionMgr .LeftJoin((a, b, c, d) => a.mo_id == d.id) .LeftJoin((a, b, c, d, e) => a.process_id == e.id) .LeftJoin((a, b,c,d,e,f) => a.workstation_id == f.Id) - .LeftJoin((a, b,c,d,e,f,g)=>a.worker_id==g.Id) + // .LeftJoin((a, b,c,d,e,f,g)=>a.worker_id==g.Id) .Where((a, b, c, d) => a.parent_id == mo_task_id) - .Select((a, b, c, d, e,f,g) => new PackSechelToBeIssueListOutput + .Select((a, b, c, d, e,f) => new PackSechelToBeIssueListOutput { mo_task_id = a.id, mo_task_code = a.mo_task_code, @@ -456,7 +457,7 @@ namespace Tnb.ProductionMgr workline_name = c.FullName, mo_task_status = a.mo_task_status, workstation_name = f.FullName, - worker_name = g.RealName, + // worker_name = g.RealName, scheduled_qty = a.scheduled_qty, plan_qty = d.plan_qty, process_task_qty = a.process_task_qty, @@ -464,11 +465,28 @@ namespace Tnb.ProductionMgr estimated_start_date = a.estimated_start_date == null ? null : a.estimated_start_date.Value.ToString(DbTimeFormat.MM), estimated_end_date = a.estimated_end_date == null ? null : a.estimated_end_date.Value.ToString(DbTimeFormat.MM), process_name = e.process_name, - bom_version = SqlFunc.Subqueryable().Where(it => it.material_id == a.material_id).Select(it => it.version) + bom_version = SqlFunc.Subqueryable().Where(it => it.material_id == a.material_id).Select(it => it.version), + dayshift_worker_id = a.dayshift_worker_id, + dayshiftafter_worker_id = a.dayshiftafter_worker_id, + nightshift_worker_id = a.nightshift_worker_id, + nightshiftafter_worker_id = a.nightshiftafter_worker_id, }) .Mapper(it => it.mo_task_status = dic.ContainsKey(it.mo_task_status) ? dic[it.mo_task_status].ToString()! : "") .OrderBy(a => a.mo_task_code, OrderByType.Asc) .ToListAsync(); + + List userIdList = result.Select(x => x.dayshift_worker_id).Distinct().ToList(); + userIdList.AddRange(result.Select(x => x.dayshiftafter_worker_id).Distinct().ToList()); + userIdList.AddRange(result.Select(x => x.nightshift_worker_id).Distinct().ToList()); + userIdList.AddRange(result.Select(x => x.nightshiftafter_worker_id).Distinct().ToList()); + List userEntities = await _db.Queryable().Where(x=>userIdList.Contains(x.Id)).ToListAsync(); + foreach (var item in result) + { + item.dayshift_worker_id = userEntities.Find(x=>x.Id==item.dayshift_worker_id)?.RealName ?? item.dayshift_worker_id; + item.dayshiftafter_worker_id = userEntities.Find(x=>x.Id==item.dayshiftafter_worker_id)?.RealName ?? item.dayshiftafter_worker_id; + item.nightshift_worker_id = userEntities.Find(x=>x.Id==item.nightshift_worker_id)?.RealName ?? item.nightshift_worker_id; + item.nightshiftafter_worker_id = userEntities.Find(x=>x.Id==item.nightshiftafter_worker_id)?.RealName ?? item.nightshiftafter_worker_id; + } return result; } // /// @@ -1157,16 +1175,34 @@ namespace Tnb.ProductionMgr { #region 质检模块 //质检 - if (prdTaskList.Where(p => p.mo_task_status == "Pause").Count() > 0 && status == "InProgress") + // if (prdTaskList.Where(p => p.mo_task_status == "Pause").Count() > 0 && status == "InProgress") + // { + // foreach (PrdMoTask? task in prdTaskList.Where(p => p.mo_task_status == "Pause").ToList()) + // { + // TriggerPlanEntity entity = new() + // { + // materialid = task.material_id, + // processid = task.process_id, + // workid = task.workstation_id, + // triggerevent = EnumTriggerEvent.首件检生产任务暂停 + // }; + // await _qcCheckPlanService.CreateTask(entity); + // } + // } + + if (prdTaskList.Where(p => p.mo_task_status == "Pause").Count() > 0 && behavior==PrdTaskBehavior.Start) { - foreach (PrdMoTask? task in prdTaskList.Where(p => p.mo_task_status == "Pause").ToList()) + TimerPoolHelper.GetInstance().StartTimer(TimeCallback,prdTaskList.Where(p => p.mo_task_status == "Pause").ToList(),TimeSpan.FromHours(1),Timeout.InfiniteTimeSpan); + }else if (prdTaskList.Where(p => p.mo_task_status == "ToBeStarted").Count() > 0 && behavior == PrdTaskBehavior.Start) + { + foreach (PrdMoTask? task in prdTaskList.Where(p => p.mo_task_status == "ToBeStarted").ToList()) { TriggerPlanEntity entity = new() { materialid = task.material_id, processid = task.process_id, workid = task.workstation_id, - triggerevent = EnumTriggerEvent.首件检生产任务暂停 + triggerevent = EnumTriggerEvent.开工首件检, }; await _qcCheckPlanService.CreateTask(entity); } @@ -1506,6 +1542,34 @@ namespace Tnb.ProductionMgr return "保存成功"; } + + public async void TimeCallback(object args) + { + try + { + Dictionary dic = (Dictionary)args; + List prdTaskList = (List)(dic["value"]); + foreach (PrdMoTask? task in prdTaskList) + { + TriggerPlanEntity entity = new() + { + materialid = task.material_id, + processid = task.process_id, + workid = task.workstation_id, + triggerevent = EnumTriggerEvent.开工首件检, + mo_task_code = task.mo_task_code, + check_type = WmsWareHouseConst.FULLREVIEW_CODE + }; + await _qcCheckPlanService.CreateTask(entity); + } + + Console.WriteLine("质检任务生成成功"); + } + catch (Exception e) + { + Log.Error("质检任务生成失败:"+e.Message,e); + } + } /// /// 生产任务单修改 @@ -1556,55 +1620,6 @@ namespace Tnb.ProductionMgr return row > 0; } - // /// - // /// 生产提报 - // /// - // /// - // /// - // /// input: - // ///
{ - // ///
icmo_id:生产任务ID - // ///
icmo_code:任务单号 - // ///
prd_qty:生产数量 - // ///
reported_work_qty:已报工数量 - // ///
reported_qty:提报数量 - // ///
icmo_qty:生产任务量 - // ///
} - // ///
- // [HttpPost] - // public async Task PrdReport(PrdReportCrInput input) - // { - // var row = -1; - // var db = _repository.AsSugarClient(); - // var report = await db.Queryable().FirstAsync(it => it.mo_task_id == input.mo_task_id); - // - // //if (report is not null) - // //{ - // // report.mo_task_code = input.mo_task_code; - // // report.mo_task_id = input.mo_task_id; - // // report.reported_work_qty += input.reported_qty; - // // report.prd_qty += input.reported_qty; - // //} - // //else - // { - // report = input.Adapt(); - // report.id = SnowflakeIdHelper.NextId(); - // report.reported_qty = input.reported_qty; - // report.create_id = _userManager.UserId; - // report.create_time = DateTime.Now; - // - // } - // row = await db.Insertable(report).ExecuteCommandAsync(); - // var master = await db.Queryable().FirstAsync(it => it.mo_task_id == input.mo_task_id); - // if (master != null) - // { - // master.reported_work_qty += input.reported_qty; - // master.completed_qty += input.reported_qty; - // await db.Updateable(master).ExecuteCommandAsync(); - // } - // return row > 0; - // } - /// /// 生产提报 /// @@ -1691,6 +1706,27 @@ namespace Tnb.ProductionMgr throw Oops.Bah("提报数量不能大于排产数量"); } } + + if ((prdMoTask.reported_work_qty ?? 0) + input.reported_qty > prdMoTask.scheduled_qty) + { + BasFactoryConfig config1 = await db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.IS_SURPASS); + if (config1?.value == "1") + { + BasFactoryConfig? config2 = await db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.IS_SURPASS_PERCENTAGE); + if (!string.IsNullOrEmpty(config2?.value)) + { + if ((prdMoTask.reported_work_qty ?? 0) + input.reported_qty > prdMoTask.scheduled_qty * (100 + Convert.ToDecimal(config2?.value ?? "1")) / 100) + { + throw Oops.Bah($"提报数量不能大于{100 + Convert.ToDecimal(config2?.value ?? "0")}%排产数量"); + } + } + } + else + { + throw Oops.Bah("提报数量不能大于排产数量"); + } + } + // bool flag = (prdMoTask.reported_work_qty ?? 0) + (prdMoTask.scrap_qty ?? 0) + input.reported_qty == prdMoTask.scheduled_qty; @@ -1775,6 +1811,30 @@ namespace Tnb.ProductionMgr batch = $"{organizeEntity.EnCode.Substring(organizeEntity.EnCode.Length - 2, 2)}{DateTime.Now.ToString("yyMMdd")}"; } + if (prdMoTask.has_last_check == 0) + { + if ((prdMoTask.reported_work_qty ?? 0) + input.reported_qty >= prdMoTask.scheduled_qty * 90 / 100) + { + await _db.Updateable() + .SetColumns(x => x.has_last_check==1) + .Where(x => x.id == prdMoTask.id) + .ExecuteCommandAsync(); + + TriggerPlanEntity entity = new() + { + materialid = prdMoTask.material_id, + processid = prdMoTask.process_id, + workid = prdMoTask.workstation_id, + triggerevent = EnumTriggerEvent.末检质检方案, + mo_task_code = prdMoTask.mo_task_code, + carry_code = report.material_box_code, + report_id = report.id, + batch = report.batch, + }; + await _qcCheckPlanService.CreateTask(entity); + } + } + // report.location_code = input.location_code; report.create_id = _userManager?.UserId ?? WmsWareHouseConst.AdministratorUserId; @@ -1791,6 +1851,7 @@ namespace Tnb.ProductionMgr report.unit_id = prdMoTask.unit_id; report.process_id = mbomProcess?.process_id ?? ""; + row = await db.Insertable(report).ExecuteCommandAsync(); WmsCarryH wmsCarryH = await db.Queryable().SingleAsync((x => x.carry_code == materialBoxCode)); if (wmsCarryH == null) @@ -1806,38 +1867,44 @@ namespace Tnb.ProductionMgr throw Oops.Bah($"提报失败,载具异常"); } - + bool isCheckFlag = !basMaterial.category_id.Contains("ZZCP"); #region 质检模块 //质检模块 - // if (wmsCarryH.is_check == 0) - // { - // TriggerPlanEntity entity = new() - // { - // materialid = prdMoTask.material_id, - // processid = prdMoTask.process_id, - // workid = prdMoTask.workstation_id - // }; - // int? reported = prdMoTask.reported_work_qty == null ? 0 : prdMoTask.reported_work_qty; - // int? scrap = prdMoTask.scrap_qty == null ? 0 : prdMoTask.scrap_qty; - // entity.oldpronum = reported + scrap; - // entity.newpronum = input.reported_qty; - // // entity.triggerevent = EnumTriggerEvent.生产检定量; - // entity.triggerevent = EnumTriggerEvent.零部件最终检验事件; - // await _qcCheckPlanService.CreateTask(entity); - // await _db.Ado.CommitTranAsync(); - // return "生成质检任务"; - // }else if (wmsCarryH.is_check==1) - // { - // return "检验中,请稍后提报"; - // } - // else - // { - // row = await db.Insertable(report).ExecuteCommandAsync(); - // } + if (isCheckFlag && wmsCarryH.is_check == EnumCheckConclusion.待检.ParseToInt().ToString()) + { + TriggerPlanEntity entity = new() + { + materialid = prdMoTask.material_id, + processid = prdMoTask.process_id, + workid = prdMoTask.workstation_id, + mo_task_code = prdMoTask.mo_task_code, + carry_code = report.material_box_code, + report_id = report.id, + batch = report.batch, + check_type = WmsWareHouseConst.FULLREVIEW_CODE + }; + int? reported = prdMoTask.reported_work_qty == null ? 0 : prdMoTask.reported_work_qty; + int? scrap = prdMoTask.scrap_qty == null ? 0 : prdMoTask.scrap_qty; + entity.oldpronum = reported + scrap; + entity.newpronum = input.reported_qty; + // entity.triggerevent = EnumTriggerEvent.生产检定量; + entity.triggerevent = EnumTriggerEvent.零部件最终检验; + await _qcCheckPlanService.CreateTask(entity); + + await _db.Updateable() + .SetColumns(x => x.is_check == EnumCheckConclusion.检验中.ParseToInt().ToString()) + .Where(x => x.id == wmsCarryH.id) + .ExecuteCommandAsync(); + + isCheckFlag = true; + + }else if (wmsCarryH.is_check==EnumCheckConclusion.检验中.ParseToInt().ToString()) + { + return "检验中,请稍后提报"; + } - row = await db.Insertable(report).ExecuteCommandAsync(); #endregion _ = prdMoTask.reported_work_qty == null @@ -2028,9 +2095,58 @@ namespace Tnb.ProductionMgr // } // } - - + if(!isCheckFlag){ + List prdVisionResultRecords = await _db.Queryable() + .Where(x => x.status == 0 && x.result.ToUpper()=="OK").OrderByDescending(x => x.create_time).Take(report.reported_qty.Value).ToListAsync(); + List ids = prdVisionResultRecords.Select(x => x.id).ToList(); + + await db.Updateable().SetColumns(x => x.status == 1).Where(x => ids.Contains(x.id)).ExecuteCommandAsync(); + await ReportInstock(new CheckCompleteInput() + { + report_id = report.id, + pqty = report.reported_qty.ParseToDecimal(), + rqty = 0, + records = prdVisionResultRecords, + }); + } + + + + await _db.Ado.CommitTranAsync(); + + } + catch (Exception ex) + { + Log.Error("提报失败", ex); + await _db.Ado.RollbackTranAsync(); + throw Oops.Bah("提报失败:"+ex.Message); + } + finally{ + prdreportSemaphore.Release(); + } + + return "提报成功"; + } + + public async Task ReportInstock(CheckCompleteInput input) + { + try + { + var db = _repository.AsSugarClient(); + PrdReport report = await db.Queryable().FirstAsync(it => it.id==input.report_id); + PrdMoTask? prdMoTask = await db.Queryable().SingleAsync(x => x.id == report.mo_task_id); + EqpEquipment equip = await db.Queryable().SingleAsync(x => x.id == prdMoTask.eqp_id); + BasMaterial basMaterial = await db.Queryable().SingleAsync(x => x.id == prdMoTask.material_id); + WmsCarryH wmsCarryH = await db.Queryable().FirstAsync(x=>x.carry_code==report.material_box_code); + BasLocation location = await db.Queryable().FirstAsync(x=>x.location_code==report.location_code); + PrdMo prdMo = await db.Queryable().SingleAsync(x => x.id == prdMoTask.mo_id); + + await db.Updateable() + .SetColumns(x => x.check_result == input.check_result) + .Where(x => x.id == input.report_id) + .ExecuteCommandAsync(); + BindCarryCodeInput bindCarryCodeInput = new BindCarryCodeInput(); bindCarryCodeInput.carry_id = wmsCarryH.id; @@ -2058,8 +2174,8 @@ namespace Tnb.ProductionMgr wmsPrdInstockInput.material_name = basMaterial.name; wmsPrdInstockInput.material_spec = basMaterial.material_specification; wmsPrdInstockInput.planqty = prdMoTask.scheduled_qty.Value; - wmsPrdInstockInput.pqty = input.reported_qty; - wmsPrdInstockInput.rqty = 0; + wmsPrdInstockInput.pqty = input.pqty; + wmsPrdInstockInput.rqty = input.rqty; wmsPrdInstockInput.type = prdMo.mo_type; wmsPrdInstockInput.create_id = report.create_id; wmsPrdInstockInput.prdInstockDs = new List(); @@ -2077,35 +2193,28 @@ namespace Tnb.ProductionMgr wmsPrdInstockInput.prdInstockCodes.Add(new WmsPrdInstockCodeInput() { planqty = prdMoTask.scheduled_qty.Value, - pqty = input.reported_qty, - code_batch = batch, + pqty = input.pqty, + code_batch = report.batch, code = report.barcode, unit_id = prdMoTask.unit_id, carry_id = wmsCarryH.id, }); } - else - { - List prdVisionResultRecords = await _db.Queryable() - .Where(x => x.status == 0 && x.result.ToUpper()=="OK").OrderByDescending(x => x.create_time).Take(report.reported_qty.Value).ToListAsync(); - List ids = prdVisionResultRecords.Select(x => x.id).ToList(); - - foreach (var record in prdVisionResultRecords) + if (input.records != null) + { + foreach (var record in input.records) { wmsPrdInstockInput.prdInstockCodes.Add(new WmsPrdInstockCodeInput() { planqty = prdMoTask.scheduled_qty.Value, pqty = 1, - code_batch = batch, + code_batch = report.batch, code = record.info, unit_id = prdMoTask.unit_id, carry_id = wmsCarryH.id, }); } - - await db.Updateable() - .SetColumns(x => x.status == 1).Where(x => ids.Contains(x.id)).ExecuteCommandAsync(); } @@ -2130,7 +2239,7 @@ namespace Tnb.ProductionMgr erpExtendIds.Add(WmsWareHouseConst.AdministratorOrgId); erpExtendIds.Add(report.material_id); erpExtendIds.Add(report.unit_id); - + List erpExtendFields = await _db.Queryable().Where(x=>erpExtendIds.Contains(x.table_id)).ToListAsync(); string erpCreateId = erpExtendFields.Find(x=>x.table_id==_userManager.UserId)?.user_id ?? ""; ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (WmsWareHouseConst.AdministratorOrgId)); @@ -2181,12 +2290,13 @@ namespace Tnb.ProductionMgr erpRequestData.Add("AggWrDtl",erpRequestDataDetails); requestData.Add(erpRequestData); + BasFactoryConfig config = await _db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.BIPURL); ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord(); thirdWebapiRecord.id = SnowflakeIdHelper.NextId(); thirdWebapiRecord.third_name = WmsWareHouseConst.BIP; thirdWebapiRecord.name = "生产报告"; thirdWebapiRecord.method = "POST"; - thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN+"uapws/rest/pwrnew/save"; + thirdWebapiRecord.url = config.value+"uapws/rest/pwrnew/save"; thirdWebapiRecord.request_data = JsonConvert.SerializeObject(erpRequestData); thirdWebapiRecord.create_time = DateTime.Now; @@ -2256,51 +2366,15 @@ namespace Tnb.ProductionMgr throw Oops.Bah(x2ServerResult.Msg); } } - - - await _db.Ado.CommitTranAsync(); - } - catch (Exception ex) + catch (Exception e) { - Log.Error("提报失败", ex); - await _db.Ado.RollbackTranAsync(); - throw Oops.Bah("提报失败:"+ex.Message); + Log.Error("提报入库任务下发失败", e); + throw Oops.Bah("提报入库任务下发失败:"+e.Message); } - finally{ - prdreportSemaphore.Release(); - } - - // DbResult result = await _repository.AsSugarClient().Ado.UseTranAsync(async () => - // { - // - // - // - // }); - // if (result.IsSuccess) - // { - // if (!string.IsNullOrEmpty(basMaterial.category_id)) - // { - // string[] arr = JsonConvert.DeserializeObject(basMaterial.category_id); - // if (arr.Length > 0 && arr.Contains("DGJCJ"))//短管挤出件入库申请 - // { - // // string resultMsg = await _prdInstockService.InstockTubeOne(report); - // // return resultMsg == "true" ? (dynamic)true : throw Oops.Bah(resultMsg); - // return true; - // } - // - // if (arr.Length > 0 && arr.Contains("CGJCJ"))//短管挤出件入库申请 - // { - // string resultMsg = await _prdInstockService.InstockTubeThree(report); - // return resultMsg == "true" ? (dynamic)true : throw Oops.Bah(resultMsg); - // } - // } - // - // - // } + return "入库任务下发成功"; - return "提报成功"; } /// @@ -2652,14 +2726,14 @@ namespace Tnb.ProductionMgr .LeftJoin((a, b, c, d, e, f) => a.mo_id == f.id) .LeftJoin((a, b, c, d, e, f, g) => a.workline_id == g.Id) .LeftJoin((a, b, c, d, e, f, g, h) => a.eqp_id == h.id) - .LeftJoin((a, b, c, d, e, f, g, h,i)=>a.worker_id==i.Id) + // .LeftJoin((a, b, c, d, e, f, g, h,i)=>a.worker_id==i.Id) .WhereIF(!string.IsNullOrEmpty(moTaskCode), (a, b, c, d) => a.mo_task_code.Contains(moTaskCode)) .WhereIF(!string.IsNullOrEmpty(eqpId) && equipIds.Count <= 0 && worklineIds.Count <= 0, (a, b, c, d) => a.workline_id == eqpId || a.eqp_id == eqpId) .WhereIF(worklineIds.Count > 0, (a, b, c, d) => worklineIds.Contains(a.workline_id)) .WhereIF(equipIds.Count > 0, (a, b, c, d) => equipIds.Contains(a.eqp_id)) .Where((a) => a.mo_task_status == DictConst.ToBeStartedEnCode || a.mo_task_code == DictConst.ToBeScheduledEncode || a.mo_task_code == DictConst.MoStatusPauseCode) - .Select((a, b, c, d, e, f, g, h,i) => new WorkOrderAdjustmentListOutput + .Select((a, b, c, d, e, f, g, h) => new WorkOrderAdjustmentListOutput { id = a.id, mo_task_code = a.mo_task_code, @@ -2679,8 +2753,25 @@ namespace Tnb.ProductionMgr eqp_id_id = a.eqp_id, create_time = a.create_time == null ? "" : a.create_time.Value.ToString(DbTimeFormat.SS), schedule_type = a.schedule_type, - worker_id = i.RealName + // worker_id = i.RealName + dayshift_worker_id = a.dayshift_worker_id, + dayshiftafter_worker_id = a.dayshiftafter_worker_id, + nightshift_worker_id = a.nightshift_worker_id, + nightshiftafter_worker_id = a.nightshiftafter_worker_id, }).OrderByDescending(a => a.create_time).ToPagedListAsync(input.currentPage, input.pageSize); + + List userIdList = result.list.Select(x => x.dayshift_worker_id).Distinct().ToList(); + userIdList.AddRange(result.list.Select(x => x.dayshiftafter_worker_id).Distinct().ToList()); + userIdList.AddRange(result.list.Select(x => x.nightshift_worker_id).Distinct().ToList()); + userIdList.AddRange(result.list.Select(x => x.nightshiftafter_worker_id).Distinct().ToList()); + List userEntities = await db.Queryable().Where(x=>userIdList.Contains(x.Id)).ToListAsync(); + foreach (var item in result.list) + { + item.dayshift_worker_id = userEntities.Find(x=>x.Id==item.dayshift_worker_id)?.RealName ?? item.dayshift_worker_id; + item.dayshiftafter_worker_id = userEntities.Find(x=>x.Id==item.dayshiftafter_worker_id)?.RealName ?? item.dayshiftafter_worker_id; + item.nightshift_worker_id = userEntities.Find(x=>x.Id==item.nightshift_worker_id)?.RealName ?? item.nightshift_worker_id; + item.nightshiftafter_worker_id = userEntities.Find(x=>x.Id==item.nightshiftafter_worker_id)?.RealName ?? item.nightshiftafter_worker_id; + } return PageResult.SqlSugarPageResult(result); } @@ -3654,13 +3745,56 @@ namespace Tnb.ProductionMgr { string ids = input.GetOrDefault("ids"); string[] idList = ids.Split(","); - string workerId = input.GetOrDefault("worker_id"); + // string workerId = input.GetOrDefault("worker_id"); + string dayshiftWorkerId = input.GetOrDefault("dayshift_worker_id"); + string nightshiftWorkerId = input.GetOrDefault("nightshift_worker_id"); + string dayshiftafterWorkerId = input.GetOrDefault("dayshiftafter_worker_id"); + string nightshiftafterWorkerId = input.GetOrDefault("nightshiftafter_worker_id"); int row = await _db.Updateable() - .SetColumns(x => x.worker_id == workerId) + .SetColumns(x => x.dayshift_worker_id == dayshiftWorkerId) + .SetColumns(x => x.nightshift_worker_id == nightshiftWorkerId) + .SetColumns(x => x.dayshiftafter_worker_id == dayshiftafterWorkerId) + .SetColumns(x => x.nightshiftafter_worker_id == nightshiftafterWorkerId) .Where(x => idList.Contains(x.id)) .ExecuteCommandAsync(); return row>0 ? "分配成功" : "分配失败"; } + + /// + /// 末检 + /// + /// + /// + [HttpPost] + public async Task LastCheck(Dictionary input) + { + string moTaskId = input.GetOrDefault("mo_task_id"); + PrdMoTask task = await _db.Queryable().SingleAsync(x => x.id == moTaskId); + if (task.has_last_check == 1) + { + throw Oops.Bah("已经生成过质检任务"); + } + DbResult result = await _db.Ado.UseTranAsync(async () => + { + await _db.Updateable() + .SetColumns(x => x.has_last_check==1) + .Where(x => x.id == moTaskId) + .ExecuteCommandAsync(); + + TriggerPlanEntity entity = new() + { + materialid = task.material_id, + processid = task.process_id, + workid = task.workstation_id, + triggerevent = EnumTriggerEvent.末检质检方案, + mo_task_code = task.mo_task_code, + }; + + await _qcCheckPlanService.CreateTask(entity); + }); + return !result.IsSuccess ? throw Oops.Oh(ErrorCode.COM1008) : (dynamic)(result.IsSuccess ? "操作成功" : result.ErrorMessage); + + } } diff --git a/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs b/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs index e575ead8..6b6e8083 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Dto/CheckTask.cs @@ -14,6 +14,11 @@ public string? tasktime { get; set; } public string? exectime { get; set; } public string? execuser { get; set; } + + public string mo_task_code { get; set; } + public string batch { get; set; } + public int? qty { get; set; } + public string bill_code { get; set; } } public class CheckTaskOut @@ -23,6 +28,15 @@ public string? workname { get; set; } public string? wareid { get; set; } public string? status { get; set; } + public string mo_task_code { get; set; } + public string material_id { get; set; } + public string material_code { get; set; } + public string material_name { get; set; } + public int checknum { get; set; } + + public string worker_name { get; set; } + public string bill_code { get; set; } + public string carry_code { get; set; } public List? checktypes { get; set; } } public class CheckExecTypeOut diff --git a/QcMgr/Tnb.QcMgr.Entities/Dto/Trigger.cs b/QcMgr/Tnb.QcMgr.Entities/Dto/Trigger.cs index 1ac31664..e10f7bc4 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Dto/Trigger.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Dto/Trigger.cs @@ -44,6 +44,17 @@ namespace Tnb.QcMgr.Entities /// 生产次数 /// public int? pronum { get; set; } + + public string mo_task_code { get; set; } + + public string carry_code { get; set; } + + /// + /// 提报记录id + /// + public string report_id { get; set; } + public string check_type { get; set; } + public string batch { get; set; } } diff --git a/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecD.cs b/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecD.cs index b15ec47c..f7d4309d 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecD.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecD.cs @@ -106,7 +106,10 @@ namespace Tnb.QcMgr.Entities ///
public string? checkindex { get; set; } - + /// + /// 不合格数量 + /// + public int qty { get; set; } } diff --git a/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecH.cs b/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecH.cs index 6b40831b..d68799c3 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecH.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Entity/QcCheckExecH.cs @@ -43,6 +43,11 @@ namespace Tnb.QcMgr.Entities /// 抽样数 ///
public string? checknum { get; set; } + + /// + /// 合格数 + /// + public int? qty { get; set; } /// /// 状态 @@ -93,5 +98,36 @@ namespace Tnb.QcMgr.Entities /// 修改时间 /// public DateTime? modify_time { get; set; } + + /// + /// 单据编号 + /// + public string bill_code { get; set; } + + /// + /// 生产任务单编号 + /// + public string mo_task_code { get; set; } + + /// + /// 载具编号 + /// + public string carry_code { get; set; } + + /// + /// 提报记录id + /// + public string report_id { get; set; } + + /// + /// 抽样方式 + /// + public string check_type { get; set; } + + /// + /// 备注 + /// + public string remark { get; set; } + public string batch { get; set; } } } diff --git a/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs index 103670f4..38e6964b 100644 --- a/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs +++ b/QcMgr/Tnb.QcMgr.Entities/Enums/EnumTriggerType.cs @@ -36,8 +36,12 @@ namespace Tnb.QcMgr.Entities.Enums 生产检固定次数 = 12, [Remark("生产检", "按流转卡")] 生产检按流转卡 = 13, - [Remark("零部件最终检验", "零部件最终检验事件")] - 零部件最终检验事件 = 14 + [Remark("零部件最终检验", "零部件最终检验")] + 零部件最终检验 = 14, + [Remark("首检", "开工检")] + 开工首件检 = 15, + [Remark("末检", "末检触发事件")] + 末检质检方案 = 16 } public class RemarkAttribute : Attribute { diff --git a/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs b/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs index df2c6565..712ff6a7 100644 --- a/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs +++ b/QcMgr/Tnb.QcMgr/QcCheckPlanService.cs @@ -6,6 +6,7 @@ using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.JsonSerialization; using JNPF.Systems.Entitys.System; +using JNPF.Systems.Interfaces.System; using JNPF.TaskScheduler; using JNPF.TaskScheduler.Entitys.Dto.TaskScheduler; using JNPF.TaskScheduler.Entitys.Model; @@ -16,6 +17,8 @@ using Tnb.QcMgr.Entities; using Tnb.QcMgr.Entities.Entity; using Tnb.QcMgr.Entities.Enums; using Tnb.QcMgr.Interfaces; +using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.BasicData; namespace Tnb.QcMgr { @@ -31,11 +34,24 @@ namespace Tnb.QcMgr private readonly ISqlSugarRepository _repository; private readonly IUserManager _userManager; private readonly TimeTaskService _timeTaskService; + private readonly IBillRullService _billRullService; public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); - public QcCheckPlanService(ISqlSugarRepository repository, IUserManager userManager, TimeTaskService timeTaskService) + + private static Dictionary _dicBillCodes = new Dictionary() + { + [WmsWareHouseConst.SHOUJIAN_ID] = CodeTemplateConst.SHOUJIAN_CODE, + [WmsWareHouseConst.XUNJIAN_ID] = CodeTemplateConst.XUNJIAN_CODE, + [WmsWareHouseConst.MOJIAN_ID] = CodeTemplateConst.MOJIAN_CODE, + [WmsWareHouseConst.LINGBUJIANZUIZHONGJIANYAN_ID] = CodeTemplateConst.LINGBUJIANZUIZHONGJIANYAN_CODE, + [WmsWareHouseConst.CHENGPINJIANYAN_ID] = CodeTemplateConst.CHENGPINJIANYAN_CODE, + }; + public QcCheckPlanService(ISqlSugarRepository repository, + IBillRullService billRullService, + IUserManager userManager, TimeTaskService timeTaskService) { _repository = repository; _userManager = userManager; + _billRullService = billRullService; _timeTaskService = timeTaskService; OverideFuncs.DeleteAsync = Delete; } @@ -512,13 +528,17 @@ namespace Tnb.QcMgr removePlanHs.Add(plan); } } - if (enumTriggerEvent == EnumTriggerEvent.零部件最终检验事件) + if (enumTriggerEvent == EnumTriggerEvent.零部件最终检验) { int? number = _repository.AsSugarClient().Queryable().Where(p => p.mainid == plan.id).First().number; if ((entity.newpronum + (entity.oldpronum / number)) <= (entity.oldpronum / number)) { removePlanHs.Add(plan); } + } + if (enumTriggerEvent == EnumTriggerEvent.开工首件检) + { + } if (enumTriggerEvent == EnumTriggerEvent.生产检定码) { @@ -552,9 +572,11 @@ namespace Tnb.QcMgr foreach (QcCheckPlanH planh in planhs) { DateTime time = DateTime.Now; + string billCode = await _billRullService.GetBillNumber(_dicBillCodes[planh.checktype]); QcCheckExecH qcCheckExecH = new() { id = SnowflakeIdHelper.NextId(), + bill_code = billCode, checktype = planh.checktype, status = DictionaryData.Id, tasktime = time.ToString("yyyy-MM-dd HH:mm:ss"), @@ -562,8 +584,17 @@ namespace Tnb.QcMgr processid = entity.processid, workid = entity.workid, create_id = _userManager.UserId, - create_time = time + create_time = time, + mo_task_code = entity.mo_task_code, + carry_code = entity.carry_code, + report_id = entity.report_id, + check_type = entity.check_type, + batch = entity.batch }; + if (entity.triggerevent == EnumTriggerEvent.零部件最终检验) + { + qcCheckExecH.checknum = entity.newpronum.ToString(); + } List ExecDs = new(); foreach (QcCheckPlanD? pland in plands.Where(p => p.mainid == planh.id).ToList()) { diff --git a/QcMgr/Tnb.QcMgr/QcCheckTaskResultService.cs b/QcMgr/Tnb.QcMgr/QcCheckTaskResultService.cs index 4b8c36ee..b3bb384f 100644 --- a/QcMgr/Tnb.QcMgr/QcCheckTaskResultService.cs +++ b/QcMgr/Tnb.QcMgr/QcCheckTaskResultService.cs @@ -39,7 +39,7 @@ namespace Tnb.QcMgr { { "ok", "合格" }, { "no", "不合格" }, - { "barelyok", "让步合格" }, + { "barelyok", "让步接收" }, { "await", "待检" }, { "temporarily", "暂控" } }; @@ -93,7 +93,7 @@ namespace Tnb.QcMgr { { "ok", "合格" }, { "no", "不合格" }, - { "barelyOk", "让步合格" }, + { "barelyOk", "让步接收" }, { "await", "待检" }, { "temporarily", "暂控" } }; @@ -120,6 +120,7 @@ namespace Tnb.QcMgr .Select((a, b, c, d, e) => new QcCheckExecHOut { id = a.id, + bill_code = a.bill_code, materialid = b.name, checktype = a.checktype, workid = d.FullName, diff --git a/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs b/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs index 70ef769b..651ba769 100644 --- a/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs +++ b/QcMgr/Tnb.QcMgr/QcCheckTaskService.cs @@ -5,6 +5,7 @@ using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.JsonSerialization; +using JNPF.Logging; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using JNPF.VisualDev; @@ -13,10 +14,17 @@ using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; using Tnb.BasicData.Entities; +using Tnb.ProductionMgr.Entities.Dto.PrdManage; using Tnb.QcMgr.Entities; using Tnb.QcMgr.Interfaces; +using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Interfaces; +using Tnb.ProductionMgr.Interfaces; +using Tnb.ProductionMgr.Entities; +using Tnb.WarehouseMgr.Entities.Enums; +using Tnb.ProductionMgr.Entities.Dto.PrdManage; +using Tnb.WarehouseMgr.Entities; namespace Tnb.QcMgr { @@ -33,13 +41,19 @@ namespace Tnb.QcMgr private readonly IUserManager _userManager; private readonly IWmsSaleService _wmsSaleService; private readonly IWmsPurchaseService _wmsPurchaseService; + private readonly IPrdMoTaskService _prdMoTaskService; public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); - public QcCheckTaskService(ISqlSugarRepository repository, IUserManager userManager, IWmsSaleService wmsSaleService, IWmsPurchaseService wmsPurchaseService) + public QcCheckTaskService(ISqlSugarRepository repository, + IUserManager userManager, + IWmsSaleService wmsSaleService, + IPrdMoTaskService prdMoTaskService, + IWmsPurchaseService wmsPurchaseService) { _repository = repository; _userManager = userManager; OverideFuncs.GetListAsync = GetListAsync; _wmsSaleService= wmsSaleService; + _prdMoTaskService = prdMoTaskService; _wmsPurchaseService= wmsPurchaseService; } @@ -50,7 +64,7 @@ namespace Tnb.QcMgr { { "ok", "合格" }, { "no", "不合格" }, - { "barelyOk", "让步合格" }, + { "barelyOk", "让步接收" }, { "await", "待检" }, { "temporarily", "暂控" } }; @@ -67,11 +81,12 @@ namespace Tnb.QcMgr .LeftJoin((a, b, c) => a.processid == c.id) .LeftJoin((a, b, c, d) => a.workid == d.Id) .LeftJoin((a, b, c, d, e) => a.execuser == e.Id) + .LeftJoin((a,b,c,d,e,f)=>a.report_id==f.id) .WhereIF(!string.IsNullOrEmpty(materialid), (a, b, c, d,e) => b.name.Contains(materialid)) .WhereIF(!string.IsNullOrEmpty(checktype), (a, b, c, d, e) => a.checktype == checktype) .WhereIF(!string.IsNullOrEmpty(status), (a, b, c, d, e) => a.status == status) .Where((a, b, c, d, e) => a.status == list.Where(p => p.FullName == "待执行").First().Id) - .Select((a, b, c, d, e) => new QcCheckExecHOut + .Select((a, b, c, d, e,f) => new QcCheckExecHOut { id = a.id, materialid = b.name, @@ -85,6 +100,9 @@ namespace Tnb.QcMgr tasktime = a.tasktime ?? "", exectime = a.exectime ?? "", execuser = e.RealName ?? "", + mo_task_code = a.mo_task_code, + batch = a.batch, + qty = a.qty }).OrderByDescending(a => DateTime.Parse(a.tasktime)).ToPagedListAsync(input.currentPage, input.pageSize); foreach (QcCheckExecHOut? item in result.list) { @@ -111,12 +129,33 @@ namespace Tnb.QcMgr List QcErrorCauses = await db.Queryable().ToListAsync(); List QcErrorLevels = await db.Queryable().ToListAsync(); + PrdMoTask moTask = await db.Queryable().Where(x => x.mo_task_code == QcCheckExecH.mo_task_code).FirstAsync(); + if (moTask == null) + { + throw Oops.Bah($"未找到任务单{QcCheckExecH.mo_task_code}"); + } + + if (string.IsNullOrEmpty(QcCheckExecH.report_id)) + { + throw Oops.Bah($"未找到提报记录{QcCheckExecH.report_id}"); + } + BasMaterial basMaterial = await db.Queryable().Where(x=>x.id==moTask.material_id).FirstAsync(); + PrdReport prdReport = await db.Queryable().SingleAsync(x => x.id == QcCheckExecH.report_id); + UserEntity userEntity = await db.Queryable().SingleAsync(x => x.Id == prdReport.create_id); CheckTaskOut CheckTaskOut = new() { mainid = id, wareid = QcCheckExecH.wareid!, workid = QcCheckExecH.workid!, - status = QcCheckExecH.status! + status = QcCheckExecH.status!, + mo_task_code = QcCheckExecH.mo_task_code, + material_id = moTask.material_id, + material_code = basMaterial.code, + material_name = basMaterial.name, + checknum = !string.IsNullOrEmpty(QcCheckExecH.checknum) ? int.Parse(QcCheckExecH.checknum) : 0, + worker_name = userEntity?.RealName ?? "", + bill_code = QcCheckExecH.bill_code, + carry_code = prdReport.material_box_code, }; if (!string.IsNullOrEmpty(CheckTaskOut.workid)) { @@ -204,13 +243,14 @@ namespace Tnb.QcMgr try { Dictionary dic = new() - { - { "ok", 1 }, - { "no", 2 }, - { "barelyOk", 4 }, - { "await", 8 }, - { "temporarily", 16 } - }; + { + { "ok", 1 }, + { "no", 2 }, + { "barelyOk", 4 }, + { "await", 8 }, + { "temporarily", 16 }, + { "checking", 32 }, + }; QcCheckExecH QcCheckExecH = await db.Queryable().Where(p => p.id == CheckTaskInput.mainid).FirstAsync(); DictionaryTypeEntity DictionaryType = await db.Queryable().Where(p => p.FullName == "质检状态").FirstAsync(); DictionaryDataEntity DictionaryData = await db.Queryable().Where(p => p.DictionaryTypeId == DictionaryType.Id && p.FullName == "已完成").FirstAsync(); @@ -219,7 +259,11 @@ namespace Tnb.QcMgr QcCheckExecH.result = CheckTaskInput.result; QcCheckExecH.execuser = _userManager.UserId; QcCheckExecH.exectime = DateTime.Now.ToString(); + QcCheckExecH.check_type = CheckTaskInput.check_type; + QcCheckExecH.remark = CheckTaskInput.remark; List QcCheckExecDs = await db.Queryable().Where(p => p.mainid == CheckTaskInput.mainid).ToListAsync(); + + int rqty = 0; List QcCheckExecDdel = new(); List QcCheckExecDinsert = new(); if (CheckTaskInput.checktypes?.Count > 0) @@ -268,9 +312,12 @@ namespace Tnb.QcMgr create_time = QcCheckExecD.create_time, postdata = item.postItemForm, result = item.result, - checkindex = (i + 1).ToString() + checkindex = (i + 1).ToString(), + qty = item.qty }; QcCheckExecDinsert.Add(insert); + + rqty += item.qty; } } } @@ -278,6 +325,7 @@ namespace Tnb.QcMgr } } await db.Ado.BeginTranAsync(); + QcCheckExecH.qty = int.Parse(CheckTaskInput.checknum) - rqty; _ = await db.Updateable(QcCheckExecH).ExecuteCommandAsync(); _ = await db.Deleteable(QcCheckExecDdel).ExecuteCommandAsync(); _ = await db.Insertable(QcCheckExecDinsert).ExecuteCommandAsync(); @@ -296,12 +344,39 @@ namespace Tnb.QcMgr mesCheckdCallbackUpinput.maintableid = QcCheckExecH.extras; mesCheckdCallbackUpinput.check_conclusion = dic.Where(p => p.Key == CheckTaskInput.result).Any() ? dic.Where(p => p.Key == CheckTaskInput.result).First().Value : 0; await _wmsPurchaseService.MesCheckdPurchaseCallback(mesCheckdCallbackUpinput); + }else if (QcCheckExecH.checktype == WmsWareHouseConst.LINGBUJIANZUIZHONGJIANYAN_ID) + { + PrdReport prdReport = await db.Queryable().SingleAsync(x=>x.id==QcCheckExecH.report_id); + int pqty = prdReport.reported_qty.Value - rqty; + if (rqty > Decimal.Parse(QcCheckExecH.checknum)) + { + throw Oops.Bah("不合格数不能大于抽样数"); + } + + if (CheckTaskInput.result != "await") + { + string isCheck = dic[CheckTaskInput.result].ToString(); + await db.Updateable() + .SetColumns(x => x.is_check == isCheck) + .Where(x => x.carry_code == prdReport.material_box_code) + .ExecuteCommandAsync(); + + _prdMoTaskService.ReportInstock(new CheckCompleteInput() + { + report_id = QcCheckExecH.report_id, + pqty = pqty, + rqty = rqty, + check_result = ((EnumCheckConclusion)dic[CheckTaskInput.result]).ToString(), + }); + } } await db.Ado.CommitTranAsync(); } - catch (Exception) + catch (Exception e) { - throw Oops.Oh("执行失败"); + await db.Ado.RollbackTranAsync(); + Log.Error(e.Message,e); + throw Oops.Oh("执行失败:"+e.Message); } } diff --git a/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj b/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj index 1cf08455..2aca6871 100644 --- a/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj +++ b/QcMgr/Tnb.QcMgr/Tnb.QcMgr.csproj @@ -8,6 +8,7 @@ + diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs index 73f2b7b5..b6e8bad5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs @@ -72,9 +72,9 @@ public partial class WmsCarryH : BaseEntity public string out_status { get; set; } /// - /// 检验状态 0 未检验 1 检验中 2 合格 3 不合格 + /// 检验状态 同质量结果 /// - public int is_check { get; set; } + public string is_check { get; set; } /// /// 来源单据ID diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckConclusion.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckConclusion.cs index 880b317d..6ececb02 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckConclusion.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckConclusion.cs @@ -10,13 +10,15 @@ namespace Tnb.WarehouseMgr.Entities.Enums { [Description("合格")] 合格 = 1, - [Description("让步合格")] - 让步合格 = 2, + [Description("让步接收")] + 让步接收 = 2, [Description("不合格")] 不合格 = 4, [Description("待检")] 待检 = 8, [Description("暂控")] 暂控 = 16, + [Description("检验中")] + 检验中 = 32, } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Mapper/Mapper.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Mapper/Mapper.cs index ea946732..c8e0893e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Mapper/Mapper.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Mapper/Mapper.cs @@ -18,8 +18,8 @@ namespace Tnb.WarehouseMgr.Entities.Mapper config.ForType() .Map(dest => dest.carryId, src => src.carry_code) ; - config.ForType() - .Map(dest => dest.qc_status, src => src.is_check == 0 ? "不合格" : "合格"); + // config.ForType() + // .Map(dest => dest.qc_status, src => src.is_check == 0 ? "不合格" : "合格"); config.ForType() .Map(dest => dest.check_conclusion, src => GenericEnumDicionary.GetEnumDesc(src.check_conclusion)); config.ForType() diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryLedgerService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryLedgerService.cs index e8afb39c..c9e01b9e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryLedgerService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryLedgerService.cs @@ -1,4 +1,5 @@ using JNPF.Common.Core.Manager; +using JNPF.Common.Extension; using JNPF.Common.Security; using JNPF.FriendlyException; using JNPF.VisualDev; @@ -8,6 +9,7 @@ using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; using Tnb.BasicData.Entities; +using Tnb.ProductionMgr.Entities.Enums; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Enums; @@ -86,7 +88,7 @@ namespace Tnb.WarehouseMgr } x.out_status = ((int)EnumOutStatus.正常).ToString(); - x.is_check = 1; + x.is_check = EnumCheckConclusion.待检.ParseToInt().ToString(); x.create_id = _userManager.UserId; x.modify_id = null; x.modify_time = null; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs index 7677dda4..fdc68a70 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs @@ -20,6 +20,7 @@ using Npgsql; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.Common.Utils; +using Tnb.ProductionMgr.Entities.Enums; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; @@ -185,7 +186,7 @@ namespace Tnb.WarehouseMgr carryObj.location_id = null; carryObj.location_code = null; carryObj.out_status = "0"; - carryObj.is_check = 1; + carryObj.is_check = EnumCheckConclusion.待检.ParseToInt().ToString(); carryObj.status = 1; carryObj.bale_num = null; carryObj.collocation_scheme_id = null; @@ -282,7 +283,7 @@ namespace Tnb.WarehouseMgr carry.id = SnowflakeIdHelper.NextId(); carry.carry_name = carryCode; carry.carry_code = carryCode; - carry.is_check = 1; + carry.is_check = EnumCheckConclusion.待检.ParseToInt().ToString(); carry.status = 1; carry.create_id = "25398501929509"; carry.create_time = DateTime.Now; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs index a558483d..67f5f10f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs @@ -21,6 +21,7 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Entity.Constraints; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; +using Tnb.ProductionMgr.Entities.Enums; namespace Tnb.WarehouseMgr { @@ -149,7 +150,7 @@ namespace Tnb.WarehouseMgr if (carry != null) { carry.check_conclusion = input.check_conclusion; - carry.is_check = 1; + carry.is_check = EnumCheckConclusion.待检.ParseToInt().ToString(); isOk = await _db.Updateable(carry).UpdateColumns(it => new { it.check_conclusion, it.is_check }).ExecuteCommandHasChangeAsync(); } } diff --git a/system/Tnb.Systems/System/OnlineUserService.cs b/system/Tnb.Systems/System/OnlineUserService.cs index 7f99e4dd..4d7a1ff5 100644 --- a/system/Tnb.Systems/System/OnlineUserService.cs +++ b/system/Tnb.Systems/System/OnlineUserService.cs @@ -79,6 +79,8 @@ public class OnlineUserService : IDynamicApiController, ITransient { var tenantId = _userManager.TenantId; var list = await GetOnlineUserList(tenantId); + if (list == null) + return; var user = list.Find(it => it.tenantId == tenantId && it.userId == id); if (user != null) {