王 垚
2021-01-05 6ed23c03a18bf631039bf750ee456a5e2a582bfd
代码上传
2个文件已修改
220 ■■■■■ 已修改文件
src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.TimedTaskPlugIn/PRD/StockChangeDynamicAlignment.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs
@@ -17,6 +17,8 @@
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.ServiceHelper.FileServer;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.SCM.STK;
using Kingdee.K3.SCM.ServiceHelper;
using Newtonsoft.Json.Linq;
using NPOI.HSSF.UserModel;
using NPOI.SS.Formula.Functions;
@@ -57,29 +59,18 @@
                if (e.BarItemKey.ToUpper() == "BTEXPORT")
                {
                    ExportExcel();
                    //this.View.ShowMessage("测试啦");
                    string path = PathUtils.GetServerPath(KeyConst.TEMPFILEPATH, PathName);
                    DynamicFormShowParameter dynamicForm = new DynamicFormShowParameter();
                    dynamicForm.FormId = "BOS_FileDownLoad";
                    dynamicForm.OpenStyle.ShowType = ShowType.Modal;
                    dynamicForm.CustomParams.Add("IsExportData", "true");
                    dynamicForm.CustomParams.Add("url", path);
                    this.View.ShowForm(dynamicForm);
                    //ShowDownload();
                }
                if (e.BarItemKey.ToUpper() == "TBSEARCH")
                {
                    SearchList();
                }
                if (e.BarItemKey.ToUpper() == "TBLOCK")
                {
                    Lock();
@@ -103,18 +94,32 @@
                //提料计划
                if (e.BarItemKey.ToUpper() == "TBEXTRACTION")
                {
                    Extraction();
                    try
                    {
                        COMPLETE();
                        DayPlanPPBomBill();
                        Extraction();
                    }
                    catch (Exception ex)
                    {
                        this.View.ShowErrMessage(ex.Message.ToString());
                    }
                    finally {
                        this.View.ShowMessage("操作成功!");
                    }
                }
                //预留
                if (e.BarItemKey.ToUpper() == "TBRESERVE")
                {
                    Extraction();
                    Reserve();
                }
                //释放
                if (e.BarItemKey.ToUpper() == "TBRELEASE")
                {
                    Extraction();
                    Release();
                }
            }
            catch (Exception ex)
@@ -2128,8 +2133,6 @@
                    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
@@ -2147,7 +2150,6 @@
                    ["IsVerifyBaseDataField"] = "false",
                    ["Model"] = model
                };
                CloudClient cloudClient = new CloudClient("http://localhost/K3Cloud/");
                var result = cloudClient.Save("paez_PODemandPlan", jsonRoot.ToString());
                JObject saveObj = JObject.Parse(result);
