王 垚
2021-02-13 b502fc26362d5c1b4e3e689fe71b5f6cfa1a7af9
代码上传
3个文件已修改
1个文件已添加
1个文件已删除
1291 ■■■■■ 已修改文件
src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.TimedTaskPlugIn/Demo.TimedTaskPlugIn.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.TimedTaskPlugIn/PRD/DayPlanChangeDynamicAlignment.cs 756 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.TimedTaskPlugIn/PRD/TLPlanTimeTask.cs 476 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Model/Demo.Model/Model/DayPlanMaterial.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs
@@ -1,4 +1,5 @@
using Demo.Model.Model;
using Demo.BillView.PRD;
using Demo.Model.Model;
using Demo.Model.Model.PODemandPlan;
using K3Cloud.Extend.Utils;
using Kingdee.BOS.Core;
@@ -380,7 +381,7 @@
            //{
            //锁定后生成日计划用料清单 及 提料计划
            DayPlanPPBomBillBatch();
            Extraction();
            //Extraction();
            SearchList();
            this.View.ShowMessage("操作成功");
            //}
@@ -1713,18 +1714,45 @@
        /// <summary>
        /// 日计划用料清单生成
        /// </summary>
        /// </summary>
        public void DayPlanPPBomBillBatch()
        {
            //LogService.WriteAsync(entrys);
            //查找到的同批项次
            Entity entity = this.View.BillBusinessInfo.GetEntity("FEntity");
            //单据体信息转换为列表集合
            DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
            DynamicObjectCollection filterResult = entityDataObjoct.Clone();
            filterResult.Clear();
            entityDataObjoct.Where(x => Convert.ToBoolean(x["FFOCUS"])).ToList().ForEach(x => filterResult.Add(x));
            string sqlWhere = " 1=1 ";
            string FDayPlanWorkID = "";
            string zxSql = "";
            List<string> zxSqlList = new List<string>();
            if (filterResult.Count() > 0)
            {
                foreach (var filter in filterResult)
                {
                    FDayPlanWorkID += filter["FDayPlanWorkID"].ToString() + ",";
                    zxSqlList.Add(string.Format(@"/*dialect*/
 INSERT INTO Z_SC_TLPLANZXJH (COLUMN1) VALUES ('{0}')
 SELECT * FROM Z_SC_TLPLANZXJH
 INSERT INTO SC_TLPLANZXJH(FID, FDAYPLANID, FCREATEDATE) SELECT *, GETDATE() FROM Z_SC_TLPLANZXJH
 DELETE FROM Z_SC_TLPLANZXJH
 SELECT * FROM SC_TLPLANZXJH", filter["FDayPlanWorkID"]));
                }
                FDayPlanWorkID = FDayPlanWorkID.TrimEnd(',');
                sqlWhere += $"AND t2.FID IN ({FDayPlanWorkID})";
            }
            DBServiceHelper.ExecuteBatch(Context, zxSqlList);
            Stopwatch sw = new Stopwatch();
            sw.Start();//开始计时
            LogHelper.Info("生成日计划用料清单准备数据");
            //锁定的日计划不生成
            try
            {
                string sql = string.Format(@"
/*dialect*/
select t1.FID,t1.FSEQ FDayPlanFSEQ,t1.FEntryID,T2.FBILLNO AS FDayPlanFBILLNO,t3.FMATERIALID,T5.FNUMBER,t1.FHMASTERDATE,t1.FHQTY,t4.FMATERIALID FMATERIALID2,T6.FNUMBER FNUMBER2,T7.FNUMBER FUNITNUMBER,FNumerator,FDenominator,convert(decimal(18,2),(t4.FMustQty/T3.FQTY) *t1.FHQTY) FHQtyMust,T4.FUnitID,t8.FNUMBER FUNITNUMBER2,T3.FID FPPBOM,T4.FENTRYID FPPBOMENTRYID,isnull(T9.FBillNo,'')FBillNo,t10.FNUMBER FORGNUMBER,t11.FNUMBER FHSOURCENUMBER,FSCRAPRATE,FFIXSCRAPQTY,T9.FID AS DayPlanFID,t2.FSCORDERNO,
                string sql = string.Format(@"/*dialect*/
select t1.FID,t1.FSEQ FDayPlanFSEQ,t1.FEntryID,T2.FBILLNO AS FDayPlanFBILLNO,t3.FMATERIALID,t3.FMOEntrySeq as FMoSeq,T5.FNUMBER,t1.FHMASTERDATE,t1.FHQTY,t4.FMATERIALID FMATERIALID2,T6.FNUMBER FNUMBER2,T7.FNUMBER FUNITNUMBER,FNumerator,FDenominator,convert(decimal(18,2),(t4.FMustQty/T3.FQTY) *t1.FHQTY) FHQtyMust,T4.FUnitID,t8.FNUMBER FUNITNUMBER2,T3.FID FPPBOM,T4.FENTRYID FPPBOMENTRYID,isnull(T9.FBillNo,'')FBillNo,t10.FNUMBER FORGNUMBER,t11.FNUMBER FHSOURCENUMBER,FSCRAPRATE,FFIXSCRAPQTY,T9.FID AS DayPlanFID,t2.FSCORDERNO,
t3.FMOENTRYID,t3.FBILLNO FPPBOMBILLNO,T4.FSEQ,tc.FOWNERTYPEID,tc.FOWNERID,tc.FEntrustPickOrgId,torg.FNUMBER as FORGNUMBER,t3.FMOID,FIssueType,FMaterialType,td.FNUMBER as FWORKSHOPID,t4.FReplaceGroup,isnull(ttt.FrowCount,0)FIsTDL,t4.FUseRate
FROM Sc_WorkBillSortBillSub t1
JOIN Sc_WorkBillSortBillMAIN t2 on t1.FID = t2.FID
@@ -1751,12 +1779,13 @@
select distinct FDAYPLANFID from Sc_DayPlanPPBomBillMain where FID IN (
select distinct FDAYPLANFID from T_PRD_PICKMTRLDATA)
)
AND {0}
-- and T4.FMustQty>0
-- (
-- select  FDayPlanFID FROM Sc_DayPlanPPBomBillMain WHERE FID IN ( select distinct FID from  Sc_DayPlanPPBomBillSub WHERE FTranslateQty >0 or FPickedQty >0)
-- )
"
);
",
sqlWhere);
                LogHelper.Info("生成日计划用料清单准备数据sql:" + sql);
                DataSet ds = DBServiceHelper.ExecuteDataSet(Context, sql);
                DataTable dt = ds.Tables[0];
@@ -1802,7 +1831,8 @@
                            FWORKSHOPID = dr["FWORKSHOPID"].ToString(),
                            FReplaceGroup = dr["FReplaceGroup"].ToString(),
                            FUseRate = dr["FUseRate"].ToString(),
                            FIsTDL = dr["FIsTDL"].ToString()
                            FIsTDL = dr["FIsTDL"].ToString(),
                            FMoSeq = dr["FMoSeq"].ToString(),
                        });
                    }
                    LogHelper.Info($"日计划用料清单,数据准备完成,保存到Model实体,总行数:{DayPlanMaterial.Count},耗时:" + sw.Elapsed);
