王 垚
2021-02-28 3b819605e47e354eeafc696ea3bcb837b8eb063f
2.28 客户现场调整后上传
6个文件已修改
2个文件已添加
625 ■■■■■ 已修改文件
src/BLL/Demo.BillView/Demo.BillView.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.BillView/PRD/Pro_MaterialRequisitionAudit.cs 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.BillView/PRD/Pro_MaterialRequisitionAuditDayPlan.cs 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.BillView/PRD/Pro_ScDayImport.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Model/Demo.Model/Model/DayPlanMaterial.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Model/Demo.Model/Model/PODemandPlan/DayPlanPpbom.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/Model/Demo.Model/Model/PODemandPlan/PODemandPlanTemp.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.BillView/Demo.BillView.csproj
@@ -209,6 +209,8 @@
    <Compile Include="PRD\ProTardinessDetails.cs" />
    <Compile Include="PRD\ProCompleteAnalysisMateriel.cs" />
    <Compile Include="PRD\ProCompleteAnalysisDetails.cs" />
    <Compile Include="PRD\Pro_MaterialRequisitionAuditDayPlan.cs" />
    <Compile Include="PRD\Pro_MaterialRequisitionAudit.cs" />
    <Compile Include="PRD\Pro_ScDayImport.cs" />
    <Compile Include="PRD\Pro_TlPlanConfigure.cs" />
    <Compile Include="PRD\Pro_WorkBillPlatform.cs" />
