Bladeren bron

Merge branch 'master' of http://123.60.180.165:4647/ZZYDOP/DOPCore

heteng 3 jaren geleden
bovenliggende
commit
4d9f96734a

+ 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; }
+    }
+}

+ 216 - 23
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -36,6 +36,10 @@ using System.Runtime.CompilerServices;
 using MongoDB.Driver;
 using Volo.Abp.Validation.Localization;
 using Hangfire.Annotations;
+using System.Globalization;
+using MongoDB.Driver.Linq;
+using Bussiness.Model.SRM;
+using System.ComponentModel.DataAnnotations;
 
 namespace Business.ResourceExamineManagement
 {
@@ -110,6 +114,25 @@ namespace Business.ResourceExamineManagement
         private readonly IMongoDB<ic_item_stock> _ic_item_stock;
         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>
@@ -165,6 +188,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 +204,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 +221,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 +238,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>
@@ -397,7 +433,7 @@ namespace Business.ResourceExamineManagement
         }
 
         /// <summary>
-        /// 生成工单
+        /// 生成工单
         /// </summary>
         /// <param name="BomNumber">Bom编码</param>
         /// <param name="Quantity">需要数量</param>
@@ -406,8 +442,6 @@ namespace Business.ResourceExamineManagement
         /// <returns></returns>
         public async Task GenerateMorder(long seorderentry_id)
         {
-            //需要生成的物料,需要生产的数量,对应销售订单。
-
             //1.库存、在制工单检查完成后 当前BOM需要自制时 产生工单。
 
             //2.每一个销售订单行对应一个工单。
@@ -415,6 +449,8 @@ namespace Business.ResourceExamineManagement
             var seorderentry = await _crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
             //获取销售订单信息
             var seorder = await _crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id);
+            //物料BOM
+            var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == seorderentry.bom_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
 
             mes_morder mes_Morder = new mes_morder();
             mes_Morder.GenerateNewId();
@@ -422,25 +458,39 @@ namespace Business.ResourceExamineManagement
             //mes_Morder.morder_icitem_type
             mes_Morder.work_order_type = "常规工单";
             mes_Morder.morder_state = "初始";
-            mes_Morder.morder_no = "";//TODO:编码规则暂时没有
+            mes_Morder.morder_no = string.Format("VMO{0}", DateTime.Now.ToString("yyyyMMddhhmmss"));//测试编码
             mes_Morder.fms_number = seorderentry.fms_number;
             mes_Morder.bom_number = seorderentry.bom_number;
             mes_Morder.fmodel = seorderentry.specification;
-            mes_Morder.moentry_startup_status = 1;
-            mes_Morder.tenant_id = 0;
+            //最早的开工时间3天后、 最晚时间为订单承诺时间-采购提前期-质检提前期-入库提前期-发料提前期 =最晚开工时间  最早或最晚为系统建议开工日期
+            //根绝系统配置参数 取最早或者最晚开始日期
+            var StartDate = DateTime.Now.Date.AddDays(3);
+            mes_Morder.moentry_sys_stime = StartDate;
+            var ProductiveDate = ProductiveExamine(ic_bom.tech_id, (int)(seorderentry.qty.Value));
+            //系统建议完工日期为 开工日期+产能检查时间=完工日期
+            var Day = ProductiveDate.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
+            mes_Morder.moentry_sys_etime = StartDate.AddDays((double)Day);
+            mes_Morder.morder_need_time = ProductiveDate.Result;
+            mes_Morder.moentry_startup_status = 0;
+            mes_Morder.tenant_id = seorderentry.tenant_id;
             mes_Morder.product_code = seorderentry.item_number;
             mes_Morder.product_name = seorderentry.item_name;
             mes_Morder.project_name = seorder.project_name;
             mes_Morder.planner_num = seorderentry.planner_no;
             mes_Morder.planner_name = seorderentry.planner_name;
             mes_Morder.morder_date = DateTime.Now.Date;
+            //TODO:目前没有取值位置
+            mes_Morder.moentry_prd = null;
+            mes_Morder.moentry_prdname = null;
+            mes_Morder.moentry_wrkc = null;
+            mes_Morder.moentry_wrkcname = null;
+            mes_Morder.picking_qty = 0;
             //TODO:可删除主表字段
             mes_Morder.unit = seorderentry.unit;
             mes_Morder.morder_production_number = seorderentry.qty;
             mes_Morder.need_number = seorderentry.qty;
             mes_Morder.remaining_number = 0;
-            await _mes_morder.InsertOne(mes_Morder);
-
+            //生成工单子表数据
             mes_moentry mes_Moentry = new mes_moentry();
             mes_Moentry.GenerateNewId();
             mes_Moentry.moentry_moid = mes_Morder.Id;
@@ -452,9 +502,24 @@ namespace Business.ResourceExamineManagement
             mes_Moentry.morder_production_number = seorderentry.qty;
             mes_Moentry.need_number = seorderentry.qty;
             mes_Moentry.remaining_number = 0;
