yl
2023-09-22 4e8bb8eaf8c6bb06cdb56c401ead036231651446
1.工单派发、工单关闭、工单报工获取数据接口
已修改8个文件
1041 ■■■■ 文件已修改
VueWebCoreApi/Controllers/BasicSettingController.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/Controllers/WorkOrderController.cs 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/DLL/BLL/WorkOrderBLL.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/DLL/DAL/BasicSettingDAL.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/DLL/DAL/GeneralBasicDataDAL.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/DLL/DAL/ProductionManagementDAL.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/DLL/DAL/WorkOrderDAL.cs 548 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/Tools/ScanStartReport.cs 302 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VueWebCoreApi/Controllers/BasicSettingController.cs
@@ -825,5 +825,7 @@
            return Json(mes);
        }
        #endregion
    }
}
VueWebCoreApi/Controllers/WorkOrderController.cs
@@ -265,7 +265,20 @@
        #region[MES工单派发提交]
        /// <summary>
        /// MES工单派发提交
        /// </summary>
        /// <param name="wocodelist">工单号数组</param>
        /// <returns></returns>
        [Route(template: "MesOrderDistribution")]
        [HttpPost]
        public JsonResult MesOrderDistribution([FromBody] string[] wocodelist)
        {
            var token = HttpContext.Request.Headers["Token"].ToString();
            User us = JwtTools.Denocode(token.ToString());
            mes = WorkOrderBLL.MesOrderDistribution(wocodelist, us);
            return Json(mes);
        }
        #endregion
@@ -305,15 +318,130 @@
        /// <summary>
        /// MES工单关闭提交
        /// </summary>
        /// <param name="dt">工单号数组对象</param>
        /// <param name="wocodelist">工单号数组</param>
        /// <returns></returns>
        [Route(template: "MesOrderBitchClosedSeave")]
        [HttpPost]
        public JsonResult MesOrderBitchClosedSeave(DataTable dt)
        public JsonResult MesOrderBitchClosedSeave([FromBody] string[] wocodelist)
        {
            var token = HttpContext.Request.Headers["Token"].ToString();
            User us = JwtTools.Denocode(token.ToString());
            mes = WorkOrderBLL.MesOrderBitchClosedSeave(us, dt);
            mes = WorkOrderBLL.MesOrderBitchClosedSeave(us, wocodelist);
            return Json(mes);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(自制)]
        /// <summary>
        /// 生产开报工扫码获取工单对应工序任务(自制)
        /// </summary>
        /// <param name="wocode">工单号</param>
        /// <param name="partcode">产品编码</param>
        /// <param name="partname">产品名称</param>
        /// <param name="partspec">规格型号</param>
        /// <param name="page">页码</param>
        /// <param name="rows">每页显示条数</param>
        /// <param name="prop">排序字段</param>
        /// <param name="order">排序规则(默认按照计划开工时间正序)</param>
        /// <returns></returns>
        [Route(template: "MesOrderStepSearch")]
        [HttpGet]
        public JsonResult MesOrderStepSearch(string wocode = null, string partcode = null, string partname = null, string partspec = null, int page = 0, int rows = 0, string prop = null, string order = null)
        {
            var token = HttpContext.Request.Headers["Token"].ToString();
            User us = JwtTools.Denocode(token.ToString());
            int startNum = rows * (page - 1) + 1;  //起始记录rowNum
            int endNum = rows * page;   //结束记录 rowNum
            mes = WorkOrderBLL.MesOrderStepSearch(wocode, partcode, partname, partspec, startNum, endNum, prop, order);
            return Json(mes);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(外协)]
        /// <summary>
        /// 生产开报工扫码获取工单对应工序任务(外协)
        /// </summary>
        /// <param name="wocode">工单号</param>
        /// <param name="partcode">产品编码</param>
        /// <param name="partname">产品名称</param>
        /// <param name="partspec">规格型号</param>
        /// <param name="page">页码</param>
        /// <param name="rows">每页显示条数</param>
        /// <param name="prop">排序字段</param>
        /// <param name="order">排序规则(默认按照计划开工时间正序)</param>
        /// <returns></returns>
        [Route(template: "MesOrderWxStepSearch")]
        [HttpGet]
        public JsonResult MesOrderWxStepSearch(string wocode = null, string partcode = null, string partname = null, string partspec = null, int page = 0, int rows = 0, string prop = null, string order = null)
        {
            var token = HttpContext.Request.Headers["Token"].ToString();
            User us = JwtTools.Denocode(token.ToString());
            int startNum = rows * (page - 1) + 1;  //起始记录rowNum
            int endNum = rows * page;   //结束记录 rowNum
            mes = WorkOrderBLL.MesOrderWxStepSearch(wocode, partcode, partname, partspec, startNum, endNum, prop, order);
            return Json(mes);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(不良)]
        /// <summary>
        /// 生产开报工扫码获取工单对应工序任务(不良)
        /// </summary>
        /// <param name="wocode">工单号</param>
        /// <param name="partcode">产品编码</param>
        /// <param name="partname">产品名称</param>
        /// <param name="partspec">规格型号</param>
        /// <param name="page">页码</param>
        /// <param name="rows">每页显示条数</param>
        /// <param name="prop">排序字段</param>
        /// <param name="order">排序规则(默认按照计划开工时间正序)</param>
        /// <returns></returns>
        [Route(template: "MesOrderNgStepSearch")]
        [HttpGet]
        public JsonResult MesOrderNgStepSearch(string wocode = null, string partcode = null, string partname = null, string partspec = null, int page = 0, int rows = 0, string prop = null, string order = null)
        {
            var token = HttpContext.Request.Headers["Token"].ToString();
            User us = JwtTools.Denocode(token.ToString());
            int startNum = rows * (page - 1) + 1;  //起始记录rowNum
            int endNum = rows * page;   //结束记录 rowNum
            mes = WorkOrderBLL.MesOrderNgStepSearch(wocode, partcode, partname, partspec, startNum, endNum, prop, order);
            return Json(mes);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(不良明细)]
        /// <summary>
        /// 生产开报工扫码获取工单对应工序任务(不良明细)
        /// </summary>
        /// <param name="wocode">工单号</param>
        /// <param name="stepcode">工序编码</param>
        /// <returns></returns>
        [Route(template: "MesOrderNgSubStepSearch")]
        [HttpGet]
        public JsonResult MesOrderNgSubStepSearch(string wocode,string stepcode)
        {
            var token = HttpContext.Request.Headers["Token"].ToString();
            User us = JwtTools.Denocode(token.ToString());
            mes = WorkOrderBLL.MesOrderNgSubStepSearch(wocode,stepcode);
            return Json(mes);
        }
        #endregion
        #region [生产开报工:报工/外协(发料/收料)时条件判断及数据返回接口]
        /// <summary>
        /// 生产开报工:报工/外协(发料/收料)时条件判断及数据返回接口
        /// </summary>
        /// <param name="OperType">操作类型:自制(ZZ)/外协(WX)</param>
        /// <param name="SelectType">操作类型:自制(传空)/外协(发料标识(OUT)/收料标识(IN))</param>
        /// <param name="wocode">工单编号</param>
        /// <param name="stepcode">工序编号</param>
        /// <returns></returns>
        [Route(template: "MesOrderStepStart")]
        [HttpGet]
        public JsonResult MesOrderStepStart(string OperType,string SelectType, string wocode, string stepcode )
        {
            mes = WorkOrderBLL.MesOrderStepStart(OperType,SelectType, wocode, stepcode);
            return Json(mes);
        }
        #endregion
