1
duhe
2023-08-07 9ae6aa786445d49dc3e93ead5a8ee4b92006304e
WebAPI/Controllers/SCGL/Èռƻ®¹ÜÀí/JIT_DayPlanPlatFormBillController.cs
@@ -8,6 +8,7 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Diagnostics;
using System.Threading;
namespace WebAPI.Controllers.SCGL.日计划管理
{
@@ -42,7 +43,8 @@
                omdelMian = JsonConvert.DeserializeObject<Sc_WorkBillSortBillMain>(sWhere);
                ds = oCN.RunProcReturn($"exec h_p_JIT_Sc_WorkBillSortBill_Query '{omdelMian.HPlanBeginDate}',{(omdelMian.HProdORGID == null ? 0 : omdelMian.HProdORGID)},'{omdelMian.HSeOrderBillNo}'" +
                    $",'{omdelMian.HPlanEndDate.AddDays(1)}',{omdelMian.HMaterID},'{omdelMian.HICMOBillNo}',{omdelMian.HWorkShopID}", "h_p_JIT_Sc_WorkBillSortBill_Query");
                    $",'{omdelMian.HPlanEndDate.AddDays(1)}',{omdelMian.HMaterID},'{omdelMian.HICMOBillNo}',{omdelMian.HWorkShopID}" +
                    $",'{omdelMian.HMastersDate}','{omdelMian.sWheres}'", "h_p_JIT_Sc_WorkBillSortBill_Query");
                objJsonResult.code = "1";
                objJsonResult.count = 1;
@@ -220,14 +222,16 @@
                            " HMaterID, HMaterName, HMaterModel, HUnitID, HSeOrderBillQty," +
                            " HOrderNeedQty, HSplitQty, HDayPlanSumQty,HPlanBeginDate," +
                            "HSeOrderBillNo,HICMOBillType,HSourceStockInQty,HLeftPlanQty,HOrderLev,HPreparatDate," +
                            "HMainSourceInterID,HMainSourceEntryID,HICMOInterID_Sec,HICMOEntryID_Sec,HPlanQty)values" +
                            "HMainSourceInterID,HMainSourceEntryID,HICMOInterID_Sec,HICMOEntryID_Sec,HPlanQty" +
                            ",HICMOInterID,HICMOEntryID)values" +
                            $"({HInterID},'{HBillNo}',{DateTime.Now.Year},{DateTime.Now.Month},'{BillType}'," +
                            $"'{BillType}',GETDATE(),1,'{user}',getdate(),'{HICMOBillNo}','{HOrderType}'," +
                            $"{(HICMOEntrySEQ == "" ? 0.ToString() : HICMOEntrySEQ)},{(HWorkShopID == "" ? 0.ToString() : HWorkShopID)},{(HSourceID == "" ? 0.ToString() : HSourceID)}, {(HYX == "" ? 0.ToString() : HYX)}, {(HProdORGID == "" ? 0.ToString() : HProdORGID)}," +
                            $" {(HMaterID == "" ? 0.ToString() : HMaterID)}, '{HMaterName}', '{HMaterModel}', {(HUnitID == "" ? 0.ToString() : HUnitID)}, {(HSeOrderBillQty == "" ? 0.ToString() : HSeOrderBillQty)}," +
                            $" 0, {(HSplitQty == "" ? 0.ToString() : HSplitQty)}, {(HDayPlanSumQty == "" ? 0.ToString() : HDayPlanSumQty)},'{HPlanBeginDate}'," +
                            $"'{HSeOrderBillNo}','{HICMOBillType}',{(HSourceStockInQty == "" ? 0.ToString() : HSourceStockInQty)},{(HLeftPlanQty == "" ? 0.ToString() : HLeftPlanQty)},'{HOrderLev}',getdate()," +
                            $"{HMainSourceInterID},{HMainSourceEntryID},{HMainSourceInterID},{HMainSourceEntryID},{HPlanQty})";
                            $"{HMainSourceInterID},{HMainSourceEntryID},{HMainSourceInterID},{HMainSourceEntryID},{HPlanQty}," +
                            $"{HMainSourceInterID},{HMainSourceEntryID})";
                        //LogService.Write("sql:" + sql);
                        //主表
