Murphy 3 роки тому
батько
коміт
dd4b25add4

+ 33 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/ICItemLeadTimeDto.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.ResourceExamineManagement.Dto
+{
+    public class ICItemLeadTimeDto
+    {
+        /// <summary>
+        /// 物料id
+        /// </summary>
+        public long item_id { get; set; }
+
+        /// <summary>
+        /// 运输中提前期_天
+        /// </summary>
+        public decimal? transportation_leadtime { get; set; }
+
+        /// <summary>
+        /// 仓库中提前期_天
+        /// </summary>
+        public decimal? stock_leadtime { get; set; }
+
+        /// <summary>
+        /// 生产中提前期_天
+        /// </summary>
+        public decimal? production_leadtime { get; set; }
+    }
+}

+ 164 - 2
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -36,6 +36,8 @@ using System.Runtime.CompilerServices;
 using MongoDB.Driver;
 using Volo.Abp.Validation.Localization;
 using Hangfire.Annotations;
+using Bussiness.Model.SRM;
+using System.ComponentModel.DataAnnotations;
 
 namespace Business.ResourceExamineManagement
 {
@@ -111,6 +113,25 @@ namespace Business.ResourceExamineManagement
         private IRepository<ic_item_stock, long> _mysql_ic_item_stock;
 
         /// <summary>
+        /// 物料工厂明细表
+        /// </summary>
+        private readonly IMongoDB<ic_factory_details> _ic_factory_details;
+        private IRepository<ic_factory_details, long> _mysql_ic_factory_details;
+
+        /// <summary>
+        /// 采购申请单
+        /// </summary>
+        private readonly IMongoDB<srm_pr_main> _srm_pr_main;
+        private IRepository<srm_pr_main, long> _mysql_srm_pr_main;
+
+
+        /// <summary>
+        /// 委外工单
+        /// </summary>
+        private readonly IMongoDB<mes_oorder> _mes_oorder;
+        private IRepository<mes_oorder, long> _mysql_mes_oorder;
+
+        /// <summary>
         /// 物料质检表
         /// </summary>
         private readonly IMongoDB<ic_check> _ic_check;
@@ -165,6 +186,9 @@ namespace Business.ResourceExamineManagement
             IMongoDB<ic_bom_child> ic_bom_child,
             IMongoDB<ic_item_stock> ic_item_stock,
             IMongoDB<ic_check> ic_check,
+            IMongoDB<ic_factory_details> ic_factory_details,
+            IMongoDB<mes_oorder> mes_oorder,
+            IMongoDB<srm_pr_main> srm_pr_main,
             //IMongoDB<ic_substitute> ic_substitute,
             //IMongoDB<ic_substitute_all> ic_substitute_all,
             //IMongoDB<ic_substitute_all_dtl> ic_substitute_all_dtl,
@@ -178,7 +202,11 @@ namespace Business.ResourceExamineManagement
             IRepository<mes_technique, long> mysql_mes_technique,
             IRepository<crm_seorder, long> mysql_crm_seorder,
             IRepository<crm_seorderentry, long> mysql_crm_seorderentry,
-            IRepository<ic_item_stock, long> mysql_ic_item_stock
+            IRepository<ic_item_stock, long> mysql_ic_item_stock,
+            IRepository<ic_factory_details, long> mysql_ic_factory_details,
+            IRepository<mes_oorder, long> mysql_mes_oorder,
+            IRepository<srm_pr_main, long> mysql_srm_pr_main
+
 
             )
         {
@@ -191,6 +219,9 @@ namespace Business.ResourceExamineManagement
             _ic_bom_child = ic_bom_child;
             _ic_item_stock = ic_item_stock;
             _ic_check = ic_check;
+            _ic_factory_details= ic_factory_details;
+            _mes_oorder= mes_oorder;
+            _srm_pr_main= srm_pr_main;
             //_ic_substitute = ic_substitute;
             //_ic_substitute_all = ic_substitute_all;
             //_ic_substitute_all_dtl = ic_substitute_all_dtl;
@@ -205,6 +236,9 @@ namespace Business.ResourceExamineManagement
             _crm_seorderentry = mysql_crm_seorderentry;
             _mysql_mes_technique = mysql_mes_technique;
             _mysql_ic_item_stock = mysql_ic_item_stock;
+            _mysql_ic_factory_details= mysql_ic_factory_details;
+            _mysql_mes_oorder= mysql_mes_oorder;
+            _mysql_srm_pr_main= mysql_srm_pr_main;
         }
 
         /// <summary>