VueWebCoreApi/DLL/BLL/WorkOrderBLL.cs
@@ -86,6 +86,13 @@
        #endregion
        #region[MES工单派发提交]
        public static ToMessage MesOrderDistribution(string[] wocodelist, User us)
        {
            return WorkOrderDAL.MesOrderDistribution(wocodelist, us);
        }
        #endregion
        #region[工单关闭列表查询]
        public static ToMessage MesOrderClosedSearch(string mesorderstus, string mesordercode, string sourceorder, string saleordercode, string ordertype, string partcode, string partname, string partspec, int startNum, string creatuser, string createdate, int endNum, string prop, string order)
        {
@@ -94,9 +101,44 @@
        #endregion
        #region[MES工单批量关闭提交]
        public static ToMessage MesOrderBitchClosedSeave(User us, DataTable dt)
        public static ToMessage MesOrderBitchClosedSeave(User us, string[] wocodelist)
        {
            return WorkOrderDAL.MesOrderBitchClosedSeave(us, dt);
            return WorkOrderDAL.MesOrderBitchClosedSeave(us,wocodelist);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(自制)]
        public static ToMessage MesOrderStepSearch(string wocode, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
        {
            return WorkOrderDAL.MesOrderStepSearch(wocode, partcode, partname, partspec, startNum, endNum, prop, order);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(外协)]
        public static ToMessage MesOrderWxStepSearch(string wocode, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
        {
            return WorkOrderDAL.MesOrderWxStepSearch(wocode, partcode, partname, partspec, startNum, endNum, prop, order);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(不良)]
        public static ToMessage MesOrderNgStepSearch(string wocode, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
        {
            return WorkOrderDAL.MesOrderNgStepSearch(wocode, partcode, partname, partspec, startNum, endNum, prop, order);
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(不良明细)]
        public static ToMessage MesOrderNgSubStepSearch(string wocode, string stepcode)
        {
            return WorkOrderDAL.MesOrderNgSubStepSearch(wocode, stepcode);
        }
        #endregion
        #region [生产开报工:报工/外协(发料/收料)时条件判断及数据返回接口]
        public static ToMessage MesOrderStepStart(string OperType, string SelectType, string wocode, string stepcode)
        {
            return WorkOrderDAL.MesOrderStepStart(OperType, SelectType, wocode, stepcode);
        }
        #endregion
    }
VueWebCoreApi/DLL/DAL/BasicSettingDAL.cs
@@ -3499,5 +3499,6 @@
            return mes;
        }
        #endregion
    }
}
VueWebCoreApi/DLL/DAL/GeneralBasicDataDAL.cs
@@ -293,7 +293,7 @@
            try
            {
                //获取仓库数据
                sql = @"select stepcode,stepname from TStep";
                sql = @"select stepcode,stepname from TStep where enable='Y'";
                var data = DapperHelper.selecttable(sql);
                mes.code = "200";
                mes.Message = "查询成功!";
VueWebCoreApi/DLL/DAL/ProductionManagementDAL.cs
@@ -1468,10 +1468,10 @@
                    switch (OperType)
                    {
                        case "ZZ":
                            mes = ScanStartReport.ZZEncodingSeach(stu_torgcode, ordercode, stepcode);
                            mes = ScanStartReport.ZZEncodingSeach(ordercode, stepcode);
                            break;
                        case "WX":
                            mes = ScanStartReport.WXEncodingSeach(stu_torgcode, SelectType, ordercode, stepcode);
                            mes = ScanStartReport.WXEncodingSeach(SelectType, ordercode, stepcode);
                            break;
                        default:
                            break;
VueWebCoreApi/DLL/DAL/WorkOrderDAL.cs
@@ -463,7 +463,7 @@
                // --------------查询指定数据--------------
                var total = 0; //总条数
                var sql = @"select A.id, A.status,A.wotype,A.wo_code,A.materiel_code as partcode,B.partname,B.partspec,A.plan_qty,A.wkshp_code,C.torg_name as wkshp_name,
                            A.stck_code,D.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.sourceid,A.m_po,A.saleOrderDeliveryDate,W.saleOrderCode,U.username as lm_user,A.lm_date
                            A.stck_code,D.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.sourceid,A.m_po,A.saleOrderDeliveryDate,W.saleOrderCode,U.username as lm_user,A.lm_date,A.data_sources
                            from TK_Wrk_Man A
                            left join TKimp_Ewo W on A.m_po=W.wo and A.materiel_code=W.materiel_code
                            left join TMateriel_Info B on A.materiel_code=B.partcode
@@ -607,16 +607,21 @@
            {
                if (data_sources == "ERP")  //数据来源ERP
                {
                    //查询订单任务总数
                    sql = @"select qty  from TKimp_Ewo where id=@sourceid and wo=@sourcewo";
                    dynamicParams.Add("@sourceid", sourceid);
                    dynamicParams.Add("@sourcewo", sourcewo);
                    dynamicParams.Add("@wocode", wocode);
                    var data0 = DapperHelper.selectdata(sql, dynamicParams);
                    //查询当前工单可修改数量=订单总数-已下达工单总数
                    sql = @"select max(qty) as qty,isnull(sum(M.plan_qty),0) as plan_qty  from TKimp_Ewo  E
                            inner join TK_Wrk_Man  M on E.wo=M.m_po and E.id=M.sourceid
                            where E.wo=@sourcewo and E.id=@sourceid and M.wo_code<>@wocode";
                    sql = @"select isnull(sum(plan_qty),0) as plan_qty   from TK_Wrk_Man
                            where sourceid=@sourceid and m_po=@sourcewo and wo_code<>@wocode";
                    dynamicParams.Add("@sourceid", sourceid);
                    dynamicParams.Add("@sourcewo", sourcewo);
                    dynamicParams.Add("@wocode", wocode);
                    var data = DapperHelper.selectdata(sql,dynamicParams);
                    //当前工单可修改数量=订单数量-非当前工单总下达工单数量
                    canupdate_qty = decimal.Parse(data.Rows[0]["qty"].ToString()) - decimal.Parse(data.Rows[0]["plan_qty"].ToString());
                    canupdate_qty = decimal.Parse(data0.Rows[0]["qty"].ToString()) - decimal.Parse(data.Rows[0]["plan_qty"].ToString());
                }
                if (data_sources == "MES")  //数据来源MES
                {
@@ -673,7 +678,7 @@
                {
                    //写入工单表
                    sql = @"insert into TK_Wrk_Man(wo_code,wotype,status,wkshp_code,plan_qty,lm_user,lm_date,materiel_code,sourceid,m_po,saleOrderDeliveryDate,piroque,isaps,data_sources,isstep)
                                values(@wo_code,@wotype,@status,@wkshp_code,@plan_qty,@lm_user,@lm_date,@materiel_code,@m_po,@saleOrderDeliveryDate,@orderlev,@isaps,@data_sources,@isstep)";
                                values(@wo_code,@wotype,@status,@wkshp_code,@plan_qty,@lm_user,@lm_date,@materiel_code,@sourceid,@m_po,@saleOrderDeliveryDate,@orderlev,@isaps,@data_sources,@isstep)";
                    list.Add(new
                    {
                        str = sql,
@@ -687,7 +692,7 @@
                            lm_user = us.usercode,
                            lm_date = DateTime.Now.ToString(),
                            materiel_code = json.partcode,
                            sourceid = json.sourceid==""?"NULL": json.sourceid, //无源单时赋值NULL
                            sourceid = json.sourceid == "" ? null : json.sourceid, //无源单时赋值NULL
                            m_po = json.sourcewo,
                            saleOrderDeliveryDate = json.deliverydate,
                            orderlev = "3",//优先级:特级(1) 紧急(2) 正常(3)
@@ -714,8 +719,8 @@
                                status = json.wostatus,
                                isbott = json.WorkListSub[i].isbott,
                                isend = json.WorkListSub[i].isend,
                                username = us.usercode,
                                CreateDate = DateTime.Now.ToString()
                                lm_user = us.usercode,
                                lm_date = DateTime.Now.ToString()
                            }
                        });
                    }
@@ -750,9 +755,10 @@
                        {
                            wo_code = json.wocode,
                            wotype = json.wotype,
                            wkshp_code = json.wkshopcode,
                            plan_qty = json.woqty,
                            materiel_code = json.partcode,
                            sourceid = json.sourceid == "" ? "NULL" : json.sourceid, //无源单时赋值NULL
                            sourceid = json.sourceid == "" ? null : json.sourceid, //无源单时赋值NULL
                            m_po = json.sourcewo,
                            saleOrderDeliveryDate = json.deliverydate,
                            lm_user = us.usercode,
@@ -788,8 +794,8 @@
                                status = json.wostatus,
                                isbott = json.WorkListSub[i].isbott,
                                isend = json.WorkListSub[i].isend,
                                username = us.usercode,
                                CreateDate = DateTime.Now.ToString()
                                lm_user = us.usercode,
                                lm_date = DateTime.Now.ToString()
                            }
                        });
                    }