@@ -1844,6 +1874,7 @@
                            ModelEnty.Add("FHQtyScrap", _item.FHQtyScrap);//变动损耗率%
                            ModelEnty.Add("FMOBILLNO", _item.FMOBILLNO);//  
                            ModelEnty.Add("FMOENTRYIDINT", _item.FMOENTRYID);//  
                            ModelEnty.Add("FMoSeq", _item.FMoSeq);//
                            ModelEnty.Add("FPPBOMBILLNO", _item.FPPBOMBILLNO);//  
                            ModelEnty.Add("FPPBOMFSEQINT", _item.FPPBOMFSEQ);//  
                            ModelEnty.Add("FOwnerTypeId", _item.FOwnerTypeId);//  
@@ -1909,6 +1940,7 @@
            catch (Exception ex)
            {
                LogHelper.Error("日计划用料清单+" + ex.Message.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
            }
        }
@@ -1953,7 +1985,8 @@
                LogHelper.Info("[提料计划准备阶段]可用采购订单数据sql:" + sql);
                sql = string.Format(@"
 /*dialect*/
 SELECT T1.FID,FHMATERID,FHMASTERDATE,FHQTY,FCOMPLETECOUNT,FPRDMOMAINID,T2.FENTRYID,T1.FBILLNO, FNeedQty,(FLeadtime+FLeadTtime2)FFIXLEADTIME,t5.FMAXPOQTY,FJITBatch FMINPOQTY,FJITMATERIALGROUP,FJITMaterielDemand,FJITSafeStock,t3.FMATERIALID,t6.FNumber,FHQTY*FNeedQty NeedQty,FHPRDORGID FStockOrgId FROM  SC_WORKBILLSORTBILLMAIN T1
 SELECT T1.FID,FHMATERID,FHMASTERDATE,FHQTY,FCOMPLETECOUNT,FPRDMOMAINID,T2.FENTRYID,T1.FBILLNO, FNeedQty,(FLeadtime+FLeadTtime2)FFIXLEADTIME,t5.FMAXPOQTY,FJITBatch FMINPOQTY,FJITMATERIALGROUP,FJITMaterielDemand,FJITSafeStock,t3.FMATERIALID,t6.FNumber,FHQTY*FNeedQty NeedQty,FHPRDORGID FStockOrgId
FROM  SC_WORKBILLSORTBILLMAIN T1
JOIN SC_WORKBILLSORTBILLSUB T2 ON T1.FID=T2.FID
LEFT JOIN(SELECT T1.FID,max(t2.FMATERIALID)FMATERIALIDMAIN, max(t2.FMoId)FMoId,MAX(FENTRYID) FENTRYID, SUM(convert(decimal(18, 2), FBASENUMERATOR / FBASEDENOMINATOR))FNeedQty, T1.FMATERIALID from T_PRD_PPBOMENTRY  T1
JOIN T_PRD_PPBOM   T2 on t1.FID = t2.FID
src/BLL/Demo.TimedTaskPlugIn/Demo.TimedTaskPlugIn.csproj
@@ -149,7 +149,7 @@
  </ItemGroup>
  <ItemGroup>
    <Compile Include="PRD\StockChangeDynamicAlignment.cs" />
    <Compile Include="PRD\DayPlanChangeDynamicAlignment.cs" />
    <Compile Include="PRD\TLPlanTimeTask.cs" />
    <Compile Include="PRD\DayPlanPPBomBillTimeTask.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
src/BLL/Demo.TimedTaskPlugIn/PRD/DayPlanChangeDynamicAlignment.cs
File was deleted
src/BLL/Demo.TimedTaskPlugIn/PRD/TLPlanTimeTask.cs
New file
@@ -0,0 +1,476 @@
using System.ComponentModel;
using Kingdee.BOS.Contracts;
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.ServiceHelper;
using System.Data;
using ZD.Cloud.Logger;
using Newtonsoft.Json.Linq;
using System;
using Kingdee.BOS.Util;
using System.Linq;
using ZD.Cloud.WebApi;
using Demo.Model.Model;
using Demo.Model.Model.PODemandPlan;
using System.Diagnostics;
using System.Collections.Generic;
using ZD.Share.Common;
namespace Demo.TimedTaskPlugIn.PRD
{
    [Description("日计划发生变动时执行")]
    [HotUpdate]
    public class TLPlanTimeTask : Kingdee.BOS.Contracts.IScheduleService
    {
        CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/");
        public Context Context;
        public void Run(Context ctx, Schedule schedule)
        {
            try
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                Context = ctx;
                string sql = "/*dialect*/  select  FID,FDAYPLANID from sc_TLPLANZXJH where FISZX = 0";
                List<string> sqlList = new List<string>();
                DataTable dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        Extraction(dr["FDAYPLANID"].ToString());
                        sqlList.Add($"/*dialect*/  update sc_TLPLANZXJH set  FZXDATE = getdate(), FISZX = 1 where FID={dr["FID"]}");
                    }
                    DBServiceHelper.ExecuteBatch(Context, sqlList);
                }
                LogHelper.Info("提料计划时长:" + sw.Elapsed);
                sw.Stop();
            }
            catch (System.Exception ex)
            {
                LogHelper.Error(ex.Message.ToString());
            }
        }
        public void Extraction(string FDayPlanWorkID)
        {
            LogHelper.Info("[提料计划准备阶段]:测试测试测试测试测试测试测试测试");
            try
            {
                //Stopwatch sw = new Stopwatch();
                //sw.Start();//开始计时
                //提料计划预处理 清理提料计划单数据 更新采购订单提料计划数量
                string sql = string.Format(@"
  /*dialect*/
 exec [提料计划预处理] '{0}'
 ", FDayPlanWorkID.Replace(",", "-"));
                DBServiceHelper.Execute(Context, sql);
                LogHelper.Info("[提料计划准备阶段]提料计划预处理sql:" + sql);
                //采购订单数据
                sql = @"
 /*dialect*/
 select t1.FID,t1.FBillNo,t2.FENTRYID,t1.FSUPPLIERID,t3.fnumber,t2.FMATERIALID,(t2.FQTY-t2.FPODemandPlanCount)FQTY,FPurchaseOrgId FStockOrgId,t5.FNUMBER FORGNumber,FSTOCKINQTY,FReceiveQty,FCloseStatus,FMRPCLOSESTATUS from t_PUR_POOrder t1
join t_PUR_POOrderEntry t2 on t1.FID = t2.FID
join t_BD_Supplier t3 on t1.FSUPPLIERID = t3.FSUPPLIERID
join  T_PUR_POORDERENTRY_R t4 on t2.FENTRYID = t4.FENTRYID
join T_ORG_Organizations t5 on t1.FPurchaseOrgId = t5.FORGID
where t2.FQTY-t2.FPODemandPlanCount>0
 and FCloseStatus in('A') and FMRPCLOSESTATUS in('A')
 and t1.FBillTypeID in('83d822ca3e374b4ab01e5dd46a0062bd','6d01d059713d42a28bb976c90a121142')
";
                List<PurchaseInventory> PurchaseInventory = DBServiceHelper.ExecuteDataSet(Context, sql).ToModelList<PurchaseInventory>();
                LogHelper.Info("[提料计划准备阶段]可用采购订单数据sql:" + sql);
                sql = string.Format(@"
 /*dialect*/
 SELECT T1.FID,FHMATERID,FHMASTERDATE,FHQTY,FCOMPLETECOUNT,FPRDMOMAINID,T2.FENTRYID,T1.FBILLNO, FNeedQty,(FLeadtime+FLeadTtime2)FFIXLEADTIME,t5.FMAXPOQTY,FJITBatch FMINPOQTY,FJITMATERIALGROUP,FJITMaterielDemand,FJITSafeStock,t3.FMATERIALID,t6.FNumber,FHQTY*FNeedQty NeedQty,FHPRDORGID FStockOrgId
FROM  SC_WORKBILLSORTBILLMAIN T1
JOIN SC_WORKBILLSORTBILLSUB T2 ON T1.FID=T2.FID
LEFT JOIN(SELECT T1.FID,max(t2.FMATERIALID)FMATERIALIDMAIN, max(t2.FMoId)FMoId,MAX(FENTRYID) FENTRYID, SUM(convert(decimal(18, 2), FBASENUMERATOR / FBASEDENOMINATOR))FNeedQty, T1.FMATERIALID from T_PRD_PPBOMENTRY  T1
JOIN T_PRD_PPBOM   T2 on t1.FID = t2.FID
group by T1.FMATERIALID, T1.FID) T3 on T1.FPRDMOMAINID = t3.FMoId  and T1.FHMATERID = t3.FMATERIALIDMAIN
JOIN T_BD_MATERIAL T6 ON T3.FMATERIALID = T6.FMATERIALID
join t_BD_MaterialBase t4 on t3.FMATERIALID = t4.FMATERIALID
join t_BD_MaterialPlan t5 on t3.FMATERIALID = t5.FMATERIALID
WHERE  DATEDIFF(D,GETDATE(),FHMASTERDATE) >=0
AND FComplete ='未齐套'
AND FERPCLSID=1
 AND T2.FENTRYID not in (select distinct FHSOURCEENTRYID from CG_PODEMANDPLANBILLSUB where FHSOURCEINTERID IN ({0}))
AND T1.FID in ({0})
order by FHMASTERDATE
", FDayPlanWorkID);
                sql = string.Format(@"
 /*dialect*/
SELECT T1.FID,FHMASTERDATE,t1.FEntryID,T1.FBILLNO, FNeedQty,(FLeadtime+FLeadTtime2)FFIXLEADTIME,t5.FMAXPOQTY,FJITBatch FMINPOQTY,FJITMATERIALGROUP,FJITMaterielDemand,FJITSafeStock,t1.FMATERIALID,t6.FNumber,NeedQty, FStockOrgId ,FErpClsID
FROM   (
select FHICMOINTERID FID,FHICMOENTRYID FEntryID,FPlanDate FHMASTERDATE,FLackCount NeedQty,FHMATERID FMATERIALID,FHStockOrgID FStockOrgId,FPRDBILLNO FBillNo,FSumPlanCount FNeedQty from JIT_MOMaterReadysBill a
right join (select max(FID)FID from JIT_MOMaterReadysBill GROUP BY FHICMOENTRYID,FHMATERID) b on a.FID = b.FID
)T1
JOIN T_BD_MATERIAL T6 ON T1.FMATERIALID = T6.FMATERIALID
join t_BD_MaterialBase t4 on T1.FMATERIALID = t4.FMATERIALID
join t_BD_MaterialPlan t5 on T1.FMATERIALID = t5.FMATERIALID
WHERE  DATEDIFF(D,GETDATE(),FHMASTERDATE) >=0
AND FERPCLSID in ('1','3')
AND T1.NeedQty>0
AND T1.FENTRYID not in (select distinct FHSOURCEENTRYID from CG_PODEMANDPLANBILLSUB where FHSOURCEINTERID IN ({0}))
AND T1.FID in ({0})
order by FHMASTERDATE
", FDayPlanWorkID);
                //LogHelper.Info("[提料计划准备阶段]需要提料数据sql:" + sql);
                DataSet ds = DBServiceHelper.ExecuteDataSet(Context, sql);
                List<DayPlanPpbom> DayPlanPpbom = ds.ToModelList<DayPlanPpbom>();
                //物料+库存组织分类
                var MaterialIDList = DayPlanPpbom.GroupBy(p => new { p.FMATERIALID, p.FStockOrgId }).Select(x => new PODemandPlanTemp { FMATERIALID = x.Key.FMATERIALID, FStockOrgId = x.Key.FStockOrgId }).ToList();
                var _MaterialIDList = MaterialIDList.Where(p => p.FMATERIALID == "163165").ToList();
                //LogHelper.Info("[提料计划准备阶段]总物料行数" + MaterialIDList.Count);
                //提料计划数据集临时存储集合
                List<PODemandPlanTemp> PODemandPlanTemp = new List<PODemandPlanTemp>();
                //sql集合 更新采购订单占用的提料计划数量
                List<string> sqlList = new List<string>();
                //MaterialIDList = new List<string> { "105773" };
                foreach (var item in MaterialIDList)
                {
                    //当前物料没有采购订单时 直接跳出
                    List<PurchaseInventory> _PurchaseInventory = PurchaseInventory.Where(x => x.FMATERIALID == item.FMATERIALID && x.FStockOrgId == item.FStockOrgId && x.FQTY > 0).OrderBy(x => x.FENTRYID).ToList();
                    if (_PurchaseInventory.Count == 0)
                    {
                        LogHelper.Info("[提料计划开始]当前物料无采购信息:" + item.FMATERIALID + " 库存组织:" + item.FStockOrgId);
                        continue;
                    }
                    //LogHelper.Info(item.FMATERIALID.ToString());
                    //当前物料和库存组织对应的需进行提料计划的数据
                    List<DayPlanPpbom> _DayPlanPpbom = DayPlanPpbom.Where(x => x.FMATERIALID == item.FMATERIALID && x.FStockOrgId == item.FStockOrgId).ToList();
                    decimal FMINPOQTY = _DayPlanPpbom.FirstOrDefault().FMINPOQTY;//最小起订量
                    double FFIXLEADTIME = _DayPlanPpbom.FirstOrDefault().FFIXLEADTIME;//提前期
                    string FJITmaterialGroup = _DayPlanPpbom.FirstOrDefault().FJITmaterialGroup;//jit物料分类
                    string FJITMaterielDemand = _DayPlanPpbom.FirstOrDefault().FJITMaterielDemand; //JIT物料需求供货周期
                    string FJITSafeStock = _DayPlanPpbom.FirstOrDefault().FJITSafeStock; //JIT安全库存
                    decimal NeedQty = 0;
                    DateTime DATE = _DayPlanPpbom.FirstOrDefault().FHMASTERDATE;//第一个订货起始日期
                    int i = 0;
                    //记录在最小采购量需求下的日计划明细FentyrID
                    List<int> FEntryIdList = new List<int>();
                    foreach (var _item in _DayPlanPpbom)
                    {
                        i++;
                        _PurchaseInventory = PurchaseInventory.Where(x => x.FMATERIALID == item.FMATERIALID && x.FStockOrgId == item.FStockOrgId && x.FQTY > 0).OrderBy(x => x.FENTRYID).ToList();
                        if (_PurchaseInventory.Count == 0)
                        {
                            //LogHelper.Info("[提料计划开始]当前物料明细无采购信息:" + item.FMATERIALID + " 库存组织:" + item.FStockOrgId);
                            break;
                        }
                        if (NeedQty == 0)
                            DATE = Convert.ToDateTime(_item.FHMASTERDATE).AddDays(-FFIXLEADTIME);
                        FEntryIdList.Add(_item.FENTRYID);
                        NeedQty += _item.NeedQty;
                        //LogHelper.Info("记录明细id:" + _item.FENTRYID + "");
                        //LogHelper.Info("总需求量:" + NeedQty + "");
                        //LogHelper.Info("最小起订量:" + FMINPOQTY + "");
                        if (NeedQty <= FMINPOQTY)
                        {
                            LogHelper.Info("[提料计划]当前物料明细无采购信息:" + item.FMATERIALID + ",数量:" + NeedQty + ",最小起订量:" + FMINPOQTY + "");
                        }
                        if ((FJITmaterialGroup == "总量控制规格类" || FJITmaterialGroup == "订单专用个性类") && FEntryIdList.Count < Convert.ToInt32(FJITMaterielDemand) && i < _DayPlanPpbom.Count) //订单专用个性类
                            continue;
                        //if (NeedQty >= FMINPOQTY)
                        //{
                        foreach (var Purchase in _PurchaseInventory)
                        {
                            //LogHelper.Info("采购订单号测试:" + Purchase.FBillNo);
                            //LogHelper.Info("物料:" + Purchase.FMATERIALID + ",采购订单数量:" + Purchase.FQTY);
                            if (Purchase.FQTY >= NeedQty)
                            {
                                foreach (int id in FEntryIdList)
                                {
                                    var DayPlanPpbomls = DayPlanPpbom.Where(c => c.FENTRYID == id && c.FMATERIALID == _item.FMATERIALID).FirstOrDefault();
                                    PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp
                                    {
                                        FID = DayPlanPpbomls.FID,
                                        FHMASTERDATE = DATE,
                                        FQty = DayPlanPpbomls.NeedQty,
                                        FBILLNO = DayPlanPpbomls.FBILLNO,
                                        FENTRYID = DayPlanPpbomls.FENTRYID,
                                        FMATERIALID = DayPlanPpbomls.FMATERIALID,
                                        FNumber = DayPlanPpbomls.FNumber,
                                        OLDDATE = DayPlanPpbomls.FHMASTERDATE,
                                        FFIXLEADTIME = FFIXLEADTIME,
                                        FErpClsID = DayPlanPpbomls.FErpClsID,
                                        PurchseFID = Purchase.FID,
                                        PurchseFentryID = Purchase.FENTRYID,
                                        FSUPPLIERID = Purchase.FSUPPLIERID,
                                        PurchseFNUMBER = Purchase.FNUMBER,
                                        PurchseFBillNo = Purchase.FBillNo,
                                        PurchseFqty = Purchase.FQTY,
                                        FStockOrgId = Purchase.FStockOrgId, //采购组织
                                        FORGNumber = Purchase.FORGNumber
                                    });
                                    //扣除日计划明细已被分配的数量
                                    DayPlanPpbomls.NeedQty = 0;
                                }
                                FEntryIdList.Clear();
                                //更新采购订单
                                sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount  =isnull(FPODemandPlanCount,0)+  '{NeedQty}' where FENTRYID = {Purchase.FENTRYID}");
                                //扣除当前行对应采购订单数量
                                var ls = PurchaseInventory.Where(c => c.FENTRYID == Purchase.FENTRYID).FirstOrDefault();
                                ls.FQTY -= NeedQty;
                                break;
                            }
                            else
                            {
                                //更新总需求数量
                                NeedQty = NeedQty - Purchase.FQTY;
                                //采购订单数量
                                decimal _NeedQty = Purchase.FQTY;
                                List<int> mmm = new List<int>();
                                foreach (int id in FEntryIdList)
                                {
                                    var DayPlanPpbomls = DayPlanPpbom.Where(c => c.FENTRYID == id && c.FMATERIALID == _item.FMATERIALID).FirstOrDefault();
                                    decimal Qty = DayPlanPpbomls.NeedQty;//订单数量
                                    //if (Qty == 0)
                                    //    LogHelper.Info("订单数量为0");
                                    if (Qty > _NeedQty)
                                        Qty = _NeedQty; //订单数量>采购订单数量 取采购订单
                                    //if (_NeedQty == 0)
                                    //    LogHelper.Info("订单数量为0");
                                    _NeedQty = _NeedQty - Qty;
                                    PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp
                                    {
                                        FID = DayPlanPpbomls.FID,
                                        FHMASTERDATE = DATE,
                                        FQty = Qty,
                                        FBILLNO = DayPlanPpbomls.FBILLNO,
                                        FENTRYID = DayPlanPpbomls.FENTRYID,
                                        FMATERIALID = DayPlanPpbomls.FMATERIALID,
                                        FNumber = DayPlanPpbomls.FNumber,
                                        OLDDATE = DayPlanPpbomls.FHMASTERDATE,
                                        FFIXLEADTIME = FFIXLEADTIME,
                                        FErpClsID = DayPlanPpbomls.FErpClsID,
                                        PurchseFID = Purchase.FID,
                                        PurchseFentryID = Purchase.FENTRYID,
                                        FSUPPLIERID = Purchase.FSUPPLIERID,
                                        PurchseFNUMBER = Purchase.FNUMBER,
                                        PurchseFBillNo = Purchase.FBillNo,
                                        PurchseFqty = Purchase.FQTY,
                                        FStockOrgId = Purchase.FStockOrgId, //采购组织
                                        FORGNumber = Purchase.FORGNumber
                                    });
                                    //更新计划数量(剩余需要排的) 继续去计算下一个采购订单
                                    DayPlanPpbomls.NeedQty -= Qty;
                                    //更新采购订单
                                    sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount = isnull(FPODemandPlanCount,0)+ '{Qty}' where FENTRYID = {Purchase.FENTRYID}");
                                    //更新Model
                                    var ls = PurchaseInventory.Where(c => c.FENTRYID == Purchase.FENTRYID).FirstOrDefault();
                                    ls.FQTY -= Qty;
                                    if (_NeedQty <= 0)
                                    {
                                        foreach (var mm in mmm)
                                        {
                                            FEntryIdList.Remove(mm);
                                        }
                                        break;
                                    }
                                    mmm.Add(id);
                                }
                                //foreach (var mm in mmm)
                                //{
                                //    FEntryIdList.Remove(mm);
                                //}
                            }
                        }
                        NeedQty = 0;
                        //}
                        #region 剩下不足时按最小采购批次生成
                        //剩下不足时按最小采购批次生成
                        //else if (i == _DayPlanPpbom.Count && NeedQty > 0)
                        //{
                        //    NeedQty = FMINPOQTY;
                        //    List<PurchaseInventory> _PurchaseInventory = PurchaseInventory.Where(x => x.FMATERIALID == item.FMATERIALID && x.FStockOrgId == item.FStockOrgId && x.FQTY > 0).ToList();
                        //    if (_PurchaseInventory.Count == 0)
                        //    {
                        //        NeedQty = 0;
                        //        break;
                        //    }
                        //    foreach (var Purchase in _PurchaseInventory)
                        //    {
                        //        if (Purchase.FQTY >= NeedQty)
                        //        {
                        //            List<int> mmm = new List<int>();
                        //            foreach (int id in FEntryIdList)
                        //            {
                        //                mmm.Add(id);
                        //                var DayPlanPpbomls = DayPlanPpbom.Where(c => c.FENTRYID == id && c.FMATERIALID == _item.FMATERIALID).FirstOrDefault();
                        //                PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp
                        //                {
                        //                    FID = DayPlanPpbomls.FID,
                        //                    FHMASTERDATE = DATE,
                        //                    FQty = DayPlanPpbomls.NeedQty,
                        //                    FBILLNO = DayPlanPpbomls.FBILLNO,
                        //                    FENTRYID = DayPlanPpbomls.FENTRYID,
                        //                    FMATERIALID = DayPlanPpbomls.FMATERIALID,
                        //                    FNumber = DayPlanPpbomls.FNumber,
                        //                    OLDDATE = DayPlanPpbomls.FHMASTERDATE,
                        //                    FFIXLEADTIME = FFIXLEADTIME,
                        //                    PurchseFID = Purchase.FID,
                        //                    PurchseFentryID = Purchase.FENTRYID,
                        //                    FSUPPLIERID = Purchase.FSUPPLIERID,
                        //                    PurchseFNUMBER = Purchase.FNUMBER,
                        //                    PurchseFBillNo = Purchase.FBillNo,
                        //                    PurchseFqty = Purchase.FQTY
                        //                });
                        //                //扣除日计划明细已被分配的数量
                        //                DayPlanPpbomls.NeedQty = 0;
                        //            }
                        //            FEntryIdList.Clear();
                        //            //更新采购订单
                        //            sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount  =isnull(FPODemandPlanCount,0)+  '{NeedQty}' where FENTRYID = {Purchase.FENTRYID}");
                        //            //扣除当前行对应采购订单数量
                        //            var ls = PurchaseInventory.Where(c => c.FENTRYID == Purchase.FENTRYID).FirstOrDefault();
                        //            ls.FQTY -= NeedQty;
                        //            break;
                        //        }
                        //        else
                        //        {
                        //            NeedQty = NeedQty - Purchase.FQTY;
                        //            decimal _NeedQty = Purchase.FQTY;//采购订单数量
                        //            List<int> mmm = new List<int>();
                        //            foreach (int id in FEntryIdList)
                        //            {
                        //                var DayPlanPpbomls = DayPlanPpbom.Where(c => c.FENTRYID == id && c.FMATERIALID == _item.FMATERIALID).FirstOrDefault();
                        //                decimal Qty = DayPlanPpbomls.NeedQty;
                        //                if (Qty > _NeedQty)
                        //                    Qty = _NeedQty;
                        //                _NeedQty = _NeedQty - DayPlanPpbomls.NeedQty;
                        //                PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp
                        //                {
                        //                    FID = DayPlanPpbomls.FID,
                        //                    FHMASTERDATE = DATE,
                        //                    FQty = Qty,
                        //                    FBILLNO = DayPlanPpbomls.FBILLNO,
                        //                    FENTRYID = DayPlanPpbomls.FENTRYID,
                        //                    FMATERIALID = DayPlanPpbomls.FMATERIALID,
                        //                    FNumber = DayPlanPpbomls.FNumber,
                        //                    OLDDATE = DayPlanPpbomls.FHMASTERDATE,
                        //                    FFIXLEADTIME = FFIXLEADTIME,
                        //                    PurchseFID = Purchase.FID,
                        //                    PurchseFentryID = Purchase.FENTRYID,
                        //                    FSUPPLIERID = Purchase.FSUPPLIERID,
                        //                    PurchseFNUMBER = Purchase.FNUMBER,
                        //                    PurchseFBillNo = Purchase.FBillNo,
                        //                    PurchseFqty = Purchase.FQTY
                        //                });
                        //                DayPlanPpbomls.NeedQty -= Qty;
                        //                //更新采购订单
                        //                sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount = isnull(FPODemandPlanCount,0)+ '{Qty}' where FENTRYID = {Purchase.FENTRYID}");
                        //                //更新Model
                        //                var ls = PurchaseInventory.Where(c => c.FENTRYID == Purchase.FENTRYID).FirstOrDefault();
                        //                ls.FQTY -= Qty;
                        //                if (_NeedQty < 0)
                        //                {
                        //                    foreach (var mm in mmm)
                        //                    {
                        //                        FEntryIdList.Remove(mm);
                        //                    }
                        //                    break;
                        //                }
                        //                mmm.Add(id);
                        //            }
                        //            foreach (var mm in mmm)
                        //            {
                        //                FEntryIdList.Remove(mm);
                        //            }
                        //        }
                        //    }
                        //    NeedQty = 0;
                        //}
                        #endregion
                    }
                }
                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},耗时:" + sw.Elapsed);
                int tlmmm = 1;
                JArray FinalyResult = new JArray();
                foreach (var item in PODemandPlanList)
                {
                    DateTime date = item.FHMASTERDATE;
                    string PurchseFNUMBER = item.PurchseFNUMBER;
                    JObject model = new JObject();
                    model.Add("FHDate", date);
                    model.Add("FSettleCurrId", new JObject() { ["Fnumber"] = "PRE001" });
                    model.Add("FSupplierID", new JObject() { ["Fnumber"] = PurchseFNUMBER });
                    JArray Fentity = new JArray();
                    List<PODemandPlanTemp> _PODemandPlanList = PODemandPlanTemp.Where(x => x.FHMASTERDATE == date && x.PurchseFNUMBER == PurchseFNUMBER).ToList();
                    int FSEQ = 1;
                    foreach (var _item in _PODemandPlanList)
                    {
                        JObject FentityModel = new JObject();
                        FentityModel.Add("FHPURCHASEORGID", new JObject() { ["Fnumber"] = _item.FORGNumber });//采购组织
                        FentityModel.Add("FHMaterID", new JObject() { ["Fnumber"] = _item.FNumber });//物料
                        FentityModel.Add("FHQty", _item.FQty);//数量
                        FentityModel.Add("FHSourceInterID", _item.FID);//日计划工单FID
                        FentityModel.Add("FHSourceEntryID", _item.FENTRYID);//日计划工单FENTRYID
                        FentityModel.Add("FHSourceBillNo", _item.FBILLNO);//日计划工单单号
                        FentityModel.Add("FHSourceBillType", "");//日计划工单类型
                        FentityModel.Add("FDayPlanDate", _item.OLDDATE);//日计划工单类型
                        FentityModel.Add("FHRelationQty", _item.PurchseFqty);//关联数量
                        FentityModel.Add("FFIXLEADTIME", _item.FFIXLEADTIME);//提前期
                        FentityModel.Add("FPURCHASEORGID", new JObject() { ["Fnumber"] = _item.FORGNumber });//采购组织
                        FentityModel.Add("FHPOOrderInterID", _item.PurchseFID);// 采购订单内码:FHPOOrderInterID
                        FentityModel.Add("FHPOOrderEntryID", _item.PurchseFentryID); //采购订单子内码:FHPOOrderEntryID
                        FentityModel.Add("FHPOOrderBillNo", _item.PurchseFBillNo); //采购订单号:FHPOOrderBillNo
                        FentityModel.Add("FERPCLSID", _item.FErpClsID); //发料方式
                        //FentityModel.Add("FSEQ", FSEQ); //发料方式
                        FentityModel.Add("FUnitID", new JObject() { ["Fnumber"] = "Pcs" }); //发料方式
                        Fentity.Add(FentityModel);
                        FSEQ++;
                    }
                    model.Add("FEntity", Fentity);
                    FinalyResult.Add(model);
                    if ((tlmmm >= 20 || tlmmm == PODemandPlanList.Count) && (tlmmm % 20 == 0 || tlmmm == PODemandPlanList.Count))
                    {
                        LogHelper.Info("提料计划新增批量执行,记录循环的当前条数" + tlmmm);
                        JObject jsonRoot = new JObject()
                        {
                            ["Creator"] = "",
                            ["NeedUpDateFields"] = new JArray(),
                            ["NeedReturnFields"] = new JArray(),
                            ["IsDeleteEntry"] = "false",
                            ["SubSystemId"] = "",
                            ["IsVerifyBaseDataField"] = "false",
                            ["Model"] = FinalyResult
                        };
                        CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/");
                        var result = cloudClient.BatchSave("paez_PODemandPlan", jsonRoot.ToString());
                        JObject saveObj = JObject.Parse(result);
                        string saveIsSuc = saveObj["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToUpper();
                        if (saveIsSuc != "TRUE")
                        {
                            LogHelper.Error(jsonRoot.ToString());
                        }
                        FinalyResult = new JArray();
                    }
                    tlmmm++;
                }
                //sw.Stop();//结束计时
                //LogHelper.Info("提料计划执行完成,运行总时长:" + sw.Elapsed);
                DBServiceHelper.ExecuteBatch(Context, sqlList);
            }
            catch (Exception ex)
            {
                LogHelper.Info("提料计划跳出:" + ex.Message.ToString());
            }
            // var PODemandPlanList22 = PODemandPlanTemp.GroupBy(p => new   {p.FSUPPLIERID,     p.FHMASTERDATE }).ToList();
        }
    }
}
src/Model/Demo.Model/Model/DayPlanMaterial.cs
@@ -66,6 +66,10 @@
        /// 生产订单内码
        /// </summary>
        public string FMOID { get; set; }
        /// <summary>
        /// 生产订单行号
        /// </summary>
        public string FMoSeq { get; set; }
        /// <summary>
        /// 生产用料清单编号