@@ -786,7 +820,7 @@ namespace Business.ResourceExamineManagement
 
             //List<BomChildExamineDto> returnlist = new List<BomChildExamineDto>();
             var dto = new BomChildExamineDto();
-            var bom = bomlist.WhereIf(true, s => s.icitem_id == dtl.icitem_id).FirstOrDefault();
+            var bom = bomlist.WhereIf(true,s => s.icitem_id == dtl.icitem_id).FirstOrDefault();
             var icitem = icitemlist.Find(s => s.Id == dtl.icitem_id);
             if (icitem == null)
             {
@@ -1010,5 +1044,133 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+        //根据物料id获取物料3个提前期
+        private Task<List<ICItemLeadTimeDto>> GetLeadTime(List<BomChildExamineDto> returnlist,long factoryid)
+        {
+            //ToDo:企业Id
+            ProjectionDefinitionBuilder<ic_factory_details> project = new ProjectionDefinitionBuilder<ic_factory_details>();
+            return _ic_factory_details.Find(p => returnlist.Select(x => x.item_id).Contains(p.icitem_id) && p.factory_id == factoryid,
+                project.Include(p => p.icitem_id).Include(p => p.production_leadtime).Include(p => p.stock_leadtime).Include(p => p.transportation_leadtime)).Result.
+                Select(x => new ICItemLeadTimeDto { item_id = x.icitem_id,transportation_leadtime=x.transportation_leadtime,stock_leadtime=x.stock_leadtime,production_leadtime=x.production_leadtime }).AsQueryable<ICItemLeadTimeDto>().ToListAsync();
+        }
+
+        /// <summary>
+        /// 生成委外工单
+        /// </summary>
+        /// <param name="returnlist"></param>
+        /// <param name="factoryid"></param>
+        private void CreateMesOOder(List<BomChildExamineDto> returnlist, long factoryid)
+        {
+            List<mes_oorder> oOderList = new List<mes_oorder>();
+            foreach (var item in returnlist)
+            {
+                mes_oorder oOrder = new mes_oorder();
+                oOrder.GenerateNewId();
+                oOrder.oorder_no =getOrderNum("WW");//生产工单编号
+                oOrder.oorder_type = "委外工单";//生产工单类型
+                oOrder.oorder_date = DateTime.Now;//委外订单日期
+                oOrder.oorder_state = "已提交";//订单状态
+                oOrder.ooentry_prd = 10000;//生产组织
+                oOrder.ooentry_prdname = "1000";//生产组织名称
+                oOrder.ooentry_wrkc = 10000;//工作中心id
+                oOrder.ooentry_wrkcname = "10001";//工作中心名称
+                oOrder.planner_num = "wwww";//计划员工号
+                oOrder.planner_name = "qqq";//计划员名称
+                oOrder.ooentry_stime = DateTime.Now;//计划开工日期
+                oOrder.ooentry_etime = DateTime.Now;//计划完工日期
+                oOrder.product_code = "产品代码";//产品代码
+                oOrder.ffms_number = "1000";//fms旧料号
+                oOrder.product_name = "test";//产品名称
+                oOrder.specification_model ="";//规格型号
+                oOrder.bom_number = "";//bom编码
+                oOrder.unit ="";//单位
+                oOrder.morder_progress ="";//工单进度
+                oOrder.morder_production_number = 120;//工单生产数量(计划数量)
+                oOrder.need_number = 11;//需求数量
+                oOrder.remaining_number = 11;//剩余可用数量
+                oOrder.work_number = 11;//报工数量
+                oOrder.inspection_number = 11;//报检数量
+                oOrder.qualified_number = 22;//合格数量
+                oOrder.inventory_number = 22;//入库数量
+                oOrder.notice_qty = 22;//已开通知单数量
+                oOrder.moentry_on = 22;//启动状态
+                oOrder.start_time =DateTime.Now;//开始时间
+                oOrder.pause_time = DateTime.Now;//最近暂停时间
+                oOrder.restart_time = DateTime.Now;//最近重启时间
+                oOrder.project_name = "22";//项目名称
+                oOrder.sent_status = 22;//发料状态 1-待发料  2-已发料
+                oOrder.production_unit = "ge";//加工单位
+                oOrder.production_unit_code = "元";//加工单位编码
+                oOrder.need_icitem_status =1;//所需物料是否充足  1-充足 0-缺料
+                oOderList.Add(oOrder);
+            }
+            _mes_oorder.InsertMany(oOderList);
+        }
+
+
+        /// <summary>
+        /// 生成采购申请单
+        /// </summary>
+        /// <param name="returnlist"></param>
+        /// <param name="factoryid"></param>
+        /// <param name="orderType">1委外采购申请单,2采购申请单</param>
+        private  void CreateSRMPR(List<BomChildExamineDto> returnlist, long factoryid,int orderType)
+        {
+            List<srm_pr_main> prList=new List<srm_pr_main>();
+            foreach(var item in returnlist)
+            {
+                srm_pr_main srm_Pr = new srm_pr_main();
+                srm_Pr.GenerateNewId();
+                srm_Pr.pr_billno = "";//pr单号
+                srm_Pr.pr_mono = "";//关联工单号
+                srm_Pr.entity_id = 1;//pr单号
+                srm_Pr.pr_purchaseid = 1001;//供应商id
+                srm_Pr.pr_purchasenumber = "10000";//供应商编码
+                srm_Pr.pr_purchasename = "1000";//供应商名称
+                srm_Pr.pr_purchaser = "10000";//采购员
+                srm_Pr.pr_purchaser_num = "10001";//采购员工号(采购信息表)
+                srm_Pr.pr_rqty = 20;//需求数量
+                srm_Pr.pr_aqty = 1000;//申请数量
+                srm_Pr.pr_sqty = 22;//建议数量
+                srm_Pr.icitem_id = 10001;//物料id
+                srm_Pr.icitem_name = "test111";//物料名称
+                srm_Pr.pr_order_type = 1000;//单据类型
+                srm_Pr.pr_ssend_date = DateTime.Now;//系统建议下单日期
+                srm_Pr.pr_sarrive_date = DateTime.Now;//系统建议到达日期(建议到货日期)
+                srm_Pr.pr_bsarrive_date = DateTime.Now;//采购员建议到货日期
+                srm_Pr.pr_oarrive_date = DateTime.Now;//订单到货日期
+                srm_Pr.pr_psend_date = DateTime.Now;//计划下单日期
+                srm_Pr.pr_parrive_date = DateTime.Now;//计划到达日期
+                srm_Pr.pr_rarrive_date = DateTime.Now;//需求到货日期
+                srm_Pr.pr_rparrive_date = DateTime.Now;//再计划到货日期
+                srm_Pr.pr_psend_date = DateTime.Now;//计划下单日期
+                srm_Pr.pr_pur_affirm_date = DateTime.Now;//采购确认到货日期
+                srm_Pr.pr_sysprice = 22;//系统价格(含税)
+                srm_Pr.pr_orderprice = 22;//订单价格(含税)
+                srm_Pr.pr_price = 22;//采购净价(不含税)
+                srm_Pr.pr_rate = 22;//税率
+                srm_Pr.pr_unit = "元";//单位
+                srm_Pr.state = 22;//状态
+                srm_Pr.old_apply_aqty = 22;//已申请数量
+                srm_Pr.pr_type = 22;//申请类型
+                srm_Pr.currencytype = 22;//币种
+                srm_Pr.secInv_ratio = 22;//安全库存触发采购比例
+                srm_Pr.remark = "元";//备注
+                srm_Pr.pr_rreason = "元";//拒绝原因
+                prList.Add(srm_Pr);
+            }
+            _srm_pr_main.InsertMany(prList);
+        }
+
+        // 生成订单编号 字母+年月日+8位随机数+时间戳
+        private string getOrderNum(string preCode)
+        {
+            string Dates = DateTime.Now.ToString("yyyyMMdd");//获取当前时间
+            Random Rdm = new Random(Guid.NewGuid().GetHashCode());//随机数
+            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);//时间戳
+            string newts = Convert.ToInt64(ts.TotalMilliseconds).ToString();//时间戳          
+            string new_orderNum = preCode + Dates + Rdm.Next(0, 100000000) + newts;
+            return new_orderNum;
+        }
     }
 }

