王 垚
2022-10-27 0283d10f1f65729a5f3a79832ea587f977a28e96
自动排程 , 派工
4个文件已修改
240 ■■■■■ 已修改文件
MES/src/BLL/Demo.BillView/PRD/Pro_DayPlanList.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES/src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES/src/BLL/Demo.BillView/PRD/ProductScheduleButtonClick.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES/src/Model/Demo.Model/Model/ENG_WORKCALFULLDATA.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES/src/BLL/Demo.BillView/PRD/Pro_DayPlanList.cs
@@ -121,7 +121,8 @@
                        }
                    }
                    string sql = $"/*dialect*/ update  Sc_WorkBillSortBillMain set FDocumentStatus = 'C',FHCloseMan = '',FHCloseDate = NULL where FID in ({FID})";
                    if (fbillno.Length > 0) {
                    if (fbillno.Length > 0)
                    {
                        fbillno = fbillno.Substring(0, fbillno.Length - 1);
                        sql = $"/*dialect*/ update  Sc_WorkBillSortBillMain set FDocumentStatus = 'C',FHCloseMan = '',FHCloseDate = NULL where FID in ({FID}) AND FBILLNO NOT IN ({fbillno})";
                    }
@@ -135,6 +136,51 @@
                    this.View.ShowMessage("操作成功");
                }
            }
            else if (e.BarItemKey.Equals("BTNDISPATCH"))
            {
                PushDispatchBill();
            }
        }
        public void PushDispatchBill()
        {
            try
            {
                //获取选择记录
                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);
                DataTable dt = new DataTable();
                string dtsql = $"/*dialect*/ exec proc_jit_saveDispatchBill '{fentryids}'";
                dt = DBServiceHelper.ExecuteDataSet(Context, dtsql).Tables[0];
                // 一次性获取10个单据编号
                var billNos = BusinessDataServiceHelper.GetListBillNO(this.Context, "bsv_dispatchBill", dt.Rows.Count, "635782b535d236");
                //LogService.Write("billNos:" + string.Join(",", billNos)); ;
                List<string> sqllist = new List<string>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string sql = string.Format(@"
/*dialect*/
insert into z_jit_prdDispatchBill values('')
INSERT INTO [t_jit_prdDispatchBill]([FID],[FBILLNO],[FDOCUMENTSTATUS],[FCREATORID],[FCREATEDATE],[FMODIFIERID],[FMODIFYDATE],[FWORKSHOPID],[FSCX],[FSALEORDERNO],[FMONO],[FMATERIALID],[FQTY],[FDAYPLANQTY],[FWAREHOUSQTY],[F_SB],[FKHXH],[FDATE],F_dy,F_gl,F_db,FDAYPLANFID,FDAYPLANFENTRYID,FDAYPLANBILLNO)
select id,'{0}','A',{1},GETDATE(),{1},GETDATE(),{2},{3},'{4}','{5}',{6},{7},{8},{9},'{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}' from z_jit_prdDispatchBill
delete z_jit_prdDispatchBill", billNos[i], Context.UserId, dt.Rows[i]["FWORKSHOPID"], dt.Rows[i]["FSCX"], dt.Rows[i]["FSALEORDERNO"], dt.Rows[i]["FMONO"], dt.Rows[i]["FMATERIALID"], dt.Rows[i]["FQTY"], dt.Rows[i]["FDAYPLANQTY"], dt.Rows[i]["FWAREHOUSQTY"], dt.Rows[i]["F_SB"], dt.Rows[i]["FKHXH"],dt.Rows[i]["FDATE"], dt.Rows[i]["F_dy"], dt.Rows[i]["F_gl"], dt.Rows[i]["F_db"], dt.Rows[i]["FDAYPLANFID"], dt.Rows[i]["FDAYPLANFENTRYID"], dt.Rows[i]["FDAYPLANBILLNO"]);
                    //LogService.Write(sql);
                    sqllist.Add(sql);
                }
                var ret = DBServiceHelper.ExecuteBatch(Context, sqllist);
                //LogService.Write("ret:" + ret);
                this.View.ShowMessage("操作成功,生成派工单数量为" + billNos.Count);
            }
            catch (Exception ex)
            {
                //LogService.Write(ex.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
            }
        }
    }
}
MES/src/BLL/Demo.BillView/PRD/Pro_WorkBillPlatform.cs
@@ -193,6 +193,11 @@
                {
                    btnReFarshJDT();
                }
                //自动排程(数据引入)
                if (e.BarItemKey.ToUpper() == "TB_ZDPC")
                {
                    btnZdpc();
                }
                if (e.BarItemKey.ToUpper() == "TB_OPERCOMPLETEREPORT")
                {
                    // 打开简单系统账表
@@ -4875,5 +4880,176 @@
            }
        }
        public void btnZdpc()
        {
            string errMessege = string.Empty;//错误信息提示
            var fPrdOrgId = (this.Model.GetValue("FPRDOrgId") as DynamicObject)?["Id"].ToString();//组织
            string fProWorkShopId = "";
            DynamicObjectCollection entryOp = this.View.Model.GetValue("F_bsv_MulBase") as DynamicObjectCollection;//生产车间
            if (entryOp.Count == 1)
            {
                List<string> pkValueList = entryOp.Select(p => p["F_bsv_MulBase_Id"].ToString()).Distinct().ToList();
                fProWorkShopId = string.Join(",", pkValueList);
            }
            if (String.IsNullOrEmpty(fProWorkShopId) || String.IsNullOrEmpty(fPrdOrgId))
            {
                errMessege = "请选择组织和单个生产车间";
                this.View.ShowErrMessage(errMessege);
                return;
            }
            int fLockDays = Convert.ToInt32(this.Model.GetValue("FLockDays"));//引入天数
            string sql = $"/*dialect*/ exec proc_jit_zdpc {fPrdOrgId},{fProWorkShopId},{fLockDays}";
            LogService.Write("自动排产sql:"+sql);
            DataSet ds = DBServiceHelper.ExecuteDataSet(Context, sql);
            if (ds.Tables[0].Rows[0][0].ToString().Contains("失败_生产订单没有维护生产资源"))
            {
                foreach (DataRow dr in ds.Tables[1].Rows)
                {
                    errMessege += $"{dr["FBILLNO"]}\r\n";
                    this.View.ShowErrMessage("操作失败,生产订单没有维护生产资源,生产订单编号\r\n" + errMessege);
                    return;
                }
            }
            if (ds.Tables[0].Rows[0][0].ToString().Contains("失败_生产资源没有维护工作日历"))
            {
                foreach (DataRow dr in ds.Tables[1].Rows)
                {
                    errMessege += $"{dr["FNUMBER"]}\r\n";
                    this.View.ShowErrMessage("操作失败,生产资源没有维护工作日历,生产资源(重复生产线)编码:\r\n" + errMessege);
                    return;
                }
            }
            if (ds.Tables[0].Rows[0][0].ToString().Contains("失败_没有维护产能"))
            {
                foreach (DataRow dr in ds.Tables[1].Rows)
                {
                    errMessege += $"生产资源:{dr["FWORKCENTERNUMBER"]},物料编码:{dr["FMATERIALNUMBER"]}\r\n";
                    this.View.ShowErrMessage("操作失败,没有维护产能\r\n" + errMessege);
                    return;
                }
            }
            DataTable dt = ds.Tables[0];//生产订单信息结果集
            List<string> fsczyidList = dt.AsEnumerable().Select(r => r["FSCZYID"].ToString()).Distinct().ToList();//生产资源集合
            foreach (var item in fsczyidList)//循环生产资源
            {
                DataRow[] drs = dt.Select("FSCZYID =" + item);//筛选出当前生产资源生产订单数据
                string _sql = string.Format(@"
/*dialect*/
select FCalUserId,FCalUserType,FShiftId,FIsWorkTime,FDay,FDateStyle,c.FALLHOURS ,c.FALLHOURS FALLHOURSCONST,b.FENTRYID from T_ENG_WORKCAL a
left join T_ENG_WORKCALFULLDATA b on a.FID=b.FID
left join T_ENG_SHIFT c on b.FShiftId =c.FID --班制表
where FCalUserType ='ENG_RepetitiveProductLine'
and FDateStyle = 1 --是否工作日
and FIsWorkTime = 1 --是否生产
and DATEDIFF(D,getdate(),FDAY)>=0
and c.FALLHOURS >0
and FCalUserId = {0}", item);
                LogService.Write("产能sql:" + _sql);
                var engWorkcalfulldataList = DBServiceHelper.ExecuteDataSet(Context, _sql).ToModelList<ENG_WORKCALFULLDATA>();//所有可以用于排产的日期
                foreach (var dr in drs) //循环生产订单
                {
                    List<ENG_WORKCALFULLDATA> finalyResult = new List<ENG_WORKCALFULLDATA>();//用于记录每个订单排产状况
                    decimal fqty = Convert.ToDecimal(dr["FQTY"]);//生产订单数量
                    decimal fcapacity = Convert.ToDecimal(dr["FCAPACITY"]);//小时产能
                    var _engWorkcalfulldataList = engWorkcalfulldataList.Where(x => x.FALLHOURS > 0).ToList();
                    foreach (var model in _engWorkcalfulldataList) //循环工作日历
                    {
                        if (fqty == 0)
                            break;
                        var dayFCapacity = fcapacity * model.FALLHOURS;//今天可以生产总数量
                        var dayFqty = dayFCapacity > fqty ? fqty : dayFCapacity;//今天实际排产数量
                        finalyResult.Add(new Demo.Model.Model.ENG_WORKCALFULLDATA
                        {
                            FDay = model.FDay,
                            FQTY = dayFqty,
                            FCAPACITY = fcapacity,
                            FHOURS = dayFqty / fcapacity,
                            FGZRLENTRYID = model.FENTRYID
                        });
                        //当日剩余产量大于剩余生产订单数量时 按小时产量去计算需要时间 list<>去扣除相应的工时
                        if (dayFCapacity > fqty)
                        {
                            //改变list中某个元素值
                            var engWorkcalfulldataModel = engWorkcalfulldataList.Where(c => c.FENTRYID == model.FENTRYID).FirstOrDefault();
                            //model.FALLHOURS -= Math.Ceiling(fqty / FCapacity);
                            engWorkcalfulldataModel.FALLHOURS -= dayFqty / fcapacity; // 生产数 / 小时产能 = 消耗的小时 (数值类型为decimal)
                        }
                        else
                        {
                            var engWorkcalfulldataModel = engWorkcalfulldataList.Where(c => c.FENTRYID == model.FENTRYID).FirstOrDefault();
                            engWorkcalfulldataModel.FALLHOURS = 0;
                        }
                        fqty -= dayFqty;//生产订单数量扣除掉今天生产数量
                    }
                    JObject jsonRoot = new JObject();
                    jsonRoot.Add("Creator", "");
                    jsonRoot.Add("NeedUpDateFields", new JArray());
                    jsonRoot.Add("NeedReturnFields", new JArray());
                    jsonRoot.Add("IsDeleteEntry", "false");
                    jsonRoot.Add("SubSystemId", "");
                    jsonRoot.Add("IsVerifyBaseDataField", "");
                    JObject jsonModel = new JObject();
                    jsonModel.Add("FMoFBillType", dr["FMoFBillType"].ToString());
                    jsonModel.Add("FOrderType", "生产订单");//
                    jsonModel.Add("FSRCBILLENTRYSEQ", Convert.ToString(dr["FSEQ"]));//生产订单明细行号
                    jsonModel.Add("FSCOrderNo", Convert.ToString(dr["FBILLNO"])); //生产订单号FSCOrderNo
                    jsonModel.Add("FHSeOrderBillNo", Convert.ToString(dr["FSaleOrderNo"]));//销售订单号
                    jsonModel.Add("FHOrderQty", Convert.ToString(dr["FSalOrderCount"]));//销售订单数量
                    jsonModel.Add("FHOrderLev", "3");//订单等级
                    jsonModel.Add("FHOrderCommitDate", Convert.ToString(dr["FPLANDELIVERYDATE"]));//销售订单交货日期
                    jsonModel.Add("FHPlanBeginDate", Convert.ToString(dr["FPLANSTARTDATE"])); //计划开始日期
                    jsonModel.Add("FHPlanEndDate", Convert.ToString(dr["FPLANFINISHDATE"])); //计划完工日期
                    jsonModel.Add("FPriority", Convert.ToInt32(dr["FROWId"]) * 10);//优先级
                    jsonModel.Add("FHOrderNeedQty", Convert.ToString(dr["FQTY"]));// 订单需求数量
                    jsonModel.Add("FPrdBillNo", Convert.ToString(dr["FBILLNO"])); ;//源单编号
                    jsonModel.Add("FPRDMOMAINID", Convert.ToString(dr["FID"])); ;//源单主内码
                    jsonModel.Add("FPRDMOENTYID", Convert.ToString(dr["FENTRYID"])); ;//源单子内码
                    jsonModel.Add("FMoFID", Convert.ToString(dr["FID"])); ;//源单主内码
                    jsonModel.Add("FMoFentryId", Convert.ToString(dr["FENTRYID"])); ;//源单子内码
                    jsonModel.Add("FOrderQuantity", Convert.ToString(dr["FQTY"])); ;//生产订单数量
                    jsonModel.Add("FDayPlanQuantity", Convert.ToString(dr["FQTY"])); ;//日计划数量
                    jsonModel.Add("FHMaker ", new JObject() { ["FUserID"] = Context.UserId }); //创建人
                    jsonModel.Add("FHUpDater ", new JObject() { ["FUserID"] = Context.UserId }); //修改人
                    jsonModel.Add("FHPRDORGID", new JObject() { ["Fnumber"] = Convert.ToString(dr["FORGNUMBER"]) });//生产组织
                    jsonModel.Add("FHUnitID", new JObject() { ["Fnumber"] = Convert.ToString(dr["FUNITNUMBER"]) });//单位
                    jsonModel.Add("FBOMID", new JObject() { ["Fnumber"] = Convert.ToString(dr["FBOMNUMBER"]) });//BOM版本
                    jsonModel.Add("FHMaterID", new JObject() { ["Fnumber"] = Convert.ToString(dr["FMATERIALNUMBER"]) });//物料
                    jsonModel.Add("FHWorkShopID", new JObject() { ["Fnumber"] = Convert.ToString(dr["FDEPTNUMBER"]) });//生产车间
                    jsonModel.Add("FHSourceID", new JObject() { ["Fnumber"] = Convert.ToString(dr["FSCZYNUMBER"]) });//生产资源
                    JArray Entry = new JArray();
                    foreach (var entry in finalyResult)
                    {
                        JObject jsonFPOOrderEntry = new JObject();
                        jsonFPOOrderEntry.Add("FHMasterDate", entry.FDay);
                        jsonFPOOrderEntry.Add("FHQty ", entry.FQTY);
                        jsonFPOOrderEntry.Add("FCAPACITY ", entry.FCAPACITY);//小时产能
                        jsonFPOOrderEntry.Add("FHOURS ", entry.FHOURS);//工时
                        jsonFPOOrderEntry.Add("FGZRLENTRYID ", entry.FGZRLENTRYID);//
                        Entry.Add(jsonFPOOrderEntry);
                    }
                    jsonModel.Add("FEntity", Entry);
                    jsonRoot.Add("Model", jsonModel);
                    CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/");
                    var result = cloudClient.Save("Paez_Sc_WorkBillAutoSortBill", jsonRoot.ToString());
                    JObject saveObj = JObject.Parse(result);
                    string saveIsSuc = saveObj["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToUpper();
                    if (saveIsSuc != "TRUE")
                    {
                        errMessege += saveObj["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString() + " \r\n";
                        //this.View.ShowErrMessage(saveObj["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString());
                        //return;
                    }
                }
            }
            if (errMessege.Length > 0)
            {
                this.View.ShowMessage(errMessege);
            }
            else {
                this.View.ShowMessage("操作成功");
            }
        }
    }
}
MES/src/BLL/Demo.BillView/PRD/ProductScheduleButtonClick.cs
@@ -427,6 +427,7 @@
where ISNULL(e.FSCOrderNo,'')=''";
                sql += sqlWhere;
                DataTable dt = DBServiceHelper.ExecuteDataSet(this.Context, sql).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //this.Model.DeleteEntryData("FScddEntity");
MES/src/Model/Demo.Model/Model/ENG_WORKCALFULLDATA.cs
@@ -11,8 +11,6 @@
    /// </summary>
    public class ENG_WORKCALFULLDATA
    {
        /// <summary>
        /// 重复生产线id
        /// </summary>
@@ -58,8 +56,19 @@
        /// </summary>
        public long FENTRYID { get; set; }
        /// <summary>
        /// 产能(用于日计划工单记录)
        /// </summary>
        public decimal FCAPACITY { get; set; }
        /// <summary>
        /// 所花工时(用于日计划工单记录)
        /// </summary>
        public decimal FHOURS { get; set; }
        /// <summary>
        /// 工作日历fentryid(用于日计划工单记录)
        /// </summary>
        public long FGZRLENTRYID { get; set; }
    }
}