@@ -241,6 +245,13 @@
                        var HICMOEntrySEQ = list[i]["生产订单明细行号"].ToString();
                        var HSourceID = list[i]["HSourceID"].ToString();
                        var HYX = list[i]["优先级"].ToString();
                        var HWorkQty = list[i]["小时产能"].ToString();
                        var HProdTimes = list[i]["生产周期"].ToString();
                        var HReadyTimes = list[i]["开工余量"].ToString();
                        var HLastBeginDate = list[i]["最迟开工日期"].ToString();
                        var HLastEndDate = list[i]["最迟完工日期"].ToString();
                        var HOrderNeedQty = list[i]["订单需求数量"].ToString();
                        var HOrderCommitDate = list[i]["订单交货期"].ToString();
                        if (HSourceID == "" || HSourceID == "0")
                        {
@@ -272,7 +283,10 @@
                            return objJsonResult;
                        }
                        oCN.RunProc($"update Sc_WorkBillSortBillMain set HSourceID={(HSourceID == "" ? 0.ToString() : HSourceID)},HYX={HYX} where HInterID={list[i]["hmainid"].ToString()} and HBillNo='{list[i]["单据号"].ToString()}'");
                        oCN.RunProc($"update Sc_WorkBillSortBillMain set HSourceID={(HSourceID == "" ? 0.ToString() : HSourceID)},HYX={HYX}" +
                            $",HWorkQty={HWorkQty},HProdTimes={HProdTimes},HReadyTimes={HReadyTimes},HLastBeginDate='{HLastBeginDate}'" +
                            $",HLastEndDate='{HLastEndDate}',HOrderNeedQty={HOrderNeedQty},HOrderCommitDate='{HOrderCommitDate}'" +
                            $" where HInterID={list[i]["hmainid"].ToString()} and HBillNo='{list[i]["单据号"].ToString()}'");
                    }
                    oCN.RunProc($"update Sc_WorkBillSortBillMain set HDayPlanSumQty={list[i]["日计划数量总量"].ToString()} where HInterID={(HInterID==0?int.Parse(list[i]["hmainid"].ToString()):HInterID)} and HBillNo='{(HBillNo==""?list[i]["单据号"].ToString(): HBillNo)}'");