+ 1 - 1
MicroServices/Business/Business.Core/Extensions/DecimalPrecisionAttribute.cs → MicroServices/Business/Business.Core/Attributes/DecimalPrecisionAttribute.cs

@@ -4,7 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace Business.Core.Extensions
+namespace Business.Core.Attributes
 {
     /// <summary>
     /// 自定义Decimal类型的精确度属性

+ 15 - 0
MicroServices/Business/Business.Core/MongoDBHelper/IMongoDB.cs

@@ -92,5 +92,20 @@ namespace Business.Core.MongoDBHelper
         /// <returns></returns>
         Task<DeleteResult> Delete(FilterDefinition<T> filter, bool isOne = false);
 
+        /// <summary>
+        /// 根据条件获取结果列表
+        /// </summary>
+        /// <param name="expression">条件Expression</param>
+        /// <returns>结果列表</returns>
+        Task<List<T>> Find(Expression<Func<T, bool>> expression, ProjectionDefinition<T, T> projecter = null, SortDefinition<T> sorter = null);
+
+        /// <summary>
+        /// 批量更新
+        /// </summary>
+        /// <param name="updates"></param>
+        /// <param name="options"></param>
+        /// <returns></returns>
+        Task<BulkWriteResult<T>> BulkWrite(List<WriteModel<T>> updates, BulkWriteOptions options = null);
+
     }
 }