src/BLL/Demo.BillView/PRD/Pro_MaterialRequisitionAudit.cs
New file
@@ -0,0 +1,237 @@
using System;
using System.Collections.Generic;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.App;
using Kingdee.BOS.Core.Metadata.FieldElement;
using System.ComponentModel;
using Kingdee.BOS.ServiceHelper;
namespace Demo.DynamicForm.PRD
{
    /// <summary>
    /// 插件示例:引入销售出库单,建立与销售订单的关联
    /// </summary>
    /// <remarks>
    /// 要求:
    /// 1. 需要引入单据体的源单类型、源单编号字段
    /// 2. 本插件挂在销售出库单的保存操作上
    /// 出库关联销售订单
    /// </remarks>
    [Description("引入生产领料单,建立与生产订单的关联")]
    [HotUpdate]
    public class Pro_MaterialRequisitionAudit : AbstractOperationServicePlugIn
    {
        public override void OnPreparePropertys(PreparePropertysEventArgs e)
        {
            base.OnPreparePropertys(e);
            e.FieldKeys.Add("FSrcBillType");
            e.FieldKeys.Add("FSrcBillNo");
            e.FieldKeys.Add("FID");
            e.FieldKeys.Add("FTreeEntity_FEntryID");
            e.FieldKeys.Add("FBillNo");
            e.FieldKeys.Add("FBFLowId");
            e.FieldKeys.Add("FMaterialId");
            e.FieldKeys.Add("FBaseUnitQty");
            e.FieldKeys.Add("FBaseJoinQty");
        }
        private const string POFormId = "PRD_PPBOM";
        public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
        {
            base.BeforeExecuteOperationTransaction(e);
            HashSet<string> poBillNos = new HashSet<string>();
            Entity entity = this.BusinessInfo.GetEntity("FEntity");//获取明细信息
            Entity linkEntry = this.BusinessInfo.GetEntity("FEntity_Link");
            Field fldSrcFormId = this.BusinessInfo.GetField("FSrcBillType");
            Field fldSrcBillNo = this.BusinessInfo.GetField("FSrcBillNo");
            // 对单据体进行循环,取关联的源单编号
            foreach (var billObj in e.SelectedRows)
            {
                DynamicObjectCollection entryRows = entity.DynamicProperty.GetValue(billObj.DataEntity)
                            as DynamicObjectCollection;
                foreach (var entryRow in entryRows)
                {
                    string srcFormId = "";
                    string srcSrcBillNo = "";
                    try
                    {
                        srcFormId = "PRD_PPBOM";
                        srcSrcBillNo = fldSrcBillNo.DynamicProperty.GetValue<string>(entryRow);
                        srcSrcBillNo = DBServiceHelper.ExecuteScalar<string>(Context, $" select distinct FPPBOMBILLNO from T_PRD_PICKMTRLDATA where FSRCBILLNO = '{srcSrcBillNo}' ", srcSrcBillNo);
                    }
                    catch (Exception)
                    {
                    }
                    if (string.IsNullOrWhiteSpace(srcFormId)
                        || string.IsNullOrWhiteSpace(srcSrcBillNo)
                        )
                    {// 源单不是采购订单,略过
                        continue;
                    }
                    // 源单编号已经登记,不再重复记录,略过
                    if (poBillNos.Contains(srcSrcBillNo)) continue;
                    // Link已经记录了源单信息,略过
                    //DynamicObjectCollection linkRows = linkEntry.DynamicProperty.GetValue(entryRow)
                    //        as DynamicObjectCollection;
                    //if (linkRows.Count > 0) continue;
                    bool Ret = SourceVerification(Convert.ToString(entryRow["Id"]));
                    if (!Ret) continue;
                    poBillNos.Add(srcSrcBillNo);
                }
            }
            if (poBillNos.Count == 0) return;
            DynamicObject[] poObjs = this.LoadPurchaseOrder(poBillNos);
            if (poObjs == null || poObjs.Length == 0) return;
            Dictionary<string, Dictionary<string, DynamicObject>> dctAllBills = this.BuildDictionary(poObjs);
            string srcTableNumber = this.GetPOEntryTableNumber();
            List<DynamicObject> allNewLinkRows = new List<DynamicObject>();
            // 循环单据体,为单据体,建立起源单关联信息:
            foreach (var billObj in e.SelectedRows)
            {
                DynamicObjectCollection entryRows = entity.DynamicProperty.GetValue(billObj.DataEntity)
                            as DynamicObjectCollection;
                foreach (var entryRow in entryRows)
                {
                    string srcSrcBillNo = fldSrcBillNo.DynamicProperty.GetValue<string>(entryRow);
                    string srcFormId = "PRD_PPBOM";
                    srcSrcBillNo = DBServiceHelper.ExecuteScalar<string>(Context, $" select distinct FPPBOMBILLNO from T_PRD_PICKMTRLDATA where FSRCBILLNO = '{srcSrcBillNo}' ", srcSrcBillNo);
                    if (string.IsNullOrWhiteSpace(srcFormId)
                        || string.IsNullOrWhiteSpace(srcSrcBillNo)
                      )
                    {// 源单不是销售订单,略过
                        continue;
                    }
                    Dictionary<string, DynamicObject> dctOneBill = null;
                    if (dctAllBills.TryGetValue(srcSrcBillNo, out dctOneBill) == false) continue;
                    DynamicObject materialObj = entryRow["MaterialId"] as DynamicObject;
                    if (materialObj == null) continue;
                    string materialNumber = Convert.ToString(materialObj["number"]);
                    DynamicObject srcRow = null;
                    if (dctOneBill.TryGetValue(materialNumber, out srcRow) == false) continue;
                    // Link已经记录了源单信息,略过
                    bool Ret = SourceVerification(Convert.ToString(entryRow["Id"]));
                    if (!Ret) continue;
                    DynamicObjectCollection linkRows = linkEntry.DynamicProperty.GetValue(entryRow)
                            as DynamicObjectCollection;
                    linkRows.Clear();
                    DynamicObject linkRow = new DynamicObject(linkEntry.DynamicObjectType);
                    linkRow["STableName"] = srcTableNumber;
                    this.FillLinkRow(srcRow, entryRow, linkRow);
                    linkRows.Add(linkRow);
                    allNewLinkRows.Add(linkRow);
                }
            }
            // 为新建的源单关联信息,设置内码
            IDBService dbService = ServiceHelper.GetService<IDBService>();
            dbService.AutoSetPrimaryKey(this.Context, allNewLinkRows.ToArray(), linkEntry.DynamicObjectType);
        }
        /// <summary>
        /// 加载相关的销售订单数据
        /// </summary>
        /// <param name="poBillNos"></param>
        /// <returns></returns>
        private DynamicObject[] LoadPurchaseOrder(HashSet<string> poBillNos)
        {
            IViewService viewService = ServiceHelper.GetService<IViewService>();
            string formId = "PRD_PPBOM";
            // 指定需要加载的销售订单字段
            List<SelectorItemInfo> fields = new List<SelectorItemInfo>();
            fields.Add(new SelectorItemInfo("FID"));        // 单据主键
            fields.Add(new SelectorItemInfo("FTreeEntity_FEntryID"));     // 单据体主键
            fields.Add(new SelectorItemInfo("FBillNo"));    // 单据编号
            fields.Add(new SelectorItemInfo("FBFLowId"));    // 业务流程
            fields.Add(new SelectorItemInfo("FMaterialId"));    // 物料
            fields.Add(new SelectorItemInfo("FMaterialID2"));    // 物料
            fields.Add(new SelectorItemInfo("FBASENEEDQTY"));           // 基本单位数量
            fields.Add(new SelectorItemInfo("FBASEPICKEDQTY"));           // 基本单位关联数量
            fields.Add(new SelectorItemInfo("FBFLOWID"));           //
            // 指定过滤条件
            string filter = string.Format(" FBillNo IN ('{0}') ", string.Join("','", poBillNos));
            OQLFilter ofilter = OQLFilter.CreateHeadEntityFilter(filter);
            var objs = viewService.Load(this.Context, formId, fields, ofilter);
            return objs;
        }
        /// <summary>
        /// 把销售订单单据体行构建为字典:Dictionary(单据编号, Dictionary(物料编码, 源单行));
        /// </summary>
        /// <param name="poObjs"></param>
        /// <returns></returns>
        private Dictionary<string, Dictionary<string, DynamicObject>> BuildDictionary(DynamicObject[] poObjs)
        {
            Dictionary<string, Dictionary<string, DynamicObject>> dctAllBills =
                new Dictionary<string, Dictionary<string, DynamicObject>>();
            foreach (var poObj in poObjs)
            {
                string billNo = Convert.ToString(poObj["BillNo"]);
                Dictionary<string, DynamicObject> dctOneBill = new Dictionary<string, DynamicObject>();
                DynamicObjectCollection entryRows = poObj["PPBomEntry"] as DynamicObjectCollection;
                foreach (var entryRow in entryRows)
                {
                    DynamicObject materialObj = entryRow["MaterialId"] as DynamicObject;
                    if (materialObj == null) continue;
                    string materialNumber = Convert.ToString(materialObj["number"]);
                    dctOneBill[materialNumber] = entryRow;
                }
                dctAllBills.Add(billNo, dctOneBill);
            }
            return dctAllBills;
        }
        /// <summary>
        /// 获取销售订单关联主实体表格编码
        /// </summary>
        /// <returns></returns>
        private string GetPOEntryTableNumber()
        {
            IBusinessFlowService bfMetaService = ServiceHelper.GetService<IBusinessFlowService>();
            var tableDefine = bfMetaService.LoadTableDefine(this.Context, POFormId, "FEntity");
            return tableDefine.TableNumber;
        }
        /// <summary>
        /// 填写源单信息
        /// </summary>
        /// <param name="srcRow">源单行</param>
        /// <param name="toRow">目标单行</param>
        /// <param name="linkRow">关联行</param>
        private void FillLinkRow(DynamicObject srcRow, DynamicObject toRow, DynamicObject linkRow)
        {
            linkRow["FlowId"] = srcRow["BFLowId_Id"];
            linkRow["FlowLineId"] = 0;
            linkRow["RuleId"] = "PRD_PPBOM2PICKMTRL_NORMAL";
            linkRow["SBillId"] = ((DynamicObject)srcRow.Parent)[0];
            linkRow["SId"] = srcRow[0];
            // 原始携带量
            decimal baseUnitQty = Convert.ToDecimal(srcRow["BaseNeedQty"]);//用料清单单位数量
            decimal joinUnitQty = Convert.ToDecimal(srcRow["BasePickedQty"]);//用料清单单位领料数量
            linkRow["BaseActualQtyOld"] = baseUnitQty - joinUnitQty;
            linkRow["BaseActualQty"] = toRow["BASEACTUALQTY"]; //基本单位实发数量
        }
        /// <summary>
        /// 验证是否生成过生产用料清单对应的源单
        /// </summary>
        /// <returns></returns>
        public bool SourceVerification(string FTID)
        {
            string sql = $" select count(*) from T_BF_INSTANCEENTRY where FSTABLENAME= 'T_PRD_PPBOMENTRY' and FTID = '{FTID}'";
            int count = DBServiceHelper.ExecuteScalar<int>(Context, sql, 0);
            if (count == 0)
                return true;
            else
                return false;
        }
    }
}
src/BLL/Demo.BillView/PRD/Pro_MaterialRequisitionAuditDayPlan.cs
New file
@@ -0,0 +1,237 @@
using System;
using System.Collections.Generic;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.App;
using Kingdee.BOS.Core.Metadata.FieldElement;
using System.ComponentModel;
using Kingdee.BOS.ServiceHelper;
namespace Demo.DynamicForm.PRD
{
    /// <summary>
    /// 插件示例:引入销售出库单,建立与销售订单的关联
    /// </summary>
    /// <remarks>
    /// 要求:
    /// 1. 需要引入单据体的源单类型、源单编号字段
    /// 2. 本插件挂在销售出库单的保存操作上
    /// 出库关联销售订单
    /// </remarks>
    [Description("引入生产领料单,建立与生产订单的关联,日计划用料清单")]
    [HotUpdate]
    public class Pro_MaterialRequisitionAuditDayPlan : AbstractOperationServicePlugIn
    {
        public override void OnPreparePropertys(PreparePropertysEventArgs e)
        {
            base.OnPreparePropertys(e);
            e.FieldKeys.Add("FSrcBillType");
            e.FieldKeys.Add("FSrcBillNo");
            e.FieldKeys.Add("FID");
            e.FieldKeys.Add("FTreeEntity_FEntryID");
            e.FieldKeys.Add("FBillNo");
            e.FieldKeys.Add("FBFLowId");
            e.FieldKeys.Add("FMaterialId");
            e.FieldKeys.Add("FBaseUnitQty");
            e.FieldKeys.Add("FBaseJoinQty");
        }
        private const string POFormId = "PRD_PPBOM";
        public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
        {
            base.BeforeExecuteOperationTransaction(e);
            HashSet<string> poBillNos = new HashSet<string>();
            Entity entity = this.BusinessInfo.GetEntity("FEntity");//获取明细信息
            Entity linkEntry = this.BusinessInfo.GetEntity("FEntity_Link");
            Field fldSrcFormId = this.BusinessInfo.GetField("FSrcBillType");
            Field fldSrcBillNo = this.BusinessInfo.GetField("FSrcBillNo");
            // 对单据体进行循环,取关联的源单编号
            foreach (var billObj in e.SelectedRows)
            {
                DynamicObjectCollection entryRows = entity.DynamicProperty.GetValue(billObj.DataEntity)
                            as DynamicObjectCollection;
                foreach (var entryRow in entryRows)
                {
                    string srcFormId = "";
                    string srcSrcBillNo = "";
                    try
                    {
                        srcFormId = "PRD_PPBOM";
                        srcSrcBillNo = fldSrcBillNo.DynamicProperty.GetValue<string>(entryRow);
                        srcSrcBillNo = DBServiceHelper.ExecuteScalar<string>(Context, $" select distinct FPPBOMBILLNO from T_PRD_PICKMTRLDATA where FSRCBILLNO = '{srcSrcBillNo}' ", srcSrcBillNo);
                    }
                    catch (Exception)
                    {
                    }
                    if (string.IsNullOrWhiteSpace(srcFormId)
                        || string.IsNullOrWhiteSpace(srcSrcBillNo)
                        )
                    {// 源单不是采购订单,略过
                        continue;
                    }
                    // 源单编号已经登记,不再重复记录,略过
                    if (poBillNos.Contains(srcSrcBillNo)) continue;
                    // Link已经记录了源单信息,略过
                    //DynamicObjectCollection linkRows = linkEntry.DynamicProperty.GetValue(entryRow)
                    //        as DynamicObjectCollection;
                    //if (linkRows.Count > 0) continue;
                    bool Ret = SourceVerification(Convert.ToString(entryRow["Id"]));
                    if (!Ret) continue;
                    poBillNos.Add(srcSrcBillNo);
                }
            }
            if (poBillNos.Count == 0) return;
            DynamicObject[] poObjs = this.LoadPurchaseOrder(poBillNos);
            if (poObjs == null || poObjs.Length == 0) return;
            Dictionary<string, Dictionary<string, DynamicObject>> dctAllBills = this.BuildDictionary(poObjs);
            string srcTableNumber = this.GetPOEntryTableNumber();
            List<DynamicObject> allNewLinkRows = new List<DynamicObject>();
            // 循环单据体,为单据体,建立起源单关联信息:
            foreach (var billObj in e.SelectedRows)
            {
                DynamicObjectCollection entryRows = entity.DynamicProperty.GetValue(billObj.DataEntity)
                            as DynamicObjectCollection;
                foreach (var entryRow in entryRows)
                {
                    string srcSrcBillNo = fldSrcBillNo.DynamicProperty.GetValue<string>(entryRow);
                    string srcFormId = "PRD_PPBOM";
                    srcSrcBillNo = DBServiceHelper.ExecuteScalar<string>(Context, $" select distinct FPPBOMBILLNO from T_PRD_PICKMTRLDATA where FSRCBILLNO = '{srcSrcBillNo}' ", srcSrcBillNo);
                    if (string.IsNullOrWhiteSpace(srcFormId)
                        || string.IsNullOrWhiteSpace(srcSrcBillNo)
                      )
                    {// 源单不是销售订单,略过
                        continue;
                    }
                    Dictionary<string, DynamicObject> dctOneBill = null;
                    if (dctAllBills.TryGetValue(srcSrcBillNo, out dctOneBill) == false) continue;
                    DynamicObject materialObj = entryRow["MaterialId"] as DynamicObject;
                    if (materialObj == null) continue;
                    string materialNumber = Convert.ToString(materialObj["number"]);
                    DynamicObject srcRow = null;
                    if (dctOneBill.TryGetValue(materialNumber, out srcRow) == false) continue;
                    // Link已经记录了源单信息,略过
                    bool Ret = SourceVerification(Convert.ToString(entryRow["Id"]));
                    if (!Ret) continue;
                    DynamicObjectCollection linkRows = linkEntry.DynamicProperty.GetValue(entryRow)
                            as DynamicObjectCollection;
                    linkRows.Clear();
                    DynamicObject linkRow = new DynamicObject(linkEntry.DynamicObjectType);
                    linkRow["STableName"] = srcTableNumber;
                    this.FillLinkRow(srcRow, entryRow, linkRow);
                    linkRows.Add(linkRow);
                    allNewLinkRows.Add(linkRow);
                }
            }
            // 为新建的源单关联信息,设置内码
            IDBService dbService = ServiceHelper.GetService<IDBService>();
            dbService.AutoSetPrimaryKey(this.Context, allNewLinkRows.ToArray(), linkEntry.DynamicObjectType);
        }
        /// <summary>
        /// 加载相关的销售订单数据
        /// </summary>
        /// <param name="poBillNos"></param>
        /// <returns></returns>
        private DynamicObject[] LoadPurchaseOrder(HashSet<string> poBillNos)
        {
            IViewService viewService = ServiceHelper.GetService<IViewService>();
            string formId = "PRD_PPBOM";
            // 指定需要加载的销售订单字段
            List<SelectorItemInfo> fields = new List<SelectorItemInfo>();
            fields.Add(new SelectorItemInfo("FID"));        // 单据主键
            fields.Add(new SelectorItemInfo("FTreeEntity_FEntryID"));     // 单据体主键
            fields.Add(new SelectorItemInfo("FBillNo"));    // 单据编号
            fields.Add(new SelectorItemInfo("FBFLowId"));    // 业务流程
            fields.Add(new SelectorItemInfo("FMaterialId"));    // 物料
            fields.Add(new SelectorItemInfo("FMaterialID2"));    // 物料
            fields.Add(new SelectorItemInfo("FBASENEEDQTY"));           // 基本单位数量
            fields.Add(new SelectorItemInfo("FBASEPICKEDQTY"));           // 基本单位关联数量
            fields.Add(new SelectorItemInfo("FBFLOWID"));           //
            // 指定过滤条件
            string filter = string.Format(" FBillNo IN ('{0}') ", string.Join("','", poBillNos));
            OQLFilter ofilter = OQLFilter.CreateHeadEntityFilter(filter);
            var objs = viewService.Load(this.Context, formId, fields, ofilter);
            return objs;
        }
        /// <summary>
        /// 把销售订单单据体行构建为字典:Dictionary(单据编号, Dictionary(物料编码, 源单行));
        /// </summary>
        /// <param name="poObjs"></param>
        /// <returns></returns>
        private Dictionary<string, Dictionary<string, DynamicObject>> BuildDictionary(DynamicObject[] poObjs)
        {
            Dictionary<string, Dictionary<string, DynamicObject>> dctAllBills =
                new Dictionary<string, Dictionary<string, DynamicObject>>();
            foreach (var poObj in poObjs)
            {
                string billNo = Convert.ToString(poObj["BillNo"]);
                Dictionary<string, DynamicObject> dctOneBill = new Dictionary<string, DynamicObject>();
                DynamicObjectCollection entryRows = poObj["PPBomEntry"] as DynamicObjectCollection;
                foreach (var entryRow in entryRows)
                {
                    DynamicObject materialObj = entryRow["MaterialId"] as DynamicObject;
                    if (materialObj == null) continue;
                    string materialNumber = Convert.ToString(materialObj["number"]);
                    dctOneBill[materialNumber] = entryRow;
                }
                dctAllBills.Add(billNo, dctOneBill);
            }
            return dctAllBills;
        }
        /// <summary>
        /// 获取销售订单关联主实体表格编码
        /// </summary>
        /// <returns></returns>
        private string GetPOEntryTableNumber()
        {
            IBusinessFlowService bfMetaService = ServiceHelper.GetService<IBusinessFlowService>();
            var tableDefine = bfMetaService.LoadTableDefine(this.Context, POFormId, "FEntity");
            return tableDefine.TableNumber;
        }
        /// <summary>
        /// 填写源单信息
        /// </summary>
        /// <param name="srcRow">源单行</param>
        /// <param name="toRow">目标单行</param>
        /// <param name="linkRow">关联行</param>
        private void FillLinkRow(DynamicObject srcRow, DynamicObject toRow, DynamicObject linkRow)
        {
            linkRow["FlowId"] = srcRow["BFLowId_Id"];
            linkRow["FlowLineId"] = 0;
            linkRow["RuleId"] = "PRD_PPBOM2PICKMTRL_NORMAL";
            linkRow["SBillId"] = ((DynamicObject)srcRow.Parent)[0];
            linkRow["SId"] = srcRow[0];
            // 原始携带量
            decimal baseUnitQty = Convert.ToDecimal(srcRow["BaseNeedQty"]);//用料清单单位数量
            decimal joinUnitQty = Convert.ToDecimal(srcRow["BasePickedQty"]);//用料清单单位领料数量
            linkRow["BaseActualQtyOld"] = baseUnitQty - joinUnitQty;
            linkRow["BaseActualQty"] = toRow["BASEACTUALQTY"]; //基本单位实发数量
        }
        /// <summary>
        /// 验证是否生成过生产用料清单对应的源单
        /// </summary>
        /// <returns></returns>
        public bool SourceVerification(string FTID)
        {
            string sql = $" select count(*) from T_BF_INSTANCEENTRY where FSTABLENAME= 'T_PRD_PPBOMENTRY' and FTID = '{FTID}'";
            int count = DBServiceHelper.ExecuteScalar<int>(Context, sql, 0);
            if (count == 0)
                return true;
            else
                return false;
        }
    }
}
src/BLL/Demo.BillView/PRD/Pro_ScDayImport.cs
@@ -68,7 +68,6 @@
                //// 下载地址
                //string downloadUrl = "FileUpLoadServices/download.aspx";
                //updateControl.SetCustomPropertyValue("ExDownLoadUrl", downloadUrl);
                LogHelper.Info("222222");
                LogService.WriteAsync("上传功能:");
                ImportDataSC(fileFullPath);
            }