@@ -2163,13 +2165,188 @@
                    LogHelper.Error(saveIsSuc);
                }
            }
            DBServiceHelper.ExecuteBatch(Context, sqlList);
            this.View.ShowMessage("操作成功");
            // var PODemandPlanList22 = PODemandPlanTemp.GroupBy(p => new   {p.FSUPPLIERID,     p.FHMASTERDATE }).ToList();
        }
        /// <summary>
        /// 1.锁库,具体字段根据业务单据决定,‘Inv’表示即时库存,‘FInvDetailID’为即时库存ID
        /// </summary>
        public void Reserve()
        {
            try
            {
                decimal ReserveCount = Convert.ToDecimal((this.Model.GetValue("FReservedCount")));
                if (ReserveCount == 0)
                {
                    this.View.ShowMessage("请输入预留数量");
                    return;
                }
                //获取单据体信息
                Entity entity = this.View.BillBusinessInfo.GetEntity("FEntity");
                //单据体信息转换为列表集合
                DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
                EntryGrid grid = this.View.GetControl<EntryGrid>("FEntity");
                //总库存 物料+库存组织+库存数量
                DataSet ds = DBServiceHelper.ExecuteDataSet(Context, @"
/*dialect*/
 select  sum(isnull(a.FBASEQTY,0)-ISNULL(b.FHUseQty,0))FBASEQTY,T1.FStockOrgId,T1.FMATERIALID from
(
select a.FHPRDORGID FStockOrgId,T2.FMATERIALID 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(select FID,FMATERIALID from T_PRD_PPBOMENTRY
group by FMATERIALID,FID) T2 on T1.FID = t2.FID
group by a.FHPRDORGID,T2.FMATERIALID
) T1
LEFT JOIN T_STK_Inventory a on T1.FStockOrgId = a.FStockOrgId and T1.FMATERIALID =a.FMATERIALID
LEFT JOIN JIT_MOMaterReadysBill B ON T1.FStockOrgId = b.FHSTOCKORGID and T1.FMATERIALID =b.FHMATERID
--where T1.FMATERIALID in (105773)
group by T1.FStockOrgId,T1.FMATERIALID
");
                ListInventoryByStockOrgId = ds.ToModelList<PRD_Inventory>();
                foreach (DynamicObject current in entityDataObjoct)
                {
                    if (Convert.ToString(current["FFOCUS"]) == "False")
                        continue;
                    string sql = string.Format(@"
/*dialect*/
--生产用料清单列表
SELECT T1.FID,T1.FBillNo,T1.FMOBillNO,T1.FMOEntrySeq,T1.FMoId,T1.FMaterialID,T1.FQty,FPRDORGID FStockOrgId,
T2.FMATERIALID FMATERIALID2,T4.FNumber,T2.FNeedQty,convert(decimal(18,2),FNeedQty/FQty ) as dwyl
--,isnull(t3.FBASEQTY,0)FBASEQTY
 FROM T_PRD_PPBOM T1
LEFT JOIN (select FID,MAX(FENTRYID)FENTRYID,SUM(FNeedQty)FNeedQty,FMATERIALID  from T_PRD_PPBOMENTRY where FMoId='{0}'
group by FMATERIALID,FID ) T2 on T1.FID=t2.FID
--LEFT JOIN T_STK_Inventory T3 on t2.FMATERIALID = t3.FMATERIALID
LEFT JOIN T_BD_MATERIAL T4 on T2.FMATERIALID=T4.FMATERIALID
where t1.FMoId='{0}'    and T1.FMaterialID='{1}'
", current["FHMainSourceInterID"].ToString(), current["FMatrailId_Id"].ToString());
                    ds = DBServiceHelper.ExecuteDataSet(Context, sql);
                    var PpbomList = ds.ToModelList<PRD_PPBOM>();
                    //当前最大齐套数 下层需求数量/父级需求数量=单位用料
                    //var SumGetComplete = Math.Floor(PpbomList.Min(t => t.FBASEQTY / (t.FNeedQty / t.FQty)));
                    //最大齐套数
                    var result = (from a in PpbomList
                                  join b in ListInventoryByStockOrgId
                                  on new { materialId = a.FMATERIALID2, stockOrgId = a.FStockOrgId }
                                  equals new { materialId = b.FMATERIALID, stockOrgId = b.FStockOrgId }
                                  into g
                                  from b in g.DefaultIfEmpty()
                                  select new
                                  {
                                      value = (b?.FBASEQTY / a.dwyl) ?? 0
                                  }).ToList().Min(x => x.value);
                    if (result < ReserveCount)
                    {
                        this.View.ShowErrMessage("当前库存超出可预留最大数:" + result + "");
                        return;
                    };
                    //将预留数量分配到日计划工单
                    sql = string.Format(@"/*dialect*/select FEntryID,FHQTY from Sc_WorkBillSortBillSub
where FID='{0}' and isnull(FCOMPLETE,'未齐套')='未齐套'", current["FDayPlanWorkID"].ToString());
                    DataTable dayPlanDt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
                    var count = ReserveCount;
                    List<string> sqlList = new List<string>();
                    if (dayPlanDt.Rows.Count > 0)
                    {
                        foreach (DataRow dr in dayPlanDt.Rows)
                        {
                            if (count > 0)
                            {
                                sql = string.Format("/*dialect*/ update Sc_WorkBillSortBillSub set FReservedCount = {0} where FEntryID = {1}", count >= Convert.ToDecimal(dr["FHQTY"]) ? Convert.ToDecimal(dr["FHQTY"]) : count, dr["FEntryID"].ToString());
                                sqlList.Add(sql);
                                count = count - Convert.ToDecimal(dr["FHQTY"]);
                            }
                            else
                                break;
                        }
                        DBServiceHelper.ExecuteBatch(Context, sqlList);
                    }
                    sql = string.Format(@"/*dialect*/
--生产用料清单列表
SELECT T1.FID,T1.FBillNo,T1.FMOBillNO,T1.FMOEntrySeq,T1.FMoId,T1.FMaterialID,T1.FQty,FPRDORGID FStockOrgId,
T2.FMATERIALID FMATERIALID2,T4.FNumber,T2.FNeedQty,convert(decimal(18,2),FNeedQty/T1.FQty ) as dwyl,
t5.FBASEUNITID,t6.FSTOREUNITID,t7.FID FSTKID,t7.FOwnerID,t7.FOwnerTypeID,t7.FSTOCKID,t7.FBASEQTY
--,isnull(t3.FBASEQTY,0)FBASEQTY
 FROM T_PRD_PPBOM T1
LEFT JOIN (select FID,MAX(FENTRYID)FENTRYID,SUM(FNeedQty)FNeedQty,FMATERIALID  from T_PRD_PPBOMENTRY   where FMoId='{0}'
group by FMATERIALID,FID ) T2 on T1.FID=t2.FID
--LEFT JOIN T_STK_Inventory T3 on t2.FMATERIALID = t3.FMATERIALID
LEFT JOIN T_BD_MATERIAL T4 on T2.FMATERIALID=T4.FMATERIALID
join t_BD_MaterialBase t5 on t4.FMATERIALID = t5.FMATERIALID
join t_BD_MaterialStock t6 on t4.FMATERIALID = t6.FMATERIALID
join T_STK_INVENTORY t7 on t4.FMATERIALID = t7.FMATERIALID and t1.FPRDORGID=t7.FSTOCKORGID
where t1.FMoId='{0}'    and T1.FMaterialID='{1}'
", current["FHMainSourceInterID"].ToString(), current["FMatrailId_Id"].ToString());
                    DataTable skDt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
                    //锁库
                    List<LockStockArgs> list = new List<LockStockArgs>();
                    foreach (DataRow dr in skDt.Rows)
                    {
                        LockStockArgs lockStockArgs = new LockStockArgs();
                        lockStockArgs.ObjectId = "SAL_SaleOrder";
                        lockStockArgs.BillId = Convert.ToString(current["FHMainSourceInterID"]); //生产订单ID
                        lockStockArgs.BillNo = Convert.ToString(current["FSCOrderNo"]);//生产订单号
                        lockStockArgs.FID = Convert.ToInt32(current["FHMainSourceInterID"]); //生产订单ID
                        lockStockArgs.BaseQty = decimal.Parse(dr["FBASEQTY"].ToString());//基本单位数量
                        lockStockArgs.BaseUnitID = int.Parse(dr["FBASEUNITID"].ToString());//基本单位
                        lockStockArgs.BillDetailID = Convert.ToString(current["FHMainSourceEntryID"]);
                        lockStockArgs.FEntryID = Convert.ToInt32(current["FHMainSourceEntryID"]); ;
                        //lockStockArgs.Lot = Convert.ToString(current["FBatch"]); ;//批次 FBatch
                        lockStockArgs.MaterialID = long.Parse(dr["FMATERIALID2"].ToString());
                        lockStockArgs.OwnerID = long.Parse(dr["FOwnerID"].ToString());
                        lockStockArgs.OwnerTypeID = dr["FOwnerTypeID"].ToString();
                        lockStockArgs.Qty = Convert.ToDecimal(dr["dwyl"].ToString()) * ReserveCount;//数量
                        lockStockArgs.STOCKID = long.Parse(dr["FSTOCKID"].ToString());//仓库
                        lockStockArgs.StockOrgID = long.Parse(dr["FStockOrgId"].ToString());//库存组织
                        lockStockArgs.UnitID = long.Parse(dr["FSTOREUNITID"].ToString());//单位
                        lockStockArgs.LockBaseQty = Convert.ToDecimal(dr["dwyl"].ToString()) * ReserveCount;
                        lockStockArgs.LockQty = Convert.ToDecimal(dr["dwyl"].ToString()) * ReserveCount;//基本单位数量
                        lockStockArgs.FInvDetailID = Convert.ToString(dr["FSTKID"].ToString());
                        list.Add(lockStockArgs);
                    }
                    var sa = StockServiceHelper.SaveLockInfo(Context, list, "Inv", false);
                    this.View.ShowMessage("操作成功!");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
            }
        }
        /// <summary>
        /// 释放
        /// </summary>
        public void Release()
        {
            try
            {
                //获取单据体信息
                Entity entity = this.View.BillBusinessInfo.GetEntity("FEntity");
                //单据体信息转换为列表集合
                DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
                DynamicObjectCollection filterResult = entityDataObjoct.Clone();
                filterResult.Clear();
                entityDataObjoct.Where(x => Convert.ToBoolean(x["FFOCUS"])).ToList().ForEach(x=> filterResult.Add(x));
                foreach (DynamicObject current in entityDataObjoct)
                {
                    if (Convert.ToString(current["FFOCUS"]) == "False")
                        continue;
                    string sql = string.Format(@"/*dialect*/ update Sc_WorkBillSortBillSub set FReservedCount = 0 where FID='{0}'", current["FDayPlanWorkID"].ToString());
                    DBServiceHelper.Execute(Context, sql);
                }
                this.View.ShowMessage("操作成功!");
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
            }
        }
    }
}
//tbReleaseReserve
src/BLL/Demo.TimedTaskPlugIn/PRD/StockChangeDynamicAlignment.cs
@@ -15,6 +15,9 @@
using System.Diagnostics;
using System.Collections.Generic;
using ZD.Share.Common;
using Kingdee.K3.Core.SCM.STK;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.K3.SCM.ServiceHelper;
namespace Demo.TimedTaskPlugIn.PRD
{
@@ -766,5 +769,7 @@
            }
            DBServiceHelper.ExecuteBatch(Context, sqlList);
        }
    }
}