+ 93 - 1
MicroServices/Business/Business.Core/MongoDBHelper/MongoDBTools.cs

@@ -1,15 +1,20 @@
-using Business.Core.Attributes;
+using Amazon.Runtime.Internal;
+using Business.Core.Attributes;
 using Microsoft.Extensions.Options;
 using MongoDB.Bson;
+using MongoDB.Bson.Serialization.Attributes;
 using MongoDB.Driver;
 using MongoDB.Driver.Linq;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 using Volo.Abp.Domain.Entities;
+using Volo.Abp.Domain.Repositories;
 
 namespace Business.Core.MongoDBHelper
 {
@@ -159,5 +164,92 @@ namespace Business.Core.MongoDBHelper
             else
                 return mongoCollection.DeleteManyAsync(filter);
         }
+
+        /// <summary>
+        /// 根据条件获取结果列表
+        /// </summary>
+        /// <param name="expression">条件Expression</param>
+        /// <returns>结果列表</returns>
+        public Task<List<T>> Find(Expression<Func<T,bool>> expression, ProjectionDefinition<T, T> projecter = null, SortDefinition<T> sorter = null)
+        {
+            //Include表示包含那些字段
+            //ProjectionDefinitionBuilder<VoucherTemplate> project = new ProjectionDefinitionBuilder<VoucherTemplate>();
+            //var templates = voucherRepository.Find(x => x.AppId == this.AppId, project.Include(x => x.FContentId).
+            //    Include(x => x.TemplateName)).Select(x => new Template { TemplateId = x.FContentId, TemplateName = x.TemplateName }).AsQueryable<Template>();
+            //Exclude表示包含那些字段
+            //List<ExchangeRate> exchangeRates = exchangeRateRepository.Find(x => x.AppId == this.AppId, project.Exclude(x => x.CurrencyXRates).Exclude(y => y.ExchangeRateId));
+
+            return mongoCollection.Find(expression).Project(projecter).Sort(sorter).ToListAsync();
+        }
+
+        /// <summary>
+        ///  批处理操作,操作的数据条数需要大于0
+        /// </summary>
+        /// <param name="updates"></param>
+        /// <returns></returns>
+        public Task<BulkWriteResult<T>> BulkWrite(List<WriteModel<T>> updates, BulkWriteOptions options = null)
+        {
+            //eg:使用示例
+            //List<WriteModel<BusinessDataLockRule>> rules = new List<WriteModel<BusinessDataLockRule>>();
+            //foreach (var ruleName in ruleNames)
+            //{
+            //    var lockRule = lockRules.FirstOrDefault(x => x.RuleName == ruleName);
+            //    var dimDLMember = string.Join("-", ruleName.Split("-").Skip(3));
+            //    if (lockRule == null)
+            //    {
+            //        lockRule = new BusinessDataLockRule();
+            //        lockRule.RuleName = ruleName;
+            //        lockRule.Locked = true;
+            //        var insertOneModel = new InsertOneModel<BusinessDataLockRule>(lockRule);
+            //        rules.Add(insertOneModel);
+            //    }
+            //    else
+            //    {
+            //        var filterDefinition = Builders<BusinessDataLockRule>.Filter.Eq(x => x.Id, lockRule.Id);
+            //        var updateDefinition = Builders<BusinessDataLockRule>.Update.Set(x => x.Locked, lockRule.Locked)
+            //                                                                    .Set(x => x.LockDimensions, lockRule.LockDimensions)
+            //                                                                    .Set(x => x.LockTime, DateTime.Now);
+            //        var updateOneModel = new UpdateOneModel<BusinessDataLockRule>(filterDefinition, updateDefinition);
+            //        rules.Add(updateOneModel);
+            //    }
+            //}
+            //if (!rules.IsNullOrEmpty())
+            //{
+            //    mongoCollection.BulkWriteAsync(rules, new BulkWriteOptions { IsOrdered = false });
+            //}
+            return mongoCollection.BulkWriteAsync(updates,options);
+        }
+
+        /// <summary>
+        /// 排序扩展方法
+        /// </summary>
+        public static class MongoDBExt
+        {
+            //eg:MongoDBExt.GetSortDefinition<CheckRuleGroup>("targetType,targetId,fContentType desc")
+            /// <summary>
+            ///  生成SortDefinition对象 根据排序字符串(和sql一样)
+            ///  规则如下:Model属性名 [asc|desc]  ,默认asc可以不写,eg: id,name desc 
+            /// </summary>
+            /// <typeparam name="T"></typeparam>
+            /// <param name="orderBy"></param>
+            /// <returns></returns>
+            public static SortDefinition<T> GetSortDefinition<T>(string orderBy)
+            {
+                if (string.IsNullOrEmpty(orderBy)) return null;
+
+                var builder = Builders<T>.Sort;
+                List<SortDefinition<T>> sorts = new List<SortDefinition<T>>();
+                foreach (var order in orderBy.Split(','))
+                {
+                    var ods = order.Split(' ');
+                    if (ods.Length == 1 || (ods.Length == 2 && ods[1].ToLower() == "asc"))
+                        sorts.Add(builder.Ascending(ods[0]));
+                    else
+                        sorts.Add(builder.Descending(ods[0]));
+                }
+
+                return builder.Combine(sorts);
+            }
+        }
     }
 }