@@ -120,7 +119,7 @@
                            if (dt.Rows[i][1].ToString() == "")
                                error += "生产订单号不能为空;";
                            if (dt.Rows[i][2].ToString() == "")
                                error += "生产组织不能为空;";
                                error += "组织不能为空;";
                            if (dt.Rows[i][3].ToString() == "")
                                error += "生产车间不能为空;";
                            if (dt.Rows[i][5].ToString() == "")
@@ -145,7 +144,7 @@
                            string sql = string.Format(@"/*dialect*/ SELECT T1.FBILLNO,T2.* FROM T_PRD_MO T1
LEFT JOIN T_PRD_MOENTRY T2 ON T1.FID = T2.FID
JOIN T_BD_MATERIAL T3 ON T2.FMATERIALID = T3.FMATERIALID
WHERE T1.FBILLNO = '{0}'  AND T3.FNUMBER = '{1}'", dt.Rows[i][1].ToString(), dt.Rows[i][5].ToString());
WHERE T1.FBILLNO = '{0}'  AND T3.FNUMBER = '{1}' ", dt.Rows[i][1].ToString(), dt.Rows[i][5].ToString());
                            DataTable _dt = new DataTable();
                            _dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
                            string FLOT = "";//FLOT  批次
@@ -174,7 +173,7 @@
                            this.Model.SetValue("FSEQ", i + 1, i);
                            this.Model.SetValue("FSalOrderNo", dt.Rows[i][0].ToString(), i);
                            this.Model.SetValue("FSCOrderNo", dt.Rows[i][1].ToString(), i);
                            this.Model.SetItemValueByNumber("FORGID", dt.Rows[i][2].ToString(), i);
                            this.Model.SetItemValueByNumber("FORGID", "100", i);
                            this.Model.SetItemValueByNumber("FProductWorkShopId", dt.Rows[i][3].ToString(), i);
                            this.Model.SetItemValueByNumber("FResourcesId", dt.Rows[i][4].ToString(), i);
                            //  this.Model.SetValue("FMatrailId", dt.Rows[i][5].ToString(), i);
@@ -334,20 +333,20 @@
                    jsonRoot.Add("IsVerifyBaseDataField", "");
                    JObject jsonModel = new JObject();
                    jsonModel.Add("FPreparatDate", date.ToString());//编制日期
                    jsonModel.Add("FSCOrderNo", current["FSCOrderNo"].ToString()); //生产订单号FSCOrderNo
                    jsonModel.Add("FSCOrderNo", Convert.ToString(current["FSCOrderNo"])); //生产订单号FSCOrderNo
                    jsonModel.Add("FHSeOrderBillNo", Convert.ToString(current["FSalOrderNo"]));//销售订单号
                    jsonModel.Add("FHOrderLev", current["FOrderLevel"].ToString());//订单等级
                    jsonModel.Add("FHOrderQty", Convert.ToString(current["FSalOrderCount"]));//销售订单数量
                    jsonModel.Add("FHOrderCommitDate", current["FDeliveryDate"].ToString());//交货期HOrderCommitDate
                    jsonModel.Add("FHOrderCommitDate", Convert.ToString(current["FDeliveryDate"]));//交货期HOrderCommitDate
                                                                                            //jsonModel.Add("FBatch", current["FBatch"].ToString());//批次
                    jsonModel.Add("FBatch", FLOT);//批次
                    jsonModel.Add("FHOrderNeedQty", FQTY);// 订单需求数量
                    jsonModel.Add("FPrdBillNo", FBILLNO); ;//源单编号
                    jsonModel.Add("FPRDMOMAINID", FID); ;//源单主内码
                    jsonModel.Add("FPRDMOENTYID", FENTRYID); ;//源单子内码
                    jsonModel.Add("FOrderQuantity", current["FOrderQuantity"].ToString()); ;//生产订单数量
                    jsonModel.Add("FDayPlanQuantity", current["FDayPlanQuantity"].ToString()); ;//日计划数量
                    jsonModel.Add("FNoScheduled", current["FNoScheduled"].ToString()); ;//未排数量
                    jsonModel.Add("FOrderQuantity", Convert.ToString(current["FOrderQuantity"])); ;//生产订单数量
                    jsonModel.Add("FDayPlanQuantity", Convert.ToString(current["FDayPlanQuantity"])); ;//日计划数量
                    jsonModel.Add("FNoScheduled", Convert.ToString(current["FNoScheduled"])); ;//未排数量
                    JObject jsonFHMaterID = new JObject();
                    jsonFHMaterID.Add("FNumber", (current["FMatrailId"] as DynamicObject)["Number"].ToString());
                    jsonModel.Add("FHMaterID", jsonFHMaterID);//FHMaterID 物料
@@ -377,6 +376,8 @@
                        DateTime EndDate = DBServiceHelper.ExecuteScalar<DateTime>(Context, sql, DateTime.Now);
                        for (int i = 0; i <= 60; i++)
                        {
                            if (Convert.ToString(current["FT" + "" + i + ""]) == "" || Convert.ToString(current["FT" + "" + i + ""]) == "0")
                                continue;
                            if (EndDate >= date.AddDays(i))
                                continue;
                            JObject jsonFPOOrderEntry = new JObject();
@@ -400,7 +401,6 @@
                        }
                        else
                        {
                            LogService.WriteAsync(jsonRoot);
                            LogHelper.Error(jsonRoot.ToString());
                            this.View.ShowErrMessage(jsonRoot.ToString());
                        }
@@ -409,6 +409,15 @@
                    {
                        for (int i = 0; i <= 60; i++)
                        {
                            LogHelper.Error("测试跳出");
                            if (Convert.ToString(current["FT" + "" + i + ""]) == "" || Convert.ToString(current["FT" + "" + i + ""]) == "0")
                                continue;
                            LogHelper.Error("测试跳出结束");
                            JObject jsonFPOOrderEntry = new JObject();
                            jsonFPOOrderEntry.Add("FHMasterDate", date.AddDays(i).ToShortDateString()); ;//主日期
                            jsonFPOOrderEntry.Add("FHQty ", Convert.ToString(current["FT" + "" + i + ""])); ;//日计划数量
@@ -431,7 +440,6 @@
                        }
                        else
                        {
                            LogService.WriteAsync(jsonRoot);
                            LogHelper.Error(jsonRoot.ToString());
                            this.View.ShowErrMessage(jsonRoot.ToString());
                        }
@@ -441,6 +449,7 @@
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.ToString());
                this.View.ShowErrMessage(ex.ToString());
            }