@@ -908,6 +914,66 @@
        #endregion
        #region[MES工单派发提交]
        public static ToMessage MesOrderDistribution(string[] wocodelist, User us)
        {
            string sql = "";
            List<object> list = new List<object>();
            try
            {
                //更新工单表状态
                sql = @"update TK_Wrk_Man set status=@status where wo_code in @wocode";
                list.Add(new
                {
                    str = sql,
                    parm = new
                    {
                        wocode = wocodelist,
                        status = "ALLO"
                    }
                });
                //更新工序任务表状态
                sql = @"update TK_Wrk_Step set status=@status where wo_code in @wocode";
                list.Add(new
                {
                    str = sql,
                    parm = new
                    {
                        wocode = wocodelist,
                        status = "ALLO"
                    }
                });
                bool aa = DapperHelper.DoTransaction(list);
                if (aa)
                {
                    //写入操作记录表
                    LogHelper.DbOperateLog(us.usercode, "派发", "派发了工单:" + string.Join(",", wocodelist), us.usertype);
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "MES工单派发成功!";
                    mes.data = null;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "MES工建派发失败!";
                    mes.data = null;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[工单关闭列表查询]
        public static ToMessage MesOrderClosedSearch(string mesorderstus, string mesordercode, string sourceorder, string saleordercode, string ordertype, string partcode, string partname, string partspec, int startNum, string creatuser, string createdate, int endNum, string prop, string order)
        {
@@ -1005,7 +1071,7 @@
        #endregion
        #region[MES工单批量关闭提交]
        public static ToMessage MesOrderBitchClosedSeave(User us, DataTable dt)
        public static ToMessage MesOrderBitchClosedSeave(User us, string[] wocodelist)
        {
            var sql = "";
            List<object> list = new List<object>();
@@ -1015,15 +1081,17 @@
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //关闭工单对应工序任务
                    sql = @"update TK_Wrk_Step set status='CLOSED'  where wo_code=@wocode";
                    list.Add(new { str = sql, parm = new { wocode = dt.Rows[i]["WO_CODE"].ToString() } });
                    sql = @"update TK_Wrk_Step set status='CLOSED'  where wo_code in @wocode";
                    list.Add(new { str = sql, parm = new { wocode = wocodelist } });
                    //回写工单表状态为(关闭)
                    sql = @"update TK_Wrk_Man set status='CLOSED',closeuser=@username,closedate=@closedate  where wo_code=@wocode";
                    list.Add(new { str = sql, parm = new { wocode = dt.Rows[i]["WO_CODE"].ToString(), username = us.usercode, closedate = DateTime.Now.ToString() } });
                    sql = @"update TK_Wrk_Man set status='CLOSED',closeuser=@username,closedate=@closedate  where wo_code in @wocode";
                    list.Add(new { str = sql, parm = new { wocode = wocodelist, username = us.usercode, closedate = DateTime.Now.ToString() } });
                }
                bool aa = DapperHelper.DoTransaction(list);
                if (aa)
                {
                    //写入操作记录表
                    LogHelper.DbOperateLog(us.usercode, "关闭", "关闭了工单:" + string.Join(",", wocodelist), us.usertype);
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "工单关闭成功!";
@@ -1047,5 +1115,451 @@
            return mes;
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(自制)]
        public static ToMessage MesOrderStepSearch(string wocode, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
        {
            var sql = "";
            string search = "";
            string ordercode = "";
            string stepcode = "";
            var dynamicParams = new DynamicParameters();
            var total = 0; //总条数
            try
            {
                if (wocode != "" && wocode != null)
                {
                    string[] arra = wocode.Split(';');
                    if (arra.Length == 1) //工单号二维码
                    {
                        ordercode = arra[0]; //获取指定字符串前面的字符
                    }
                    if (arra.Length == 2) //工单号+工序号二维码
                    {
                        ordercode = arra[0]; //获取指定字符串前面的字符
                        stepcode = arra[1]; //获取指定字符串前面的字符
                    }
                    if (ordercode != "" && stepcode == null) //工单号不为空,工序号为空
                    {
                        search += "and A.wo_code=@ordercode ";
                        dynamicParams.Add("@ordercode", ordercode);
                    }
                    if (ordercode != "" && stepcode != "") //工单号不为空,工序号不为空
                    {
                        search += "and A.wo_code=@ordercode ";
                        dynamicParams.Add("@ordercode", ordercode);
                        search += "and S.stepcode=@stepcode ";
                        dynamicParams.Add("@stepcode", stepcode);
                    }
                }
                if (stepcode != "")
                {
                    //查找当前工序属性
                    sql = @"select *  from TStep  where stepcode=@stepcode";
                    dynamicParams.Add("@stepcode", stepcode);
                    var data0 = DapperHelper.selectdata(sql, dynamicParams);
                    if (data0.Rows.Count > 0)
                    {
                        if (data0.Rows[0]["FLWTYPE"].ToString() == "W")
                        {
                            mes.code = "300";
                            mes.count = 0;
                            mes.Message = "当前工序任务为外协工序任务,请前往外协操作页签执行!";
                            mes.data = null;
                            return mes;
                        }
                    }
                }
                if (partcode != "" && partcode != null)
                {
                    search += "and M.partcode like '%'+@partcode+'%' ";
                    dynamicParams.Add("@partcode", partcode);
                }
                if (partname != "" && partname != null)
                {
                    search += "and M.partname like '%'+@partname+'%' ";
                    dynamicParams.Add("@partname", partname);
                }
                if (partspec != "" && partspec != null)
                {
                    search += "and M.partspec like '%'+@partspec+'%' ";
                    dynamicParams.Add("@partspec", partspec);
                }
                //根据条件查询工单工序任务(自制工序)
                sql = @"select A.status,A.wo_code,M.partcode,M.partname,M.partspec,A.seq,A.isbott,A.isend,
                        S.stepcode,S.stepname,S.descr,A.plan_qty,A.good_qty,A.ng_qty,A.laborbad_qty,A.materielbad_qty,B.lm_date
                        from TK_Wrk_Step A
                        left join TK_Wrk_Man B on A.wo_code=B.wo_code
                        left join TMateriel_Info M on B.materiel_code=M.partcode
                        left join TStep S on A.step_code=S.stepcode
                        where A.status in('ALLO','START') and S.flwtype='Z'  " + search;
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                if (data.ToList().Count > 0)
                {
                    mes.code = "200";
                    mes.count = total;
                    mes.Message = "查询成功!";
                    mes.data = data.ToList();
                    return mes;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "无可执行的生产任务,任务已完成或已关闭!";
                    mes.data = null;
                    return mes;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(外协)]
        public static ToMessage MesOrderWxStepSearch(string wocode, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
        {
            var sql = "";
            string search = "";
            string ordercode = "";
            string stepcode = "";
            var dynamicParams = new DynamicParameters();
            var total = 0; //总条数
            try
            {
                if (wocode != "" && wocode != null)
                {
                    string[] arra = wocode.Split(';');
                    if (arra.Length == 1) //工单号二维码
                    {
                        ordercode = arra[0]; //获取指定字符串前面的字符
                    }
                    if (arra.Length == 2) //工单号+工序号二维码
                    {
                        ordercode = arra[0]; //获取指定字符串前面的字符
                        stepcode = arra[1]; //获取指定字符串前面的字符
                    }
                    if (ordercode != "" && stepcode == null) //工单号不为空,工序号为空
                    {
                        search += "and A.wo_code=@ordercode ";
                        dynamicParams.Add("@ordercode", ordercode);
                    }
                    if (ordercode != "" && stepcode != "") //工单号不为空,工序号不为空
                    {
                        search += "and A.wo_code=@ordercode ";
                        dynamicParams.Add("@ordercode", ordercode);
                        search += "and S.stepcode=@stepcode ";
                        dynamicParams.Add("@stepcode", stepcode);
                    }
                }
                if (stepcode != "")
                {
                    //查找当前工序属性
                    sql = @"select *  from TStep  where stepcode=@stepcode";
                    dynamicParams.Add("@stepcode", stepcode);
                    var data0 = DapperHelper.selectdata(sql, dynamicParams);
                    if (data0.Rows.Count > 0)
                    {
                        if (data0.Rows[0]["FLWTYPE"].ToString() == "Z")
                        {
                            mes.code = "300";
                            mes.count = 0;
                            mes.Message = "当前工序任务为自制工序任务,请前往自制操作页签执行!";
                            mes.data = null;
                            return mes;
                        }
                    }
                }
                if (partcode != "" && partcode != null)
                {
                    search += "and M.partcode like '%'+@partcode+'%' ";
                    dynamicParams.Add("@partcode", partcode);
                }
                if (partname != "" && partname != null)
                {
                    search += "and M.partname like '%'+@partname+'%' ";
                    dynamicParams.Add("@partname", partname);
                }
                if (partspec != "" && partspec != null)
                {
                    search += "and M.partspec like '%'+@partspec+'%' ";
                    dynamicParams.Add("@partspec", partspec);
                }
                //根据条件查询工单工序任务(自制工序)
                sql = @"select A.status,A.wo_code,M.partcode,M.partname,M.partspec,A.seq,A.isbott,A.isend,
                        S.stepcode,S.stepname,S.descr,A.plan_qty,A.good_qty,A.ng_qty,A.laborbad_qty,A.materielbad_qty,A.plan_startdate,A.plan_enddate,B.lm_date
                        from TK_Wrk_Step A
                        left join TK_Wrk_Man B on A.wo_code=B.wo_code
                        left join TMateriel_Info M on B.materiel_code=M.partcode
                        left join TStep S on A.step_code=S.stepcode
                        where A.status in('ALLO','START') and S.flwtype='W'  " + search;
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                if (data.ToList().Count > 0)
                {
                    mes.code = "200";
                    mes.count = total;
                    mes.Message = "查询成功!";
                    mes.data = data.ToList();
                    return mes;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "无可执行的生产任务,任务已完成或已关闭!";
                    mes.data = null;
                    return mes;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(不良)]
        public static ToMessage MesOrderNgStepSearch(string wocode, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
        {
            var sql = "";
            string search = "";
            string ordercode = "";
            string stepcode = "";
            var dynamicParams = new DynamicParameters();
            var total = 0; //总条数
            try
            {
                if (wocode != "" && wocode != null)
                {
                    string[] arra = wocode.Split(';');
                    if (arra.Length == 1) //工单号二维码
                    {
                        ordercode = arra[0]; //获取指定字符串前面的字符
                    }
                    if (arra.Length == 2) //工单号+工序号二维码
                    {
                        ordercode = arra[0]; //获取指定字符串前面的字符
                        stepcode = arra[1]; //获取指定字符串前面的字符
                    }
                    if (ordercode != "" && stepcode == null) //工单号不为空,工序号为空
                    {
                        search += "and A.wo_code=@ordercode ";
                        dynamicParams.Add("@ordercode", ordercode);
                    }
                    if (ordercode != "" && stepcode != "") //工单号不为空,工序号不为空
                    {
                        search += "and A.wo_code=@ordercode ";
                        dynamicParams.Add("@ordercode", ordercode);
                        search += "and S.stepcode=@stepcode ";
                        dynamicParams.Add("@stepcode", stepcode);
                    }
                }
                if (stepcode != "")
                {
                    //查找当前工序任务
                    sql = @"select *  from TK_Wrk_Step  where step_code=@stepcode and wo_code=@ordercode";
                    dynamicParams.Add("@stepcode", stepcode);
                    dynamicParams.Add("@ordercode", ordercode);
                    var data0 = DapperHelper.selectdata(sql, dynamicParams);
                    if (data0.Rows.Count <= 0)
                    {
                        mes.code = "300";
                        mes.count = 0;
                        mes.Message = "当前工序任务不存在,无效条码!";
                        mes.data = null;
                        return mes;
                    }
                }
                if (partcode != "" && partcode != null)
                {
                    search += "and M.partcode like '%'+@partcode+'%' ";
                    dynamicParams.Add("@partcode", partcode);
                }
                if (partname != "" && partname != null)
                {
                    search += "and M.partname like '%'+@partname+'%' ";
                    dynamicParams.Add("@partname", partname);
                }
                if (partspec != "" && partspec != null)
                {
                    search += "and M.partspec like '%'+@partspec+'%' ";
                    dynamicParams.Add("@partspec", partspec);
                }
                //根据条件查询工单工序任务(自制工序)
                sql = @"select A.wo_code,M.partcode,M.partname,M.partspec,A.seq,A.isend,
                        S.stepcode,S.stepname,S.descr,A.plan_qty,A.good_qty,A.ng_qty,A.laborbad_qty,A.materielbad_qty,B.lm_date
                        from TK_Wrk_Step A
                        left join TK_Wrk_Man B on A.wo_code=B.wo_code
                        left join TMateriel_Info M on B.materiel_code=M.partcode
                        left join TStep S on A.step_code=S.stepcode
                        where A.status in('ALLO','START') and A.ng_qty>0  " + search;
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                if (data.ToList().Count > 0)
                {
                    mes.code = "200";
                    mes.count = total;
                    mes.Message = "查询成功!";
                    mes.data = data.ToList();
                    return mes;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "无可执行的生产任务,任务已完成或已关闭!";
                    mes.data = null;
                    return mes;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[生产开报工扫码获取工单对应工序任务(不良明细)]
        public static ToMessage MesOrderNgSubStepSearch(string wocode, string stepcode)
        {
            var sql = "";
            var dynamicParams = new DynamicParameters();
            var dynamicParams1 = new DynamicParameters();
            Dictionary<string, object> list = new Dictionary<string, object>();
            ScanStartReportData rt = new ScanStartReportData();
            try
            {
                //1.根据工单+工序查找当前工序是否首道工序
                sql = @"select A.wo_code,P.partcode,P.partname,P.partspec, T.stepcode,T.stepname,A.seq,T.flwtype,T.descr,A.status,
                        A.plan_qty,A.good_qty,A.ng_qty,A.laborbad_qty,A.materielbad_qty,A.isbott,A.isend
                        from TK_Wrk_Step A
                        left join  TStep T on A.step_code=T.stepcode
                        left join  TK_Wrk_Man M on A.wo_code=M.wo_code
                        left join  TMateriel_Info P on M.materiel_code=P.partcode
                        where A.wo_code=@ordercode and A.step_code=@stepcode";
                dynamicParams.Add("@ordercode", wocode);
                dynamicParams.Add("@stepcode", stepcode);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                if (data.Rows.Count > 0)
                {
                    rt.wo_code = data.Rows[0]["wo_code"].ToString(); //工单号
                    rt.partnumber = data.Rows[0]["partcode"].ToString(); //产品编码
                    rt.partname = data.Rows[0]["partname"].ToString(); //产品名称
                    rt.partspec = data.Rows[0]["partspec"].ToString(); //产品规格
                    rt.stepcode = data.Rows[0]["stepcode"].ToString(); //工序编码
                    rt.stepname = data.Rows[0]["stepname"].ToString(); //工序名称
                    rt.stepdesc = data.Rows[0]["descr"].ToString(); //工序描述
                    rt.planqty = decimal.Parse(data.Rows[0]["plan_qty"].ToString()); //任务数量
                    rt.noreportqty = decimal.Parse(data.Rows[0]["good_qty"].ToString()); //报工数量
                    rt.noputqty = decimal.Parse(data.Rows[0]["ng_qty"].ToString()); //不良数量
                    string isend = data.Rows[0]["isend"].ToString();//末道工序
                    rt.seq = data.Rows[0]["seq"].ToString();//工序序号
                    //获取当前工序下道工序
                    sql = @"select A.isbott,A.isend,T.stepcode,T.stepname from TK_Wrk_Step A
                            left join  TStep T on A.step_code=T.stepcode
                            where A.wo_code=@ordercode and A.seq=@seq+1 ";
                    dynamicParams.Add("@ordercode", wocode);
                    dynamicParams.Add("@seq", decimal.Parse(data.Rows[0]["seq"].ToString()));
                    var dt0 = DapperHelper.selectdata(sql, dynamicParams);
                    if (dt0.Rows.Count > 0) //有下道工序
                    {
                        rt.nextstepcode = dt0.Rows[0]["stepcode"].ToString();//下道工序编码
                        rt.nextstepname = dt0.Rows[0]["stepname"].ToString();//下道工序名称
                    }
                    if (isend == "Y")  //当前工序是末道工序
                    {
                        rt.nextstepcode = "";//赋空
                        rt.nextstepname = "";//赋空
                    }
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "当前工序任务不存在!";
                    mes.data = null;
                    return mes;
                }
                //根据条件查询工单工序报工(收料)记录,且不良数量大于0
                //存储过程名
                sql = @"h_p_IFCLD_MesReportDefectHandleSelect";
                dynamicParams1.Add("@ordercode", wocode);
                dynamicParams1.Add("@stepcode", stepcode);
                DataTable dt = DapperHelper.selectProcedure(sql, dynamicParams1);
                if (dt.Rows.Count > 0)
                {
                    list.Add("data1", rt);
                    list.Add("data2", dt);
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "查询成功!";
                    mes.data = list;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "无可执行的生产任务,任务已完成或已关闭!";
                    mes.data = null;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region [生产开报工:报工/外协(发料/收料)时条件判断及数据返回接口]
        public static ToMessage MesOrderStepStart(string OperType, string SelectType, string wocode, string stepcode)
        {
            var dynamicParams = new DynamicParameters();
            try
            {
                switch (OperType)
                {
                    case "ZZ":
                        mes = ScanStartReport.ZZEncodingSeach(wocode, stepcode);
                        break;
                    case "WX":
                        mes = ScanStartReport.WXEncodingSeach(SelectType, stepcode, stepcode);
                        break;
                    default:
                        break;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
    }
}
VueWebCoreApi/Tools/ScanStartReport.cs
@@ -17,11 +17,10 @@
        /// <summary>
        /// 扫码信息为工单+工序条码
        /// </summary>
        /// <param name="stu_torgcode">所属组织编码</param>
        /// <param name="ordercode">工单编号</param>
        /// <param name="stepcode">工序编码</param>
        /// <returns></returns>
        public static ToMessage ZZEncodingSeach(string stu_torgcode, string ordercode, string stepcode)
        public static ToMessage ZZEncodingSeach(string ordercode, string stepcode)
        {
            var sql = "";
            string flwtype = ""; //工序属性
@@ -34,29 +33,14 @@
            try
            {
                //判断当前工单是否关闭
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and wkshp_code=@stu_torgcode and status='CLOSED'";
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and status='CLOSED'";
                dynamicParams.Add("@ordercode", ordercode);
                dynamicParams.Add("@stu_torgcode", stu_torgcode);
                var da0 = DapperHelper.selectdata(sql, dynamicParams);
                if (da0.Rows.Count > 0) 
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "当前工单已关闭,不允许开报工操作!";
                    mes.data = null;
                    return mes;
                }
                //0.判断当前工单所属车间是否为当前登录人员车间
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and wkshp_code=@stu_torgcode";
                dynamicParams.Add("@ordercode", ordercode);
                dynamicParams.Add("@stu_torgcode", stu_torgcode);
                var da1 = DapperHelper.selectdata(sql, dynamicParams);
                if (da1.Rows.Count<=0)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "不是本车间生产任务,不允许操作!";
                    mes.data = null;
                    return mes;
                }
@@ -112,7 +96,7 @@
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "当前扫码工序任务不存在!";
                    mes.Message = "当前工序任务不存在!";
                    mes.data = null;
                    return mes;
                }
@@ -120,15 +104,6 @@
                {
                    case "Z":  //自制工序
                        if (isbott == "Y")  //首道工序
                        {
                            //1.首道工序时,判断是否有开工记录
                            sql = @"select *   from TK_Wrk_Record R
                                    left join TEqpInfo E on R.eqp_code=E.code
                                    where R.wo_code=@ordercode and R.step_code=@stepcode and R.style='S'";
                            dynamicParams.Add("@ordercode", ordercode);
                            dynamicParams.Add("@stepcode", stepcode);
                            var data0 = DapperHelper.selectdata(sql, dynamicParams);
                            if (data0.Rows.Count > 0)  //有开工记录
                            {
                                //首道工序时,判断是否有报工记录
                                sql = @"select *   from TK_Wrk_Record where wo_code=@ordercode and step_code=@stepcode and style='B'";
@@ -139,9 +114,10 @@
                                {
                                    decimal good_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("GOOD_QTY")).Sum();  //报工总数量
                                    decimal ng_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();  //不良数量
                                    decimal bad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //报废数量
                                    decimal kbqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - (good_qty + ng_qty+bad_qty); //剩余可报工数量=任务数量-(报工数量+不良数量+报废数量)
                                decimal laborbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //工废数量
                                decimal materielbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //料废数量
                                //剩余可报工数量=任务数量-(报工数量+不良数量+工废废数量+料废数量)
                                decimal kbqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - (good_qty + ng_qty + laborbad_qty + materielbad_qty);
                                    if (kbqty <= 0)//无可报工数量
                                    {
                                        mes.code = "300";
@@ -152,64 +128,37 @@
                                    }
                                    else
                                    {
                                        rt.eqpcode = data0.Rows[0]["code"].ToString();                              //开工设备编码
                                        rt.eqpname = data0.Rows[0]["name"].ToString();                              //开工设备名称
                                        rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());            //任务数量
                                        rt.startqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());           //开工数量=任务数量
                                        rt.noreportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - good_qty- ng_qty-bad_qty;  //未报数量=任务数量-已报数量-不良数量-报废数量
                                        rt.reportqty = good_qty + ng_qty+bad_qty;             //已报数量=报工数量+不良数量+报废数量
                                    rt.noreportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - good_qty - ng_qty - laborbad_qty - materielbad_qty;  //未报数量=任务数量-已报数量-不良数量-工废数量-料废数量
                                    rt.reportqty = good_qty + ng_qty + laborbad_qty+ materielbad_qty;             //已报数量=报工数量+不良数量+工废数量+料废数量
                                        mes.code = "200";
                                        mes.count = 1;
                                        mes.Message = "弹窗报工界面!";
                                        mes.data = rt;
                                    }
                                }
                                else
                                {
                                    rt.eqpcode = data0.Rows[0]["code"].ToString();                              //开工设备编码
                                    rt.eqpname = data0.Rows[0]["name"].ToString();                              //开工设备名称
                                    rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                                    rt.startqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //开工数量
                                    rt.noreportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //未报数量
                                    rt.reportqty = 0;                                                    //已报数量
                                    mes.code = "200";
                                    mes.count = 1;
                                    mes.Message = "弹窗报工界面!";
                                    mes.Message = "查找成功!";
                                    mes.data = rt;
                                }
                            }
                            else
                            {
                                rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                                rt.startqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //开工数量
                                rt.noreportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //未报数量
                                rt.reportqty = 0;                                                    //已报数量
                                mes.code = "200";
                                mes.count = 0;
                                mes.Message = "弹窗开工界面!";
                                mes.count = 1;
                                mes.Message = "查找成功!";
                                mes.data = rt;
                            }
                        }
                        else   //非首道工序
                        {
                            //查找当前工序上到工序(自制或者外协)
                            sql = @"select A.step_code,S.stepname,S.flwtype  from TFlw_Rtdt A
                                               left join TK_Wrk_Man M on A.rout_code=M.route_code
                            sql = @"select A.step_code,S.stepname,S.flwtype   from TK_Wrk_Step A
                                               left join TStep S on A.step_code=S.stepcode
                                               where M.wo_code=@wocode  and A.seq=@seq-1";
                                    where A.wo_code=@wocode  and A.seq=@seq-1";
                            dynamicParams.Add("@wocode", data.Rows[0]["WO_CODE"].ToString());
                            dynamicParams.Add("@seq", decimal.Parse(data.Rows[0]["SEQ"].ToString()));
                            var data0 = DapperHelper.selectdata(sql, dynamicParams);
                            if (data0.Rows.Count > 0)
                            {
                                //1.非首道工序时,判断本道是否有开工记录
                                sql = @"select *   from TK_Wrk_Record R
                                        left join TEqpInfo E on R.eqp_code=E.code
                                        where R.wo_code=@ordercode and R.step_code=@stepcode and R.style='S'";
                                dynamicParams.Add("@ordercode", ordercode);
                                dynamicParams.Add("@stepcode", stepcode);
                                var data1 = DapperHelper.selectdata(sql, dynamicParams);
                                if (data1.Rows.Count > 0)//本道有开工记录
                                {
                                    //非首道工序时,判断本道是否有报工记录
                                    sql = @"select *   from TK_Wrk_Record where wo_code=@ordercode and step_code=@stepcode and style='B'";
@@ -230,9 +179,10 @@
                                                decimal sgood_qty = data3.AsEnumerable().Select(d => d.Field<decimal>("GOOD_QTY")).Sum();  //上道报工总数量
                                                decimal good_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("GOOD_QTY")).Sum();  //本道报工总数量
                                                decimal ng_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();  //本道不良总数量
                                                decimal bad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //本道总报废数量
                                                decimal sybqty = sgood_qty - good_qty - ng_qty-bad_qty;//本道剩余可报数量=上道报工总数量-本道报工总数量-本道不良总数量-本道报废总数
                                            decimal laborbad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //本道总工废数量
                                            decimal materielbad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //本道总料废数量
                                            //本道剩余可报数量=上道报工总数量-本道报工总数量-本道不良总数量-本道工废总数-本道料废总数
                                            decimal sybqty = sgood_qty - good_qty - ng_qty - laborbad_qty- materielbad_qty;
                                                if (sybqty <= 0)
                                                {
                                                    mes.code = "300";
@@ -247,16 +197,13 @@
                                                    {
                                                        mes.code = "300";
                                                        mes.count = 0;
                                                        mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 合格产出为0,本道不允许开报工!";
                                                    mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 合格产出为0,本道不允许报工!";
                                                        mes.data = null;
                                                        return mes;
                                                    }
                                                    rt.eqpcode = data1.Rows[0]["code"].ToString();                              //开工设备编码
                                                    rt.eqpname = data1.Rows[0]["name"].ToString();                              //开工设备名称
                                                    rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                                                    rt.startqty = sybqty;                                                //开工数量=本道剩余可报数量
                                                    rt.noreportqty = sybqty;                                             //未报数量=本道剩余可报数量
                                                    rt.reportqty = good_qty + ng_qty+bad_qty;                            //已报数量=本道报工总数量+本道报工总不良+本道报废总数
                                                rt.reportqty = good_qty + ng_qty + laborbad_qty+ materielbad_qty;//已报数量=本道报工总数量+本道报工总不良+本道工废总数+本道料废总数
                                                    mes.code = "200";
                                                    mes.count = 1;
                                                    mes.Message = "弹窗报工界面!";
@@ -267,7 +214,7 @@
                                            {
                                                mes.code = "300";
                                                mes.count = 0;
                                                mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未报工,本道不允许开报工!";
                                            mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未报工,本道不允许报工!";
                                                mes.data = null;
                                                return mes;
                                            }
@@ -284,9 +231,10 @@
                                                decimal sqty = data3.AsEnumerable().Select(d => d.Field<decimal>("SQTY")).Sum();  //上道收料数量
                                                decimal good_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("GOOD_QTY")).Sum();  //本道报工总数量
                                                decimal ng_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();  //本道不良总数量
                                                decimal bad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //本道总报废数量
                                                decimal sybqty = sqty - good_qty - ng_qty-bad_qty;//本道剩余可报数量=上道收料总数量-本道报工总数量-本道不良总数量-本道总报废数
                                            decimal laborbad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //本道总工废数量
                                            decimal materielbad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //本道总料废数量
                                            //本道剩余可报数量=上道收料总数量-本道报工总数量-本道不良总数量-本道总工废数量-本道总料废数量
                                            decimal sybqty = sqty - good_qty - ng_qty - laborbad_qty- materielbad_qty;
                                                if (sybqty <= 0)
                                                {
                                                    mes.code = "300";
@@ -305,15 +253,12 @@
                                                        mes.data = null;
                                                        return mes;
                                                    }
                                                    rt.eqpcode = data1.Rows[0]["code"].ToString();                              //开工设备编码
                                                    rt.eqpname = data1.Rows[0]["name"].ToString();                              //开工设备名称
                                                    rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                                                    rt.startqty = sybqty;                                                //开工数量=本道剩余可报数量
                                                    rt.noreportqty = sybqty;                                             //未报数量=本道剩余可报数量
                                                    rt.reportqty = good_qty + ng_qty+bad_qty;                            //已报数量=本道报工总数量+本道报工总不良+本道总报废数
                                                rt.reportqty = good_qty + ng_qty + laborbad_qty+materielbad_qty; //已报数量=本道报工总数量+本道报工总不良+本道总工废数+本道总料废数
                                                    mes.code = "200";
                                                    mes.count = 1;
                                                    mes.Message = "弹窗报工界面!";
                                                mes.Message = "查找成功!";
                                                    mes.data = rt;
                                                }
                                            }
@@ -348,22 +293,19 @@
                                                    mes.data = null;
                                                    return mes;
                                                }
                                                rt.eqpcode = data1.Rows[0]["code"].ToString();                              //开工设备编码
                                                rt.eqpname = data1.Rows[0]["name"].ToString();                              //开工设备名称
                                                rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                                                rt.startqty = sybqty;                                                //开工数量=本道剩余可报数量
                                                rt.noreportqty = sybqty;                                             //未报数量=本道剩余可报数量
                                                rt.reportqty = 0;                                                    //已报数量
                                                mes.code = "200";
                                                mes.count = 1;
                                                mes.Message = "弹窗报工界面!";
                                            mes.Message = "查找成功!";
                                                mes.data = rt;
                                            }
                                            else
                                            {
                                                mes.code = "300";
                                                mes.count = 0;
                                                mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未报工,本道不允许开报工!";
                                            mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未报工,本道不允许报工!";
                                                mes.data = null;
                                                return mes;
                                            }
@@ -387,102 +329,19 @@
                                                    mes.data = null;
                                                    return mes;
                                                }
                                                rt.eqpcode = data1.Rows[0]["code"].ToString();                              //开工设备编码
                                                rt.eqpname = data1.Rows[0]["name"].ToString();                              //开工设备名称
                                                rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                                                rt.startqty = sybqty;                                                //开工数量=本道剩余可收数量
                                                rt.noreportqty = sybqty;                                             //未报数量=本道剩余可收数量
                                                rt.reportqty = 0;                                                    //已报数量
                                                mes.code = "200";
                                                mes.count = 1;
                                                mes.Message = "弹窗报工界面!";
                                            mes.Message = "查找成功!";
                                                mes.data = rt;
                                            }
                                            else
                                            {
                                                mes.code = "300";
                                                mes.count = 0;
                                                mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未收料,本道不允许开报工,请前往外协操作页执行!";
                                                mes.data = null;
                                                return mes;
                                            }
                                        }
                                    }
                                }
                                else //无开工记录
                                {
                                    if (data0.Rows[0]["FLWTYPE"].ToString() == "Z")  //自制工序
                                    {
                                        //查找上到工序报工记录
                                        sql = @"select *   from TK_Wrk_Record where wo_code=@ordercode and step_code=@stepcode and style='B'";
                                        dynamicParams.Add("@ordercode", ordercode);
                                        dynamicParams.Add("@stepcode", data0.Rows[0]["STEP_CODE"].ToString());
                                        var data2 = DapperHelper.selectdata(sql, dynamicParams);
                                        if (data2.Rows.Count > 0) //上到工序有报工
                                        {
                                            decimal good_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("GOOD_QTY")).Sum();//报工数量
                                            decimal ng_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();// 不良数量
                                            decimal bad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();// 报废数量
                                            if (good_qty == null || good_qty == 0)
                                            {
                                                mes.code = "300";
                                                mes.count = 0;
                                                mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 合格产出为0,本道不允许开报工!";
                                                mes.data = null;
                                                return mes;
                                            }
                                            rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                            rt.startqty = good_qty;                               //开工数量=(上一道的报工总数量)
                                            rt.noreportqty = good_qty;                            //未报数量=(上一道的报工总数量)
                                            rt.reportqty = 0;                                                    //已报数量
                                            mes.code = "200";
                                            mes.count = 0;
                                            mes.Message = "弹窗开工界面!";
                                            mes.data = rt;
                                        }
                                        else
                                        {
                                            mes.code = "300";
                                            mes.count = 0;
                                            mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未报工,本道不允许开报工!";
                                            mes.data = null;
                                            return mes;
                                        }
                                    }
                                    if (data0.Rows[0]["FLWTYPE"].ToString() == "W")  //委外工序
                                    {
                                        //查找上道工序外协收料记录
                                        sql = @"select *   from TK_Wrk_OutRecord where wo_code=@ordercode and step_code=@stepcode and style='S'";
                                        dynamicParams.Add("@ordercode", ordercode);
                                        dynamicParams.Add("@stepcode", data0.Rows[0]["STEP_CODE"].ToString());
                                        var data2 = DapperHelper.selectdata(sql, dynamicParams);
                                        if (data2.Rows.Count > 0) //上道工序有收料
                                        {
                                            decimal sqty = data2.AsEnumerable().Select(d => d.Field<decimal>("SQTY")).Sum();//收料数量
                                            decimal ng_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();// 不良数量
                                            decimal bad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();// 报废数量
                                            if (sqty == null || sqty == 0)
                                            {
                                                mes.code = "300";
                                                mes.count = 0;
                                                mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 合格收料为0,本道不允许开报工!";
                                                mes.data = null;
                                                return mes;
                                            }
                                            rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                            rt.startqty = sqty;                                                  //开工数量=(上一道的收料数量)
                                            rt.noreportqty = sqty;                                               //未报数量=(上一道的收料数量)
                                            rt.reportqty = 0;                                                    //已报数量
                                            mes.code = "200";
                                            mes.count = 0;
                                            mes.Message = "弹窗开工界面!";
                                            mes.data = rt;
                                        }
                                        else
                                        {
                                            mes.code = "300";
                                            mes.count = 0;
                                            mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未收料,本道不允许开报工,请前往外协操作页执行!";
                                            mes.Message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 的上道工序:" + data0.Rows[0]["STEPNAME"].ToString() + " 未收料,本道不允许报工,请前往外协操作页执行!";
                                            mes.data = null;
                                            return mes;
                                        }
@@ -503,7 +362,7 @@
                    case "W":  //外协工序
                        mes.code = "300";
                        mes.count = 0;
                        mes.Message = "当前标签为外协标签,请前往外协操作标签页扫码!";
                        mes.Message = "当前工单工序任务为外协,请前往外协操作标签页操作!";
                        mes.data = null;
                        break;
                    default:   //自制+外协工序
@@ -527,12 +386,11 @@
        /// <summary>
        /// 生产开报工:外协工序任务开报工判断:工单号+工序
        /// </summary>
        /// <param name="stu_torgcode">所属组织编码</param>
        /// <param name="SelectType">操作类型</param>
        /// <param name="ordercode">工单编号</param>
        /// <param name="stepcode">工序编码</param>
        /// <returns></returns>
        public static ToMessage WXEncodingSeach(string stu_torgcode, string SelectType, string ordercode, string stepcode)
        public static ToMessage WXEncodingSeach(string SelectType, string ordercode, string stepcode)
        {
            var sql = "";
            string flwtype = ""; //工序属性
@@ -545,29 +403,14 @@
            try
            {
                //判断当前工单是否关闭
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and wkshp_code=@stu_torgcode and status='CLOSED'";
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and status='CLOSED'";
                dynamicParams.Add("@ordercode", ordercode);
                dynamicParams.Add("@stu_torgcode", stu_torgcode);
                var da0 = DapperHelper.selectdata(sql, dynamicParams);
                if (da0.Rows.Count > 0)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "当前工单已关闭,不允许开报工操作!";
                    mes.data = null;
                    return mes;
                }
                //0.判断当前工单所属车间是否为当前登录人员车间
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and wkshp_code=@stu_torgcode";
                dynamicParams.Add("@ordercode", ordercode);
                dynamicParams.Add("@stu_torgcode", stu_torgcode);
                var da1 = DapperHelper.selectdata(sql, dynamicParams);
                if (da1.Rows.Count <= 0)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "不是本车间生产任务,不允许操作!";
                    mes.data = null;
                    return mes;
                }
@@ -652,8 +495,9 @@
                                    {
                                        decimal fqty = data0.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();  //发料数量
                                        decimal ng_qty =data0.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();// 不良数量
                                        decimal bad_qty = data0.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //报废数量
                                        decimal kfqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - fqty - ng_qty- bad_qty;  //剩余可发数量
                                        decimal laborbad_qty = data0.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //工废数量
                                        decimal materielbad_qty = data0.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //料废数量
                                        decimal kfqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - fqty - ng_qty - laborbad_qty-materielbad_qty; //剩余可发数量
                                        if (kfqty <= 0)
                                        {
                                            mes.code = "300";
@@ -670,7 +514,7 @@
                                            rt.startqty = kfqty;                                                 //发料数量=剩余可发数量      
                                            mes.code = "200";
                                            mes.count = 2;
                                            mes.Message = "弹窗发料界面!";
                                            mes.Message = "查询成功!";
                                            mes.data = rt;
                                        }
                                    }
@@ -689,10 +533,9 @@
                                else //非首道
                                {
                                    //查找当前工序上到工序(自制或者外协)
                                    sql = @"select A.step_code,S.stepname,S.flwtype  from TFlw_Rtdt A
                                               left join TK_Wrk_Man M on A.rout_code=M.route_code
                                    sql = @"select A.step_code,S.stepname,S.flwtype   from TK_Wrk_Step A
                                               left join TStep S on A.step_code=S.stepcode
                                               where M.wo_code=@wocode  and A.seq=@seq-1";
                                            where A.wo_code=@wocode  and A.seq=@seq-1";
                                    dynamicParams.Add("@wocode", data.Rows[0]["WO_CODE"].ToString());
                                    dynamicParams.Add("@seq", decimal.Parse(data.Rows[0]["SEQ"].ToString()));
                                    var data0 = DapperHelper.selectdata(sql, dynamicParams);
@@ -719,9 +562,10 @@
                                                    decimal sgood_qty = data3.AsEnumerable().Select(d => d.Field<decimal>("GOOD_QTY")).Sum();  //本道报工总数量
                                                    decimal sqty = data1.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();//本道发料数量
                                                    decimal ng_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();// 本道不良数量
                                                    decimal bad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //本道报废数量
                                                    decimal sybqty =sgood_qty - sqty - ng_qty- bad_qty;//本道剩余可发数量=上道报工数量-本道发料数量-本道不良数量-本道报废数量
                                                    decimal laborbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //本道工废数量
                                                    decimal materielbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //本道料废数量
                                                    //本道剩余可发数量=上道报工数量-本道发料数量-本道不良数量-本道工废数量-本道料废数量
                                                    decimal sybqty = sgood_qty - sqty - ng_qty - laborbad_qty- materielbad_qty;
                                                    if (sybqty <= 0)
                                                    {
                                                        mes.code = "300";
@@ -742,7 +586,7 @@
                                                        }
                                                        rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                                        rt.noreportqty = sybqty;                                             //未发数量=剩余可发数量
                                                        rt.reportqty = sqty + ng_qty+bad_qty;                                //已发数量= 本道发料数量+本道不良数量+本道报废数量
                                                        rt.reportqty = sqty + ng_qty + laborbad_qty+ materielbad_qty;       //已发数量= 本道发料数量+本道不良数量+本道工废数量+本道料废数量
                                                        rt.startqty = sybqty;                                                //收料数量=剩余可发数量      
                                                        mes.code = "200";
@@ -772,9 +616,10 @@
                                                    decimal ssqty = data3.AsEnumerable().Select(d => d.Field<decimal>("SQTY")).Sum();//上道收料数量
                                                    decimal sqty = data1.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();//本道发料数量
                                                    decimal ng_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();// 本道不良数量
                                                    decimal bad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //本道报废数量
                                                    decimal sybqty = ssqty - sqty - ng_qty-bad_qty;//本道剩余可发数量=上道收料数量-本道发料数量-本道不良数量-本道报废数量
                                                    decimal laborbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //本道工废数量
                                                    decimal materielbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //本道料废数量
                                                    //本道剩余可发数量=上道收料数量-本道发料数量-本道不良数量-本道工废数量-本道料废数量
                                                    decimal sybqty = ssqty - sqty - ng_qty - laborbad_qty-materielbad_qty;
                                                    if (sybqty <= 0)
                                                    {
                                                        mes.code = "300";
@@ -795,7 +640,7 @@
                                                        }
                                                        rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                                        rt.noreportqty = sybqty;                                             //未发数量=剩余可发数量
                                                        rt.reportqty = sqty + ng_qty+bad_qty;                                //已发数量= 本道发料数量+本道不良数量+本道报废数量
                                                        rt.reportqty = sqty + ng_qty + laborbad_qty+materielbad_qty;         //已发数量= 本道发料数量+本道不良数量+本道工废数量+本道料废数量
                                                        rt.startqty = sybqty;                                                //收料数量=剩余可发数量      
                                                        mes.code = "200";
@@ -962,8 +807,10 @@
                                            decimal fqty = data0.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();//本道发料数量
                                            decimal sqty = data1.AsEnumerable().Select(d => d.Field<decimal>("SQTY")).Sum();//本道收料数量
                                            decimal ng_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();//本道不良数量
                                            decimal bad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //本道报废数量
                                            decimal ksqty = fqty - sqty - ng_qty-bad_qty;  //剩余可发数量=本道发料数量-本道收料数量-本道不良数量-本道报废数量
                                            decimal laborbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //本道工废数量
                                            decimal materielbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //本道料废数量
                                            //剩余可发数量=本道发料数量-本道收料数量-本道不良数量-本道工废数量-本道料废数量
                                            decimal ksqty = fqty - sqty - ng_qty - laborbad_qty-materielbad_qty;
                                            if (ksqty <= 0)
                                            {
                                                mes.code = "300";
@@ -976,16 +823,18 @@
                                            {
                                                rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                                rt.noreportqty = ksqty;                                              //未收数量=本道发料数量
                                                rt.reportqty = sqty + ng_qty+bad_qty;                                //已收数量
                                                rt.reportqty = sqty + ng_qty + laborbad_qty+materielbad_qty;          //已收数量
                                                rt.startqty = ksqty;                                                  //收料数量=本道发料数量      
                                              
                                                data0.Merge(data1);//将指定的dt合并                                                 
                                                rt.list = data0.AsEnumerable().GroupBy(r => new {
                                                rt.list = data0.AsEnumerable().GroupBy(r => new
                                                {
                                                    wo_code = r["wo_code"],
                                                    step_code = r["step_code"],
                                                    code = r["code"],
                                                    name = r["name"]
                                                }).Select(g => new {
                                                }).Select(g => new
                                                {
                                                    Name = g.Key.code,
                                                    tp = g.Key.name,
                                                    fqty = g.Sum(i => (decimal)i["fqty"]),
@@ -1010,12 +859,14 @@
                                            rt.startqty = fqty;                                                  //收料数量=本道发料数量
                                                                                                                 //
                                            data0.Merge(data1);//将指定的dt合并                                                 
                                            rt.list = data0.AsEnumerable().GroupBy(r => new {
                                            rt.list = data0.AsEnumerable().GroupBy(r => new
                                            {
                                                wo_code = r["wo_code"],
                                                step_code = r["step_code"],
                                                code = r["code"],
                                                name = r["name"]
                                            }).Select(g => new {
                                            }).Select(g => new
                                            {
                                                Name = g.Key.code,
                                                tp = g.Key.name,
                                                fqty = g.Sum(i => (decimal)i["fqty"]),
@@ -1042,10 +893,9 @@
                                else //非首道
                                {
                                    //查找当前工序上到工序(自制或者外协)
                                    sql = @"select A.step_code,S.stepname,S.flwtype  from TFlw_Rtdt A
                                               left join TK_Wrk_Man M on A.rout_code=M.route_code
                                    sql = @"select A.step_code,S.stepname,S.flwtype   from TK_Wrk_Step A
                                               left join TStep S on A.step_code=S.stepcode
                                               where M.wo_code=@wocode  and A.seq=@seq-1";
                                            where A.wo_code=@wocode  and A.seq=@seq-1";
                                    dynamicParams.Add("@wocode", data.Rows[0]["WO_CODE"].ToString());
                                    dynamicParams.Add("@seq", decimal.Parse(data.Rows[0]["SEQ"].ToString()));
                                    var data0 = DapperHelper.selectdata(sql, dynamicParams);
@@ -1078,8 +928,10 @@
                                                decimal fqty = data1.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();//本道发料数量
                                                decimal sqty = data2.AsEnumerable().Select(d => d.Field<decimal>("SQTY")).Sum();//本道收料数量
                                                decimal ng_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();//本道不良数量
                                                decimal bad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("BAD_QTY")).Sum();  //本道报废数量
                                                decimal ksqty = fqty - sqty - ng_qty-bad_qty;//剩余可发数量=本道发料数量-本道收料数量-本道不良数量-本道报废数量
                                                decimal laborbad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //本道工废数量
                                                decimal materielbad_qty = data2.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //本道料废数量
                                                //剩余可发数量=本道发料数量-本道收料数量-本道不良数量-本道工废数量-本道料废数量
                                                decimal ksqty = fqty - sqty - ng_qty - laborbad_qty- materielbad_qty;
                                                if (ksqty <= 0)
                                                {
                                                    mes.code = "300";
@@ -1092,16 +944,18 @@
                                                {
                                                    rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                                    rt.noreportqty = ksqty;                                              //未收数量=本道发料数量
                                                    rt.reportqty = sqty + ng_qty+bad_qty;                                 //已收数量
                                                    rt.reportqty = sqty + ng_qty + laborbad_qty+materielbad_qty;         //已收数量
                                                    rt.startqty = ksqty;                                                  //收料数量=本道发料数量      
                                                    
                                                    data1.Merge(data2);//将指定的dt合并                                                 
                                                    rt.list = data1.AsEnumerable().GroupBy(r => new {
                                                    rt.list = data1.AsEnumerable().GroupBy(r => new
                                                    {
                                                        wo_code = r["wo_code"], 
                                                        step_code = r["step_code"],
                                                        code= r["code"],
                                                        name = r["name"]
                                                    }).Select(g => new {
                                                    }).Select(g => new
                                                    {
                                                        Name = g.Key.code, 
                                                        tp = g.Key.name, 
                                                        fqty = g.Sum(i => (decimal)i["fqty"]),
@@ -1124,12 +978,14 @@
                                                rt.reportqty = 0;                                                    //已收数量                                   
                                                rt.startqty = fqty;                                                  //收料数量=本道发料数量      
                                                data1.Merge(data2);//将指定的dt合并                                                 
                                                rt.list = data1.AsEnumerable().GroupBy(r => new {
                                                rt.list = data1.AsEnumerable().GroupBy(r => new
                                                {
                                                    wo_code = r["wo_code"],
                                                    step_code = r["step_code"],
                                                    code = r["code"],
                                                    name = r["name"]
                                                }).Select(g => new {
                                                }).Select(g => new
                                                {
                                                    Name = g.Key.code,
                                                    tp = g.Key.name,
                                                    fqty = g.Sum(i => (decimal)i["fqty"]),