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<string> 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<string> 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<int>(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<FormResult>(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) => { });
|
}
|
|
/// <summary>
|
/// 齐套 提料计划 要料计划
|
/// </summary>
|
/// <returns></returns>
|
public string btnReFarsh()
|
{
|
string sql = "";
|
try
|
{
|
Stopwatch sw = new Stopwatch();
|
#region 齐套分析
|
var fPrdOrgId = Context.CurrentOrganizationInfo.ID;
|
var fProWorkShopId = 0; //全组织进行计算
|
List<PRD_PPBOM> BomList = new List<PRD_PPBOM>();
|
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<PRD_PPBOM>();
|
string fDayPlanFids = string.Empty;
|
string fDayPlanFEntryids = string.Empty;
|
if (BomList.Count == 0)
|
{
|
return "没有需要进行齐套分析的数据";
|
}
|
else
|
{
|
List<string> fidList = BomList.Select(x => x.FID.ToString()).Distinct().ToList();
|
List<string> 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<PRD_Inventory> ListInventory = ds.ToModelList<PRD_Inventory>();
|
//车间 仓库对照列表
|
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> pRD_WorkHouseCompar = ds.ToModelList<PRD_WorkHouseCompar>();
|
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> DayPlanPickedModel = new List<DayPlanPickedModel>();
|
ds = DBServiceHelper.ExecuteDataSet(Context, LLsql);
|
DayPlanPickedModel = ds.ToModelList<DayPlanPickedModel>();
|
//CompleteAnalysisTempModel 用于存储临时需要插入数据
|
List<CompleteAnalysisTempModel> completeAnalysisTempModel = new List<CompleteAnalysisTempModel>();
|
//创建字典 用于储存物料 + 占用数量
|
Dictionary<string, decimal> occupyDic = new Dictionary<string, decimal>();
|
LogService.Write($"提料计划单列表重算 齐套分析,数据准备阶段,用时" + sw.Elapsed + "总行数:" + BomList.Count);
|
//第一个循环 日计划工单明细 一天+一个工单 一个循环
|
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<PRD_Inventory> _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<PRD_Inventory> _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<int>(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> DayPlanPpbom = DBServiceHelper.ExecuteDataSet(Context, sql).ToModelList<DayPlanPpbom>();
|
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> PurchaseInventory = DBServiceHelper.ExecuteDataSet(Context, sql).ToModelList<PurchaseInventory>();
|
////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> PODemandPlanTemp = new List<PODemandPlanTemp>();
|
//sql集合 更新采购订单占用的提料计划数量
|
List<string> sqlList = new List<string>();
|
//MaterialIDList = new List<string> { "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 = 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<PODemandPlanTemp> _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();
|
|
}
|
}
|
|
/// <summary>
|
/// 生成送货单
|
/// </summary>
|
/// <returns></returns>
|
public void btnPush()
|
{
|
try
|
{
|
//获取选择记录
|
ListSelectedRowCollection selectRows = this.ListView.SelectedRowsInfo;
|
if (selectRows.Count == 0)
|
{
|
this.View.ShowMessage("请选择需要生成送货单的单据!", MessageBoxType.Notice);
|
return;
|
}
|
List<string> 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<string> errList = new List<string>();
|
//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<string> 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<string>() { "FPOOrderEntry" };
|
var listTrackParameter = new ListTrackBillShowParameter();
|
listTrackParameter.FormId = "PUR_PurchaseOrder";
|
listTrackParameter.PageId = Guid.NewGuid().ToString();
|
listTrackParameter.IsShowFilter = false;
|
listTrackParameter.ListFilterParameter = filterParameter;
|
this.View.ShowForm(listTrackParameter);
|
}
|
}
|
}
|