src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs
@@ -164,13 +164,20 @@
        /// </summary>
        public void ExportExcel()
        {
            string[] Title = new string[] {"销售订单号", "生产订单号", "生产组织", "生产车间", "生产资源", "产品代码", "产品名称", "规格型号", "计量单位",
                "批次号","销售订单数量","生产订单数量","总齐套数量","交货日期","订单等级","T0","T1","T2","T3","T4","T5","T6","T7",
            List<string> Title = new List<string> {"销售订单号", "生产订单号*","生产组织*", "生产车间*", "生产资源", "产品代码*", "产品名称", "规格型号", "计量单位",
                "批次号","销售订单数量","生产订单数量","总齐套数量","交货日期*","订单等级*"};
            /*
             ,"T0","T1","T2","T3","T4","T5","T6","T7",
                "T8","T9","T10","T11","T12","T13","T14","T15","T16","T17",
                "T18","T19","T20","T21","T22","T23","T24","T25","T26","T27","T28","T29",
                "T30","T31","T32","T33","T34","T35","T36","T37","T38","T39","T40","T41","T42",
                "T43","T44","T45","T46","T47","T48","T49","T50","T51","T52","T53","T54","T55","T56","T57","T58","T59","T60"};
                "T43","T44","T45","T46","T47","T48","T49","T50","T51","T52","T53","T54","T55","T56","T57","T58","T59","T60"
             */
            DateTime date = DateTime.Now;
            for (int i = 0; i < 61; i++)
            {
                Title.Add(date.AddDays(i).ToString("yyyy-MM-dd"));
            }
            string sheetname = "日计划导入模板.xlsx";
            string file = "";
            file = @"D:\办公\K3Cloud\WebSite\TempfilePath\" + sheetname;
@@ -219,7 +226,7 @@
            //设置列名
            HSSFRow row = (HSSFRow)sheet.CreateRow(0);
            for (int i = 0; i < Title.Length; i++)
            for (int i = 0; i < Title.Count; i++)
            {
                ICell cell = (ICell)row.CreateCell(i);
                var rowName = Title[i];
@@ -229,7 +236,7 @@
            //单元格赋值
            //列宽自适应,只对英文和数字有效
            for (int i = 0; i <= Title.Length; i++)
            for (int i = 0; i <= Title.Count; i++)
            {
                sheet.AutoSizeColumn(i);
            }
@@ -947,7 +954,7 @@
LEFT JOIN JIT_MOMaterReadysBill B ON T1.FStockOrgId = b.FHSTOCKORGID and T1.FMATERIALID =b.FHMATERID and a.FOwnerId = b.FOwnerId 
LEFT join T_ORG_Organizations c on a.FOWNERID = c.FORGID
--join t_BD_Stock d on a.FSTOCKID =d.FSTOCKID
--where d.FAvailableComplete<>0
where d.FAvailableComplete<>0
--where T1.FMATERIALID in (105773)
");
                ListInventory = ds.ToModelList<PRD_Inventory>();
@@ -1509,11 +1516,14 @@
            {
                string sql = string.Format(@"
/*dialect*/
select t1.FID,t1.FEntryID,t3.FMATERIALID,T5.FNUMBER,t1.FHMASTERDATE,t1.FHQTY,t4.FMATERIALID FMATERIALID2,T6.FNUMBER FNUMBER2,T7.FNUMBER FUNITNUMBER,FNumerator,FDenominator,convert(decimal(18,2),(FNumerator/FDenominator) *t1.FHQTY) FHQtyMust,T4.FUnitID,t8.FNUMBER FUNITNUMBER2,T3.FID FPPBOM,T4.FENTRYID,isnull(T9.FBillNo,'')FBillNo,t10.FNUMBER FORGNUMBER,t11.FNUMBER FHSOURCENUMBER,FSCRAPRATE,FFIXSCRAPQTY,T9.FID AS DayPlanFID
 select t1.FID,t1.FEntryID,t3.FMATERIALID,T5.FNUMBER,t1.FHMASTERDATE,t1.FHQTY,t4.FMATERIALID FMATERIALID2,T6.FNUMBER FNUMBER2,T7.FNUMBER FUNITNUMBER,FNumerator,FDenominator,convert(decimal(18,2),(FNumerator/FDenominator) *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
FROM Sc_WorkBillSortBillSub t1
JOIN Sc_WorkBillSortBillMAIN t2 on t1.FID = t2.FID
JOIN T_PRD_PPBOM T3 on T2.FPRDMOMAINID=t3.FMOID AND T2.FPRDMOENTYID=T3.FMOENTRYID
JOIN T_PRD_PPBOMENTRY T4 ON T3.FID=T4.FID
JOIN T_PRD_PPBOMENTRY_C Tc ON T4.FENTRYID=Tc.FENTRYID
join T_ORG_Organizations torg ON tc.FOWNERID = torg.FORGID
JOIN T_BD_MATERIAL T5 ON T3.FMATERIALID=T5.FMATERIALID
JOIN T_BD_MATERIAL T6 ON T4.FMATERIALID=T6.FMATERIALID
LEFT JOIN T_BD_UNIT T7 ON T3.FUNITID = T7.FUNITID
@@ -1548,12 +1558,21 @@
                            FHQtyMust = dr["FHQtyMust"].ToString(),
                            FHQtySub = dr["FHQtyMust"].ToString(),
                            FHPPBomInterID = dr["FPPBOM"].ToString(),
                            FHPPBomEntryID = dr["FENTRYID"].ToString(),
                            FHPPBomEntryID = dr["FPPBOMENTRYID"].ToString(),
                            FHSourceID = dr["FHSOURCENUMBER"].ToString(),
                            FNumerator = dr["FNumerator"].ToString(),
                            FDenominator = dr["FDenominator"].ToString(),
                            FFIXSCRAPQTY = dr["FFIXSCRAPQTY"].ToString(),
                            FHQtyScrap = dr["FSCRAPRATE"].ToString(),
                            FMOBILLNO = dr["FSCORDERNO"].ToString(),
                            FMOENTRYID = dr["FMOENTRYID"].ToString(),
                            FPPBOMBILLNO = dr["FPPBOMBILLNO"].ToString(),
                            FPPBOMFSEQ = dr["FSEQ"].ToString(),
                            FOwnerTypeId = dr["FOWNERTYPEID"].ToString(),
                            FOwnerID = dr["FORGNUMBER"].ToString(),
                            FEntrustPickOrgId = dr["FORGNUMBER"].ToString(),
                            FMOID = dr["FMOID"].ToString(),
                            FIssueType = dr["FIssueType"].ToString()
                        });
                    }
                    LogHelper.Info($"日计划用料清单,数据准备完成,保存到Model实体,总行数:{DayPlanMaterial.Count},耗时:" + sw.Elapsed);
@@ -1564,6 +1583,9 @@
                    {
                        var _DayPlanMaterial = DayPlanMaterial.Where(x => x.FEntryID == item).ToList();
                        JObject model = new JObject();
                        if (!string.IsNullOrEmpty(_DayPlanMaterial[0].FID))
                            model.Add("FID", _DayPlanMaterial[0].FID);
                        model.Add("FHDate", DateTime.Now);
                        model.Add("FOrgId", new JObject() { ["Fnumber"] = _DayPlanMaterial[0].FOrgId });//发料组织
                        model.Add("FHMaterID", new JObject() { ["Fnumber"] = _DayPlanMaterial[0].FHMaterID });//物料
@@ -1587,11 +1609,20 @@
                            ModelEnty.Add("FDwyl", Convert.ToDecimal(_item.FNumerator) / Convert.ToDecimal(_item.FDenominator));//单位用料
                            ModelEnty.Add("FFIXSCRAPQTY", _item.FFIXSCRAPQTY);//固定损耗
                            ModelEnty.Add("FHQtyScrap", _item.FHQtyScrap);//变动损耗率%
                            ModelEnty.Add("FMOBILLNO", _item.FMOBILLNO);//
                            ModelEnty.Add("FMOENTRYIDINT", _item.FMOENTRYID);//
                            ModelEnty.Add("FPPBOMBILLNO", _item.FPPBOMBILLNO);//
                            ModelEnty.Add("FPPBOMFSEQINT", _item.FPPBOMFSEQ);//
                            ModelEnty.Add("FOwnerTypeId", _item.FOwnerTypeId);//
                            ModelEnty.Add("FOwnerID", new JObject() { ["Fnumber"] = _item.FOwnerID });//
                            ModelEnty.Add("FEntrustPickOrgId", new JObject() { ["Fnumber"] = _item.FEntrustPickOrgId });//
                            ModelEnty.Add("FMOID", _item.FMOID);//
                            ModelEnty.Add("FISSUETYPE", _item.FIssueType);//
                            Entry.Add(ModelEnty);
                        }
                        model.Add("FEntity", Entry);
                        //if (!string.IsNullOrEmpty(_DayPlanMaterial[0].FID))
                        //    model.Add("FID", _DayPlanMaterial[0].FID);
                        Fentity.Add(model);
                        if ((i >= 20 || i == fidList.Count) && (i % 20 == 0 || i == fidList.Count))
                        {
@@ -1685,7 +1716,7 @@
", 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
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
@@ -1694,7 +1725,7 @@
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=1
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}) 
@@ -1781,6 +1812,7 @@
                                        FNumber = DayPlanPpbomls.FNumber,
                                        OLDDATE = DayPlanPpbomls.FHMASTERDATE,
                                        FFIXLEADTIME = FFIXLEADTIME,
                                        FErpClsID = DayPlanPpbomls.FErpClsID,
                                        PurchseFID = Purchase.FID,
                                        PurchseFentryID = Purchase.FENTRYID,
@@ -1833,6 +1865,7 @@
                                        FNumber = DayPlanPpbomls.FNumber,
                                        OLDDATE = DayPlanPpbomls.FHMASTERDATE,
                                        FFIXLEADTIME = FFIXLEADTIME,
                                        FErpClsID = DayPlanPpbomls.FErpClsID,
                                        PurchseFID = Purchase.FID,
                                        PurchseFentryID = Purchase.FENTRYID,
@@ -2007,6 +2040,7 @@
                        FentityModel.Add("FHPOOrderInterID", _item.PurchseFID);// 采购订单内码:FHPOOrderInterID
                        FentityModel.Add("FHPOOrderEntryID", _item.PurchseFentryID); //采购订单子内码:FHPOOrderEntryID
                        FentityModel.Add("FHPOOrderBillNo", _item.PurchseFBillNo); //采购订单号:FHPOOrderBillNo
                        FentityModel.Add("FERPCLSID", _item.FErpClsID); //发料方式
                        Fentity.Add(FentityModel);
                    }
                    model.Add("FEntity", Fentity);
src/Model/Demo.Model/Model/DayPlanMaterial.cs
@@ -51,5 +51,50 @@
        public string FDenominator { get; set; }
        public string FFIXSCRAPQTY { get; set; }
        public string FHQtyScrap { get; set; }
        /// <summary>
        /// 生产订单号
        /// </summary>
        public string FMOBILLNO { get; set; }
        /// <summary>
        /// 生产订单分录内码
        /// </summary>
        public string FMOENTRYID { get; set; }
        /// <summary>
        /// 生产订单内码
        /// </summary>
        public string FMOID { get; set; }
        /// <summary>
        /// 生产用料清单编号
        /// </summary>
        public string FPPBOMBILLNO { get; set; }
        /// <summary>
        /// 生产用料清单明细行号
        /// </summary>
        public string FPPBOMFSEQ { get; set; }
        /// <summary>
        /// 产品货主
        /// </summary>
        public string FEntrustPickOrgId { get; set; }
        /// <summary>
        /// 货主类型
        /// </summary>
        public string FOwnerTypeId { get; set; }
        /// <summary>
        /// 货主
        /// </summary>
        public string FOwnerID { get; set; }
        /// <summary>
        /// 发料方式
        /// </summary>
        public string FIssueType { get; set; }
    }
}
src/Model/Demo.Model/Model/PODemandPlan/DayPlanPpbom.cs
@@ -15,7 +15,7 @@
        /// </summary>
        public long FID { get; set; }
        /// <summary>
        /// 日计划工单编号
        /// 生产订单号
        /// </summary>
        public string FBILLNO { get; set; }
        /// <summary>
@@ -83,7 +83,11 @@
        /// JIT安全库存
        /// </summary>
        public string FJITSafeStock { get; set; }
        /// <summary>
        /// 物料属性
        /// </summary>
        public string FErpClsID { get; set; }
    }
}
src/Model/Demo.Model/Model/PODemandPlan/PODemandPlanTemp.cs
@@ -92,5 +92,10 @@
        /// 组织编码
        /// </summary>
        public string FORGNumber { get; set; }
        /// <summary>
        /// 物料属性
        /// </summary>
        public string FErpClsID { get; set; }
    }
}