+ 6 - 1
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/BusinessDbContext.cs

@@ -1,7 +1,8 @@
-using Business.Core.Extensions;
 using Business.Model;
 using Business.Models;
 using Bussiness.Model.MES.IC;
+using Bussiness.Model.Production;
+using Bussiness.Model.SRM;
 using Bussiness.Model.Tech;
 using Microsoft.EntityFrameworkCore;
 using System;
@@ -172,6 +173,10 @@ namespace Business.EntityFrameworkCore
         public DbSet<mes_workshop_shelf> mes_workshop_shelf { get; set; }
         #endregion
 
+        #region SRM
+        public DbSet<srm_pr_main> srm_pr_main { get; set; }
+        public DbSet<mes_oorder> mes_oorder { get; set; }
+        #endregion
         //Code generation...
         public BusinessDbContext(DbContextOptions<BusinessDbContext> options)
             : base(options)

+ 0 - 1
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/BusinessDbContextModelCreatingExtensions.cs

@@ -1,4 +1,3 @@
-using Business.Core.Extensions;
 using Business.Model;
 using Business.Models;
 using Bussiness.Model.MES.IC;

+ 1 - 2
MicroServices/Business/Business.Host/EntityFrameworkCore/BusinessMigrationDbContext.cs

@@ -1,5 +1,4 @@
-using Business.Core.Extensions;
-using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
 using System;
 using System.ComponentModel;
 using System.Linq;

+ 1 - 1
MicroServices/Business/Bussiness.Model/Production/mes_oorder.cs

@@ -230,7 +230,7 @@ namespace Bussiness.Model.Production
         /// <summary>
         /// 所需物料是否充足  1-充足 0-缺料
         /// </summary>
-        [Description("加工单位编码")]
+        [Description("所需物料是否充足  1-充足 0-缺料")]
         public int? need_icitem_status { get; set; }
 
     }