@@ -286,6 +300,7 @@
                        {
                            SumCount += 1;
                            ////保存子表
                            objJsonResult = AddBillSub(HInterID == 0 ? list[i]["hmainid"].ToString() : HInterID.ToString()
                                , HBillNo == "" ? list[i]["单据号"].ToString() : HBillNo
                                 , DateTime.Parse(DateTime.Now.AddDays(j).ToString("yyyy-MM-dd").ToString())
@@ -776,8 +791,11 @@
                //取应发数量 FMustQty ä¸è¦å–值需求数量FNeedQty é¢†æ–™æ•°æ®
                string LLsql = string.Format(@"exec h_p_jit_PPBOMList '{0}'", fDayPlanFids);
                List<DayPlanPickedModel> DayPlanPickedModel = new List<DayPlanPickedModel>();
                LogService.Write("LLsql:" + LLsql);
                ds = oCN.RunProcReturn(LLsql, "SC_WORKBILLSORTBILLMAIN");
                LogService.Write(JsonConvert.SerializeObject(ds));
                DayPlanPickedModel = ds.ToModelList<DayPlanPickedModel>();
                LogService.Write(JsonConvert.SerializeObject(DayPlanPickedModel));
                //CompleteAnalysisTempModel ç”¨äºŽå­˜å‚¨ä¸´æ—¶éœ€è¦æ’入数据
                List<CompleteAnalysisTempModel> completeAnalysisTempModel = new List<CompleteAnalysisTempModel>();
                //创建字典 ç”¨äºŽå‚¨å­˜ç‰©æ–™ + å ç”¨æ•°é‡
@@ -786,8 +804,11 @@
                LogService.Write($"齐套分析,数据准备阶段,用时" + sw.Elapsed + "总需要循环的bom数量:" + DatePlanList.Count);
                //第一个循环 æ—¥è®¡åˆ’工单明细 ä¸€å¤©+一个工单 ä¸€ä¸ªå¾ªçޝ
                int o = 0;
                foreach (var item in DatePlanList)
                {
                    o++;
                    LogService.Write("循环:" + o);
                    //日计划用料清单明细 æ¯ä¸€å¤©çš„实际用料情况
                    var _BomList = BomList.Where(x => x.HMasterDate == item.HMasterDate && x.HICMOEntryID_Sec == item.HICMOEntryID_Sec).ToList();
                    //每一个物料进行库存计算
@@ -823,8 +844,9 @@
                        decimal planNeed = _item.PlanCount; //不参与计算 ç”¨äºŽè®°å½•
                        decimal need = _item.PlanCount;//参与计算
                        decimal FOccupyPickedCount = 0;//占用领料单数量
                        //找到领用数量
                                                       //找到领用数量
                        var _DayPlanPickedModel = DayPlanPickedModel.Where(c => c.FPRDMOENTYID == _item.HICMOEntryID_Sec && c.FMATERIALID == _item.FMATERIALID2).FirstOrDefault();
                        if (_DayPlanPickedModel.FRemainPickedQty >= need)
                        {
                            //领料数量满足了当前这个需求量 ç›´æŽ¥é½å¥— ä¸éœ€è¦åŽ»å ç”¨ä»“åº“
@@ -855,19 +877,24 @@
                            });
                            //扣除剩余可用领料数量
                            _DayPlanPickedModel.FRemainPickedQty -= need;
                            LogService.Write($"h" + need);
                            //循环下一个物料
                            continue;
                        }
                        else
                        {
                            LogService.Write($"kxs" + need);
                            need -= _DayPlanPickedModel.FRemainPickedQty; //剩余需求数量
                            LogService.Write($"i1" + need);
                            FOccupyPickedCount = _DayPlanPickedModel.FRemainPickedQty;
                            _DayPlanPickedModel.FRemainPickedQty = 0;
                            LogService.Write($"i" + need);
                        }
                        if (_pRD_WorkHouseCompar.Count > 0)
                        {
                            //缺料数量 éœ€æ±‚数量 - å®žé™…库存  >0 ? ä¸€ä¸ªç‰©æ–™ä¸ç®¡å ç”¨å¤šå°‘条 åº“å­˜+货主 æ•°æ® ç¼ºæ–™æ•°é‡æ˜¯åŒä¸€ä¸ªæ•°é‡
                            decimal _fLackCount = need > jskcQty ? (need - jskcQty) : 0;
                            LogService.Write($"j" + _fLackCount);
                            //LogHelper.Info("组织:" + _item.FStockOrgId + " ,及时库存" + jskcQty);
                            //总库存为0了 ç›´æŽ¥ç»™å‡º ç¼ºæ–™æ•°é‡
                            if (jskcQty == 0)
@@ -900,6 +927,8 @@
                                //终止该物料计算 è¿›å…¥ä¸‹ä¸€ä¸ª
                                continue;
                            }
                            LogService.Write($"k" + 2);
                            foreach (var WorkHouse in _pRD_WorkHouseCompar)
                            {
                                //库存数据匹配
@@ -1574,7 +1603,9 @@
                List<PODemandPlanTemp> PODemandPlanTemp = new List<PODemandPlanTemp>();
                //sql集合 æ›´æ–°é‡‡è´­è®¢å•占用的提料计划数量
                List<string> sqlList = new List<string>();
                string Error = "运算失败!";
                LogService.Write("1");
                string Error = "";
                foreach (var item in MaterialIDList)
                {
                    //当前物料没有采购订单时 ç›´æŽ¥è·³å‡º
@@ -1584,6 +1615,9 @@
                        Error+="[提料计划开始]当前物料无采购信息:" + item.FNumber + " åº“存组织:" + item.FStockOrgName + "      ";
                        continue;
                    }
                    LogService.Write("1.1");
                    ////LogHelper.Info(item.FMATERIALID.ToString());
                    //当前物料和库存组织对应的需进行提料计划的数据    
                    List<DayPlanPpbom> _DayPlanPpbom = DayPlanPpbom.Where(x => x.FMATERIALID == item.FMATERIALID && x.FStockOrgId == item.FStockOrgId).ToList();
@@ -1597,6 +1631,9 @@
                    DateTime DATE = _DayPlanPpbom.FirstOrDefault().FHMASTERDATE;//第一个订货起始日期
                    int i = 0;
                    //记录在最小采购量需求下的日计划明细FentyrID
                    LogService.Write("1.2");
                    List<int> FEntryIdList = new List<int>();
                    foreach (var _item in _DayPlanPpbom)
                    {
@@ -1607,13 +1644,25 @@
                            break;
                        }
                        LogService.Write("1.2.1");
                        if (NeedQty == 0)
                        {
                            DATE = Convert.ToDateTime(_item.FHMASTERDATE).AddDays(-FFIXLEADTIME);
                        }
                        FEntryIdList.Add(_item.FENTRYID);
                        NeedQty += _item.NeedQty;
                        if ((FJITmaterialGroup == "总量控制规格类" || FJITmaterialGroup == "订单专用个性类") && FEntryIdList.Count < Convert.ToInt32(FJITMaterielDemand) && i < _DayPlanPpbom.Count) //订单专用个性类
                        //LogService.Write(FJITmaterialGroup);
                        //LogService.Write(FEntryIdList.Count);
                        //LogService.Write(Convert.ToDouble(FJITMaterielDemand));
                        //LogService.Write(_DayPlanPpbom.Count);
                        //LogService.Write(i);
                        if ((FJITmaterialGroup == "总量控制规格类" || FJITmaterialGroup == "订单专用个性类") && FEntryIdList.Count < Convert.ToDouble(FJITMaterielDemand) && i < _DayPlanPpbom.Count) //订单专用个性类
                        {
                            continue;
                        }
                        LogService.Write("1.2.2");
                        foreach (var Purchase in _PurchaseInventory)
                        {
@@ -1657,6 +1706,9 @@
                                    //扣除日计划明细已被分配的数量
                                    DayPlanPpbomls.NeedQty = 0;
                                }
                                LogService.Write("1.2.3");
                                FEntryIdList.Clear();
                                //更新采购订单
                                //sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount  =isnull(FPODemandPlanCount,0)+  '{NeedQty}' where FENTRYID = {Purchase.FENTRYID}");
@@ -1733,17 +1785,22 @@
                                }
                            }
                        }
                        LogService.Write("1.2.4");
                        NeedQty = 0;
                    }
                }
                //var PODemandPlanList222 = PODemandPlanTemp.GroupBy(p => new PODemandPlanTemp { PurchseFNUMBER = p.PurchseFNUMBER, FHMASTERDATE = p.FHMASTERDATE }).Select(x => new PODemandPlanTemp { PurchseFNUMBER = x.Key.PurchseFNUMBER, FHMASTERDATE = x.Key.FHMASTERDATE }).ToList();
                var PODemandPlanList = PODemandPlanTemp.GroupBy(p => new { p.PurchseFNUMBER, p.FHMASTERDATE }).Select(x => new PODemandPlanTemp { PurchseFNUMBER = x.Key.PurchseFNUMBER, FHMASTERDATE = x.Key.FHMASTERDATE }).ToList();
                //LogHelper.Info($"提料计划,数据准备完成,保存到Model实体,总行数:{PODemandPlanTemp.Count}");
                int tlmmm = 0;
                JArray FinalyResult = new JArray();
                LogService.Write("2");
                foreach (var item in PODemandPlanList)
                {
                    tlmmm++;
@@ -1915,12 +1972,22 @@
                    //    tlmmm++;
                }
                if (tlmmm == PODemandPlanList.Count && tlmmm != 0)
                LogService.Write("3");
                if (Error != "")
                {
                    oCN.Commit();
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "运算成功!" + Error;
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                else if (tlmmm == PODemandPlanList.Count && tlmmm != 0)
                {
                    oCN.Commit();
                    objJsonResult.code = "1";
                    objJsonResult.count = 1;
                    objJsonResult.Message = "运算成功!";
                    objJsonResult.Message = "运算成功!" + Error;
                    objJsonResult.data = null;
                    return objJsonResult;
                }
@@ -1929,7 +1996,7 @@
                    oCN.RollBack();//事务回滚
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = Error;
                    objJsonResult.Message = "运算失败!" + Error;
                    objJsonResult.data = null;
                    return objJsonResult;
                }
