Murphy 3 lat temu
rodzic
commit
e1d911bd8d

+ 52 - 21
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 System.Globalization;
+using MongoDB.Driver.Linq;
 using Bussiness.Model.SRM;
 using System.ComponentModel.DataAnnotations;
 
@@ -422,7 +424,7 @@ namespace Business.ResourceExamineManagement
         }
 
         /// <summary>
-        /// 生成工单
+        /// 生成工单
         /// </summary>
         /// <param name="BomNumber">Bom编码</param>
         /// <param name="Quantity">需要数量</param>
@@ -431,8 +433,6 @@ namespace Business.ResourceExamineManagement
         /// <returns></returns>
         public async Task GenerateMorder(long seorderentry_id)
         {
-            //需要生成的物料,需要生产的数量,对应销售订单。
-
             //1.库存、在制工单检查完成后 当前BOM需要自制时 产生工单。
 
             //2.每一个销售订单行对应一个工单。
@@ -440,6 +440,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();
@@ -447,25 +449,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;
@@ -477,9 +493,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>
         /// 检查成品库存
@@ -495,9 +526,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;
@@ -523,19 +554,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天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
@@ -610,7 +641,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>
@@ -877,7 +908,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;
             //计算剩余库存