heteng 3 лет назад
Родитель
Сommit
c1c0c6ede8

+ 24 - 0
MicroServices/Business/Business.Application.Contracts/Dto/InventoryDto.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.Business.Dto
+{
+    /// <summary>
+    /// 库存占用Dto
+    /// </summary>
+    public class InventoryDto
+    {
+        /// <summary>
+        /// 物料编码
+        /// </summary>
+        public string ItemNum { get; set; }
+
+        /// <summary>
+        /// 占用数量
+        /// </summary>
+        public decimal OccupyQty { get; set; }
+    }
+}

+ 118 - 0
MicroServices/Business/Business.Application/Quartz/ProductionScheduleAppService.cs

@@ -0,0 +1,118 @@
+using Bussiness.Model.MES.IC;
+using Bussiness.Model.Production;
+using Bussiness.Model.SRM;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+using Volo.Abp.Domain.Repositories;
+
+namespace Business.Quartz
+{
+    /// <summary>
+    /// 生产排产服务
+    /// </summary>
+    public class ProductionScheduleAppService : ApplicationService
+    {
+        /// <summary>
+        /// 物料
+        /// </summary>
+        private IRepository<ItemMaster, long> _itemMaster;
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        private IRepository<WorkOrdMaster, long> _workOrdMaster;
+
+        /// <summary>
+        /// 工单物料明细
+        /// </summary>
+        private IRepository<WorkOrdDetail, long> _workOrdDetail;
+
+        /// <summary>
+        /// 工单工艺路线明细
+        /// </summary>
+        private IRepository<WorkOrdRouting, long> _workOrdRouting;
+
+        /// <summary>
+        /// 库存主数据
+        /// </summary>
+        private IRepository<InvMaster, long> _invMaster;
+
+        /// <summary>
+        /// 生产线明细
+        /// </summary>
+        private IRepository<ProdLineDetail, long> _prodLineDetail;
+
+        /// <summary>
+        /// 生产周期明细
+        /// </summary>
+        private IRepository<PeriodSequenceDet, long> _periodSequenceDet;
+
+        /// <summary>
+        /// 排产结果明细
+        /// </summary>
+        private IRepository<ScheduleResultOpMaster, long> _scheduleResultOpMaster;
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        public ProductionScheduleAppService(
+            IRepository<ItemMaster, long> itemMaster,
+            IRepository<WorkOrdMaster, long> workOrdMaster,
+            IRepository<WorkOrdDetail, long> workOrdDetail,
+            IRepository<WorkOrdRouting, long> workOrdRouting,
+            IRepository<ProdLineDetail, long> prodLineDetail,
+            IRepository<PeriodSequenceDet, long> periodSequenceDet,
+            IRepository<ScheduleResultOpMaster, long> scheduleResultOpMaster,
+            IRepository<InvMaster, long> invMaster
+            )
+        { 
+            _itemMaster= itemMaster;
+            _workOrdMaster= workOrdMaster;
+            _workOrdDetail= workOrdDetail;
+            _workOrdRouting= workOrdRouting;
+            _prodLineDetail = prodLineDetail;
+            _periodSequenceDet = periodSequenceDet;
+            _scheduleResultOpMaster= scheduleResultOpMaster;
+            _invMaster= invMaster;
+        }
+
+        /// <summary>
+        /// 执行生产排产
+        /// </summary>
+        public async void DoExt()
+        {
+            await DoProductShcedule();
+        }
+
+        /// <summary>
+        /// 生产排产
+        /// </summary>
+        public async Task DoProductShcedule()
+        {
+            //1、获取工单:Status !='C'且 IsActive == 1
+            List<WorkOrdMaster> workOrds = _workOrdMaster.GetListAsync(p=> p.Domain == "1001" && p.Status !="C" && p.IsActive == 1).Result;
+            //1.1 过滤已排产的工单
+
+            if (workOrds.Count == 0)
+            {
+                return;
+            }
+            //1.2、工单按照优先级排序:Priority从小到大排序
+            workOrds = workOrds.OrderBy(p => p.Priority).ToList();
+            //2、获取工单工艺路径数据
+            List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.GetListAsync(p => workOrds.Select(m=>m.WorkOrd).Contains(p.WorkOrd) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result;
+            //3、获取物料对应的生产线信息
+            List<ProdLineDetail> prodLineDetails = _prodLineDetail.GetListAsync(p => workOrds.Select(m => m.ItemNum).Contains(p.Part) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result;
+            //4、获取工单物料明细
+            List<WorkOrdDetail> workOrdDetails = _workOrdDetail.GetListAsync(p => workOrds.Select(m=>m.WorkOrd).Contains(p.WorkOrd) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result;
+            //5、获取物料的库存数据
+            List<InvMaster> invMasters = _invMaster.GetListAsync(p => workOrds.Select(m => m.ItemNum).Contains(p.ItemNum) && p.Domain == "1001" && p.IsActive == 1).Result;
+            //6、判断当前工单物料是否齐套
+        
+        }
+    }
+}

+ 38 - 0
MicroServices/Business/Business.Application/Quartz/ProductionScheduleJob.cs

@@ -0,0 +1,38 @@
+using Quartz;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.Quartz
+{
+    /// <summary>
+    /// 排产定时任务
+    /// </summary>
+    public class ProductionScheduleJob : IJob
+    {
+        public readonly ProductionScheduleAppService _appService;
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        public ProductionScheduleJob(ProductionScheduleAppService appService)
+        {
+            _appService = appService;
+        }
+
+        /// <summary>
+        /// 执行
+        /// </summary>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public Task Execute(IJobExecutionContext context)
+        {
+            _appService.DoExt();
+
+            return Task.CompletedTask;
+        }
+    }
+}

+ 9 - 0
MicroServices/Business/Business.Host/BusinessHostModule.cs

@@ -133,6 +133,15 @@ namespace Business
                     .WithIdentity("ExtJob-trigger")
                     .WithCronSchedule("0 01 01 * * ?")
                     .WithDescription("定时处理金蝶同步到Ext数据库的数据"));
+
+                //var ProductionScheduleJobKey = new JobKey("ProductionScheduleJob");
+                //q.AddJob<ProductionScheduleJob>(opts => opts.WithIdentity(ProductionScheduleJobKey));
+
+                //q.AddTrigger(opts => opts
+                //    .ForJob(ProductionScheduleJobKey)
+                //    .WithIdentity("ProductionScheduleJob-trigger")
+                //    .WithCronSchedule("0 01 01 * * ?")
+                //    .WithDescription("定时排产任务"));
             });
             context.Services.AddQuartzServer(options =>
             {

+ 53 - 0
MicroServices/Business/Bussiness.Model/MES/IC/InvMaster.cs

@@ -0,0 +1,53 @@
+using Business.Model;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Bussiness.Model.MES.IC
+{
+    /// <summary>
+    /// 库存主数据表
+    /// </summary>
+    [Comment("库存主数据表")]
+    public class InvMaster : BaseEntity
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        public int? RecID { get; set; }
+
+        /// <summary>
+        /// 域名
+        /// </summary>
+        [Comment("域名")]
+        public string? Domain { get; set; }
+
+        /// <summary>
+        /// 库位
+        /// </summary>
+        [Comment("库位")]
+        public string? Location { get; set; }
+
+        /// <summary>
+        /// 物料编号
+        /// </summary>
+        [Comment("物料编号")]
+        public string? ItemNum { get; set; }
+
+        /// <summary>
+        /// 库存数量
+        /// </summary>
+        [Comment("库存数量")]
+        public decimal? QtyOnHand { get; set; }
+
+        /// <summary>
+        /// 是否有效:1-有效;0-无效
+        /// </summary>
+        [Comment("是否有效")]
+        public int? IsActive { get; set; }
+    }
+}

+ 6 - 0
MicroServices/Business/Bussiness.Model/Production/WorkOrdMaster.cs

@@ -62,6 +62,12 @@ namespace Bussiness.Model.Production
         [Comment("工艺路线编码")]
         public string? RoutingCode { get; set; }
 
+        /// <summary>
+        /// 优先级
+        /// </summary>
+        [Comment("优先级")]
+        public decimal? Priority { get; set; }
+
         /// <summary>
         /// 状态:C为不可用状态
         /// </summary>