using Kingdee.BOS.Orm.DataEntity; using System.ComponentModel; using System; using System.Collections.Generic; using System.Linq; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using Kingdee.BOS.Core.List.PlugIn; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.List; using System.Data; using System.Diagnostics; using Demo.Model.Model; using Demo.Model.Model.PODemandPlan; using ZD.Share.Common; using Newtonsoft.Json.Linq; using ZD.Cloud.WebApi; using Kingdee.BOS.Core; using Kingdee.BOS.KDThread; using Kingdee.BOS.Core.Bill; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.CommonFilter; namespace Demo.BillView.PRD { [Description("提料计划列表 列表插件")] [HotUpdate] public class PODemandPlanListFilter : AbstractListPlugIn { public override void BarItemClick(BarItemClickEventArgs e) { base.BarItemClick(e); //关闭 if (e.BarItemKey.ToUpper().Equals("BTNCLOSE")) {                 //获取选择记录                 ListSelectedRowCollection selectRows = this.ListView.SelectedRowsInfo; //读取ID,放到数组 string[] ID = selectRows.GetPrimaryKeyValues(); string FID = ""; //没有选择行提示 if (ID.Length == 0) {                     //如果选择的是0,即没有选择行记录,弹窗报错,返回                     this.View.ShowMessage("请选择单据!", MessageBoxType.Notice); return; } else { //如果点击成功,循环ID for (int i = 0; i < ID.Length; i++) { FID = FID + ID[i].ToString() + ","; } FID = FID.Substring(0, FID.Length - 1); string sql = string.Format(@"/*dialect*/ update Cg_PODemandPlanBillMain set FHCloseMan = {0}, FHCloseDate = GETDATE(), FHCloseType = 1 where fid IN ({1})", Context.UserId, FID); DBServiceHelper.Execute(Context, sql); sql = string.Format(@"/*dialect*/ UPDATE A SET A.FPODemandPlanCount -= B.FHQTY FROM t_PUR_POOrderEntry A JOIN Cg_PODemandPlanBillSub B ON A.FENTRYID = B.FHPOOrderEntryID where B.FID IN (select FID FROM Cg_PODemandPlanBillMain WHERE FHCloseType = 0 AND FID IN ({0})) AND B.FCLOSESTATUS = 0 ", FID); this.View.Refresh(); this.View.ShowMessage("操作成功"); } } else if (e.BarItemKey.ToUpper().Equals("BTNTLPLAN")) { btnReFarshJDT(); } else if (e.BarItemKey.ToUpper().Equals("BTNPUSH")) { btnPush(); } else if (e.BarItemKey.ToUpper().Equals("BTNOPENPURORDER")) { OpenPurOrder(); } } public override void PrepareFilterParameter(global::Kingdee.BOS.Core.List.PlugIn.Args.FilterArgs e) { base.PrepareFilterParameter(e); //如果过滤条件含有最新结果关键字,则在此基础上处理,以支持最新结果内置方案另存增加条件(关键字是根据生产订单状态过滤) if (e.FilterString.IsNullOrEmptyOrWhiteSpace()) { int FSupplierId = GetSupplierId(); if (FSupplierId == 2) { string sql = string.Format($"select FSUPPLIERID from T_BD_SUPPLIER where FNUMBER ='{this.Context.UserName}'"); DataSet ds = DBServiceHelper.ExecuteDataSet(Context, sql); DataTable dt = ds.Tables[0]; List FSUPPLIERIDS = dt.AsEnumerable().Select(r => r["FSUPPLIERID"].ToString()).ToList(); //LogService.Write("供应商ids:" + string.Join(",", FSUPPLIERIDS)); e.FilterString = $" FSUPPLIERID IN ({string.Join(",", FSUPPLIERIDS)})"; } } else { int FSupplierId = GetSupplierId(); if (FSupplierId == 2) { string sql = string.Format($"select FSUPPLIERID from T_BD_SUPPLIER where FNUMBER ='{this.Context.UserName}'"); DataSet ds = DBServiceHelper.ExecuteDataSet(Context, sql); DataTable dt = ds.Tables[0]; List FSUPPLIERIDS = dt.AsEnumerable().Select(r => r["FSUPPLIERID"].ToString()).ToList(); //LogService.Write("供应商ids:" + string.Join(",", FSUPPLIERIDS)); e.FilterString += $" AND FSUPPLIERID IN ({string.Join(",", FSUPPLIERIDS)})"; } } } public int GetSupplierId() { long userId = this.Context.UserId; string sql = $"/*dialect*/ select FUSERTYPE from T_SEC_user a join T_SCP_USERDATA b on a.FUSERID = b.FUSERID where a.FUSERID ={userId}"; int FSupplierId = DBServiceHelper.ExecuteScalar(Context, sql, 0); //LogService.Write("FUSERTYPE:" + FSupplierId); return FSupplierId; } [Obsolete] private void btnReFarshJDT() { // 显示一个进度显示界面:显示一个不停滚动的模拟进度 // bUseTruePro参数:是否显示真实的进度。 // bUseTruePro = false : // 显示一个不停滚动的模拟进度,与实际处理进度没有关联。 // 此方案优点:实际处理代码无需计算进度 // 此方案缺点:进度不准确,且进度页面不会自动关闭。 // bUseTruePro = true: 进度界面显示真实进度 // 此方案优点:进度真实 // 此方案缺点:需要在处理代码中,不断的更新真实进度,更新语句 // this.View.Session["ProcessRateValue"] = 100; // 特别说明,当进度更新到100时,进度界面会自动关闭 // 本案例选用此方案 var processForm = this.View.ShowProcessForm( new Action(t => { }), true, "正在生成,请稍候..."); // 开启一个异步线程,处理引入功能 // using Kingdee.BOS.KDThread; MainWorker.QuequeTask(() => { var resuult = ""; try { // 需要捕获错误,以确保处理结束时,关闭进度滚动界面 // 引入功能实际处理函数 resuult = this.btnReFarsh(); } finally { // 确保标记进度已经到达100% this.View.Session["ProcessRateValue"] = 100; // 引入完毕,关闭进度显示页面 var processView = this.View.GetView(processForm.PageId); if (processView != null) { processView.Close(); this.View.SendDynamicFormAction(processView); } this.View.ShowMessage(resuult); } }, (t) => { }); } /// /// 齐套 提料计划 要料计划 /// /// public string btnReFarsh() { string sql = ""; try { Stopwatch sw = new Stopwatch(); #region 齐套分析 var fPrdOrgId = Context.CurrentOrganizationInfo.ID; var fProWorkShopId = 0; //全组织进行计算 List BomList = new List(); string procSql = $"exec proc_jit_qtfx {fPrdOrgId},{fProWorkShopId},{Context.UserId}"; LogService.Write("提料计划单列表重算 齐套分析sql:" + procSql); DataSet _ds = DBServiceHelper.ExecuteDataSet(Context, procSql); DataTable resulTable = _ds.Tables[0]; if (resulTable.Rows[0][0].ToString().Contains("失败")) return resulTable.Rows[0][0].ToString(); else BomList = _ds.ToModelList(); string fDayPlanFids = string.Empty; string fDayPlanFEntryids = string.Empty; if (BomList.Count == 0) { return "没有需要进行齐套分析的数据"; } else { List fidList = BomList.Select(x => x.FID.ToString()).Distinct().ToList(); List fentryidList = BomList.Select(x => x.FEntryID.ToString()).Distinct().ToList(); fDayPlanFids = string.Join(",", fidList); fDayPlanFEntryids = string.Join(",", fentryidList); } LogService.Write("提料计划单列表重算 日计划工单ids" + fDayPlanFids); sw.Start();//开始计时 //获取当前即时库存 库存数量+库存组织+物料+货主+仓库 DataSet ds = DBServiceHelper.ExecuteDataSet(Context, @" /*dialect*/ select distinct isnull(a.FBASEQTY,0) FBASEQTY,/*T1.FStockOrgId,T1.FMATERIALID,*/ b.FNumber,a.FOwnerTypeId,a.FOwnerId,c.FNUMBER as FOwnerNumber,a.FSTOCKID,d.FNUMBER as FStockNumber from ( select distinct a.FHPRDORGID FStockOrgId,T2.FMATERIALID,FNumber from SC_WORKBILLSORTBILLMAIN a join SC_WORKBILLSORTBILLSub b on a.FID = b.FID join T_PRD_PPBOM T1 on a.FPRDMOMAINID = t1.FMoId and a.FPRDMOENTYID = t1.FMOENTRYID LEFT JOIN T_PRD_PPBOMENTRY T2 on T1.FID = t2.FID join T_BD_MATERIAL T3 on T2.FMATERIALID = T3.FMATERIALID ) T1 JOIN T_BD_MATERIAL b on t1.FNUMBER = b.FNUMBER LEFT JOIN T_STK_Inventory a on /*T1.FStockOrgId = a.FStockOrgId and*/ b.FMATERIALID = a.FMATERIALID LEFT join (select distinct fitemid,fformid,FNUMBER from V_ITEMCLASS_OWNER) c on a.FOwnerTypeId = c.fformid and a.FOWNERID = c.fitemid join t_BD_Stock d on a.FSTOCKID =d.FSTOCKID where a.FBASEQTY>0 "); List ListInventory = ds.ToModelList(); //车间 仓库对照列表 ds = DBServiceHelper.ExecuteDataSet(Context, @" /*dialect*/ SELECT DISTINCT T1.FORGID,FWORKSHOPID,FSTOCKID FROM T_PRD_WORKHOUSECOMPAR T1 JOIN T_PRD_WORKHOUSECOMPARENTRY T2 ON T1.FID=T2.FID "); List pRD_WorkHouseCompar = ds.ToModelList(); int i = 1;//用于进度条的加载 //日计划+生产订单子表编码ID var DatePlanList = BomList.GroupBy(p => new { p.FHMASTERDATE, p.FPRDMOENTYID }).Select(x => new PRD_PPBOM { FHMASTERDATE = x.Key.FHMASTERDATE, FPRDMOENTYID = x.Key.FPRDMOENTYID }).ToList(); //取应发数量 FMustQty 不要取值需求数量FNeedQty string LLsql = string.Format(@" /*dialect*/ 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(FCXStockInQty)FCXStockInQty,FPRDMOENTYID from SC_WORKBILLSORTBILLMAIN a where a.FID IN ({0}) group by FPRDMOENTYID ) a join T_PRD_PPBOM T1 on a.FPRDMOENTYID = t1.FMOENTRYID LEFT JOIN T_PRD_PPBOMENTRY t2 on T1.FID = T2.FID LEFT JOIN T_PRD_PPBOMENTRY_Q t3 on t2.FENTRYID = T3.FENTRYID LEFT JOIN T_BD_MATERIAL T4 ON T2.FMATERIALID = T4.FMATERIALID ) t1 group by FPRDMOENTYID,FMATERIALID ", fDayPlanFids); List DayPlanPickedModel = new List(); ds = DBServiceHelper.ExecuteDataSet(Context, LLsql); DayPlanPickedModel = ds.ToModelList(); //CompleteAnalysisTempModel 用于存储临时需要插入数据 List completeAnalysisTempModel = new List(); //创建字典 用于储存物料 + 占用数量 Dictionary occupyDic = new Dictionary(); LogService.Write($"提料计划单列表重算 齐套分析,数据准备阶段,用时" + sw.Elapsed + "总行数:" + BomList.Count); //第一个循环 日计划工单明细 一天+一个工单 一个循环 foreach (var item in DatePlanList) { this.View.Session["ProcessRateValue"] = Convert.ToInt32((Convert.ToDecimal(60) / DatePlanList.Count) * i); //日计划用料清单明细 每一天的实际用料情况 var _BomList = BomList.Where(x => x.FHMASTERDATE == item.FHMASTERDATE && x.FPRDMOENTYID == item.FPRDMOENTYID).ToList(); //每一个物料进行库存计算 foreach (var _item in _BomList) { //车间仓库 对照表 每个日计划同属一个车间 A,B var _pRD_WorkHouseCompar = pRD_WorkHouseCompar.Where(c => /*c.FORGID == _item.FStockOrgId &&*/ c.FWORKSHOPID == _item.FHWorkShopID).ToList(); decimal jskcQty = 0;//用于计算 decimal jskcQty2 = 0;//用于计算当时那个计算节点的即时库存 //计算当前这几个仓库总的库存量 if (_pRD_WorkHouseCompar.Count > 0) { foreach (var _WorkHouse in _pRD_WorkHouseCompar) { //库存数据匹配 List _ListInventory = ListInventory.Where(c => c.FNumber == _item.FNumber/* && c.FStockOrgId == _item.FStockOrgId*/ && 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.FHWorkShopID + _item.FMATERIALID2)) { occupyMaterial = occupyDic[_item.FHWorkShopID + _item.FMATERIALID2]; } //虚拟日计划用料清单 需求数量 decimal planNeed = _item.PlanCount; //不参与计算 用于记录 decimal need = _item.PlanCount;//参与计算 decimal FOccupyPickedCount = 0;//占用领料单数量 //找到领用数量 var _DayPlanPickedModel = DayPlanPickedModel.Where(c => c.FPRDMOENTYID == _item.FPRDMOENTYID && c.FMATERIALID == _item.FMATERIALID2).FirstOrDefault(); if (_DayPlanPickedModel.FRemainPickedQty >= need) { //领料数量满足了当前这个需求量 直接齐套 不需要去占用仓库 completeAnalysisTempModel.Add(new Demo.Model.Model.CompleteAnalysisTempModel { FHMainICMOInterIDr = _item.FPRDMOMAINID, FHMainICMOEntryID = _item.FPRDMOENTYID, FHICMOInterID = _item.FID.ToString(), FHICMOEntryID = _item.FEntryID.ToString(), FHMaterID = _item.FMATERIALID2, FErpClsID = _item.FErpClsID, FHStockOrgID = _item.FStockOrgId, FHPRDORGID = _item.FStockOrgId, FPRDBillNo = _item.FMOBillNO, FOwnerTypeId = "", FUnitDosage = _item.dwyl,//单位用量 FSumPlanCount = planNeed,//计划总数量 FCompleteCount1 = planNeed, //齐套数量 FLackCount = 0,//缺料数量 FHStockQty = jskcQty2,//即时库存 FHLeftQty = jskcQty,//可用数量 FOccupyCount = occupyMaterial,//占用数量 FOccupyPickedCount = planNeed,//占用领料数量 FComPlete = "齐套", FPlanDate = item.FHMASTERDATE, // 日计划日期 FWorkShop = _item.FHWorkShopID //车间 }); //扣除剩余可用领料数量 _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 Demo.Model.Model.CompleteAnalysisTempModel { FHMainICMOInterIDr = _item.FPRDMOMAINID, FHMainICMOEntryID = _item.FPRDMOENTYID, FHICMOInterID = _item.FID.ToString(), FHICMOEntryID = _item.FEntryID.ToString(), FHMaterID = _item.FMATERIALID2, FErpClsID = _item.FErpClsID, FHStockOrgID = _item.FStockOrgId, FHPRDORGID = _item.FStockOrgId, FPRDBillNo = _item.FMOBillNO, FOwnerTypeId = "", FUnitDosage = _item.dwyl,//单位用量 FSumPlanCount = planNeed,//计划总数量 FCompleteCount1 = FOccupyPickedCount, //齐套数量 FLackCount = need,//缺料数量 FHStockQty = jskcQty2,//即时库存 FHLeftQty = jskcQty,//可用数量 FOccupyCount = occupyMaterial,//占用数量 FOccupyPickedCount = FOccupyPickedCount,//占用领料数量 FComPlete = "未齐套", FPlanDate = item.FHMASTERDATE, // 日计划日期 FWorkShop = _item.FHWorkShopID //车间 }); //终止该物料计算 进入下一个 continue; } foreach (var WorkHouse in _pRD_WorkHouseCompar) { //库存数据匹配 List _ListInventory = ListInventory.Where(c => c.FNumber == _item.FNumber /*&& c.FStockOrgId == _item.FStockOrgId*/ && 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.FHWorkShopID + _item.FMATERIALID2)) { occupyDic.Add(_item.FHWorkShopID + _item.FMATERIALID2, fCompleteCount); } else { occupyMaterial = occupyDic[_item.FHWorkShopID + _item.FMATERIALID2]; occupyDic[_item.FHWorkShopID + _item.FMATERIALID2] = occupyMaterial + fCompleteCount; } completeAnalysisTempModel.Add(new Demo.Model.Model.CompleteAnalysisTempModel { FHMainICMOInterIDr = _item.FPRDMOMAINID, FHMainICMOEntryID = _item.FPRDMOENTYID, FHICMOInterID = _item.FID.ToString(), FHICMOEntryID = _item.FEntryID.ToString(), FHMaterID = _item.FMATERIALID2, FHStockOrgID = _item.FStockOrgId, FHPRDORGID = _item.FStockOrgId, FErpClsID = _item.FErpClsID, FPRDBillNo = _item.FMOBillNO, 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.FHMASTERDATE, // 日计划日期 FStock = Inventory.FSTOCKID,//仓库 FWorkShop = _item.FHWorkShopID //车间 }); //扣减总库存数量 jskcQty = jskcQty >= fCompleteCount ? jskcQty - fCompleteCount : 0; //剩余日计划需求数量 need = need >= Inventory.FBASEQTY ? need - Inventory.FBASEQTY : 0; //扣减消耗库存 Inventory.FBASEQTY = Inventory.FBASEQTY - fCompleteCount; } } } } //没有车间仓库数据 既没有可用库存 为未齐套 else { if (occupyDic.ContainsKey(_item.FHWorkShopID + _item.FMATERIALID2)) { occupyMaterial = occupyDic[_item.FHWorkShopID + _item.FMATERIALID2]; } completeAnalysisTempModel.Add(new Demo.Model.Model.CompleteAnalysisTempModel { FHMainICMOInterIDr = _item.FPRDMOMAINID, FHMainICMOEntryID = _item.FPRDMOENTYID, FHICMOInterID = _item.FID.ToString(), FHICMOEntryID = _item.FEntryID.ToString(), FHMaterID = _item.FMATERIALID2, FErpClsID = _item.FErpClsID, FHStockOrgID = _item.FStockOrgId, FHPRDORGID = _item.FStockOrgId, FPRDBillNo = _item.FMOBillNO, FOwnerTypeId = "", FUnitDosage = _item.dwyl,//单位用量 FSumPlanCount = planNeed,//计划总数量 FCompleteCount1 = planNeed - need, //齐套数量 FLackCount = need,//缺料数量 FHStockQty = jskcQty2,//即时库存 FHLeftQty = jskcQty,//可用数量 FOccupyCount = occupyMaterial,//占用数量 FOccupyPickedCount = FOccupyPickedCount,//占用领料数量 FComPlete = "未齐套", FPlanDate = item.FHMASTERDATE, // 日计划日期 FWorkShop = _item.FHWorkShopID //车间 }); } } //Thread.Sleep(6000); i++; } LogService.Write($"提料计划单列表重算 齐套分析,数据准备完成,保存到Model实体,总行数:{completeAnalysisTempModel.Count},耗时:" + sw.Elapsed); DataTable insertDT = new DataTable(); insertDT.TableName = "JIT_MOMaterReadysBill"; insertDT.Columns.Add("FID", typeof(long)); //insertDT.Columns.Add("FBILLNO", typeof(string)); 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("FIDENTIFICAT", typeof(long)); 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; int maxFid = DBServiceHelper.ExecuteScalar(Context, "select max(FID)FID FROM JIT_MOMaterReadysBill", 0); foreach (var item in completeAnalysisTempModel) { DataRow dr = insertDT.NewRow(); dr["FID"] = maxFid + jdtmmm; //dr["FBILLNO"] = ""; 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["FIDENTIFICAT"] = ""; 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); this.View.Session["ProcessRateValue"] = 60 + Convert.ToInt32((Convert.ToDecimal(10) / completeAnalysisTempModel.Count) * jdtmmm); jdtmmm++; } insertDT.EndLoadData(); // 灌入数据结束 //插入之前执行下清空语句(测试是否能够防止重复生成) string deletesql = $"delete from JIT_MOMaterReadysBill where FHICMOINTERID in ({fDayPlanFids}) "; LogService.Write("提料计划单列表重算 齐套分析批量插入到数据库用时:" + sw.Elapsed); // 批量插入到数据库 DBServiceHelper.BulkInserts(this.Context, string.Empty, string.Empty, insertDT); //DBServiceHelper.ExecuteBatch(Context, sqlList); //执行完成后 更新日计划工单状态 string updatesql = string.Format(@" /*dialect*/ update Sc_WorkBillSortBillSub set FComplete = '未齐套' where FEntryID IN (select distinct FHICMOEntryID from JIT_MOMaterReadysBill where isnull(FCOMPLETE,'未齐套') ='未齐套' and FHICMOEntryID in ({0}) )", fDayPlanFEntryids); DBServiceHelper.Execute(Context, updatesql); updatesql = string.Format(@" /*dialect*/ update Sc_WorkBillSortBillSub set FComplete = '齐套' where FEntryID IN ({0}) and FCOMPLETE <>'未齐套' ", fDayPlanFEntryids); DBServiceHelper.Execute(Context, updatesql); //释放齐套操作 避免多人同时进行齐套分析 DBServiceHelper.Execute(Context, $"/*dialect*/ update T_PRD_QTFX set FSTATUS = 0 where FPRDORGID ={fPrdOrgId} and FSTATUS = 1"); LogService.Write("提料计划单列表重算 齐套分析运行总时长:" + sw.Elapsed); #endregion #region 提料计划 //提料计划预处理 清理提料计划单数据 更新采购订单提料计划数量 sql = string.Format($"/*dialect*/exec PROC_JIT_TLPLANYCL '{fProWorkShopId}','{fPrdOrgId}'"); List DayPlanPpbom = DBServiceHelper.ExecuteDataSet(Context, sql).ToModelList(); if (DayPlanPpbom.Count == 0) return "无数据运算"; DBServiceHelper.Execute(Context, sql); //采购订单数据 (剩余收料数量) sql = string.Format(@" /*dialect*/ select t4.FSTOCKINQTY,t4.FReceiveQty,t1.FID,t1.FBillNo,t2.FENTRYID,t1.FSUPPLIERID,t3.fnumber,t2.FMATERIALID,(t4.FREMAINRECEIVEQTY-t2.FPODemandPlanCount)FQTY ,FPurchaseOrgId FStockOrgId,t5.FNUMBER FORGNumber,FCloseStatus,FMRPCLOSESTATUS,FPURCHASEDEPTID,t7.FNUMBER as FPURCHASEDEPTNUMBER ,t1.FCREATORID,t8.FName ,t1.FDate,tD.FDeliveryDate,t2.FNOTE, t2.FSTOCKINQTY,t2.FReceiveQty,(t4.FReceiveQty - t4.FSTOCKINQTY) as FReceiveNotInQty,t2.FXQD,T2.FQTY AS FPURCHASEQTY,FJOINQTY, isnull((select top 1 FLEADTIME + FLEADTTIME2 from T_PRD_TLPlanConfig a join T_PRD_TLPlanConfigEntry b on a.FID =b.FID where a.FORGID = t1.FPurchaseOrgId and b.FSUPPLIERID = t1.FSUPPLIERID), 0)FFIXLEADTIME 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_PUR_POORDERENTRY_D tD on t2.FENTRYID = tD.FENTRYID join T_ORG_Organizations t5 on t1.FPurchaseOrgId = t5.FORGID join T_SEC_user t8 on t1.FCREATORID = t8.FuserId join T_BD_DEPARTMENT T7 ON t1.FPURCHASEDEPTID = T7.FDEPTID where t4.FREMAINRECEIVEQTY-t2.FPODemandPlanCount>0 and FCloseStatus in('A') and FMRPCLOSESTATUS in('A') and t1.FBillTypeID in('83d822ca3e374b4ab01e5dd46a0062bd','6d01d059713d42a28bb976c90a121142') and FPurchaseOrgId = '{0}' ", fPrdOrgId); //LogService.Write("查询采购订单数据用时:" + sw.Elapsed); List PurchaseInventory = DBServiceHelper.ExecuteDataSet(Context, sql).ToModelList(); ////LogHelper.Info("[提料计划准备阶段]可用采购订单数据sql:" + sql); //物料+库存组织分类 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(); //提料计划数据集临时存储集合 List PODemandPlanTemp = new List(); //sql集合 更新采购订单占用的提料计划数量 List sqlList = new List(); //MaterialIDList = new List { "105773" }; int ii = 1;//用于进度条加载 foreach (var item in MaterialIDList) { this.View.Session["ProcessRateValue"] = 70 + Convert.ToInt32((Convert.ToDecimal(18) / MaterialIDList.Count) * ii); //当前物料和库存组织对应的需进行提料计划的数据 List _DayPlanPpbom = DayPlanPpbom.Where(x => x.FMATERIALID == item.FMATERIALID && x.FStockOrgId == item.FStockOrgId).ToList(); decimal NeedQty = 0; foreach (var _item in _DayPlanPpbom) { //查询有没有可以用于提料的采购订单数据 var _PurchaseInventory = PurchaseInventory.Where(x => x.FMATERIALID == item.FMATERIALID && x.FStockOrgId == item.FStockOrgId && x.FQTY > 0).OrderBy(x => x.FENTRYID).ToList(); if (_PurchaseInventory.Count == 0) { //无采购订单直接下一个物料 sql = $"INSERT INTO T_PRD_TLPLANERROR(FROGID,FUSERID,FWORKSHOPID,FDAYPLANID,FDAYPLANENTRYID,FMATERIALID,FQTY,FTYPE) VALUES({fPrdOrgId},{Context.UserId},{fProWorkShopId},{_item.FID},{_item.FENTRYID},{_item.FMATERIALID},{_item.NeedQty},0) "; sqlList.Add(sql); break; } //需求数量 NeedQty = _item.NeedQty; //增加一个销售订单号匹配的逻辑 优先循环 var PurchaseInventoryBySalOrder = _PurchaseInventory.Where(x => x.FXQD == _item.FXQD).OrderBy(x => x.FENTRYID).ToList(); if (PurchaseInventoryBySalOrder.Count > 0) { foreach (var Purchase in PurchaseInventoryBySalOrder) { double _FFIXLEADTIME = Purchase.FFIXLEADTIME;//提前期 DateTime _DATE = Convert.ToDateTime(_item.FHMASTERDATE).AddDays(-_FFIXLEADTIME); if (Purchase.FQTY >= NeedQty) { PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp { FID = _item.FID, FHMASTERDATE = _DATE, FQty = NeedQty, FBILLNO = _item.FBILLNO, FENTRYID = _item.FENTRYID, FMATERIALID = _item.FMATERIALID, FNumber = _item.FNumber, OLDDATE = _item.FHMASTERDATE, FFIXLEADTIME = _FFIXLEADTIME, FErpClsID = _item.FErpClsID, FWORKSHOPNUMBER = _item.FWORKSHOPNUMBER, FDAYPLANBILLNO = _item.FDAYPLANBILLNO, PurchseFentryID = Purchase.FENTRYID, FSUPPLIERID = Purchase.FSUPPLIERID, PurchseFNUMBER = Purchase.FNUMBER, PurchseFBillNo = Purchase.FBillNo, PurchseFqty = Purchase.FQTY, FStockOrgId = Purchase.FStockOrgId, //采购组织 FORGNumber = Purchase.FORGNumber, FPURCHASEDEPTNUMBER = Purchase.FPURCHASEDEPTNUMBER, FXQD = _item.FXQD, FCREATORID = Purchase.FCREATORID, FName = Purchase.FName, FDate = Purchase.FDate, FDeliveryDate = Purchase.FDeliveryDate, F_QIMB_NOTE = Purchase.F_QIMB_NOTE, FNOTE = Purchase.FNOTE, FPURCHASEQTY = Purchase.FPURCHASEQTY, FJOINQTY = Purchase.FJOINQTY }); //更新采购订单 //sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount =isnull(FPODemandPlanCount,0)+ '{NeedQty}' where FENTRYID = {Purchase.FENTRYID}"); //扣除日计划明细已被分配的数量 _item.NeedQty = 0; //扣除当前行对应采购订单数量 Purchase.FQTY -= NeedQty; //需求数量变为0 NeedQty = 0; break; } else//采购订单数据不能满足订单所需数量 { //采购订单数量 decimal _NeedQty = Purchase.FQTY; PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp { FID = _item.FID, FHMASTERDATE = _DATE, FQty = _NeedQty, FBILLNO = _item.FBILLNO, FENTRYID = _item.FENTRYID, FMATERIALID = _item.FMATERIALID, FNumber = _item.FNumber, OLDDATE = _item.FHMASTERDATE, FFIXLEADTIME = _FFIXLEADTIME, FErpClsID = _item.FErpClsID, FWORKSHOPNUMBER = _item.FWORKSHOPNUMBER, FDAYPLANBILLNO = _item.FDAYPLANBILLNO, PurchseFentryID = Purchase.FENTRYID, FSUPPLIERID = Purchase.FSUPPLIERID, PurchseFNUMBER = Purchase.FNUMBER, PurchseFBillNo = Purchase.FBillNo, PurchseFqty = Purchase.FQTY, FStockOrgId = Purchase.FStockOrgId, //采购组织 FORGNumber = Purchase.FORGNumber, FPURCHASEDEPTNUMBER = Purchase.FPURCHASEDEPTNUMBER, FXQD = _item.FXQD, FCREATORID = Purchase.FCREATORID, FName = Purchase.FName, FDate = Purchase.FDate, FDeliveryDate = Purchase.FDeliveryDate, F_QIMB_NOTE = Purchase.F_QIMB_NOTE, FNOTE = Purchase.FNOTE, FPURCHASEQTY = Purchase.FPURCHASEQTY, FJOINQTY = Purchase.FJOINQTY }); //更新采购订单 //sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount = isnull(FPODemandPlanCount,0)+ '{Purchase.FQTY}' where FENTRYID = {Purchase.FENTRYID}"); //更新订单需求数量 NeedQty = NeedQty - Purchase.FQTY; //扣除日计划明细已被分配的数量 _item.NeedQty -= _NeedQty; //扣除当前行对应采购订单数量 Purchase.FQTY = 0; } } } if (NeedQty == 0) continue; var PurchaseInventoryElse = _PurchaseInventory.Where(x => x.FXQD != _item.FXQD).OrderBy(x => x.FENTRYID).ToList(); foreach (var Purchase in PurchaseInventoryElse) { double _FFIXLEADTIME = Purchase.FFIXLEADTIME;//提前期 DateTime _DATE = Convert.ToDateTime(_item.FHMASTERDATE).AddDays(-_FFIXLEADTIME); if (Purchase.FQTY >= NeedQty) { PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp { FID = _item.FID, FHMASTERDATE = _DATE, FQty = _item.NeedQty, FBILLNO = _item.FBILLNO, FENTRYID = _item.FENTRYID, FMATERIALID = _item.FMATERIALID, FNumber = _item.FNumber, OLDDATE = _item.FHMASTERDATE, FFIXLEADTIME = _FFIXLEADTIME, FErpClsID = _item.FErpClsID, FWORKSHOPNUMBER = _item.FWORKSHOPNUMBER, FDAYPLANBILLNO = _item.FDAYPLANBILLNO, PurchseFentryID = Purchase.FENTRYID, FSUPPLIERID = Purchase.FSUPPLIERID, PurchseFNUMBER = Purchase.FNUMBER, PurchseFBillNo = Purchase.FBillNo, PurchseFqty = Purchase.FQTY, FStockOrgId = Purchase.FStockOrgId, //采购组织 FORGNumber = Purchase.FORGNumber, FPURCHASEDEPTNUMBER = Purchase.FPURCHASEDEPTNUMBER, FXQD = _item.FXQD, FCREATORID = Purchase.FCREATORID, FName = Purchase.FName, FDate = Purchase.FDate, FDeliveryDate = Purchase.FDeliveryDate, F_QIMB_NOTE = Purchase.F_QIMB_NOTE, FNOTE = Purchase.FNOTE, FPURCHASEQTY = Purchase.FPURCHASEQTY, FJOINQTY = Purchase.FJOINQTY }); //更新采购订单 //sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount =isnull(FPODemandPlanCount,0)+ '{NeedQty}' where FENTRYID = {Purchase.FENTRYID}"); //扣除日计划明细已被分配的数量 _item.NeedQty = 0; //扣除当前行对应采购订单数量 Purchase.FQTY -= NeedQty; //需求数量变为0 NeedQty = 0; break; } else//采购订单数据不能满足订单所需数量 { //更新总需求数量 NeedQty = NeedQty - Purchase.FQTY; //采购订单数量 decimal _NeedQty = Purchase.FQTY; PODemandPlanTemp.Add(new Demo.Model.Model.PODemandPlan.PODemandPlanTemp { FID = _item.FID, FHMASTERDATE = _DATE, FQty = _NeedQty, FBILLNO = _item.FBILLNO, FENTRYID = _item.FENTRYID, FMATERIALID = _item.FMATERIALID, FNumber = _item.FNumber, OLDDATE = _item.FHMASTERDATE, FFIXLEADTIME = _FFIXLEADTIME, FErpClsID = _item.FErpClsID, FWORKSHOPNUMBER = _item.FWORKSHOPNUMBER, FDAYPLANBILLNO = _item.FDAYPLANBILLNO, PurchseFentryID = Purchase.FENTRYID, FSUPPLIERID = Purchase.FSUPPLIERID, PurchseFNUMBER = Purchase.FNUMBER, PurchseFBillNo = Purchase.FBillNo, PurchseFqty = Purchase.FQTY, FStockOrgId = Purchase.FStockOrgId, //采购组织 FORGNumber = Purchase.FORGNumber, FPURCHASEDEPTNUMBER = Purchase.FPURCHASEDEPTNUMBER, FXQD = _item.FXQD, FCREATORID = Purchase.FCREATORID, FName = Purchase.FName, FDate = Purchase.FDate, FDeliveryDate = Purchase.FDeliveryDate, F_QIMB_NOTE = Purchase.F_QIMB_NOTE, FNOTE = Purchase.FNOTE, FPURCHASEQTY = Purchase.FPURCHASEQTY, FJOINQTY = Purchase.FJOINQTY }); //更新采购订单 //sqlList.Add($"/*dialect*/ update t_PUR_POOrderEntry set FPODemandPlanCount = isnull(FPODemandPlanCount,0)+ '{Purchase.FQTY}' where FENTRYID = {Purchase.FENTRYID}"); //扣除日计划明细已被分配的数量 _item.NeedQty -= _NeedQty; //扣除当前行对应采购订单数量 Purchase.FQTY = 0; } } if (NeedQty > 0) { sql = $"INSERT INTO T_PRD_TLPLANERROR(FROGID,FUSERID,FWORKSHOPID,FDAYPLANID,FDAYPLANENTRYID,FMATERIALID,FQTY,FTYPE,FERRORTYPE) VALUES({fPrdOrgId},{Context.UserId},{fProWorkShopId},{_item.FID},{_item.FENTRYID},{_item.FMATERIALID},{NeedQty},0,1) "; sqlList.Add(sql); } } ii++; } //供应商,提料日期,生产车间,采购员 分组 var PODemandPlanList = PODemandPlanTemp.GroupBy(p => new { p.PurchseFNUMBER, p.FHMASTERDATE, p.FWORKSHOPNUMBER, p.FCREATORID }).Select(x => new PODemandPlanTemp { PurchseFNUMBER = x.Key.PurchseFNUMBER, FHMASTERDATE = x.Key.FHMASTERDATE, FWORKSHOPNUMBER = x.Key.FWORKSHOPNUMBER, FCREATORID = x.Key.FCREATORID }).ToList(); LogService.Write("提料计划单列表重算 提料计划,数据准备完成,保存到Model实体 用时:" + sw.Elapsed + "总行数:" + PODemandPlanTemp.Count); //LogHelper.Info($"提料计划,数据准备完成,保存到Model实体,总行数:{PODemandPlanTemp.Count}"); int tlmmm = 1; JArray FinalyResult = new JArray(); foreach (var item in PODemandPlanList) { this.View.Session["ProcessRateValue"] = 88 + Convert.ToInt32((Convert.ToDecimal(10) / PODemandPlanList.Count) * tlmmm); DateTime date = item.FHMASTERDATE; string PurchseFNUMBER = item.PurchseFNUMBER; string FWorkshopNumber = item.FWORKSHOPNUMBER; string FCreatorID = item.FCREATORID; JObject model = new JObject(); model.Add("FHDate", date); model.Add("FSettleCurrId", new JObject() { ["Fnumber"] = "PRE001" }); model.Add("FSupplierID", new JObject() { ["Fnumber"] = PurchseFNUMBER }); model.Add("FHMaker", new JObject() { ["FUserID"] = Context.UserId }); model.Add("FHUpDater ", new JObject() { ["FUserID"] = Context.UserId }); //修改人 JArray Fentity = new JArray(); List _PODemandPlanList = PODemandPlanTemp.Where(x => x.FHMASTERDATE == date && x.PurchseFNUMBER == PurchseFNUMBER && x.FWORKSHOPNUMBER == FWorkshopNumber && x.FCREATORID == FCreatorID).ToList(); foreach (var _item in _PODemandPlanList) { if (!model.ToString().Contains("FHPURCHASEORGID")) model.Add("FHPURCHASEORGID", new JObject() { ["Fnumber"] = _item.FORGNumber }); JObject FentityModel = new JObject(); 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("FUnitID", new JObject() { ["Fnumber"] = "Pcs" }); //发料方式 FentityModel.Add("FSalOrderNo", _item.FXQD); //需求单号 FentityModel.Add("FCgddCreaterId", new JObject() { ["FUserID"] = _item.FCREATORID }); //采购员 FentityModel.Add("FCgDate", _item.FDate); //采购订单单据日期 FentityModel.Add("FCgDeliveryDate", _item.FDeliveryDate); //采购订单交货日期 FentityModel.Add("F_QIMB_NOTE", _item.F_QIMB_NOTE); //采购订单摘要 FentityModel.Add("FNOTE", _item.FNOTE); //采购订单表体备注 FentityModel.Add("FDAYPLANBILLNO", _item.FDAYPLANBILLNO); //日计划工单号 FentityModel.Add("FWORKSHOPID", new JObject() { ["Fnumber"] = _item.FWORKSHOPNUMBER }); //生产车间 FentityModel.Add("FPURCHASEDEPTID", new JObject() { ["Fnumber"] = _item.FPURCHASEDEPTNUMBER }); //采购部门 FentityModel.Add("FCgddQty", _item.FPURCHASEQTY); //采购订单数量 FentityModel.Add("FCGDDJOINQTY", _item.FJOINQTY); //采购订单关联数量 Fentity.Add(FentityModel); } 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", ["IsAutoSubmitAndAudit"] = true,//自动调用提交和审核功能 ["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") { this.View.ShowMessage(saveObj["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString()); } FinalyResult = new JArray(); } tlmmm++; } LogService.Write("提料计划单列表重算 提料计划调用webapi 用时:" + sw.Elapsed + "总行数:" + PODemandPlanTemp.Count); DBServiceHelper.ExecuteBatch(Context, sqlList); #endregion return "操作成功"; } catch (Exception ex) { LogService.Write("操作失败:" + ex.Message.ToString()); return "操作失败," + ex.Message.ToString(); } } /// /// 生成送货单 /// /// public void btnPush() { try { //获取选择记录 ListSelectedRowCollection selectRows = this.ListView.SelectedRowsInfo; if (selectRows.Count == 0) { this.View.ShowMessage("请选择需要生成送货单的单据!", MessageBoxType.Notice); return; } List fidList = selectRows.GetEntryPrimaryKeyValues().ToList(); string fids = string.Join(",", fidList); //校验 送货控制天数 string sql = string.Format(@" /*dialect*/ select t2.FBILLNO,t2.FHDATE,t3.FDELIVERYDAYSKZ,DATEDIFF(d,GETDATE(),t2.FHDATE) as FTQDATE,t4.fnumber from CG_PODEMANDPLANBILLSUB t1 join CG_PODEMANDPLANBILLMAIN T2 on t1.fid =t2.fid join ( select distinct t1.FORGID,t2.FSUPPLIERID,t2.FMATERIALID,t2.FDELIVERYDAYSKZ from T_PRD_TLPlanConfig t1 join T_PRD_TLPlanConfigEntry t2 on t1.fid = t2.fid ) t3 on t2.FHPURCHASEORGID = t3.FORGID and t2.FSUPPLIERID = t3.FSUPPLIERID and t1.FHMATERID = t3.FMATERIALID join T_BD_MATERIAL t4 on t3.FMATERIALID = t4.FMATERIALID --where DATEDIFF(d,t2.FHDATE,GETDATE()) < t3.FDELIVERYDAYSKZ and DATEDIFF(d,t2.FHDATE,GETDATE()) > 0 where t1.FENTRYID IN ({0}) ", fids); DataTable yzDataTable = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0]; //LogService.Write("测试1"+yzDataTable.Rows); foreach (DataRow dr in yzDataTable.Rows) { if (Convert.ToInt32(dr["FTQDATE"]) > Convert.ToInt32(dr["FDELIVERYDAYSKZ"])) { this.View.ShowErrMessage($"单据编号:{dr["FBILLNO"]},物料:{dr["fnumber"]}已配置提前期为{Convert.ToInt32(dr["FDELIVERYDAYSKZ"])}天,不允许今天下推。"); return; } if (Convert.ToInt32(dr["FDELIVERYDAYSKZ"]) < 0) { this.View.ShowErrMessage($"单据编号:{dr["FBILLNO"]},提料日期为:{Convert.ToString(dr["FHDATE"])},不允许超出日期时下推。"); return; } } sql = string.Format(@" /*dialect*/ SELECT T3.FNAME AS FTYPENAME,M.FBILLNO HBILLNO,M.FDOCUMENTSTATUS,B.FID HID,B.FEntryID as HENTRYID,C.FID,C.FENTRYID, D.FBILLNO,B.FHQTY,B.FReciveCount,b.FRMREALQTY,CD.FRECEIVEORGID,CDOO.FNUMBER AS FRECEIVENUMBER ,D.FSUPPLIERID,DS.FNUMBER AS FSUPPLIERNUMBER,D.FPURCHASEORGID,DOO.FNUMBER AS FPURCHASEORGNUMBER,CROO.FNUMBER AS FSETTLEORGNUMBER, E.FPRICETIMEPOINT,E.FSETTLECURRID,EC.FNUMBER AS FSETTLECURRNUMBER,C.FMATERIALID,CM.FNUMBER AS FMATERIALNUMBER ,C.FUNITID ,CU.FNUMBER AS FUNITNUMBER,CR.FPRICE,CR.FTAXPRICE,CR.FTAXRATE,D.FPURCHASERID,isnull(T4.FNUMBER,'') AS FPURCHASERNUMBER,C.FXQD FROM Cg_PODemandPlanBillSub B JOIN Cg_PODemandPlanBillMain M ON B.FID = M.FID JOIN T_PUR_POORDERENTRY C ON B.FHPOORDERENTRYID = C.FENTRYID LEFT JOIN T_BD_MATERIAL CM ON C.FMATERIALID =CM.FMATERIALID LEFT JOIN T_BD_UNIT CU ON C.FUNITID =CU.FUNITID JOIN T_PUR_POORDERENTRY_D CD ON C.FENTRYID = CD.FENTRYID LEFT JOIN T_ORG_ORGANIZATIONS CDOO ON CD.FRECEIVEORGID = CDOO.FORGID JOIN T_PUR_POORDERENTRY_F CR ON C.FENTRYID = CR.FENTRYID LEFT JOIN T_ORG_ORGANIZATIONS CROO ON CR.FSETTLEORGID = CROO.FORGID LEFT JOIN T_PUR_POORDER D ON C.FID =D.FID LEFT JOIN T_BAS_BILLTYPE T2 ON D.FBILLTYPEID = T2.FBILLTYPEID LEFT JOIN T_BAS_BILLTYPE_L T3 ON T2.FBILLTYPEID = T3.FBILLTYPEID LEFT JOIN V_BD_BUYER T4 ON D.FPURCHASERID =T4.FID LEFT JOIN T_BD_SUPPLIER DS ON D.FSUPPLIERID = DS.FSUPPLIERID LEFT JOIN T_ORG_ORGANIZATIONS DOO ON D.FPURCHASEORGID = DOO.FORGID JOIN T_PUR_POORDERFIN E ON C.FID =E.FID LEFT JOIN T_BD_CURRENCY EC ON E. FSETTLECURRID =EC.FCURRENCYID where b.FENTRYID IN ({0}) ", fids); DataTable dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0]; //LogService.Write("测试2" + dt.Rows); List errList = new List(); //FPURCHASEORGID,FSUPPLIERID,FPURCHASERID 采购组织 + 供应商 + 采购员 验证所选数据是否相同 如不同则返回 foreach (DataRow dr in dt.Rows) { if (dr["FDOCUMENTSTATUS"].ToString() != "C") { this.View.ShowMessage($"单据号:{dr["FBILLNO"].ToString()}未审核,请检查!", MessageBoxType.Notice); return; } if (Convert.ToDecimal(dr["FReciveCount"]) >= Convert.ToDecimal(dr["FHQty"]) + Convert.ToDecimal(dr["FRMREALQTY"])) { this.View.ShowMessage($"单据号:{dr["FBILLNO"].ToString()},物料:{dr["FMATERIALNUMBER"].ToString()},已全部生成送货单,请检查!", MessageBoxType.Notice); return; } if (fidList.Contains(dr["FPURCHASEORGID"].ToString() + dr["FSUPPLIERID"].ToString() + dr["FPURCHASERID"].ToString())) continue; else fidList.Add(dr["FPURCHASEORGID"].ToString() + dr["FSUPPLIERID"].ToString() + dr["FPURCHASERID"].ToString()); } if (errList.Count > 1) { this.View.ShowMessage("选中的数据存在组织或采购员不一致数据,请检查!", MessageBoxType.Notice); return; } JObject model = new JObject(); string fTypeName = "SLD01_SYS";//标准采购订单类型 string ywTypeName = "CG";//标准业务类型 if (dt.Rows[0]["FTYPENAME"].ToString().Contains("委外")) { fTypeName = "SLD03_SYS"; ywTypeName = "WW"; } if (dt.Rows[0]["FTYPENAME"].ToString().Contains("资产")) { fTypeName = "SLD04_SYS"; ywTypeName = "ZCCG"; } model.Add("FBILLTYPEID", new JObject() { ["Fnumber"] = fTypeName }); //单据类型 model.Add("FBusinessType", ywTypeName); //业务类型 model.Add("FIsInsideBill", "true");// 外部单据 FIsInsideBill = 1 时候 可以显示在协同平台 //model.Add("FBILLNO", dt.Rows[0]["HBillNo"].ToString()); //单据编号 model.Add("FDate", DateTime.Now.ToString("yyyy-MM-dd")); //通知日期 model.Add("FStockOrgId", new JObject() { ["Fnumber"] = dt.Rows[0]["FRECEIVENUMBER"].ToString() }); // 收料组织 model.Add("FPurOrgId", new JObject() { ["Fnumber"] = dt.Rows[0]["FPURCHASEORGNUMBER"].ToString() }); //采购组织 model.Add("FSupplierId", new JObject() { ["Fnumber"] = dt.Rows[0]["FSUPPLIERNUMBER"].ToString() }); //供应商 model.Add("FPURCHASERID", new JObject() { ["Fnumber"] = dt.Rows[0]["FPURCHASERNUMBER"].ToString() }); //采购员 model.Add("FOwnerTypeIdHead", "BD_Supplier");// 货主类型 model.Add("FOwnerIdHead", new JObject() { ["Fnumber"] = dt.Rows[0]["FSUPPLIERNUMBER"].ToString() });//货主 供应商 model.Add("FCreatorId ", new JObject() { ["FUserID"] = Context.UserId }); //创建人 JArray Fentity = new JArray(); foreach (DataRow item in dt.Rows) { JObject FentityModel = new JObject(); FentityModel.Add("FMaterialId", new JObject() { ["Fnumber"] = item["FMATERIALNUMBER"].ToString() }); // 物料编码 FentityModel.Add("FUnitID", new JObject() { ["Fnumber"] = item["FUNITNUMBER"].ToString() }); // 单位 FentityModel.Add("FPreDeliveryDate", DateTime.Now.ToString("yyyy-MM-dd")); //预计到货日期 FentityModel.Add("FPriceUnitId", new JObject() { ["Fnumber"] = item["FUNITNUMBER"].ToString() }); // 计价单位 FentityModel.Add("FStockUnitID", new JObject() { ["Fnumber"] = item["FUNITNUMBER"].ToString() }); // 库存单位 FentityModel.Add("FActReceiveQty", Convert.ToDecimal(item["FHQty"]) - Convert.ToDecimal(item["FReciveCount"]) + Convert.ToDecimal(item["FRMREALQTY"])); // 供应商送货数量(提料计划数量 - 已生成送货单数量) FentityModel.Add("FOwnerTypeId", "BD_OwnerOrg");//货主类型 FentityModel.Add("FOwnerID", new JObject() { ["Fnumber"] = item["FPURCHASEORGNUMBER"].ToString() });//货主 FentityModel.Add("FSrcId", item["FID"].ToString());//源单内码 FentityModel.Add("FSRCFORMID", "PUR_PurchaseOrder");//源单类型 FentityModel.Add("FSrcBillNo", item["FBILLNO"].ToString());//源单单号 FentityModel.Add("FSRCENTRYID", item["FENTRYID"].ToString());//源单分录内码 FentityModel.Add("FORDERBILLNO", item["FBILLNO"].ToString());//源单单号 FentityModel.Add("FPOORDERENTRYID", item["FENTRYID"].ToString());//源单分录内码 FentityModel.Add("FTLId", item["HID"].ToString());//提料源单内码 FentityModel.Add("FTLentryId", item["HENTRYID"].ToString());//提料源单分录内码 FentityModel.Add("FTLOrderNo", item["HBILLNO"].ToString());//提料源单分录内码 FentityModel.Add("FPrice", item["FPRICE"].ToString());//单价 FentityModel.Add("FTaxPrice", item["FTAXPRICE"].ToString());//含税单价 FentityModel.Add("FEntryTaxRate", item["FTAXRATE"].ToString());//税率 FentityModel.Add("F_QIMB_Text", item["FXQD"].ToString());//需求单号 JArray Fentity2 = new JArray(); JObject FentityModel2 = new JObject(); FentityModel2.Add("FDetailEntity_Link_FRULEID", "PUR_PurchaseOrder-PUR_ReceiveBill"); FentityModel2.Add("FDetailEntity_Link_FSTableName", "t_PUR_POOrderEntry"); FentityModel2.Add("FDetailEntity_Link_FSBillId", item["FID"].ToString()); FentityModel2.Add("FDetailEntity_Link_FSId", item["FEntryID"].ToString()); Fentity2.Add(FentityModel2); FentityModel.Add("FDetailEntity_Link", Fentity2); Fentity.Add(FentityModel); } model.Add("FDetailEntity", Fentity); //明细信息 JObject _FentityModel = new JObject(); _FentityModel.Add("FSettleOrgId", new JObject() { ["Fnumber"] = dt.Rows[0]["FSETTLEORGNUMBER"].ToString() }); // 结算组织 _FentityModel.Add("FSettleCurrId", new JObject() { ["Fnumber"] = dt.Rows[0]["FSETTLECURRNUMBER"].ToString() }); // 结算币别 _FentityModel.Add("FPricePoint", 0); // 定价时点 model.Add("FinanceEntity ", _FentityModel);//财务信息 JObject jsonRoot = new JObject() { ["Creator"] = "", ["NeedUpDateFields"] = new JArray(), ["NeedReturnFields"] = new JArray(), ["IsDeleteEntry"] = "false", ["SubSystemId"] = "", ["IsVerifyBaseDataField"] = "false", //["IsAutoSubmitAndAudit"] = true,//自动调用提交和审核功能 ["Model"] = model }; CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/"); var result = cloudClient.Save("PUR_ReceiveBill", jsonRoot.ToString()); //LogService.Write("result"+ result); JObject saveObj = JObject.Parse(result); string saveIsSuc = saveObj["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToUpper(); if (saveIsSuc == "TRUE") { //this.View.ShowErrMessage(jsonRoot.ToString()); // 打开单据维护界面:以打开销售订单100001为例 // using Kingdee.BOS.Core.Bill; string pageId = Guid.NewGuid().ToString(); BillShowParameter showParameter = new BillShowParameter(); showParameter.FormId = "SCP_ReceiveBill"; showParameter.OpenStyle.ShowType = ShowType.MainNewTabPage; showParameter.PageId = pageId; showParameter.Status = OperationStatus.EDIT; // 传入需要修改的销售订单内码,演示代码直接固定写死为100001 showParameter.PKey = saveObj["Result"]["Id"].ToString(); this.View.ShowForm(showParameter); } else { this.View.ShowMessage(saveObj["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString()); return; } } catch (Exception ex) { this.View.ShowMessage(ex.Message.ToString()); } } public void OpenPurOrder() { //获取选择记录 ListSelectedRowCollection selectRows = this.ListView.SelectedRowsInfo; if (selectRows.Count == 0) { this.View.ShowMessage("请选择数据!", MessageBoxType.Notice); return; } List fidList = selectRows.GetEntryPrimaryKeyValues().ToList(); string fentryids = string.Join(",", fidList); string sql = string.Format("/*dialect*/ select distinct FHPOORDERENTRYID from Cg_PODemandPlanBillSub where FentryId in ({0})", fentryids); DataTable dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0]; string purfentryids = string.Empty; foreach (DataRow dr in dt.Rows) { purfentryids += dr["FHPOORDERENTRYID"] + ","; } purfentryids = purfentryids.Substring(0, purfentryids.Length - 1); // 采购订单        string billNo = Convert.ToString(this.Model.GetValue("FBillNo")); string fldName = "t3.FEntryID"; IRegularFilterParameter filterParameter = new ListRegularFilterParameter(); filterParameter.Filter = string.Format(" {0} IN ({1}) ", fldName, purfentryids); filterParameter.SelectEntitys = new List() { "FPOOrderEntry" }; var listTrackParameter = new ListTrackBillShowParameter(); listTrackParameter.FormId = "PUR_PurchaseOrder"; listTrackParameter.PageId = Guid.NewGuid().ToString(); listTrackParameter.IsShowFilter = false; listTrackParameter.ListFilterParameter = filterParameter; this.View.ShowForm(listTrackParameter); } } }