zzr99
2022-07-30 defb6352aa8847b7acb921f505ba202e491b8835
WebAPI/Controllers/SCGL/Èռƻ®¹ÜÀí/JIT_DayPlanPlatFormBillController.cs
@@ -7,11 +7,13 @@
using WebAPI.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Diagnostics;
namespace WebAPI.Controllers.SCGL.日计划管理
{
    public class JIT_DayPlanPlatFormBillController : ApiController
    {
        List<PRD_Inventory> ListInventory;//库存明细
        private json objJsonResult = new json();
        public DataSet ds = new DataSet();
        public WebServer webserver = new WebServer();
@@ -22,7 +24,7 @@
        #region ç”Ÿäº§æ—¥è®¡åˆ’平台 æŸ¥è¯¢
        [Route("JIT_DayPlanPlatFormBill/JIT_DayPlanPlatFormBillList")]
        [HttpGet]
        public object JIT_DayPlanPlatFormBillList(string sWhere,string user)
        public object JIT_DayPlanPlatFormBillList(string sWhere, string user)
        {
            try
            {
@@ -38,8 +40,45 @@
                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}'" +
                ds = oCN.RunProcReturn($"exec h_p_JIT_Sc_WorkBillSortBill_Query '{omdelMian.HPlanBeginDate}',{(omdelMian.HProdORGID == null ? 0 : omdelMian.HProdORGID)},'{omdelMian.HSeOrderBillNo}'" +
                    $",'{omdelMian.HPlanEndDate.AddDays(1).AddSeconds(-1)}',{omdelMian.HMaterID},'{omdelMian.HICMOBillNo}',{omdelMian.HWorkShopID}", "h_p_JIT_Sc_WorkBillSortBill_Query");
                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;
            }
        }
        /// <summary>
        /// æ ¹æ®ID查询 é½å¥—状态 å’Œ é”å®šçŠ¶æ€
        /// </summary>
        /// <param name="sWhere"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        [Route("JIT_DayPlanPlatFormBill/JIT_DayPlanPlatFormBillHinterIDList")]
        [HttpGet]
        public object JIT_DayPlanPlatFormBillHinterIDList(string sWhere,int num)
        {
            try
            {
                if (num == 1)
                {
                    ds = oCN.RunProcReturn($"select isnull(DATEDIFF(DAY,GETDATE(),CONVERT(varchar(10),max(HMasterDate),20)),0) DayNum from  Sc_WorkBillSortBillSub where HInterID in ({sWhere}) and  HMasterDate>=CONVERT(varchar(10),GETDATE(),20) and HLockedSub=1", "Sc_WorkBillSortBillSub");
                }
                else if (num == 2)
                {
                    ds = oCN.RunProcReturn($"select CONVERT(varchar(10),HMasterDate,20) HMasterDate,HComplete,HInterID from  Sc_WorkBillSortBillSub where HInterID in ({sWhere}) and  HMasterDate>=CONVERT(varchar(10),GETDATE(),20) and (HComplete='齐套' or  HComplete='未齐套') ", "Sc_WorkBillSortBillSub");
                }
                objJsonResult.code = "1";
                objJsonResult.count = 1;
@@ -149,11 +188,11 @@
                        var HMainSourceInterID = list[i]["源单主内码"].ToString();
                        var HMainSourceEntryID = list[i]["源单子内码"].ToString();
                        if (HSourceID=="")
                        if (HSourceID == "")
                        {
                            objJsonResult.code = "0";
                            objJsonResult.count = 0;
                            objJsonResult.Message = $"第{i+1}行生产资源不能为空!";
                            objJsonResult.Message = $"第{i + 1}行生产资源不能为空!";
                            objJsonResult.data = null;
                            return objJsonResult;
                        }
@@ -187,6 +226,8 @@
                            $" {(HOrderNeedQty == "" ? 0.ToString() : HOrderNeedQty)}, {(HSplitQty == "" ? 0.ToString() : HSplitQty)}, {(HDayPlanSumQty == "" ? 0.ToString() : HDayPlanSumQty)},'{HPlanBeginDate}'," +
                            $"'{HSeOrderBillNo}','{HICMOBillType}',{(HSourceStockInQty == "" ? 0.ToString() : HSourceStockInQty)},{(HLeftPlanQty == "" ? 0.ToString() : HLeftPlanQty)},'{HOrderLev}',getdate())");
                    }
                    oCN.RunProc($"update Sc_WorkBillSortBillMain set HDayPlanSumQty={list[i]["日计划数量总量"].ToString()} where HInterID={list[i]["hmainid"].ToString()} and HBillNo='{list[i]["单据号"].ToString()}'");
                    int SumDay = 31; //动态两月之差 DateTime.Now.AddMonths(1).AddDays(-1).Subtract(DateTime.Now).Days;
@@ -263,7 +304,7 @@
            if (count != 1)
            {
                //插入子表
                oCN.RunProc("insert into Sc_WorkBillSortBillSub(HInterID,HEntryID," +
                oCN.RunProc("insert into Sc_WorkBillSortBillSub(HInterID,HSEQ," +
                    "HMasterDate,HQty)" +
                            $"values({HInterID}, {(ds.Tables[0].Rows.Count + 1)}," +
                            $" '{date}', {HQTY})");
@@ -276,5 +317,822 @@
            return objJsonResult;
        }
        #endregion
        #region ç”Ÿäº§æ—¥è®¡åˆ’平台 é½å¥—分析
        #region æ¸…单配料方式
        public class PRD_PPBOM
        {
            /// <summary>
            /// æ—¥è®¡åˆ’工单FID
            /// </summary>
            public long HInterID { get; set; }
            /// <summary>
            /// æ—¥è®¡åˆ’明细FEntryID
            /// </summary>
            public long HEntryID { get; set; }
            /// <summary>
            /// ç”Ÿäº§ç”¨æ–™æ¸…单单号
            /// </summary>
            public string HBillNo { get; set; }
            /// <summary>
            /// ç”Ÿäº§è®¢å•单号
            /// </summary>
            public string HICMOBillNo { get; set; }
            /// <summary>
            /// ç”Ÿäº§è®¢å•内码
            /// </summary>
            public string HICMOInterID { get; set; }
            /// <summary>
            /// çˆ¶çº§ç‰©æ–™ID
            /// </summary>
            public string FMaterialID { get; set; }
            /// <summary>
            /// çˆ¶çº§ç‰©æ–™æ•°é‡
            /// </summary>
            public decimal FQty { get; set; }
            /// <summary>
            /// å­é¡¹ç‰©æ–™ID
            /// </summary>
            public string FMATERIALID2 { get; set; }
            /// <summary>
            /// å­é¡¹ç‰©æ–™åç§°
            /// </summary>
            public string FNumber { get; set; }
            /// <summary>
            /// éœ€æ±‚数量
            /// </summary>
            public decimal FNeedQty { get; set; }
            /// <summary>
            /// å³æ—¶åº“å­˜
            /// </summary>
            public decimal FBASEQTY { get; set; }
            /// <summary>
            /// ç”Ÿäº§è®¢å•主码
            /// </summary>
            public string HICMOInterID_Sec { get; set; }
            /// <summary>
            /// ç”Ÿäº§è®¢å•子码
            /// </summary>
            public string HICMOEntryID_Sec { get; set; }
            /// <summary>
            /// æ—¥è®¡åˆ’数量
            /// </summary>
            public string HQty { get; set; }
            /// <summary>
            /// æ—¥è®¡åˆ’日期
            /// </summary>
            public DateTime HMasterDate { get; set; }
            /// <summary>
            /// è®¢å•等级
            /// </summary>
            public string HOrderLev { get; set; }
            /// <summary>
            /// åº“存组织
            /// </summary>
            public string FStockOrgId { get; set; }
            /// <summary>
            /// ç»„织名称
            /// </summary>
            public string OrgFnumber { get; set; }
            /// <summary>
            /// å•位用量
            /// </summary>
            public decimal dwyl { get; set; }
            /// <summary>
            /// é¢„计消耗用量
            /// </summary>
            public decimal PlanCount { get; set; }
            /// <summary>
            /// ç‰©æ–™å±žæ€§
            /// </summary>
            public int FErpClsID { get; set; }
            /// <summary>
            /// è½¦é—´
            /// </summary>
            public string HWorkShopID { get; set; }
            /// <summary>
            /// è½¦é—´ç¼–码
            /// </summary>
            public string FHWorkShopNumber { get; set; }
        }
        #endregion
        #region å³æ—¶åº“å­˜
        public class PRD_Inventory
        {
            /// <summary>
            /// ç‰©æ–™ID
            /// </summary>
            public string FMATERIALID { get; set; }
            /// <summary>
            /// ç‰©æ–™ç¼–码
            /// </summary>
            public string FNumber { get; set; }
            /// <summary>
            /// å³æ—¶åº“å­˜
            /// </summary>
            public decimal FBASEQTY { get; set; }
            /// <summary>
            /// åº“存组织
            /// </summary>
            public string FStockOrgId { get; set; }
            /// <summary>
            /// åº“存货主类型
            /// </summary>
            public string FOwnerTypeId { get; set; }
            /// <summary>
            /// åº“存货主
            /// </summary>
            public string FOwnerId { get; set; }
            /// <summary>
            /// è´§ä¸»ç¼–码
            /// </summary>
            public string FOwnerNumber { get; set; }
            /// <summary>
            /// ä»“库
            /// </summary>
            public string FSTOCKID { get; set; }
            /// <summary>
            /// ä»“库编码
            /// </summary>
            public string FStockNumber { get; set; }
        }
        #endregion
        #region è½¦é—´ä»“库对照列表
        public class PRD_WorkHouseCompar
        {
            /// <summary>
            /// ç»„织
            /// </summary>
            public string FORGID { get; set; }
            /// <summary>
            /// è½¦é—´
            /// </summary>
            public string FWORKSHOPID { get; set; }
            /// <summary>
            /// ä»“库
            /// </summary>
            public string FSTOCKID { get; set; }
        }
        #endregion
        #region æ—¥è®¡åˆ’+生产订单
        public class DayPlanPickedModel
        {
            /// <summary>
            /// è®¢å•入库数量 æŒ‰ç…§ç”Ÿäº§è®¢å•明细行
            /// </summary>
            public decimal FCXStockInQty { get; set; }
            /// <summary>
            ///  ä¸»ç”Ÿäº§è®¢å•子内码
            /// </summary>
            public string FPRDMOENTYID { get; set; }
            /// <summary>
            ///  ç‰©æ–™å•位用量
            /// </summary>
            public decimal dwyl { get; set; }
            /// <summary>
            ///  å·²é¢†æ•°é‡
            /// </summary>
            public decimal FPickedQty { get; set; }
            /// <summary>
            /// å‰©ä½™å¯ç”¨æ•°é‡
            /// </summary>
            public decimal FRemainPickedQty { get; set; }
            /// <summary>
            ///  ç‰©æ–™
            /// </summary>
            public string FMATERIALID { get; set; }
        }
        #endregion
        #region å­˜å‚¨ä¸´æ—¶éœ€è¦æ’入数据
        public class CompleteAnalysisTempModel
        {
            /// <summary>
            /// ä¸»ç”Ÿäº§è®¢å•主内码:FHMainICMOInterIDr
            /// </summary>
            public string FHMainICMOInterIDr { get; set; }
            /// <summary>
            ///  ä¸»ç”Ÿäº§è®¢å•子内码:FHMainICMOEntryID
            /// </summary>
            public string FHMainICMOEntryID { get; set; }
            /// <summary>
            ///  æ—¥è®¡åˆ’订单主内码:FHICMOInterID
            /// </summary>
            public string FHICMOInterID { get; set; }
            /// <summary>
            ///  æ—¥è®¡åˆ’订单子内码:FHICMOEntryID
            /// </summary>
            public string FHICMOEntryID { get; set; }
            /// <summary>
            ///  å­ä»¶ç‰©æ–™ï¼šFHMaterID
            /// </summary>
            public string FHMaterID { get; set; }
            /// <summary>
            ///  åº“存组织:FHStockOrgID
            /// </summary>
            public string FHStockOrgID { get; set; }
            /// <summary>
            ///生产组织:FHPRDORGID
            /// </summary>
            public string FHPRDORGID { get; set; }
            /// <summary>
            /// ç”Ÿäº§è®¢å•号:FPRDBillNo
            /// </summary>
            public string FPRDBillNo { get; set; }
            /// <summary>
            /// æ ‡è¯†
            /// </summary>
            public string FIdentificat { get; set; }
            /// <summary>
            ///  è´§ä¸»åç§°ï¼šFOwnerName
            /// </summary>
            public string FOwnerName { get; set; }
            /// <summary>
            ///  è´§ä¸»ç¼–码:FOwnerId
            /// </summary>
            public string FOwnerId { get; set; }
            /// <summary>
            /// è´§ä¸»ç±»åž‹ï¼šFOwnerTypeId
            /// </summary>
            public string FOwnerTypeId { get; set; }
            /// <summary>
            /// é½å¥—状态
            /// </summary>
            public string FComPlete { get; set; }
            /// <summary>
            ///  æ•°é‡
            /// </summary>
            public string FHUseQty { get; set; }
            /// <summary>
            ///  åŠæ—¶åº“存数量:FHStockQty
            /// </summary>
            public decimal FHStockQty { get; set; }
            /// <summary>
            ///可用数量:FHLeftQty
            /// </summary>
            public decimal FHLeftQty { get; set; }
            /// <summary>
            /// ç¼ºæ–™æ•°é‡
            /// </summary>
            public decimal FLackCount { get; set; }
            /// <summary>
            /// å ç”¨æ•°é‡
            /// </summary>
            public decimal FOccupyCount { get; set; }
            /// <summary>
            /// å ç”¨é¢†æ–™æ•°é‡
            /// </summary>
            public decimal FOccupyPickedCount { get; set; }
            /// <summary>
            /// å•位用量:FUnitDosage
            /// </summary>
            public decimal FUnitDosage { get; set; }
            /// <summary>
            /// è®¡åˆ’总数量:FSumPlanCount
            /// </summary>
            public decimal FSumPlanCount { get; set; }
            /// <summary>
            /// é½å¥—数量:FCompleteCount q
            /// </summary>
            public decimal FCompleteCount { get; set; }
            public decimal FCompleteCount1 { get; set; }
            /// <summary>
            /// æ—¥è®¡åˆ’日期
            /// </summary>
            public DateTime FPlanDate { get; set; }
            //物料类型
            public int FErpClsID { get; set; }
            //仓库
            public string FStock { get; set; }
            //车间
            public string FWorkShop { get; set; }
        }
        #endregion
        [Route("JIT_DayPlanPlatFormBill/JIT_CompleteSetAnalysis")]
        [HttpGet]
        public object JIT_CompleteSetAnalysis(string sWhere, string user)
        {
            try
            {
                Stopwatch sw = new Stopwatch();
                omdelMian = JsonConvert.DeserializeObject<Sc_WorkBillSortBillMain>(sWhere);
                string sql = $"exec JIT_qtfx {omdelMian.HProdORGID},{omdelMian.HWorkShopID},'{user}' ";
                ds = oCN.RunProcReturn(sql, "JIT_qtfx");
                LogService.Write("齐套分析sql:" + sql);
                List<PRD_PPBOM> BomList = new List<PRD_PPBOM>();
                DataTable resulTable = ds.Tables[0];
                if (resulTable.Rows[0][0].ToString().Contains("失败"))
                {
                    //释放齐套操作 é¿å…å¤šäººåŒæ—¶è¿›è¡Œé½å¥—分析
                    oCN.RunProc($"update T_PRD_QTFX set FSTATUS = 0 where FPRDORGID ={omdelMian.HProdORGID} and FSTATUS = 1 ");
                    objJsonResult.code = "1";
                    objJsonResult.count = 1;
                    objJsonResult.Message = resulTable.Rows[0][0].ToString();
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                else
                {
                    BomList = ds.ToModelList<PRD_PPBOM>();
                }
                string fDayPlanFids = string.Empty;
                string fDayPlanFEntryids = string.Empty;
                if (BomList.Count == 0)
                {
                    //释放齐套操作 é¿å…å¤šäººåŒæ—¶è¿›è¡Œé½å¥—分析
                    oCN.RunProc($"update T_PRD_QTFX set FSTATUS = 0 where FPRDORGID ={omdelMian.HProdORGID} and FSTATUS = 1 ");
                    objJsonResult.code = "1";
                    objJsonResult.count = 1;
                    objJsonResult.Message = "没有需要进行齐套分析的数据";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                else
                {
                    List<string> fidList = BomList.Select(x => x.HInterID.ToString()).Distinct().ToList();
                    List<string> fentryidList = BomList.Select(x => x.HEntryID.ToString()).Distinct().ToList();
                    fDayPlanFids = string.Join(",", fidList);
                    fDayPlanFEntryids = string.Join(",", fentryidList);
                }
                LogService.Write("日计划工单ids" + fDayPlanFids);
                sw.Start();//开始计时
                //获取当前即时库存 åº“存数量+库存组织+物料+货主+仓库
                ds = oCN.RunProcReturn(@"
select distinct isnull(a.FBASEQTY,0) FBASEQTY,b.FNumber,a.FOwnerTypeId,a.FOwnerId,c.FNUMBER as FOwnerNumber,a.FSTOCKID,d.FNUMBER as FStockNumber from
(
select distinct a.HProdORGID FStockOrgId,T2.FMATERIALID,FNumber from SC_WORKBILLSORTBILLMAIN a
join SC_WORKBILLSORTBILLSub b on a.HInterID = b.HInterID
join AIS20210811135644..T_PRD_PPBOM T1 on a.HICMOInterID_Sec = t1.FMoId and a.HICMOEntryID_Sec = t1.FMOENTRYID
LEFT JOIN  AIS20210811135644..T_PRD_PPBOMENTRY T2 on T1.FID = t2.FID
join  AIS20210811135644..T_BD_MATERIAL T3 on T2.FMATERIALID = T3.FMATERIALID
) T1
JOIN  AIS20210811135644..T_BD_MATERIAL b on  t1.FNUMBER = b.FNUMBER
LEFT JOIN  AIS20210811135644..T_STK_Inventory a on b.FMATERIALID = a.FMATERIALID
LEFT join (select distinct fitemid,fformid,FNUMBER from  AIS20210811135644..V_ITEMCLASS_OWNER) c on a.FOwnerTypeId = c.fformid and a.FOWNERID = c.fitemid
join  AIS20210811135644..t_BD_Stock d on a.FSTOCKID =d.FSTOCKID
where a.FBASEQTY>0
", "SC_WORKBILLSORTBILLMAIN");
                ListInventory = ds.ToModelList<PRD_Inventory>();
                //车间 ä»“库对照列表
                ds = oCN.RunProcReturn(@"
SELECT DISTINCT T1.HOrgId FORGID,HWorkShopID FWORKSHOPID,HWHID FSTOCKID FROM Gy_WorkWarehouseBillMain T1
JOIN Gy_WorkWarehouseBillMainSub T2 ON T1.HInterID=T2.HInterID
", "Gy_WorkWarehouseBillMain");
                List<PRD_WorkHouseCompar> pRD_WorkHouseCompar = ds.ToModelList<PRD_WorkHouseCompar>();
                int i = 1;//用于进度条的加载
                //日计划+生产订单子表编码ID
                var DatePlanList = BomList.GroupBy(p => new { p.HMasterDate, p.HICMOEntryID_Sec }).Select(x => new PRD_PPBOM { HMasterDate = x.Key.HMasterDate, HICMOEntryID_Sec = x.Key.HICMOEntryID_Sec }).ToList();
                //取应发数量 FMustQty ä¸è¦å–值需求数量FNeedQty é¢†æ–™æ•°æ®
                string LLsql = string.Format(@"
select max(t1.FCXStockInQty)FCXStockInQty,FPRDMOENTYID,max(dwyl)dwyl,sum(FPickedQty)FPickedQty,sum(FRemainPickedQty)FRemainPickedQty,FMATERIALID from
(
select a.FCXStockInQty, FPRDMOENTYID,convert( decimal(18,2),FMustQty/FQty ) as dwyl,FPickedQty,T2.FMATERIALID,
case when convert( decimal(18,2),(FPickedQty - a.FCXStockInQty * FMustQty/FQty))< 0 then 0
else convert( decimal(18,2),(FPickedQty - a.FCXStockInQty * FMustQty/FQty)) end as FRemainPickedQty
 from
(
select sum(HSourceStockInQty)FCXStockInQty,HICMOEntryID_Sec FPRDMOENTYID from SC_WORKBILLSORTBILLMAIN a
--where a.HInterID IN ({0})
group by HICMOEntryID_Sec
) a
join  AIS20210811135644..T_PRD_PPBOM T1  on a.FPRDMOENTYID = t1.FMOENTRYID
LEFT JOIN AIS20210811135644..T_PRD_PPBOMENTRY t2 on T1.FID = T2.FID
LEFT JOIN AIS20210811135644..T_PRD_PPBOMENTRY_Q t3 on t2.FENTRYID = T3.FENTRYID
LEFT JOIN AIS20210811135644..T_BD_MATERIAL T4 ON T2.FMATERIALID = T4.FMATERIALID
) t1
group by FPRDMOENTYID,FMATERIALID
", fDayPlanFids);
                List<DayPlanPickedModel> DayPlanPickedModel = new List<DayPlanPickedModel>();
                ds = oCN.RunProcReturn(LLsql, "SC_WORKBILLSORTBILLMAIN");
                DayPlanPickedModel = ds.ToModelList<DayPlanPickedModel>();
                //CompleteAnalysisTempModel ç”¨äºŽå­˜å‚¨ä¸´æ—¶éœ€è¦æ’入数据
                List<CompleteAnalysisTempModel> completeAnalysisTempModel = new List<CompleteAnalysisTempModel>();
                //创建字典 ç”¨äºŽå‚¨å­˜ç‰©æ–™ + å ç”¨æ•°é‡
                Dictionary<string, decimal> occupyDic = new Dictionary<string, decimal>();
                LogService.Write($"齐套分析,数据准备阶段,用时" + sw.Elapsed + "总行数:" + BomList.Count);
                LogService.Write($"齐套分析,数据准备阶段,用时" + sw.Elapsed + "总需要循环的bom数量:" + DatePlanList.Count);
                //第一个循环 æ—¥è®¡åˆ’工单明细 ä¸€å¤©+一个工单 ä¸€ä¸ªå¾ªçޝ
                foreach (var item in DatePlanList)
                {
                    //日计划用料清单明细 æ¯ä¸€å¤©çš„实际用料情况
                    var _BomList = BomList.Where(x => x.HMasterDate == item.HMasterDate && x.HICMOEntryID_Sec == item.HICMOEntryID_Sec).ToList();
                    //每一个物料进行库存计算
                    foreach (var _item in _BomList)
                    {
                        //车间仓库 å¯¹ç…§è¡¨ æ¯ä¸ªæ—¥è®¡åˆ’同属一个车间 A,B
                        var _pRD_WorkHouseCompar = pRD_WorkHouseCompar.Where(c => c.FWORKSHOPID == _item.HWorkShopID).ToList();
                        decimal jskcQty = 0;//用于计算
                        decimal jskcQty2 = 0;//用于计算当时那个计算节点的即时库存
                        //计算当前这几个仓库总的库存量
                        if (_pRD_WorkHouseCompar.Count > 0)
                        {
                            foreach (var _WorkHouse in _pRD_WorkHouseCompar)
                            {
                                //库存数据匹配
                                List<PRD_Inventory> _ListInventory = ListInventory.Where(c => c.FNumber == _item.FNumber && c.FBASEQTY > 0 && c.FSTOCKID == _WorkHouse.FSTOCKID).ToList();
                                if (_ListInventory.Count > 0)
                                {
                                    foreach (var Inventory in _ListInventory)
                                    {
                                        jskcQty += Inventory.FBASEQTY;
                                    }
                                }
                            }
                        }
                        //找出物料被其它订单占用数量
                        decimal occupyMaterial = 0;
                        if (occupyDic.ContainsKey(_item.HWorkShopID + _item.FMATERIALID2))
                        {
                            occupyMaterial = occupyDic[_item.HWorkShopID + _item.FMATERIALID2];
                        }
                        //虚拟日计划用料清单 éœ€æ±‚数量
                        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)
                        {
                            //领料数量满足了当前这个需求量 ç›´æŽ¥é½å¥— ä¸éœ€è¦åŽ»å ç”¨ä»“åº“
                            completeAnalysisTempModel.Add(new CompleteAnalysisTempModel
                            {
                                FHMainICMOInterIDr = _item.HICMOInterID_Sec,
                                FHMainICMOEntryID = _item.HICMOEntryID_Sec,
                                FHICMOInterID = _item.HInterID.ToString(),
                                FHICMOEntryID = _item.HEntryID.ToString(),
                                FHMaterID = _item.FMATERIALID2,
                                FErpClsID = _item.FErpClsID,
                                FHStockOrgID = _item.FStockOrgId,
                                FHPRDORGID = _item.FStockOrgId,
                                FPRDBillNo = _item.HICMOBillNo,
                                FOwnerTypeId = "",
                                FUnitDosage = _item.dwyl,//单位用量
                                FSumPlanCount = planNeed,//计划总数量
                                FCompleteCount1 = planNeed, //齐套数量
                                FLackCount = 0,//缺料数量
                                FHStockQty = jskcQty2,//即时库存
                                FHLeftQty = jskcQty,//可用数量
                                FOccupyCount = occupyMaterial,//占用数量
                                FOccupyPickedCount = planNeed,//占用领料数量
                                FComPlete = "齐套",
                                FPlanDate = item.HMasterDate, // æ—¥è®¡åˆ’日期
                                FWorkShop = _item.HWorkShopID //车间
                            });
                            //扣除剩余可用领料数量
                            _DayPlanPickedModel.FRemainPickedQty -= need;
                            //循环下一个物料
                            continue;
                        }
                        else
                        {
                            need -= _DayPlanPickedModel.FRemainPickedQty; //剩余需求数量
                            FOccupyPickedCount = _DayPlanPickedModel.FRemainPickedQty;
                            _DayPlanPickedModel.FRemainPickedQty = 0;
                        }
                        if (_pRD_WorkHouseCompar.Count > 0)
                        {
                            //缺料数量 éœ€æ±‚数量 - å®žé™…库存  >0 ? ä¸€ä¸ªç‰©æ–™ä¸ç®¡å ç”¨å¤šå°‘条 åº“å­˜+货主 æ•°æ® ç¼ºæ–™æ•°é‡æ˜¯åŒä¸€ä¸ªæ•°é‡
                            decimal _fLackCount = need > jskcQty ? (need - jskcQty) : 0;
                            //LogHelper.Info("组织:" + _item.FStockOrgId + " ,及时库存" + jskcQty);
                            //总库存为0了 ç›´æŽ¥ç»™å‡º ç¼ºæ–™æ•°é‡
                            if (jskcQty == 0)
                            {
                                completeAnalysisTempModel.Add(new CompleteAnalysisTempModel
                                {
                                    FHMainICMOInterIDr = _item.HICMOInterID_Sec,
                                    FHMainICMOEntryID = _item.HICMOEntryID_Sec,
                                    FHICMOInterID = _item.HInterID.ToString(),
                                    FHICMOEntryID = _item.HEntryID.ToString(),
                                    FHMaterID = _item.FMATERIALID2,
                                    FErpClsID = _item.FErpClsID,
                                    FHStockOrgID = _item.FStockOrgId,
                                    FHPRDORGID = _item.FStockOrgId,
                                    FPRDBillNo = _item.HICMOBillNo,
                                    FOwnerTypeId = "",
                                    FUnitDosage = _item.dwyl,//单位用量
                                    FSumPlanCount = planNeed,//计划总数量
                                    FCompleteCount1 = FOccupyPickedCount, //齐套数量
                                    FLackCount = need,//缺料数量
                                    FHStockQty = jskcQty2,//即时库存
                                    FHLeftQty = jskcQty,//可用数量
                                    FOccupyCount = occupyMaterial,//占用数量
                                    FOccupyPickedCount = FOccupyPickedCount,//占用领料数量
                                    FComPlete = "未齐套",
                                    FPlanDate = item.HMasterDate, // æ—¥è®¡åˆ’日期
                                    FWorkShop = _item.HWorkShopID //车间
                                });
                                //终止该物料计算 è¿›å…¥ä¸‹ä¸€ä¸ª
                                continue;
                            }
                            foreach (var WorkHouse in _pRD_WorkHouseCompar)
                            {
                                //库存数据匹配
                                List<PRD_Inventory> _ListInventory = ListInventory.Where(c => c.FNumber == _item.FNumber && c.FBASEQTY > 0 && c.FSTOCKID == WorkHouse.FSTOCKID).ToList();
                                //需求数量 å ç”¨å®ŒåŽå¯ä»¥è·³å‡ºè½¦é—´ä»“库循环
                                if (need == 0)
                                    break;
                                if (_ListInventory.Count > 0)
                                {
                                    foreach (var Inventory in _ListInventory)
                                    {
                                        if (need == 0)
                                            break;
                                        //齐套数量
                                        decimal fCompleteCount = need >= Inventory.FBASEQTY ? Inventory.FBASEQTY : need;
                                        if (!occupyDic.ContainsKey(_item.HWorkShopID + _item.FMATERIALID2))
                                        {
                                            occupyDic.Add(_item.HWorkShopID + _item.FMATERIALID2, fCompleteCount);
                                        }
                                        else
                                        {
                                            occupyMaterial = occupyDic[_item.HWorkShopID + _item.FMATERIALID2];
                                            occupyDic[_item.HWorkShopID + _item.FMATERIALID2] = occupyMaterial + fCompleteCount;
                                        }
                                        completeAnalysisTempModel.Add(new CompleteAnalysisTempModel
                                        {
                                            FHMainICMOInterIDr = _item.HICMOInterID_Sec,
                                            FHMainICMOEntryID = _item.HICMOEntryID_Sec,
                                            FHICMOInterID = _item.HInterID.ToString(),
                                            FHICMOEntryID = _item.HEntryID.ToString(),
                                            FHMaterID = _item.FMATERIALID2,
                                            FHStockOrgID = _item.FStockOrgId,
                                            FHPRDORGID = _item.FStockOrgId,
                                            FErpClsID = _item.FErpClsID,
                                            FPRDBillNo = _item.HICMOBillNo,
                                            FOwnerTypeId = Inventory.FOwnerTypeId,
                                            FOwnerId = Inventory.FOwnerId,
                                            FUnitDosage = _item.dwyl,//单位用量
                                            FSumPlanCount = planNeed,//计划总数量
                                            FCompleteCount1 = fCompleteCount + FOccupyPickedCount, //齐套数量
                                            FLackCount = _fLackCount,//缺料数量
                                            FHStockQty = jskcQty2,//即时库存
                                            FHLeftQty = jskcQty,//可用数量
                                            FOccupyCount = occupyMaterial,//占用数量
                                            FOccupyPickedCount = FOccupyPickedCount,//领料占用数量
                                            FComPlete = jskcQty >= need ? "齐套" : "未齐套",
                                            FPlanDate = item.HMasterDate, // æ—¥è®¡åˆ’日期
                                            FStock = Inventory.FSTOCKID,//仓库
                                            FWorkShop = _item.HWorkShopID //车间
                                        });
                                        //扣减总库存数量
                                        jskcQty = jskcQty >= fCompleteCount ? jskcQty - fCompleteCount : 0;
                                        //剩余日计划需求数量
                                        need = need >= Inventory.FBASEQTY ? need - Inventory.FBASEQTY : 0;
                                        //扣减消耗库存
                                        Inventory.FBASEQTY = Inventory.FBASEQTY - fCompleteCount;
                                    }
                                }
                            }
                        }
                        //没有车间仓库数据 æ—¢æ²¡æœ‰å¯ç”¨åº“å­˜ ä¸ºæœªé½å¥—
                        else
                        {
                            if (occupyDic.ContainsKey(_item.HWorkShopID + _item.FMATERIALID2))
                            {
                                occupyMaterial = occupyDic[_item.HWorkShopID + _item.FMATERIALID2];
                            }
                            completeAnalysisTempModel.Add(new CompleteAnalysisTempModel
                            {
                                FHMainICMOInterIDr = _item.HICMOInterID_Sec,
                                FHMainICMOEntryID = _item.HICMOEntryID_Sec,
                                FHICMOInterID = _item.HInterID.ToString(),
                                FHICMOEntryID = _item.HEntryID.ToString(),
                                FHMaterID = _item.FMATERIALID2,
                                FErpClsID = _item.FErpClsID,
                                FHStockOrgID = _item.FStockOrgId,
                                FHPRDORGID = _item.FStockOrgId,
                                FPRDBillNo = _item.HICMOBillNo,
                                FOwnerTypeId = "",
                                FUnitDosage = _item.dwyl,//单位用量
                                FSumPlanCount = planNeed,//计划总数量
                                FCompleteCount1 = planNeed - need, //齐套数量
                                FLackCount = need,//缺料数量
                                FHStockQty = jskcQty2,//即时库存
                                FHLeftQty = jskcQty,//可用数量
                                FOccupyCount = occupyMaterial,//占用数量
                                FOccupyPickedCount = FOccupyPickedCount,//占用领料数量
                                FComPlete = "未齐套",
                                FPlanDate = item.HMasterDate, // æ—¥è®¡åˆ’日期
                                FWorkShop = _item.HWorkShopID //车间
                            });
                        }
                    }
                    //Thread.Sleep(6000);
                    i++;
                }
                LogService.Write($"齐套分析,数据准备完成,保存到Model实体,总行数:{completeAnalysisTempModel.Count},耗时:" + sw.Elapsed);
                List<string> sqlList = new List<string>();
                DataTable insertDT = new DataTable();
                insertDT.TableName = "JIT_MOMaterReadysBill";
                insertDT.Columns.Add("FID", typeof(long));
                insertDT.Columns.Add("FDOCUMENTSTATUS", typeof(string));
                insertDT.Columns.Add("FHMAINICMOINTERIDR", typeof(long));
                insertDT.Columns.Add("FHMAINICMOENTRYID", typeof(long));
                insertDT.Columns.Add("FHICMOINTERID", typeof(long));
                insertDT.Columns.Add("FHICMOENTRYID", typeof(long));
                insertDT.Columns.Add("FHMATERID", typeof(long));
                insertDT.Columns.Add("FHSTOCKORGID", typeof(long));
                insertDT.Columns.Add("FHSTOCKQTY", typeof(decimal));
                insertDT.Columns.Add("FHLEFTQTY", typeof(decimal));
                insertDT.Columns.Add("FHPRDORGID", typeof(long));
                insertDT.Columns.Add("FUNITDOSAGE", typeof(decimal));
                insertDT.Columns.Add("FSUMPLANCOUNT", typeof(decimal));
                insertDT.Columns.Add("FPRDBILLNO", typeof(string));
                insertDT.Columns.Add("FOWNERID", typeof(long));
                insertDT.Columns.Add("FOWNERTYPEID", typeof(string));
                insertDT.Columns.Add("FPLANDATE", typeof(DateTime));
                insertDT.Columns.Add("FCOMPLETE", typeof(string));
                insertDT.Columns.Add("FLACKCOUNT", typeof(decimal));
                insertDT.Columns.Add("FOCCUPYCOUNT", typeof(decimal));
                insertDT.Columns.Add("FCOMPLETECOUNT1", typeof(decimal));
                insertDT.Columns.Add("FERPCLSID", typeof(string));
                insertDT.Columns.Add("FWORKSHOPID", typeof(long));
                insertDT.Columns.Add("FSTOCKID", typeof(long));
                insertDT.Columns.Add("FOCCUPYPICKEDCOUNT", typeof(decimal));
                int jdtmmm = 1;
                ds = oCN.RunProcReturn("select max(HInterID)FID FROM  JIT_MOMaterReadysBill", "JIT_MOMaterReadysBill");
                int maxFid = int.Parse(ds.Tables[0].Rows[0][0].ToString() == "" ? "0" : ds.Tables[0].Rows[0][0].ToString());
                foreach (var item in completeAnalysisTempModel)
                {
                    DataRow dr = insertDT.NewRow();
                    dr["FID"] = maxFid + jdtmmm;
                    dr["FDOCUMENTSTATUS"] = "A";
                    dr["FHMAINICMOINTERIDR"] = item.FHMainICMOInterIDr;
                    dr["FHMAINICMOENTRYID"] = item.FHMainICMOEntryID;
                    dr["FHICMOINTERID"] = item.FHICMOInterID;
                    dr["FHICMOENTRYID"] = item.FHICMOEntryID;
                    dr["FHMATERID"] = item.FHMaterID;
                    dr["FHSTOCKORGID"] = item.FHStockOrgID;
                    dr["FHSTOCKQTY"] = item.FHStockQty;
                    dr["FHLEFTQTY"] = item.FHLeftQty;
                    dr["FHPRDORGID"] = item.FHPRDORGID;
                    dr["FUNITDOSAGE"] = item.FUnitDosage;
                    dr["FSUMPLANCOUNT"] = item.FSumPlanCount;
                    dr["FPRDBILLNO"] = item.FPRDBillNo;
                    dr["FOWNERID"] = item.FOwnerId == null ? "0" : item.FOwnerId;
                    dr["FOWNERTYPEID"] = item.FOwnerTypeId;
                    dr["FPLANDATE"] = item.FPlanDate.ToString("yyyy-MM-dd");
                    dr["FCOMPLETE"] = item.FComPlete;
                    dr["FLACKCOUNT"] = item.FLackCount;
                    dr["FOCCUPYCOUNT"] = item.FOccupyCount;
                    dr["FCOMPLETECOUNT1"] = item.FCompleteCount1;
                    dr["FERPCLSID"] = item.FErpClsID;
                    dr["FWORKSHOPID"] = item.FWorkShop == null ? "0" : item.FWorkShop;
                    dr["FSTOCKID"] = item.FStock == null ? "0" : item.FStock;
                    dr["FOCCUPYPICKEDCOUNT"] = item.FOccupyPickedCount;
                    insertDT.Rows.Add(dr);
                    jdtmmm++;
                }
                insertDT.EndLoadData(); // çŒå…¥æ•°æ®ç»“束
                //插入之前执行下清空语句(测试是否能够防止重复生成)
                string deletesql = $"delete from JIT_MOMaterReadysBill  where HICMOInterID  in ({fDayPlanFids}) ";
                oCN.RunProc(deletesql);
                // æ‰¹é‡æ’入到数据库
                foreach (DataRow item in insertDT.Rows)
                {
                    oCN.RunProc("insert into JIT_MOMaterReadysBill(HInterID,HDocumentStatus,HMainICMOInterID,HMainICMOEntryID,HICMOInterID" +
                            ", HICMOEntryID, HMaterID, HStockORGID, HStockQty, HLeftQty" +
                            ", HProdORGID, HUnitDosage, HSumPlanQty, HICMOBillNo, HOwnerID" +
                            ", HOwnerTypeID, HPlanDate, HComplete, HLackQty, HOccupyQty" +
                            ", HCompleteQty1, HErpClsID, HWorkShopID, HWHID, HOccupyPickedQTY)values" +
                             $"({item["FID"].ToString()}, 1, {item["FHMAINICMOINTERIDR"].ToString()}, {item["FHMAINICMOENTRYID"].ToString()}, {item["FHICMOINTERID"].ToString()}" +
                             $", {item["FHICMOENTRYID"].ToString()}, {item["FHMATERID"].ToString()}, {item["FHSTOCKORGID"].ToString()}, {item["FHSTOCKQTY"].ToString()}, {item["FHLEFTQTY"].ToString()}" +
                             $" , {item["FHPRDORGID"].ToString()}, {item["FUNITDOSAGE"].ToString()}, {item["FSUMPLANCOUNT"].ToString()}, '{item["FPRDBILLNO"].ToString()}', {item["FOWNERID"].ToString()}" +
                             $", '{item["FOWNERTYPEID"].ToString()}', '{item["FPLANDATE"].ToString()}','{item["FCOMPLETE"].ToString()}', {item["FLACKCOUNT"].ToString()}, {item["FOCCUPYCOUNT"].ToString()}" +
                             $", {item["FCOMPLETECOUNT1"].ToString()}, {item["FERPCLSID"].ToString()}, {item["FWORKSHOPID"].ToString()}, {item["FSTOCKID"].ToString()}, {item["FOCCUPYPICKEDCOUNT"].ToString()})");
                }
                LogService.Write("批量插入到数据库用时:" + sw.Elapsed);
                //执行完成后 æ›´æ–°æ—¥è®¡åˆ’工单状态
                string updatesql = string.Format(@"
update Sc_WorkBillSortBillSub set HComplete = '未齐套' where HEntryID IN
(select distinct HICMOEntryID from JIT_MOMaterReadysBill
 where  isnull(HComplete,'未齐套') ='未齐套'
 and HICMOEntryID in ({0})
 )", fDayPlanFEntryids);
                //LogService.Write(Context, updatesql);
                oCN.RunProc(updatesql);
                updatesql = string.Format(@"
update Sc_WorkBillSortBillSub set HComplete  = '齐套'
where HEntryID IN ({0}) and HComplete  <>'未齐套'
", fDayPlanFEntryids);
                //LogService.Write(updatesql);
                oCN.RunProc(updatesql);
                //释放齐套操作 é¿å…å¤šäººåŒæ—¶è¿›è¡Œé½å¥—分析
                oCN.RunProc($"update T_PRD_QTFX set FSTATUS = 0 where FPRDORGID ={omdelMian.HProdORGID} and FSTATUS = 1 ");
                sw.Stop();//结束计时
                LogService.Write("齐套分析运行总时长:" + sw.Elapsed);
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "操作成功";
                objJsonResult.data = null;
                return objJsonResult;
            }
            catch (Exception e)
            {
                LogService.Write("操作失败:" + e.Message.ToString());
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "Exception!" + e.Message.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ç”Ÿäº§æ—¥è®¡åˆ’平台 é”å®š
        [Route("JIT_DayPlanPlatFormBill/JIT_DayPlanPlatFormBillHLockedDay")]
        [HttpGet]
        public object JIT_DayPlanPlatFormBillHLockedDay(string sWhere, int HLockedDay)
        {
            try
            {
                if (sWhere != null && sWhere != "")
                {
                    oCN.RunProc("update Sc_WorkBillSortBillSub set HLockedSub=1" +
                    $" where HInterID in ({sWhere}) and HMasterDate between  DATEADD(day, -1, getdate()) and DATEADD(day,{(HLockedDay - 1)},getdate()) ");
                }
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "Sucess!";
                objJsonResult.data = null;
                return objJsonResult;
            }
            catch (Exception e)
            {
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "Exception!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ç”Ÿäº§æ—¥è®¡åˆ’平台 è§£é”
        [Route("JIT_DayPlanPlatFormBill/JIT_DayPlanPlatFormBillHUnlockDay")]
        [HttpGet]
        public object JIT_DayPlanPlatFormBillHUnlockDay(string sWhere, int HLockedDay)
        {
            try
            {
                if (sWhere != null && sWhere != "")
                {
                    oCN.RunProc("update Sc_WorkBillSortBillSub set HLockedSub=0" +
                    $" where HInterID in ({sWhere}) and HMasterDate between  DATEADD(day, -1, getdate()) and DATEADD(day,{(HLockedDay - 1)},getdate()) ");
                }
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "Sucess!";
                objJsonResult.data = null;
                return objJsonResult;
            }
            catch (Exception e)
            {
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "Exception!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
    }
}