@@ -1938,11 +2005,11 @@
                //////LogHelper.Info("提料计划执行完成,运行总时长:" + sw.Elapsed);
                //DBServiceHelper.ExecuteBatch(Context, sqlList);
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "提料运算成功!";
                objJsonResult.data = null;
                return objJsonResult;
                //objJsonResult.code = "1";
                //objJsonResult.count = 1;
                //objJsonResult.Message = "提料运算成功!";
                //objJsonResult.data = null;
                //return objJsonResult;
            }
            catch (Exception e)
            {
@@ -2534,5 +2601,102 @@
        }
        #endregion
        #region ç”Ÿäº§æ—¥è®¡åˆ’平台 æ•°æ®å‡†å¤‡ è®¾ç½®ä»»åŠ¡å•ç›¸å…³ä¿¡æ¯
        [Route("JIT_DayPlanPlatFormBill/ReadyData")]
        [HttpGet]
        public object ReadyData(string HICOMNum)
        {
            try
            {
                var list = HICOMNum.Split(',');
                DataTable dt = new DataTable("date");
                dt.Columns.Add("HICMOInterID", typeof(string));
                dt.Columns.Add("HICMOEntryID", typeof(string));
                dt.Columns.Add("小时产能", typeof(string));
                dt.Columns.Add("生产周期", typeof(decimal));
                dt.Columns.Add("开工余量", typeof(decimal));
                dt.Columns.Add("最迟开工日期", typeof(DateTime));
                dt.Columns.Add("最迟完工日期", typeof(DateTime));
                dt.Columns.Add("订单需求数量", typeof(decimal));
                dt.Columns.Add("订单交货期", typeof(DateTime));
                for (int i = 0; i < list.Length; i++)
                {
                    string HICMOInterID = list[i].Split(';')[0].ToString();
                    string HICMOEntryID = list[i].Split(';')[1].ToString();
                    Thread.Sleep(100);
                    ds = oCN.RunProcReturn("exec h_p_Sc_GetInfoByICMOBillNo " + HICMOInterID+","+ HICMOEntryID, "h_p_Sc_GetInfoByICMOBillNo");
                    if (ds == null || ds.Tables[0].Rows.Count == 0)
                    {
                    }
                    else
                    {
                        DataRow dr = dt.NewRow();
                        dr["小时产能"] = DBUtility.ClsPub.isSingle(ds.Tables[0].Rows[0]["产能"]);
                        dr["生产周期"] = DBUtility.ClsPub.isSingle(ds.Tables[0].Rows[0]["生产周期"]);
                        dr["开工余量"] = DBUtility.ClsPub.isSingle(ds.Tables[0].Rows[0]["开工余量"]);
                        dr["最迟开工日期"] = DBUtility.ClsPub.isDate(ds.Tables[0].Rows[0]["最迟开工日期"]);
                        dr["最迟完工日期"] = DBUtility.ClsPub.isDate(ds.Tables[0].Rows[0]["最迟完工日期"]);
                        dr["订单需求数量"] = DBUtility.ClsPub.isSingle(ds.Tables[0].Rows[0]["订单需求数"]);
                        dr["订单交货期"] = DBUtility.ClsPub.isDate(ds.Tables[0].Rows[0]["订单交货期"]);
                        dr["HICMOInterID"] = DBUtility.ClsPub.isSingle(ds.Tables[0].Rows[0]["HICMOInterID"]);
                        dr["HICMOEntryID"] = DBUtility.ClsPub.isSingle(ds.Tables[0].Rows[0]["HICMOEntryID"]);
                        dt.Rows.Add(dr);
                    }
                }
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "Sucess!";
                objJsonResult.data = dt;
                return objJsonResult;
            }
            catch (Exception e)
            {
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "Exception!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region  ç¼ºæ–™åˆ†æžæŠ¥è¡¨
        public class MaterialShorAnalysis
        {
            public int? HORGID;
            public DateTime HBEGINDATE;
            public DateTime HENDDATE;
        }
        [Route("JIT_DayPlanPlatFormBill/MaterialShorAnalysisReport")]
        [HttpGet]
        public object MaterialShorAnalysisReport(string sWhere)
        {
            try
            {
                MaterialShorAnalysis Report = JsonConvert.DeserializeObject<MaterialShorAnalysis>(sWhere);
                ds = oCN.RunProcReturn($"exec h_p_JIT_MaterialShorAnalysisReportList {Report.HORGID},'{Report.HBEGINDATE}','{Report.HENDDATE}' ", "h_p_JIT_PODemandPlanBill_ReportList");
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "Sucess!";
                objJsonResult.data = ds.Tables[0];
                return objJsonResult;
            }
            catch (Exception e)
            {
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "Exception!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
    }
}