-
-            await _mes_moentry.InsertOne(mes_Moentry);
-
+            using (TransactionScope scope = new TransactionScope())
+            {
+                await _mes_morder.InsertOne(mes_Morder);
+                await _mes_moentry.InsertOne(mes_Moentry);
+                scope.Complete();
+            }
+        }
+        /// <summary>
+        /// 将decimal转换成日期格式
+        /// </summary>
+        /// <param name="date">yyyyMMddHHmmss</param>
+        /// <returns>yyyy-MM-dd HH:mm:ss</returns>
+        public static string TransDecimalToDateTime(string date)
+        {
+            DateTimeFormatInfo dtfi = new CultureInfo("zh-CN", false).DateTimeFormat;
+            DateTime dateTime = DateTime.Now;
+            DateTime.TryParseExact(date, "yyyyMMddHHmmss", dtfi, DateTimeStyles.None, out dateTime);
+            return dateTime.ToString("yyyy-MM-dd HH:mm:ss"); ;
         }
         /// <summary>
         /// 检查成品库存
@@ -470,9 +535,9 @@ namespace Business.ResourceExamineManagement
                 return false;
             }
             //物料BOM
-            var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == seorderentry.bom_number).Result.FirstOrDefault();
+            var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == seorderentry.bom_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
             //物料库存表
-            var ic_Item_Stocks = await _ic_item_stock.GetManyByCondition(x => x.icitem_id == ic_bom.icitem_id);
+            var ic_Item_Stocks = await _ic_item_stock.GetManyByCondition(x => x.icitem_id == ic_bom.icitem_id && x.tenant_id == seorderentry.tenant_id);
             if (seorderentry.qty <= ic_Item_Stocks.Sum(x => x.sqty))
             {
                 return true;
@@ -498,19 +563,19 @@ namespace Business.ResourceExamineManagement
                 //TODO:入参异常;
                 throw new NotImplementedException("BOM编码或需求数量不能为空!");
             }
+            //获取销售订单信息
+            //var seorder = await _crm_seorder.FindAsync(x => x.Id == OrderId);
+            var seorderentry = await _crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
             //根据Bom编码查询出对应工单并且状态不为完成、关闭,非委外工单。
             //TODO:工单类型;
             var morderList = await _mes_morder.GetManyByCondition(x => x.bom_number == bomNumber && (x.morder_state != "完成" || x.morder_state != "关闭"
-            && x.morder_icitem_type != "相关委外工单") && x.IsDeleted == false);
+            && x.morder_icitem_type != "相关委外工单") && x.IsDeleted == false && x.tenant_id == seorderentry.tenant_id);
 
-            //获取销售订单信息
-            //var seorder = await _crm_seorder.FindAsync(x => x.Id == OrderId);
-            var seorderentry = await _crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
             //获取物料详情
-            var mysql_ic_item = await _mysql_ic_item.FindAsync(x => x.number == bomNumber);
+            var mysql_ic_item = await _mysql_ic_item.FindAsync(x => x.number == bomNumber && x.tenant_id == seorderentry.tenant_id);
 
             //工单已被占用后要与占用表关联查询...减去占用量后 剩下生产数量可供下个销售工单使用。
-            var mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && x.IsDeleted == false);
+            var mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && x.IsDeleted == false && x.tenant_id == seorderentry.tenant_id);
 
             //首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
             //当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
@@ -585,7 +650,7 @@ namespace Business.ResourceExamineManagement
             mes_Mooccupy.moo_cbr = string.Empty;
             //mes_Mooccupy.moo_ctime = ;
             mes_Mooccupy.moo_creason = string.Empty;
-            mes_Mooccupy.tenant_id = 0;//TODO:企业ID =集团 或公司ID
+            mes_Mooccupy.tenant_id = seorderentry.tenant_id;//取销售子表企业ID
             return mes_Mooccupy;
         }
         /// <summary>
@@ -795,7 +860,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)
             {
@@ -852,7 +917,7 @@ namespace Business.ResourceExamineManagement
             returnlist = returnlist.OrderBy(s => s.num).ToList();
             //获取当前工厂下物料库存数据
             List<long> icitemIds = returnlist.Select(c => c.item_id).ToList();
-            var stocklist = _ic_item_stock.GetManyByCondition(p=>p.factory_id == factoryid && icitemIds.Contains(p.icitem_id)).Result;
+            var stocklist = _ic_item_stock.GetManyByCondition(p => p.factory_id == factoryid && icitemIds.Contains(p.icitem_id)).Result;
             //取当前订单的物料库存占用记录
             var occupylist = _ic_item_stockoccupy.GetManyByCondition(p => p.bang_id == bangid && p.order_id == orderid).Result;
             //计算剩余库存
@@ -1019,5 +1084,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类型的精确度属性

+ 12 - 2
MicroServices/Business/Business.Core/MongoDBHelper/IMongoDB.cs

@@ -93,9 +93,19 @@ namespace Business.Core.MongoDBHelper
         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 DeleteAll();
+        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
 {
@@ -162,6 +167,93 @@ namespace Business.Core.MongoDBHelper
                 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);
+            }
+        }
+
         /// <summary>
         /// 删除数据-直接删除集合,慎用,慎用,慎用
         /// </summary>

+ 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; }
 
     }