yl
2023-05-30 925394b1b7f61a2c2a15fdaa0ecd0763214ccda1
VueWebApi/DLL/DAL/ProductionManagementDAL.cs
@@ -1,4 +1,5 @@
using Dapper;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
@@ -125,7 +126,8 @@
                    //获取最大单据号
                    if (i == 1)  //首单获取工单号
                    {
                        sql = @"select isnull(max(substring(wo_code,charindex('_',wo_code)+1,len(wo_code)-charindex('_',wo_code))),0)+1 as worknumb from TK_Wrk_Man where m_po=@erpordercode";
                        sql = @"select isnull(max(cast(substring(wo_code,charindex('_',wo_code)+1,len(wo_code)-charindex('_',wo_code)) as numeric)),0)+1 as worknumb
                                from TK_Wrk_Man where m_po=@erpordercode";
                        dynamicParams.Add("@erpordercode", erpordercode);
                        var data = DapperHelper.selectdata(sql, dynamicParams);
                        num = Convert.ToInt32(data.Rows[0]["WORKNUMB"].ToString());
@@ -138,18 +140,20 @@
                    }
                    if (i == Convert.ToInt32(ordernum))  //最后一单时
                    {
                        sql = @"insert into TK_Wrk_Man(wo_code,status,wkshp_code,plan_qty,stck_code,materiel_code,m_po,lm_user,lm_date) values(@wo_code,@status,@wkshp_code,@plan_qty,@stck_code,@materiel_code,@m_po,@username,@CreateDate)";
                        sql = @"insert into TK_Wrk_Man(wo_code,wotype,status,wkshp_code,plan_qty,stck_code,materiel_code,sourceid,m_po,lm_user,lm_date) values(@wo_code,@wotype,@status,@wkshp_code,@plan_qty,@stck_code,@materiel_code,@sourceid,@m_po,@username,@CreateDate)";
                        list.Add(new
                        {
                            str = sql,
                            parm = new
                            {
                                wo_code = wo,
                                wotype = "PO",
                                status = "NEW",
                                wkshp_code = wkshopcode,
                                plan_qty = cdqty + (decimal.Parse(markqty) - sumqty),  //末单下单数量=切分数量+(下单数量-累计切分下单数量)
                                stck_code = warehousecode,
                                materiel_code = partcode,
                                sourceid = erporderid,
                                m_po = erpordercode,
                                username = username,
                                CreateDate = DateTime.Now.ToString()
@@ -160,18 +164,20 @@
                    else
                    {
                        sql = @"insert into TK_Wrk_Man(wo_code,status,wkshp_code,plan_qty,stck_code,materiel_code,m_po,lm_user,lm_date) values(@wo_code,@status,@wkshp_code,@plan_qty,@stck_code,@materiel_code,@m_po,@username,@CreateDate)";
                        sql = @"insert into TK_Wrk_Man(wo_code,wotype,status,wkshp_code,plan_qty,stck_code,materiel_code,sourceid,m_po,lm_user,lm_date) values(@wo_code,@wotype,@status,@wkshp_code,@plan_qty,@stck_code,@materiel_code,@sourceid,@m_po,@username,@CreateDate)";
                        list.Add(new
                        {
                            str = sql,
                            parm = new
                            {
                                wo_code = wo,
                                wotype = "PO",
                                status = "NEW",
                                wkshp_code = wkshopcode,
                                plan_qty = cdqty,
                                stck_code = warehousecode,
                                materiel_code = partcode,
                                sourceid = erporderid,
                                m_po = erpordercode,
                                username = username,
                                CreateDate = DateTime.Now.ToString()
@@ -296,7 +302,7 @@
        #region[MES工单查询]
        public static ToMessage ErpOrderSearch(string mesorderstus, string mesordercode, string partcode, string partname, string partspec, int startNum, string creatuser, string createdate, int endNum, string prop, string order)
        public static ToMessage MesOrderSearch(string mesorderstus, string mesordercode, string sourceorder, string ordertype, string partcode, string partname, string partspec, int startNum, string creatuser, string createdate, int endNum, string prop, string order)
        {
            var dynamicParams = new DynamicParameters();
            string search = "";
@@ -311,6 +317,16 @@
                {
                    search += "and A.wo_code like '%'+@mesordercode+'%' ";
                    dynamicParams.Add("@mesordercode", mesordercode);
                }
                if (sourceorder != "" && sourceorder != null)
                {
                    search += "and A.m_po like '%'+@sourceorder+'%' ";
                    dynamicParams.Add("@sourceorder", sourceorder);
                }
                if (ordertype != "" && ordertype != null)
                {
                    search += "and A.wotype like '%'+@ordertype+'%' ";
                    dynamicParams.Add("@ordertype", ordertype);
                }
                if (partcode != "" && partcode != null)
                {
@@ -344,8 +360,8 @@
                }
                // --------------查询指定数据--------------
                var total = 0; //总条数
                var sql = @"select A.status,A.wo_code,A.materiel_code as partcode,B.partname,B.partspec,A.plan_qty,A.wkshp_code,C.org_name as wkshp_name,
                            A.route_code,E.name as route_name,A.stck_code,F.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.m_po,U.username as lm_user,A.lm_date
                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.org_name as wkshp_name,
                            A.route_code,E.name as route_name,A.stck_code,F.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.sourceid,A.m_po,U.username as lm_user,A.lm_date
                            from TK_Wrk_Man A
                            left join TMateriel_Info B on A.materiel_code=B.partcode
                            left join TOrganization C on A.wkshp_code=C.org_code
@@ -354,6 +370,83 @@
                            left join T_Sec_Stck F on A.stck_code=F.code 
                            left join TUser U on A.lm_user=U.usercode 
                            where A.is_delete<>'1' " + search;
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.count = total;
                mes.data = data.ToList();
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[MES报废补单工单查询]
        public static ToMessage MesBadOrderSearch(string mesordercode, string sourceorder, string partcode, string partname, string partspec, int startNum, string creatuser, string createdate, int endNum, string prop, string order)
        {
            var dynamicParams = new DynamicParameters();
            string search = "";
            try
            {
                if (mesordercode != "" && mesordercode != null)
                {
                    search += "and A.wo_code like '%'+@mesordercode+'%' ";
                    dynamicParams.Add("@mesordercode", mesordercode);
                }
                if (sourceorder != "" && sourceorder != null)
                {
                    search += "and A.m_po like '%'+@sourceorder+'%' ";
                    dynamicParams.Add("@sourceorder", sourceorder);
                }
                if (partcode != "" && partcode != null)
                {
                    search += "and A.materiel_code like '%'+@partcode+'%' ";
                    dynamicParams.Add("@partcode", partcode);
                }
                if (partname != "" && partname != null)
                {
                    search += "and B.partname like '%'+@partname+'%' ";
                    dynamicParams.Add("@partname", partname);
                }
                if (partspec != "" && partspec != null)
                {
                    search += "and B.partspec like '%'+@partspec+'%' ";
                    dynamicParams.Add("@partspec", partspec);
                }
                if (createdate != "" && createdate != null)
                {
                    search += "and CONVERT(varchar(100),A.lm_date,23)=@createdate ";
                    dynamicParams.Add("@createdate", createdate);
                }
                if (creatuser != "" && creatuser != null)
                {
                    search += "and U.username like '%'+@creatuser+'%' ";
                    dynamicParams.Add("@creatuser", creatuser);
                }
                if (search == "")
                {
                    search = "and 1=1 ";
                }
                // --------------查询指定数据--------------
                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.org_name as wkshp_name,
                            A.route_code,E.name as route_name,A.stck_code,F.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.sourceid,A.m_po,U.username as lm_user,A.lm_date,S.bad_qty
                            from TK_Wrk_Man A
                            left join (select wo_code,sum(bad_qty) as bad_qty from  TK_Wrk_Step where bad_qty>0 group by wo_code) S on A.wo_code=S.wo_code
                            left join TMateriel_Info B on A.materiel_code=B.partcode
                            left join TOrganization C on A.wkshp_code=C.org_code
                            left join T_Sec_Stck D on A.stck_code=D.code
                            left join TFlw_Rout E on A.route_code=E.code
                            left join T_Sec_Stck F on A.stck_code=F.code
                            left join TUser U on A.lm_user=U.usercode
                            where A.is_delete<>'1'  and A.status='START' and A.wotype='PO' and S.bad_qty>0 " + search;
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                mes.code = "200";
                mes.Message = "查询成功!";
@@ -462,8 +555,102 @@
        }
        #endregion
        #region[工单派发选择工艺路线或选择生产车间时判断绑定条件]
        public static ToMessage SelectRouteOrWkshop(string partcode, string routecode, string wkshopcode)
        {
            string sql = "";
            var dynamicParams = new DynamicParameters();
            try
            {
                mes.code = "200";
                mes.Message = "";
                mes.data = null;
                //判断工艺路线对应工序是否都有关联工作站
                sql = @"select B.step_code,C.eqp_code from TFlw_Rout A
                        inner join TFlw_Rtdt B on A.code=B.rout_code
                        left join TFlw_Rteqp C on B.step_code=C.step_code
                        where A.code=@routecode";
                dynamicParams.Add("@routecode", routecode);
                var dtck = DapperHelper.selectdata(sql, dynamicParams);
                for (int i = 0; i < dtck.Rows.Count; i++)
                {
                    if (dtck.Rows[i].IsNull("eqp_code"))
                    {
                        mes.code = "300";
                        mes.count = 0;
                        mes.Message = "当前工艺路线对应工序【" + dtck.Rows[i]["step_code"].ToString() + "】,未关联设备,请关联所有工序对应设备!";
                        mes.data = null;
                        return mes;
                    }
                }
                //判断工艺路线对应工序关联的工作站是否有设置节拍工价
                sql = @"select AA.step_code,AA.eqp_code,AA.flwtype,S.unprice  from (
                        select A.code,B.step_code,C.eqp_code,S.flwtype from TFlw_Rout A
                        inner join TFlw_Rtdt B on A.code=B.rout_code
                        left join TFlw_Rteqp C on B.step_code=C.step_code
                        left join TStep S on B.step_code=S.stepcode
                        where A.code=@route_code
                        ) as AA
                        left join (select * from TPrteEqp_Stad   where materiel_code=@partcode and route_code=@route_code) as S on
                        AA.code=S.route_code and AA.step_code=S.step_code and AA.eqp_code=S.eqp_code";
                dynamicParams.Add("@partcode", partcode);
                dynamicParams.Add("@route_code", routecode);
                var dtc = DapperHelper.selectdata(sql, dynamicParams);
                for (int i = 0; i < dtc.Rows.Count; i++)
                {
                    if (dtc.Rows[i]["flwtype"].ToString() == "Z") //判断工序是否为自制
                    {
                        if (dtc.Rows[i].IsNull("unprice") || decimal.Parse(dtc.Rows[i]["unprice"].ToString()) == 0)
                        {
                            mes.code = "300";
                            mes.count = 0;
                            mes.Message = "节拍工价中:当前产品【" + partcode + "】,对应工艺路线【" + routecode + "】未设置(或未设置全)或工价小于等于0!";
                            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[MES工单新增、获取工单号]
        public static ToMessage AddMesOrderCodeSearch()
        {
            string sql = "";
            string wo_code = "";
            var dynamicParams = new DynamicParameters();
            try
            {
                //获取单据号
                sql = @"SELECT 'SGPO'+CONVERT(varchar(12) , getdate(), 112 )+'_'+cast(isnull(max(cast(substring(wo_code,charindex('_',wo_code)+1,len(wo_code)-charindex('_',wo_code)) as numeric)),0)+1 as varchar) as numct
                        FROM TK_Wrk_Man where wo_code like '%SGPO%'";
                var data = DapperHelper.selecttable(sql);
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.data = data.Rows[0]["numct"].ToString();
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[MES工单新增、编辑提交]
        public static ToMessage AddUpdateMesOrder(string mesorderstus, string mesordercode, string partcode, string mesqty, string routecode, string wkshopcode, string planstartdate, string planenddate, string orderlev, string username, string opertype)
        public static ToMessage AddUpdateMesOrder(string mesorderstus, string sourceorder, string ordertype, string mesordercode, string partcode, string mesqty, string routecode, string wkshopcode, string planstartdate, string planenddate, string orderlev, string username, string opertype)
        {
            var sql = "";
            var dynamicParams = new DynamicParameters();
@@ -473,14 +660,16 @@
                if (opertype == "Add")
                {
                    //写入工单表
                    sql = @"insert into TK_Wrk_Man(wo_code,status,wkshp_code,plan_qty,plan_startdate,plan_enddate,route_code,stck_code,lm_user,lm_date,materiel_code,m_po,piroque)
                                values(@mesordercode,@mesorderstus,@wkshopcode,@mesqty,@planstartdate,@planenddate,@routecode,@stck_code,@username,@CreateDate,@materiel_code,@m_po,@orderlev)";
                    sql = @"insert into TK_Wrk_Man(wo_code,wotype,status,wkshp_code,plan_qty,plan_startdate,plan_enddate,route_code,stck_code,lm_user,lm_date,materiel_code,m_po,piroque)
                                values(@mesordercode,@wotype,@mesorderstus,@wkshopcode,@mesqty,@planstartdate,@planenddate,@routecode,@stck_code,@username,@CreateDate,@materiel_code,@m_po,@orderlev)";
                    list.Add(new
                    {
                        str = sql,
                        parm = new
                        {
                            mesordercode = mesordercode,
                            wotype = ordertype,
                            m_po = sourceorder,
                            mesorderstus = "ALLO", //派发
                            wkshopcode = wkshopcode,
                            mesqty = mesqty,
@@ -491,7 +680,6 @@
                            username = username,
                            CreateDate = DateTime.Now.ToString(),
                            materiel_code = partcode,
                            m_po = "",
                            orderlev = orderlev
                        }
                    });
@@ -519,6 +707,32 @@
                            CreateDate = DateTime.Now.ToString()
                        }
                    });
                    //写入工单工艺路线工序工价复制表
                    sql = @"insert into TWoPrteEqp_Stad(wo,materiel_code,eqp_code,stand_value,opc_conver,route_code,unprice,eqp_value,cavity_qty,wkspcode,lm_user,lm_date,torg_code,is_delete,step_code)
                           select distinct @mesordercode as wo,S.materiel_code,S.eqp_code,S.stand_value,S.opc_conver,S.route_code,S.unprice,
                           S.eqp_value,S.cavity_qty,S.wkspcode,S.lm_user,S.lm_date,S.torg_code,S.is_delete,S.step_code
                           from TFlw_Rtdt A
                           inner join TFlw_Rteqp C on A.step_code=C.step_code
                           inner join (select *   from TPrteEqp_Stad  where materiel_code=@materiel_code and route_code=@routecode) as S on C.step_code=S.step_code and C.eqp_code=S.eqp_code";
                    list.Add(new
                    {
                        str = sql,
                        parm = new
                        {
                            mesordercode = mesordercode,
                            materiel_code = partcode,
                            routecode = routecode
                        }
                    });
                    //if (is_aps == "Y")  //是否排程
                    //{
                    //    string sql1 = "select id from TBom_Main  where materiel_code='" + PartNumber + "' and status='Y' and version='" + VsionId + "'";
                    //    DataTable dt1 = DBHelper.GetTable(sql1);
                    //}
                    //增加工单用料表(子件)
                    bool aa = DapperHelper.DoTransaction(list);
                    if (aa)
@@ -579,6 +793,35 @@
                            CreateDate = DateTime.Now.ToString()
                        }
                    });
                    //删除工单工艺路线工序工价复制表
                    sql = @"delete TWoPrteEqp_Stad where wo=@mesordercode";
                    list.Add(new
                    {
                        str = sql,
                        parm = new
                        {
                            mesordercode = mesordercode
                        }
                    });
                    //写入工单工艺路线工序工价复制表
                    sql = @"insert into TWoPrteEqp_Stad(wo,materiel_code,eqp_code,stand_value,opc_conver,route_code,unprice,eqp_value,cavity_qty,wkspcode,lm_user,lm_date,torg_code,is_delete,step_code)
                           select distinct @mesordercode as wo,S.materiel_code,S.eqp_code,S.stand_value,S.opc_conver,S.route_code,S.unprice,
                           S.eqp_value,S.cavity_qty,S.wkspcode,S.lm_user,S.lm_date,S.torg_code,S.is_delete,S.step_code
                           from TFlw_Rtdt A
                           inner join TFlw_Rteqp C on A.step_code=C.step_code
                           inner join (select *   from TPrteEqp_Stad  where materiel_code=@materiel_code and route_code=@routecode) as S on C.step_code=S.step_code and C.eqp_code=S.eqp_code";
                    list.Add(new
                    {
                        str = sql,
                        parm = new
                        {
                            mesordercode = mesordercode,
                            materiel_code = partcode,
                            routecode = routecode
                        }
                    });
                    bool aa = DapperHelper.DoTransaction(list);
                    if (aa)
                    {
@@ -608,7 +851,7 @@
        #endregion
        #region[MES工单删除]
        public static ToMessage DeleteMesOrder(string wocode, string m_po, string orderqty)
        public static ToMessage DeleteMesOrder(string souceid, string wocode, string m_po, string orderqty)
        {
            var sql = "";
            List<object> list = new List<object>();
@@ -616,7 +859,7 @@
            try
            {
                //判断工单是否为未开始状态或者已派发状态(满足其中一种都可删除,否则不允许删除)
                sql = @"select *  from TK_Wrk_Man where wo_code=@wocode and status='NEW' or status='ALLO'";
                sql = @"select *  from TK_Wrk_Man where wo_code=@wocode and status in('NEW','ALLO')";
                dynamicParams.Add("@wocode", wocode);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                if (data.Rows.Count > 0)
@@ -624,21 +867,22 @@
                    if (m_po != "" && m_po != null)
                    {
                        //查询生产订单表数据
                        sql = @"select *  from TKimp_Ewo where wo=@m_po";
                        sql = @"select *  from TKimp_Ewo where wo=@m_po and id=@souceid";
                        dynamicParams.Add("@m_po", m_po);
                        dynamicParams.Add("@souceid", souceid);
                        var data0 = DapperHelper.selectdata(sql, dynamicParams);
                        decimal relse_qty = decimal.Parse(data0.Rows[0]["RELSE_QTY"].ToString());//以下单数量
                        if ((relse_qty - decimal.Parse(orderqty)) == 0)  //全部撤销 订单状态回写未开始,已下单数量为0
                        {
                            //回写订单表状态及已下单数量
                            sql = @"update TKimp_Ewo set status='NEW',relse_qty=0  where wo=@m_po";
                            list.Add(new { str = sql, parm = new { m_po = m_po } });
                            sql = @"update TKimp_Ewo set status='NEW',relse_qty=0  where wo=@m_po and id=@souceid";
                            list.Add(new { str = sql, parm = new { m_po = m_po, souceid = souceid } });
                        }
                        else
                        {
                            //回写订单表状态及已下单数量
                            sql = @"update TKimp_Ewo set status='CREATING',relse_qty=relse_qty-@orderqty  where wo=@m_po";
                            list.Add(new { str = sql, parm = new { m_po = m_po, orderqty = decimal.Parse(orderqty) } });
                            sql = @"update TKimp_Ewo set status='CREATING',relse_qty=relse_qty-@orderqty  where wo=@m_po and id=@souceid";
                            list.Add(new { str = sql, parm = new { m_po = m_po, souceid = souceid, orderqty = decimal.Parse(orderqty) } });
                        }
                    }
                    //删除工单工序表
@@ -684,7 +928,7 @@
        #endregion
        #region[MES工单关闭]
        public static ToMessage ClosedMesOrder(string wocode, string m_po)
        public static ToMessage ClosedMesOrder(string username, string wocode, string m_po)
        {
            var sql = "";
            List<object> list = new List<object>();
@@ -695,8 +939,8 @@
                sql = @"update TK_Wrk_Step set status='CLOSED'  where wo_code=@wocode";
                list.Add(new { str = sql, parm = new { wocode = wocode } });
                //回写工单表状态为(关闭)
                sql = @"update TK_Wrk_Man set status='CLOSED'  where wo_code=@wocode";
                list.Add(new { str = sql, parm = new { wocode = wocode } });
                sql = @"update TK_Wrk_Man set status='CLOSED',closeuser=@username,closedate=@closedate  where wo_code=@wocode";
                list.Add(new { str = sql, parm = new { wocode = wocode, username = username, closedate = DateTime.Now.ToString() } });
                bool aa = DapperHelper.DoTransaction(list);
                if (aa)
                {
@@ -736,7 +980,7 @@
                         left join TStep B on A.step_code=B.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=@wo_code";
                        where A.wo_code=@wo_code order by A.seq";
                dynamicParams.Add("@wo_code", wo_code);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                mes.code = "200";
@@ -826,7 +1070,7 @@
                }
                //根据条件查询工单工序任务(自制工序)
                sql = @"select A.status,A.wo_code,B.route_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.plan_startdate,A.plan_enddate
                            S.stepcode,S.stepname,S.descr,A.plan_qty,A.good_qty,A.ng_qty,A.bad_qty,A.plan_startdate,A.plan_enddate
                            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
@@ -930,7 +1174,7 @@
                }
                //根据条件查询工单工序任务(自制工序)
                sql = @"select A.status,A.wo_code,B.route_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.plan_startdate,A.plan_enddate
                            S.stepcode,S.stepname,S.descr,A.plan_qty,A.good_qty,A.ng_qty,A.bad_qty,A.plan_startdate,A.plan_enddate
                            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
@@ -1009,7 +1253,7 @@
                if (stepcode != "")
                {
                    //查找当前工序任务
                    sql = @"select *  from TStep  where stepcode=@stepcode and wo_code=@ordercode";
                    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);
@@ -1024,7 +1268,7 @@
                }
                //根据条件查询工单工序任务,且不良数量大于0
                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
                            S.stepcode,S.stepname,S.descr,A.plan_qty,A.good_qty,A.ng_qty,A.bad_qty
                            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
@@ -1041,7 +1285,7 @@
                }
                else
                {
                    mes.code = "300";
                    mes.code = "301";
                    mes.count = 0;
                    mes.Message = "无可执行的生产任务,任务已完成或已关闭!";
                    mes.data = null;
@@ -1092,7 +1336,7 @@
                    }
                }
                //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.isbott,A.isend
                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.bad_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
@@ -1111,7 +1355,8 @@
                    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();//工序序号
@@ -1129,7 +1374,7 @@
                    }
                    if (isend == "Y")  //当前工序是末道工序
                    {
                        rt.nextstepcode ="";//赋空
                        rt.nextstepcode = "";//赋空
                        rt.nextstepname = "";//赋空
                    }
                }
@@ -1350,7 +1595,7 @@
                    dynamicParams.Add("@usercode", usercode);
                }
                //班组获取人员列表
                sql = @"select usercode,username  from TUser where is_delete<>'1' " + search;
                sql = @"select usercode,username  from TUser where is_delete<>'1' and usercode<>'9999'" + search;
                dynamicParams.Add("@usercode", usercode);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                mes.code = "200";
@@ -1537,7 +1782,7 @@
        #endregion
        #region[生产开报工,报工提交]
        public static ToMessage SavaMesOrderStepReport(string mesordercode, string partcode, string stepseq, string stepcode, string eqpcode, string usergroupcode, string reportuser, string taskqty, string startqty, string reportqty, string ngqty, string badcode, string username)
        public static ToMessage SavaMesOrderStepReport(string mesordercode, string partcode, string stepseq, string stepcode, string eqpcode, string usergroupcode, string reportuser, string taskqty, string startqty, string reportqty, string ngqty, string badcode, string remarks, string username)
        {
            var sql = "";
            string[] arra = new string[] { };
@@ -1578,16 +1823,20 @@
                }
                if (data.Rows.Count > 0)
                {
                    //修改报工记录
                    sql = @"update TK_Wrk_Record set good_qty=good_qty+@reportqty,ng_qty=ng_qty+@ngqty,
                                lm_user=@username,lm_date=@CreateDate where wo_code=@mesordercode and step_code=@stepcode and style='B'";
                    list.Add(new { str = sql, parm = new { reportqty = decimal.Parse(reportqty), ngqty = decimal.Parse(ngqty), mesordercode = mesordercode, stepcode = stepcode, username = username, CreateDate = date } });
                    //获取主表最大ID
                    sql = @"select ISNULL(IDENT_CURRENT('TK_Wrk_Record')+1,1) as id";
                    var dt = DapperHelper.selecttable(sql);
                    //写入开报工记录表
                    sql = @"insert into  TK_Wrk_Record(wo_code,step_seq,step_code,eqp_code,materiel_code,task_qty,start_qty,good_qty,ng_qty,style,lm_user,lm_date)
                                values(@mesordercode,@stepseq,@stepcode,@eqpcode,@partcode,@taskqty,@startqty,@reportqty,@ngqty,@style,@lm_user,@lm_date)";
                    list.Add(new { str = sql, parm = new { mesordercode = mesordercode, stepseq = stepseq, stepcode = stepcode, eqpcode = eqpcode, partcode = partcode, taskqty = taskqty, startqty = startqty, reportqty = reportqty, ngqty = ngqty, style = "B", lm_user = username, lm_date = date } });
                    //写入子表
                    for (int i = 0; i < arra.Length; i++)
                    {
                        sql = @"insert into  TK_Wrk_RecordSub(m_id,eqp_code,report_person,report_date,report_qty,usergroup_code,ng_qty,style,lm_user,lm_date) 
                                values(@m_id,@eqp_code,@report_person,@report_date,@report_qty,@usergroup_code,@ng_qty,@style,@lm_user,@lm_date)";
                        list.Add(new { str = sql, parm = new { m_id = int.Parse(data.Rows[0]["ID"].ToString()), eqp_code = eqpcode, report_person = arra[i], report_date = date, report_qty = reportqty, usergroup_code = usergroupcode, ng_qty = ngqty, style = "B", lm_user = username, lm_date = date } });
                        list.Add(new { str = sql, parm = new { m_id = int.Parse(dt.Rows[0]["ID"].ToString()), eqp_code = eqpcode, report_person = arra[i], report_date = date, report_qty = reportqty, usergroup_code = usergroupcode, ng_qty = ngqty, style = "B", lm_user = username, lm_date = date } });
                    }
                    if (badcode != "" && ngqty != "0")
@@ -1595,12 +1844,35 @@
                        //写入缺陷记录表
                        for (int i = 0; i < arra1.Length; i++)
                        {
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(data.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], style = "B", lm_user = username, lm_date = date } });
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,remarks,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], remarks = remarks, style = "B", lm_user = username, lm_date = date } });
                        }
                    }
                    ////修改报工记录
                    //sql = @"update TK_Wrk_Record set good_qty=good_qty+@reportqty,ng_qty=ng_qty+@ngqty,
                    //            lm_user=@username,lm_date=@CreateDate where wo_code=@mesordercode and step_code=@stepcode and style='B'";
                    //list.Add(new { str = sql, parm = new { reportqty = decimal.Parse(reportqty), ngqty = decimal.Parse(ngqty), mesordercode = mesordercode, stepcode = stepcode, username = username, CreateDate = date } });
                    ////写入子表
                    //for (int i = 0; i < arra.Length; i++)
                    //{
                    //    sql = @"insert into  TK_Wrk_RecordSub(m_id,eqp_code,report_person,report_date,report_qty,usergroup_code,ng_qty,style,lm_user,lm_date)
                    //            values(@m_id,@eqp_code,@report_person,@report_date,@report_qty,@usergroup_code,@ng_qty,@style,@lm_user,@lm_date)";
                    //    list.Add(new { str = sql, parm = new { m_id = int.Parse(data.Rows[0]["ID"].ToString()), eqp_code = eqpcode, report_person = arra[i], report_date = date, report_qty = reportqty, usergroup_code = usergroupcode, ng_qty = ngqty, style = "B", lm_user = username, lm_date = date } });
                    //}
                    //if (badcode != "" && ngqty != "0")
                    //{
                    //    //写入缺陷记录表
                    //    for (int i = 0; i < arra1.Length; i++)
                    //    {
                    //        sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,style,lm_user,lm_date)
                    //            values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                    //        list.Add(new { str = sql, parm = new { record_id = int.Parse(data.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], style = "B", lm_user = username, lm_date = date } });
                    //    }
                    //}
                }
                else
                {
@@ -1625,9 +1897,9 @@
                        //写入缺陷记录表
                        for (int i = 0; i < arra1.Length; i++)
                        {
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], style = "B", lm_user = username, lm_date = date } });
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,remarks,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], remarks = remarks, style = "B", lm_user = username, lm_date = date } });
                        }
                    }
@@ -1747,7 +2019,7 @@
        #endregion
        #region[生产开报工, 收料提交]
        public static ToMessage SavaMesOrderStepIn(string mesordercode, string partcode, string stepseq, string stepcode, string wxcode, string inuser, string taskqty, string sqty, string ngqty, string badcode, string username)
        public static ToMessage SavaMesOrderStepIn(string mesordercode, string partcode, string stepseq, string stepcode, string wxcode, string inuser, string taskqty, string sqty, string ngqty, string badcode, string remarks, string username)
        {
            var sql = "";
            string[] arra1 = new string[] { };
@@ -1771,42 +2043,105 @@
                dynamicParams.Add("@wx_code", wxcode);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                //获取发料记录的默认选中的外协供应商与收料时的外协供应商做对比判断
                sql = @"select A.wx_code,B.name   from TK_Wrk_OutRecord A
                sql = @"select A.wx_code,B.name,A.fqty   from TK_Wrk_OutRecord A
                        inner join TCustomer B on A.wx_code=B.code
                        where A.wo_code=@wo_code and A.step_code=@step_code and A.style='F' ";
                        where A.wo_code=@wo_code and A.step_code=@step_code and wx_code=@wx_code and A.style='F' ";
                dynamicParams.Add("@wo_code", mesordercode);
                dynamicParams.Add("@step_code", stepcode);
                dynamicParams.Add("@wx_code", wxcode);
                var da = DapperHelper.selectdata(sql, dynamicParams);
                if (da.Rows[0]["WX_CODE"].ToString() != wxcode)
                if (da.Rows.Count <= 0)
                {
                    sql = @"select A.wx_code,B.name,A.fqty   from TK_Wrk_OutRecord A
                        inner join TCustomer B on A.wx_code=B.code
                        where A.wo_code=@wo_code and A.step_code=@step_code and A.style='F' ";
                    dynamicParams.Add("@wo_code", mesordercode);
                    dynamicParams.Add("@step_code", stepcode);
                    var da1 = DapperHelper.selectdata(sql, dynamicParams);
                    var dr = da1.AsEnumerable().ToList().Select(x => x.Field<string>("NAME")).ToList();
                    string wxstring = (string.Join(",", dr.Select(x => x.ToString()).ToArray()));
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "操作失败,当前收料外协供方应为:" + da.Rows[0]["NAME"].ToString() + "!";
                    mes.Message = "操作失败,当前收料外协供方与发料外协供应商不匹配,应为:【" + wxstring + "】!";
                    mes.data = null;
                    return mes;
                }
                if ((decimal.Parse(sqty) + decimal.Parse(ngqty)) > decimal.Parse(da.Rows[0]["FQTY"].ToString()))  //收料数量+不良数量>发料数量
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "操作失败,当前收料数量+不良数量,不能大于发料数量:" + da.Rows[0]["FQTY"].ToString() + "!";
                    mes.data = null;
                    return mes;
                }
                //if (da.Rows[0]["WX_CODE"].ToString() != wxcode)
                //{
                //    mes.code = "300";
                //    mes.count = 0;
                //    mes.Message = "操作失败,当前收料外协供方应为:" + da.Rows[0]["NAME"].ToString() + "!";
                //    mes.data = null;
                //    return mes;
                //}
                if (data.Rows.Count > 0)
                {
                    //修改外协记录主表
                    sql = @"update TK_Wrk_OutRecord set sqty=sqty+@sqty,ng_qty=ng_qty+@ngqty,lm_user=@username,lm_date=@CreateDate
                             where wo_code=@mesordercode and step_code=@stepcode and wx_code=@wx_code and style='S'";
                    list.Add(new { str = sql, parm = new { mesordercode = mesordercode, stepcode = stepcode, wx_code = wxcode, sqty = decimal.Parse(sqty), ngqty = decimal.Parse(ngqty), username = username, CreateDate = date } });
                    decimal sum_sqty = data.AsEnumerable().Select(d => d.Field<decimal>("SQTY")).Sum();  //获取同单号,同工序,同外协供应商收料总数量
                    decimal sum_fqty = da.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();  //获取同单号,同工序,同外协供应商发料总数量
                    if ((sum_sqty + decimal.Parse(sqty) + decimal.Parse(ngqty)) > sum_fqty) //已收料总数+当前收料数量+不良数量>总发料数量
                    {
                        mes.code = "300";
                        mes.count = 0;
                        mes.Message = "操作失败,当前收料数量+不良数量,不能大于待收数量:" + (sum_fqty - sum_sqty) + "!";
                        mes.data = null;
                        return mes;
                    }
                    //获取主表最大ID
                    sql = @"select ISNULL(IDENT_CURRENT('TK_Wrk_OutRecord')+1,1) as id";
                    var dt = DapperHelper.selecttable(sql);
                    //写入外协记录主表
                    sql = @"insert into  TK_Wrk_OutRecord(wo_code,step_seq,step_code,wx_code,materiel_code,style,sqty,ng_qty,lm_user,lm_date)
                                values(@mesordercode,@stepseq,@stepcode,@wx_code,@partcode,@style,@sqty,@ngqty,@lm_user,@lm_date)";
                    list.Add(new { str = sql, parm = new { mesordercode = mesordercode, stepseq = stepseq, stepcode = stepcode, wx_code = wxcode, partcode = partcode, style = 'S', sqty = sqty, ngqty = ngqty, lm_user = username, lm_date = date } });
                    //写入外协记录子表
                    sql = @"insert into  TK_Wrk_OutRecordSub(m_id,wx_code,in_person,in_time,sqty,ng_qty,style,lm_user,lm_date) 
                                values(@m_id,@wx_code,@in_person,@in_time,@sqty,@ngqty,@style,@lm_user,@lm_date)";
                    list.Add(new { str = sql, parm = new { m_id = int.Parse(data.Rows[0]["ID"].ToString()), wx_code = wxcode, in_person = inuser, in_time = date, sqty = sqty, ngqty = ngqty, style = 'S', lm_user = username, lm_date = date } });
                                values(@m_id,@wxcode,@in_person,@in_time,@sqty,@ng_qty,@style,@lm_user,@lm_date)";
                    list.Add(new { str = sql, parm = new { m_id = int.Parse(dt.Rows[0]["ID"].ToString()), wxcode = wxcode, in_person = inuser, in_time = date, sqty = sqty, ng_qty = ngqty, style = "S", lm_user = username, lm_date = date } });
                    if (badcode != "" && ngqty != "0")
                    {
                        //写入缺陷记录表
                        for (int i = 0; i < arra1.Length; i++)
                        {
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(data.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], style = "S", lm_user = username, lm_date = date } });
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,remarks,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], remarks = remarks, style = "S", lm_user = username, lm_date = date } });
                        }
                    }
                    ////修改外协记录主表
                    //sql = @"update TK_Wrk_OutRecord set sqty=sqty+@sqty,ng_qty=ng_qty+@ngqty,lm_user=@username,lm_date=@CreateDate
                    //         where wo_code=@mesordercode and step_code=@stepcode and wx_code=@wx_code and style='S'";
                    //list.Add(new { str = sql, parm = new { mesordercode = mesordercode, stepcode = stepcode, wx_code = wxcode, sqty = decimal.Parse(sqty), ngqty = decimal.Parse(ngqty), username = username, CreateDate = date } });
                    ////写入外协记录子表
                    //sql = @"insert into  TK_Wrk_OutRecordSub(m_id,wx_code,in_person,in_time,sqty,ng_qty,style,lm_user,lm_date)
                    //            values(@m_id,@wx_code,@in_person,@in_time,@sqty,@ngqty,@style,@lm_user,@lm_date)";
                    //list.Add(new { str = sql, parm = new { m_id = int.Parse(data.Rows[0]["ID"].ToString()), wx_code = wxcode, in_person = inuser, in_time = date, sqty = sqty, ngqty = ngqty, style = 'S', lm_user = username, lm_date = date } });
                    //if (badcode != "" && ngqty != "0")
                    //{
                    //    //写入缺陷记录表
                    //    for (int i = 0; i < arra1.Length; i++)
                    //    {
                    //        sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,style,lm_user,lm_date)
                    //            values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                    //        list.Add(new { str = sql, parm = new { record_id = int.Parse(data.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], style = "S", lm_user = username, lm_date = date } });
                    //    }
                    //}
                }
                else
                {
@@ -1828,9 +2163,9 @@
                        //写入缺陷记录表
                        for (int i = 0; i < arra1.Length; i++)
                        {
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], style = "S", lm_user = username, lm_date = date } });
                            sql = @"insert into  CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_code,remarks,style,lm_user,lm_date)
                                values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
                            list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = ngqty, defect_code = arra1[i], remarks = remarks, style = "S", lm_user = username, lm_date = date } });
                        }
                    }
@@ -1890,22 +2225,21 @@
                    if (json.Data.Rows[i]["STYLE"].ToString() == "Z")
                    {
                        //回写对应的报工记录子表合格数量、不良数量、报废数量
                        sql = @"update TK_Wrk_RecordSub set report_qty=report_qty+@repair_qty,ng_qty=ng_qty-@repair_qty,bad_qty=bad_qty+@bad_qty
                                where  id=@m_id and m_id=@id and style='B'";
                        sql = @"update TK_Wrk_RecordSub set report_qty=report_qty+@repair_qty,ng_qty=ng_qty-@repair_qty-@bad_qty,bad_qty=bad_qty+@bad_qty
                                where  m_id=@m_id and style='B'";
                        list.Add(new
                        {
                            str = sql,
                            parm = new
                            {
                                id = int.Parse(json.Data.Rows[i]["M_ID"].ToString()),
                                m_id = int.Parse(json.Data.Rows[i]["ID"].ToString()),
                                repair_qty = decimal.Parse(json.Data.Rows[i]["REPAIR_QTY"].ToString()),
                                bad_qty = decimal.Parse(json.Data.Rows[i]["BAD_QTY"].ToString())
                            }
                        });
                        //回写对应的报工记录主表合格数量、不良数量、报废数量
                        sql = @"update TK_Wrk_Record set good_qty=good_qty+@repair_qty,ng_qty=ng_qty-@repair_qty,bad_qty=bad_qty+@bad_qty
                        where wo_code=@wo_code and step_code=@stepcode and id=@id and style='B'";
                        sql = @"update TK_Wrk_Record set good_qty=good_qty+@repair_qty,ng_qty=ng_qty-@repair_qty-@bad_qty,bad_qty=bad_qty+@bad_qty
                        where wo_code=@wo_code and step_code=@step_code and id=@id and style='B'";
                        list.Add(new
                        {
                            str = sql,
@@ -1920,7 +2254,7 @@
                        });
                        //写入报工缺陷处理记录表
                        sql = @"insert into  CSR_WorkRecord_DefectHandle(record_subid,wo_code,partnumber,step_seq,step_code,repair_qty,bad_qty,defect_code,style,lm_user,lm_date) 
                                values(@record_subid,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                                values(@record_subid,@wo_code,@partcode,@stepseq,@stepcode,@repair_qty,@bad_qty,@defect_code,@style,@lm_user,@lm_date)";
                        list.Add(new
                        {
                            str = sql,
@@ -1944,25 +2278,24 @@
                        sumbad_qty = sumbad_qty + decimal.Parse(json.Data.Rows[i]["BAD_QTY"].ToString());
                    }
                    //外协工序
                    if (json.Data.Rows[i]["STYLE"].ToString() == "W")
                    if (json.Data.Rows[i]["STYLE"].ToString() == "S")
                    {
                        //回写对应的收料记录子表收料数量、不良数量、报废数量
                        sql = @"update TK_Wrk_OutRecordSub set sqty=sqty+@repair_qty,ng_qty=ng_qty-@repair_qty,bad_qty=bad_qty+@bad_qty
                                where id=@m_id and m_id=@id and style='S'";
                        sql = @"update TK_Wrk_OutRecordSub set sqty=sqty+@repair_qty,ng_qty=ng_qty-@repair_qty-@bad_qty,bad_qty=bad_qty+@bad_qty
                                where  m_id=@m_id and style='S'";
                        list.Add(new
                        {
                            str = sql,
                            parm = new
                            {
                                id = int.Parse(json.Data.Rows[i]["M_ID"].ToString()),
                                m_id = int.Parse(json.Data.Rows[i]["ID"].ToString()),
                                repair_qty = decimal.Parse(json.Data.Rows[i]["REPAIR_QTY"].ToString()),
                                bad_qty = decimal.Parse(json.Data.Rows[i]["BAD_QTY"].ToString())
                            }
                        });
                        //回写对应的收料记录主表合格数量、不良数量、报废数量
                        sql = @"update TK_Wrk_OutRecord set sqty=sqty+@repair_qty,ng_qty=ng_qty-@repair_qty,bad_qty=bad_qty+@bad_qty
                        where wo_code=@wo_code and step_code=@stepcode and id=@id and style='S'";
                        sql = @"update TK_Wrk_OutRecord set sqty=sqty+@repair_qty,ng_qty=ng_qty-@repair_qty-@bad_qty,bad_qty=bad_qty+@bad_qty
                        where wo_code=@wo_code and step_code=@step_code and id=@id and style='S'";
                        list.Add(new
                        {
                            str = sql,
@@ -1977,7 +2310,7 @@
                        });
                        //写入报工缺陷处理记录表
                        sql = @"insert into  CSR_WorkRecord_DefectHandle(record_subid,wo_code,partnumber,step_seq,step_code,repair_qty,bad_qty,defect_code,style,lm_user,lm_date) 
                                values(@record_subid,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_code,@style,@lm_user,@lm_date)";
                                values(@record_subid,@wo_code,@partcode,@stepseq,@stepcode,@repair_qty,@bad_qty,@defect_code,@style,@lm_user,@lm_date)";
                        list.Add(new
                        {
                            str = sql,
@@ -2002,7 +2335,7 @@
                }
                //回写工单工序表合格数量、不良数量
                sql = @"update TK_Wrk_Step set good_qty=good_qty+@sumrepair_qty,ng_qty=ng_qty-@sumrepair_qty,bad_qty=bad_qty+sumbad_qty  where wo_code=@wo_code and step_code=@stepcode";
                sql = @"update TK_Wrk_Step set good_qty=good_qty+@sumrepair_qty,ng_qty=ng_qty-@sumrepair_qty-@sumbad_qty,bad_qty=bad_qty+@sumbad_qty  where wo_code=@wo_code and step_code=@stepcode";
                list.Add(new
                {
                    str = sql,
@@ -2019,14 +2352,14 @@
                {
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "收成功!";
                    mes.Message = "操作成功!";
                    mes.data = null;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "收料失败!";
                    mes.Message = "操作失败!";
                    mes.data = null;
                }
            }
@@ -2041,13 +2374,15 @@
        }
        #endregion
        #region[生产开报工,工序检验扫码获取任务信息]
        public static ToMessage MesOrderStepCheckSearch(string orderstepqrcode)
        #region[工序检验扫码获取任务信息]
        public static ToMessage MesOrderStepCheckSearch(string orderstepqrcode, string checktype)
        {
            var sql = "";
            string ordercode = "";
            string stepcode = "";
            var dynamicParams = new DynamicParameters();
            Dictionary<string, object> list = new Dictionary<string, object>();
            try
            {
                if (orderstepqrcode != "" && orderstepqrcode != null)
@@ -2067,7 +2402,7 @@
                        stepcode = arra[1]; //获取指定字符串前面的字符
                    }
                    //通过扫描二维码信息查找任务信息
                    sql = @"select A.wo_code,M.partcode,M.partname,M.partspec,S.stepcode,S.stepname
                    sql = @"select A.wo_code,A.good_qty,M.partcode,M.partname,M.partspec,M.stocktype_code,S.stepcode,S.stepname
                            from TK_Wrk_Step A
                            inner join TK_Wrk_Man P on A.wo_code=P.wo_code
                            left join TMateriel_Info M on P.materiel_code=M.partcode
@@ -2078,11 +2413,44 @@
                    var data = DapperHelper.selectdata(sql, dynamicParams);
                    if (data.Rows.Count > 0)
                    {
                        mes.code = "200";
                        mes.count = 0;
                        mes.Message = "查询成功!";
                        mes.data = data;
                        return mes;
                        if (decimal.Parse(data.Rows[0]["good_qty"].ToString()) > 0)
                        {
                            //获取绑定的质检方案、抽样方式、样本数
                            sql = @"select code as checkstandcode,name as checkstandname,sampmethod,sampscare
                            from TStepCheckStandard
                            where (PATINDEX('%,' + RTRIM(@partcode) + ',%',',' + suitpart + ',')>0 or PATINDEX('%,' + RTRIM(@stocktype_code) + ',%',',' + suitpart + ',')>0)
                            and checktype=@checktype and stepcode=@stepcode ";
                            dynamicParams.Add("@partcode", data.Rows[0]["partcode"].ToString());//物料编码
                            dynamicParams.Add("@stepcode", stepcode);//工序编码
                            dynamicParams.Add("@stocktype_code", data.Rows[0]["stocktype_code"].ToString());//存货类型编码
                            dynamicParams.Add("@checktype", checktype);//检验类型
                            var data1 = DapperHelper.selectdata(sql, dynamicParams);
                            if (data1.Rows.Count > 0)
                            {
                                list.Add("labcont", data);
                                list.Add("chekstand", data1);
                                mes.code = "200";
                                mes.count = 0;
                                mes.Message = "查询成功!";
                                mes.data = list;
                            }
                            else
                            {
                                mes.code = "300";
                                mes.count = 0;
                                mes.Message = "当前产品【" + data.Rows[0]["partname"].ToString() + "】,对应工序【" + data.Rows[0]["stepname"].ToString() + "】,未指定质检方案!";
                                mes.data = null;
                                return mes;
                            }
                        }
                        else
                        {
                            mes.code = "300";
                            mes.count = 0;
                            mes.Message = "当前工序任务无报工产出!";
                            mes.data = null;
                            return mes;
                        }
                    }
                    else
                    {
@@ -2113,47 +2481,36 @@
        }
        #endregion
        #region[生产开报工,工序检验获取检验标准下拉框数据]
        public static ToMessage MesOrderStepCheckSelect()
        {
            string sql = "";
            var dynamicParams = new DynamicParameters();
            try
            {
                //获取工序检验标准
                sql = @"select code,name  from TStepCheckStandard where is_delete<>'1'";
                var data = DapperHelper.selecttable(sql);
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.data = data;
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[生产开报工,工序检验根据检验标准获取检验项目列表]
        #region[工序检验根据选择的检验方案查找检验项目]
        public static ToMessage MesOrderStepCheckItemList(string checkstandcode)
        {
            string sql = "";
            var dynamicParams = new DynamicParameters();
            try
            {
                //根据检验标准编码获取工序检验项目
                sql = @"select B.code,B.name,A.stepcheckitem_desc,A.stepcheckitem_seq   from TStepCheckStandardSub A
                //质检方案编码获取检验项
                sql = @"select A.stepcheckitem_seq, B.code,B.name,A.required,A.numberjudge,A.unit,A.decimalnum,
                        A.standvalue,A.uppervalue,A.lowervalue,A.stepcheckitem_desc
                        from TStepCheckStandardSub A
                        left join TStepCheckItem B on A.stepcheckitem_code=B.code
                        where B.is_delete<>'1' and A.stepstaned_code=@checkstandcode";
                dynamicParams.Add("@checkstandcode", checkstandcode);
                        where A.stepstaned_code=@checkstandcode
                        order by A.stepcheckitem_seq";
                dynamicParams.Add("@checkstandcode", checkstandcode);//质检方案编码
                var data = DapperHelper.selectdata(sql, dynamicParams);
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.data = data;
                if (data.Rows.Count > 0)
                {
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "查询成功!";
                    mes.data = data;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "当前质检方案无检验项!";
                    mes.data = null;
                }
            }
            catch (Exception e)
            {
@@ -2166,34 +2523,79 @@
        }
        #endregion
        #region[生产开报工,工序检验提交保存]
        public static ToMessage SaveMesOrderStepCheckItem(string mesordercode, string partcode, string stepcode, string checkstanedcode, string checkusercode, string checktypecode, string checkresult, string checkdescr, string username, List<StepCheck> json)
        #region[工序检验,提交]
        public static ToMessage SaveMesOrderStepCheckItem(string wocode, string partcode, string stepcode, string checkstandcode, string check_type, string sampmethod, string qualitystatus, string labqty, string sampleqty, string goodqty, string ngqty, string checkitemcont, string username)
        {
            var sql = "";
            string[] arra = new string[] { };
            string[] arra1 = new string[] { };
            string checktypename = "";
            List<object> list = new List<object>();
            var dynamicParams = new DynamicParameters();
            try
            {
                string date = DateTime.Now.ToString(); //获取系统时间
                string datetime = DateTime.Now.ToString(); //获取系统时间
                //获取检验项目信息
                JArray arra = (JArray)Newtonsoft.Json.JsonConvert.DeserializeObject(checkitemcont);
                list.Clear();
                //写入工序检验记录主表
                sql = @"insert into  TStepCheckRecord(wo_code,partcode,step_code,checkstaned_code,check_user,check_type,check_result,check_descr,lm_user,lm_date)
                                values(@mesordercode,@partcode,@stepcode,@checkstanedcode,@checkusercode,@checktypecode,@checkresult,@checkdescr,@lm_user,@lm_date)";
                list.Add(new { str = sql, parm = new { mesordercode = mesordercode, partcode = partcode, stepcode = stepcode, checkstanedcode = checkstanedcode, checkusercode = checkusercode, checktypecode = checktypecode, checkresult = checkresult, checkdescr = checkdescr, lm_user = username, lm_date = date } });
                //写入工序检验记录子表
                //获取主表最大ID
                sql = @"select ISNULL(IDENT_CURRENT('TStepCheckRecord')+1,1) as id";
                var dt = DapperHelper.selecttable(sql);
                for (int i = 0; i < json.Count; i++)
                //写入检验记录主表
                sql = @"insert into  TStepCheckRecord(wo_code,partcode,step_code,checkstaned_code,check_user,check_type,check_typename,sampmethod,check_result,check_qty,good_qty,ng_qty,lm_user,lm_date)
                                values(@wo_code,@partcode,@step_code,@checkstaned_code,@check_user,@check_type,@check_typename,@sampmethod,@check_result,@check_qty,@good_qty,@ng_qty,@lm_user,@lm_date)";
                switch (check_type)
                {
                    sql = @"insert into  TStepCheckRecordSub(m_id,checkitem_seq,checkitem_code,checkitem_name,checkitem_descr,check_result,lm_user,lm_date)
                                values(@m_id,@checkiem_seq,@checkitem_code,@checkitem_name,@checkitem_descr,@check_result,@lm_user,@lm_date)";
                    list.Add(new { str = sql, parm = new { m_id = int.Parse(dt.Rows[0]["ID"].ToString()), checkiem_seq = int.Parse(json[i].seq), checkitem_code = json[i].code, checkitem_name = json[i].name, checkitem_descr = json[i].descr, check_result = json[i].checkresult, lm_user = username, lm_date = date } });
                    case "FirstCheck":
                        checktypename = "首检";
                        break;
                    case "PatroCheck":
                        checktypename = "巡检";
                        break;
                    case "EndCheck":
                        checktypename = "完工检验";
                        break;
                    default:
                        break;
                }
                list.Add(new
                {
                    str = sql,
                    parm = new
                    {
                        wo_code = wocode,
                        partcode = partcode,
                        step_code = stepcode,
                        checkstaned_code = checkstandcode,
                        check_user = username,
                        check_type = check_type,
                        check_typename = checktypename,
                        sampmethod = sampmethod,
                        check_result = qualitystatus,
                        check_qty = decimal.Parse(sampleqty),
                        good_qty = decimal.Parse(goodqty),
                        ng_qty = decimal.Parse(ngqty),
                        lm_user = username,
                        lm_date = datetime
                    }
                });
                //写入检验记录子表
                for (int j = 0; j < arra.Count; j++)
                {
                    sql = @"insert into  TStepCheckRecordSub(m_id,checknum,checkitem_seq,checkitem_code,checkitem_name,checkitem_descr,check_value,check_result,lm_user,lm_date)
                                values(CONVERT(INT,IDENT_CURRENT('TStepCheckRecord')),@checknum,@checkiem_seq,@checkitem_code,@checkitem_name,@checkitem_descr,@check_value,@check_result,@lm_user,@lm_date)";
                    list.Add(new
                    {
                        str = sql,
                        parm = new
                        {
                            checknum = arra[j]["checknum"].ToString(),
                            checkiem_seq = arra[j]["checkiem_seq"].ToString(),
                            checkitem_code = arra[j]["checkitem_code"].ToString(),
                            checkitem_name = arra[j]["checkitem_name"].ToString(),
                            checkitem_descr = arra[j]["checkitem_descr"].ToString(),
                            check_value = arra[j]["check_value"].ToString(),
                            check_result = arra[j]["check_result"].ToString(),
                            lm_user = username,
                            lm_date = datetime
                        }
                    });
                }
                bool aa = DapperHelper.DoTransaction(list);
@@ -2201,14 +2603,1110 @@
                {
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "检验成功!";
                    mes.Message = "操作成功!";
                    mes.data = null;
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "检验失败!";
                    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[MES工单批量关闭查询]
        public static ToMessage MesOrderBitchClosedSearch(string mesorderstus, string mesordercode, string sourceorder, string ordertype, string partcode, string partname, string partspec, int startNum, string creatuser, string createdate, int endNum, string prop, string order)
        {
            var dynamicParams = new DynamicParameters();
            string search = "";
            try
            {
                if (mesorderstus != "" && mesorderstus != null)
                {
                    search += "and A.status=@mesorderstus ";
                    dynamicParams.Add("@mesorderstus", mesorderstus);
                }
                if (mesordercode != "" && mesordercode != null)
                {
                    search += "and A.wo_code like '%'+@mesordercode+'%' ";
                    dynamicParams.Add("@mesordercode", mesordercode);
                }
                if (sourceorder != "" && sourceorder != null)
                {
                    search += "and A.m_po like '%'+@sourceorder+'%' ";
                    dynamicParams.Add("@sourceorder", sourceorder);
                }
                if (ordertype != "" && ordertype != null)
                {
                    search += "and A.wotype like '%'+@ordertype+'%' ";
                    dynamicParams.Add("@ordertype", ordertype);
                }
                if (partcode != "" && partcode != null)
                {
                    search += "and A.materiel_code like '%'+@partcode+'%' ";
                    dynamicParams.Add("@partcode", partcode);
                }
                if (partname != "" && partname != null)
                {
                    search += "and B.partname like '%'+@partname+'%' ";
                    dynamicParams.Add("@partname", partname);
                }
                if (partspec != "" && partspec != null)
                {
                    search += "and B.partspec like '%'+@partspec+'%' ";
                    dynamicParams.Add("@partspec", partspec);
                }
                if (createdate != "" && createdate != null)
                {
                    search += "and CONVERT(varchar(100),A.lm_date,23)=@createdate ";
                    dynamicParams.Add("@createdate", createdate);
                }
                if (creatuser != "" && creatuser != null)
                {
                    search += "and U.username like '%'+@creatuser+'%' ";
                    dynamicParams.Add("@creatuser", creatuser);
                }
                if (search == "")
                {
                    search = "and 1=1 ";
                }
                // --------------查询指定数据--------------
                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.org_name as wkshp_name,
                            A.route_code,E.name as route_name,A.stck_code,F.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.sourceid,A.m_po,U.username as lm_user,A.lm_date
                            ,(select sum(S.good_qty)  from TK_Wrk_Step S where S.wo_code=A.wo_code and S.isend='Y') as good_qty
                            ,(select sum(S.ng_qty)  from TK_Wrk_Step S where S.wo_code=A.wo_code and S.isend='Y') as ng_qty
                            ,(select sum(S.bad_qty)  from TK_Wrk_Step S where S.wo_code=A.wo_code and S.isend='Y') as bad_qty
                            from TK_Wrk_Man A
                            left join TMateriel_Info B on A.materiel_code=B.partcode
                            left join TOrganization C on A.wkshp_code=C.org_code
                            left join T_Sec_Stck D on A.stck_code=D.code
                            left join TFlw_Rout E on A.route_code=E.code
                            left join T_Sec_Stck F on A.stck_code=F.code
                            left join TUser U on A.lm_user=U.usercode
                            where A.is_delete<>'1' " + search;
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.count = total;
                mes.data = data.ToList();
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[MES工单批量关闭提交]
        public static ToMessage MesOrderBitchClosedSeave(string username, DataTable dt)
        {
            var sql = "";
            List<object> list = new List<object>();
            var dynamicParams = new DynamicParameters();
            try
            {
                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_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 = username, closedate = DateTime.Now.ToString() } });
                }
                bool aa = DapperHelper.DoTransaction(list);
                if (aa)
                {
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "工单关闭成功!";
                    mes.data = null;
                }
                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[MES工单批量反关闭]
        public static ToMessage MesOrderBitchAntiClosedSeave(string username, DataTable dt)
        {
            var sql = "";
            List<object> list = new List<object>();
            var dynamicParams = new DynamicParameters();
            try
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //关闭工单对应工序任务
                    sql = @"update TK_Wrk_Step set status='START'  where wo_code=@wocode";
                    list.Add(new { str = sql, parm = new { wocode = dt.Rows[i]["WO_CODE"].ToString() } });
                    //回写工单表状态为(关闭)
                    sql = @"update TK_Wrk_Man set status='START',closeuser=@username,closedate=@closedate  where wo_code=@wocode";
                    list.Add(new { str = sql, parm = new { wocode = dt.Rows[i]["WO_CODE"].ToString(), username = username, closedate = DateTime.Now.ToString() } });
                }
                bool aa = DapperHelper.DoTransaction(list);
                if (aa)
                {
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "工单关闭成功!";
                    mes.data = null;
                }
                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 CapacityPlanningSearch(string workshop, string devicetype, string stustype, int startNum, int endNum, string prop, string order)
        {
            var dynamicParams = new DynamicParameters();
            string search = "";
            try
            {
                if (workshop != "" && workshop != null)
                {
                    search += "and A.wksp_code=@workshop ";
                    dynamicParams.Add("@workshop", workshop);
                }
                if (devicetype != "" && devicetype != null)
                {
                    search += "and A.code=@devicetype ";
                    dynamicParams.Add("@devicetype", devicetype);
                }
                if (stustype != "" && stustype != null)
                {
                    search += "and B.enable=@stustype ";
                    dynamicParams.Add("@stustype", stustype);
                }
                if (search == "")
                {
                    search = "and 1=1 ";
                }
                // --------------查询指定数据--------------
                var total = 0; //总条数
                var sql = @"select
                            B.id             CaptPlanId,
                            A.wksp_code      CaptPlanWorkShopid,
                            C.org_name       CaptPlanWorkShop,
                            A.code           CaptPlanDeviceTypeid,
                            A.name           CaptPlanDeviceType,
                            A.ClassType      CaptPlanType,
                            E.aa             CaptPlanShopCalendar,
                            E.RR             CaptPlanShopMaxDate,
                            E.TT             CaptPlanShopCalendarList,
                            B.wkshift_code   CaptPlanWorkShiftCode,
                            D.name           CaptPlanWorkShift,
                            D.duration       CaptPlanDuration,
                            B.lm_date        CaptPlanDate,
                            B.ENABLE         CaptPlanStus,
                            G.username       CaptPlanUser
                            FROM(
                            select distinct B.wksp_code,A.code,A.name,'D' ClassType   from TEqpType A
                            left join TEqpInfo B on A.code=B.eqptype_code
                            left join TFlw_Rteqp C on B.code=C.eqp_code
                            left join TFlw_Rtdt  D on C.step_code=D.step_code
                            where D.first_choke='Y'  --order by A.code
                            )A
                            left join TOrganization C on A.wksp_code=C.org_code
                            left join TWkm_capac_plan B ON A.wksp_code=B.wkshop and A.code=B.eqp_typecode
                            left join TBas_wkshift_info D on B.wkshift_code=D.code
                            left join TUser  G   on B.lm_user=G.usercode
                            left join (
                               select m_id,
                               min(CONVERT(varchar(100), wkdate, 23))+'~'+max(CONVERT(varchar(100), wkdate, 23)) aa,
                               max(CONVERT(varchar(100), wkdate, 23))RR,
                               STUFF((
                                    SELECT ',' + CONVERT(varchar(100),t1.wkdate, 23)
                                      FROM TWkm_capac_plan_sub t1
                                      WHERE t1.m_id = t0.m_id
                                      ORDER BY t1.m_id
                                      FOR XML PATH('')), 1, LEN(','), '') AS TT
                                      FROM TWkm_capac_plan_sub t0 where CONVERT(varchar(100), wkdate, 23)>=CONVERT(varchar(100),getdate(), 23)
                                      GROUP BY t0.m_id
                             ) E on B.id=E.m_id
                            where C.description='W' " + search;
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.count = total;
                mes.data = data.ToList();
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[产能规划默认方案保存提交]
        public static ToMessage CapacityPlanSubmit(string type, string captplanid, string wkshopcode, string capunitcode, string capsetupcode, string captplantype, string username)
        {
            var dynamicParams = new DynamicParameters();
            try
            {
                if (type == "Add")
                {
                    var sql = @"insert into TWkm_capac_plan(wkshop, eqp_typecode, wkshift_code, enable, lm_user, lm_date,classtype)
                            values(@wkshop,@eqp_typecode,@wkshift_code,@enable,@lm_user,@lm_date,@classtype)";
                    dynamicParams.Add("@wkshop", wkshopcode);
                    dynamicParams.Add("@eqp_typecode", capunitcode);
                    dynamicParams.Add("@wkshift_code", capsetupcode);
                    dynamicParams.Add("@enable", "Y");
                    dynamicParams.Add("@lm_user", username);
                    dynamicParams.Add("@lm_date", DateTime.Now.ToString());
                    dynamicParams.Add("@classtype", captplantype);
                    int cont = DapperHelper.SQL(sql, dynamicParams);
                    if (cont > 0)
                    {
                        mes.code = "200";
                        mes.count = 0;
                        mes.Message = "新增操作成功!";
                        mes.data = null;
                    }
                    else
                    {
                        mes.code = "300";
                        mes.count = 0;
                        mes.Message = "新增操作失败!";
                        mes.data = null;
                    }
                }
                if (type == "Update")
                {
                    var sql = @"update TWkm_capac_plan set wkshift_code=@wkshift_code,lm_user=@username,lm_date=@CreateDate where id=@captplanid";
                    dynamicParams.Add("@captplanid", captplanid);
                    dynamicParams.Add("@wkshift_code", capsetupcode);
                    dynamicParams.Add("@username", username);
                    dynamicParams.Add("@CreateDate", DateTime.Now.ToString());
                    int cont = DapperHelper.SQL(sql, dynamicParams);
                    if (cont > 0)
                    {
                        mes.code = "200";
                        mes.count = 0;
                        mes.Message = "修改操作成功!";
                        mes.data = null;
                    }
                    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 CapacityPlanningCalendar(string captplanid)
        {
            string sql = "";
            var dynamicParams = new DynamicParameters();
            List<CapaPlan> list = new List<CapaPlan>();
            try
            {
                sql = @"select CONVERT(varchar(100), wkdate, 23) DataTime,wkshift_code   from TWkm_capac_plan_sub where m_id=@captplanid";
                dynamicParams.Add("@captplanid", captplanid);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                for (int i = 0; i < data.Rows.Count; i++)
                {
                    string DataTime = data.Rows[i]["DataTime"].ToString();//日期
                    string key = data.Rows[i]["wkshift_code"].ToString(); //方案编码
                    CapaPlan cmp = new CapaPlan();
                    cmp.name = DataTime;
                    cmp.key = key;
                    list.Add(cmp);
                }
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.data = list;
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[产能规划日历双击时带出对应的方案]
        public static ToMessage CapacityPlanningOnclickSelect(string captplanid, string datetime)
        {
            string sql = "";
            var dynamicParams = new DynamicParameters();
            List<CapacityPlanSect> list = new List<CapacityPlanSect>();
            try
            {
                sql = @"select distinct AA.code,AA.name,(case  when AA.Stus is null then 'N' else 'Y' end) flag
                        from
                        (
                        select A.code,A.name,B.wkshift_code Stus  from TBas_wkshift_info A
                        left join TWkm_capac_plan_sub B on A.code= B.wkshift_code and B.m_id=@captplanid and CONVERT(varchar(100), wkdate, 23)=@datetime
                        ) AA  order by code";
                dynamicParams.Add("@captplanid", captplanid);
                dynamicParams.Add("@datetime", datetime);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                for (int i = 0; i < data.Rows.Count; i++)
                {
                    string code = data.Rows[i]["code"].ToString();//方案编码
                    string name = data.Rows[i]["name"].ToString();//方案名称
                    string flag = data.Rows[i]["flag"].ToString();   //选中方案标识
                    CapacityPlanSect cmp = new CapacityPlanSect();
                    cmp.CapCode = code;
                    cmp.CapName = name;
                    cmp.CapStus = flag;
                    cmp.list = new List<object>();
                    string sql1 = @"select wktme1_start,wktme2_start,wktme3_start,wktme4_start,wktme5_start  from TBas_wkshift_info where code=@code";
                    dynamicParams.Add("@code", code);
                    var db = DapperHelper.selectdata(sql1, dynamicParams);
                    for (int j = 0; j < db.Columns.Count; j++) //时间段
                    {
                        if (db.Rows[0][j].ToString().Trim() != null && db.Rows[0][j].ToString().Trim() != "")
                        {
                            cmp.list.Add(db.Rows[0][j].ToString());
                        }
                    }
                    list.Add(cmp);
                }
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.data = list;
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[产能规划工作日历选择提交]
        public static ToMessage CapacityPlanningGivePlanSubmit(string captplanid, string wkshopcode, string capunitcode, string capsetupcode, string captplantype, List<CapaPlan> objs, string type, string username)
        {
            string sql = "";
            List<object> list = new List<object>();
            var dynamicParams = new DynamicParameters();
            try
            {
                list.Clear();
                if (capsetupcode == "" || capsetupcode == null)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "默认方案选择不能为空!";
                    mes.data = null;
                    return mes;
                }
                if (objs.Count <= 0)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "工作日历选择不能为空!";
                    mes.data = null;
                    return mes;
                }
                if (type == "Add")
                {
                    for (int i = 0; i < objs.Count; i++)
                    {
                        sql = @"insert into TWkm_capac_plan_sub(m_id, wkdate,wkshift_code)
                                     values(@m_id,@wkdate,@wkshift_code)";
                        list.Add(new
                        {
                            str = sql,
                            parm = new
                            {
                                m_id = captplanid,
                                wkdate = objs[i].name,
                                wkshift_code = objs[i].key
                            }
                        });
                    }
                    bool aa = DapperHelper.DoTransaction(list);
                    if (aa)
                    {
                        mes.code = "200";
                        mes.count = 0;
                        mes.Message = "操作成功!";
                        mes.data = null;
                    }
                    else
                    {
                        mes.code = "200";
                        mes.count = 0;
                        mes.Message = "操作失败!";
                        mes.data = null;
                    }
                }
                if (type == "Update")
                {
                    //定义两个数组用来对比修改前后日期及方案的变化
                    List<CapaPlan> ids = new List<CapaPlan>();
                    List<CapaPlan> ids1 = new List<CapaPlan>();
                    for (int i = 0; i < objs.Count; i++)
                    {
                        ids.Add(objs[i]);
                    }
                    //根据id查找日历时间
                    string sql2 = @"select CONVERT(varchar(100), wkdate, 23) wkdate,wkshift_code  from TWkm_capac_plan_sub where m_id=@m_id";
                    dynamicParams.Add("@m_id", captplanid);
                    var dt2 = DapperHelper.selectdata(sql2, dynamicParams);
                    if (dt2.Rows.Count > 0)
                    {
                        for (int k = 0; k < dt2.Rows.Count; k++)
                        {
                            CapaPlan ids2 = new CapaPlan();
                            ids2.name = dt2.Rows[k]["wkdate"].ToString();
                            ids2.key = dt2.Rows[k]["wkshift_code"].ToString();
                            ids1.Add(ids2);
                        }
                    }
                    List<CapaPlan> list3 = ids.Except(ids1).ToList(); //表示ids中哪些值是ids1中所不存在的;
                    List<CapaPlan> list4 = ids1.Except(ids).ToList(); //表示ids1中哪些值是ids中所不存在的;
                    list4 = list3.Union(list4).ToList();
                    //查找关键工序设备、工位群组的所有设备
                    string sql3 = @"select distinct A.code,A.name  from TEqpInfo A
                                  left join TFlw_Rteqp B on A.code=B.eqp_code
                                  left join TFlw_Rtdt D on B.step_code=D.step_code
                                  where A.wksp_code=@wkshopcode  and D.first_choke='Y'  order by A.code";
                    dynamicParams.Add("@wkshopcode", wkshopcode);
                    var dt3 = DapperHelper.selectdata(sql3, dynamicParams);
                    if (list4.Count > 0)  //如果日期有变动
                    {
                        if (dt3.Rows.Count > 0)
                        {
                            for (int m = 0; m < list4.Count; m++)
                            {
                                for (int n = 0; n < dt3.Rows.Count; n++)
                                {
                                    string sql4 = @"select  A.wo_code,A.eqp_code,A.Time_Start,A.time_end,
                                                     (case  B.Status when 'SCHED' then '已排程' when 'ALLOC' then '已派发' when 'START' then '已开工' end ) status
                                                      from TK_Wrk_EqpAps  A
                                                      left join TK_Wrk_Man B on A.wo_code=B.wo_code
                                                      left join TEqpInfo C on A.eqp_code=C.code
                                                      where CONVERT(varchar(100), time_start, 23)=@time_start and A.eqp_code=@eqp_code and B.isaps='Y' and B.status IN('SCHED','ALLOC','START')";
                                    dynamicParams.Add("@time_start", list4[m].name);
                                    dynamicParams.Add("@eqp_code", dt3.Rows[n]["CODE"]);
                                    var dt4 = DapperHelper.selectdata(sql4, dynamicParams);
                                    if (dt4.Rows.Count > 0)
                                    {
                                        for (int g = 0; g < dt4.Rows.Count; g++)
                                        {
                                            mes.code = "300";
                                            mes.count = 0;
                                            mes.Message = "修改失败!,日期:" + dt4.Rows[g]["TIME_START"] + "有【" + dt4.Rows[g]["STATUS"] + "】工单:" + dt4.Rows[g]["WO_CODE"] + "";
                                            mes.data = null;
                                            return mes;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //更新排产生产资源主表
                    sql = @"update TWkm_capac_plan set wkshift_code=@wkshift_code,classtype=@classtype,lm_user=@lm_user,lm_date=@lm_time  where id=@id";
                    list.Add(new
                    {
                        str = sql,
                        parm = new
                        {
                            id = captplanid,
                            wkshift_code = capsetupcode,
                            classtype = captplantype,
                            lm_user = username,
                            lm_time = DateTime.Now.ToString()
                        }
                    });
                    //删除排产生产资源子表
                    sql = @"delete TWkm_capac_plan_sub  where m_id=@id";
                    list.Add(new
                    {
                        str = sql,
                        parm = new
                        {
                            id = captplanid
                        }
                    });
                    //循环写入排产生产资源子表
                    for (int i = 0; i < objs.Count; i++)
                    {
                        sql = @"insert into TWkm_capac_plan_sub(m_id,wkdate,wkshift_code) values(@m_id,@wkdate,@wkshift_code)";
                        list.Add(new
                        {
                            str = sql,
                            parm = new
                            {
                                m_id = captplanid,
                                wkdate = objs[i].name,
                                wkshift_code = objs[i].key
                            }
                        });
                    }
                    bool aa = DapperHelper.DoTransaction(list);
                    if (aa)
                    {
                        mes.code = "200";
                        mes.count = 0;
                        mes.Message = "操作成功!";
                        mes.data = null;
                    }
                    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 AdvancedSchedulingSearch(string workshop, string wocode, string partcode, string partname, int startNum, int endNum, string prop, string order)
        {
            var dynamicParams = new DynamicParameters();
            string search = "";
            try
            {
                if (workshop != "" && workshop != null)
                {
                    search += "and A.wkshp_code=@workshop ";
                    dynamicParams.Add("@workshop", workshop);
                }
                if (wocode != "" && wocode != null)
                {
                    search += "and A.wo_code like '%'+@wocode+'%' ";
                    dynamicParams.Add("@wocode", wocode);
                }
                if (partcode != "" && partcode != null)
                {
                    search += "and A.materiel_code like '%'+@partcode+'%' ";
                    dynamicParams.Add("@partcode", partcode);
                }
                if (partname != "" && partname != null)
                {
                    search += "and C.partname like '%'+@partname+'%' ";
                    dynamicParams.Add("@partname", partname);
                }
                if (search == "")
                {
                    search = "and 1=1 ";
                }
                // --------------查询指定数据--------------
                var total = 0; //总条数
                var sql = @"select
                             A.id              AdvaScheId,
                             A.status          AdvaScheStus,
                             A.wo_code         AdvaScheWorkCode,
                             A.wkshp_code      AdvaScheWorkShopid,
                             M.org_name        AdvaScheWorkShop,
                             A.materiel_code   AdvaSchePartNumber,
                             C.partname        AdvaSchePartName,
                             C.partspec        AdvaSchePartSpec,
                             D.name            AdvaSchePartModel,
                             A.plan_qty        AdvaScheQty,
                             U.name            AdvaScheUom,
                             isnull(E.sched_qty,0)       AdvaScheYPQty,
                            CONVERT(varchar(100), B.planenddate, 23) AdvaScheEndDate,
                            convert(varchar(20),isnull(E.sched_qty,0))+'/'+convert(varchar(20),isnull(A.plan_qty,0)) AdvaScheSpeed,
                             A.route_code    AdvaScheRoutid,
                             F.name        AdvaScheRoutName,
                             E.step_code   AdvaScheBotProcid,
                             G.stepname        AdvaScheBotProcName,
                            CONVERT(varchar(100), H.maxtime, 23) AdvaSchePCEndDate,
                             CONVERT(varchar(100), H.mintime, 23) AdvaSchePCStartDate,
                            (case  when CONVERT(varchar(100), H.maxtime, 23)<=CONVERT(varchar(100), E.plan_enddate, 23) then 'Y'  when H.MAXTime is null  then 'Y'  else 'N' end) Flag,
                            (case when A.PiroQue='1' then '特急' when A.PiroQue='2' then '紧急' when A.PiroQue='3' then '正常' end) AdvaSchePiroQue
                            from TK_Wrk_Man A
                            left join TKimp_Ewo B on A.m_po=B.wo
                            left join TMateriel_Info C on C.partcode= A.materiel_code
                             left join T_Dict D on C.stocktype_code= d.code
                             left join TK_Wrk_Step E on E.wo_code=A.wo_code
                             left join TFlw_Rout F  on A.route_code=F.code
                             left join TStep G  on E.step_code=G.stepcode
                             left join (select wo_code, max(TIME_END) MAXTime,min(time_start) MINTime  from TK_Wrk_EqpAps group by wo_code) H on A.wo_code=H.wo_code
                            left join TUom U on C.uom_code=U.code
                             left join TOrganization M on A.wkshp_code=M.org_code
                            where    E.isbott = 'Y' and A.status='NEW' and A.isaps='Y'";
                var data = DapperHelper.GetPageList<object>(sql, dynamicParams, prop, order, startNum, endNum, out total);
                mes.code = "200";
                mes.Message = "查询成功!";
                mes.count = total;
                mes.data = data.ToList();
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return mes;
        }
        #endregion
        #region[排产设备信息]
        public static List<AdvancedSchedulingDevice> OnclickAdvancedSchedulingDevice(string wocode, string wkshpcode, string partcode, string startdate, string enddate, ref ToMessage mes)
        {
            string sql = "", sql0 = "";
            var dynamicParams = new DynamicParameters();
            List<AdvancedSchedulingDevice> list = new List<AdvancedSchedulingDevice>();
            DataTable dt, dt1;
            DateTime beginDate = Convert.ToDateTime(startdate);
            DateTime endDate = DateTime.Parse(enddate);
            try
            {
                if (beginDate > endDate)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "要求交付时间不能小于当前系统时间!";
                    mes.data = null;
                    return list;
                }
                bool IsCap = false;    //是否设置产能
                //通过工单查找工艺路线对应关键工序所关联的设备是否可用
                sql = @"select distinct C.eqp_code ,D.Enable  from TK_Wrk_Man A
                       left join TFlw_Rout K on A.route_code=K.code
                       left join TFlw_Rtdt B on K.code=B.rout_code and B.first_choke='Y'
                       left join TFlw_Rteqp C on B.step_code= C.step_code
                       left join TEqpInfo D on C.eqp_code=D.code
                       where A.wo_code=@wocode and A.materiel_code=@partcode";
                dynamicParams.Add("@wocode", wocode);
                dynamicParams.Add("@partcode", partcode);
                var dt_0 = DapperHelper.selectdata(sql, dynamicParams);
                if (dt_0.Rows.Count > 0)
                {
                    int cout = dt_0.Rows.Count;
                    int num = 0;
                    for (int m = 0; m < dt_0.Rows.Count; m++)
                    {
                        if (dt_0.Rows[m]["Enable"].ToString() == "N")
                        {
                            num = num + 1;
                        }
                    }
                    if (num == cout)
                    {
                        mes.code = "300";
                        mes.count = 0;
                        mes.Message = "设备不可用!";
                        mes.data = null;
                        return list;
                    }
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "工艺路线未关联设备!";
                    mes.data = null;
                    return list;
                }
                //通过工单查找工艺路线对应关键工序所关联的设备所属车间
                sql0 = @"select distinct D.wksp_code  from TK_Wrk_Man A
                         left join TFlw_Rout K on A.route_code=K.code
                         left join TFlw_Rtdt B on K.code=B.rout_code and B.first_choke='Y'
                         left join TFlw_Rteqp C on B.step_code= C.step_code
                         left join TEqpInfo D on C.eqp_code=D.code
                         where A.wo_code=@wocode and A.materiel_code=@partcode ";
                dynamicParams.Add("@wocode", wocode);
                dynamicParams.Add("@partcode", partcode);
                var dt0 = DapperHelper.selectdata(sql0, dynamicParams);
                if (dt0.Rows.Count > 0)
                {
                    string sy = "0";
                    for (int i = 0; i < dt0.Rows.Count; i++)
                    {
                        if (dt0.Rows[i]["WKSHOP"].ToString() == wkshpcode)  //工单创建车间是否等于排产设备 车间
                        {
                            sy = "1";
                            break;
                        }
                        else
                        {
                            sy = "0";
                        }
                    }
                    if (sy == "0")
                    {
                        mes.code = "300";
                        mes.count = 0;
                        mes.Message = "排产设备车间与工单创建的车间不同!";
                        mes.data = null;
                    }
                    else
                    {
                        List<APSList> listData = SchedulingMethod.SchedulingMethodTF(wocode, wkshpcode, partcode);
                        for (DateTime date = beginDate; date <= endDate; date = date.AddDays(1))
                        {
                            AdvancedSchedulingDevice tbj = new AdvancedSchedulingDevice();
                            tbj.YearDate = date.ToString("yyyy-MM-dd");
                            tbj.children = new List<AdvancedSchedulingDeviceCont>();
                            for (int j = 0; j < listData.Count; j++)
                            {
                                if (listData[j].AdvaDevicCropMob.ToString() == "0" || listData[j].AdvaDevicRhythm.ToString() == "")
                                {
                                    mes.code = "300";
                                    mes.count = 0;
                                    mes.Message = "排程设备" + listData[j].eqp_id.ToString() + "稼动率不能为0或为空!";
                                    mes.data = null;
                                    return list;
                                }
                                if (listData[j].AdvaDevicRhythm.ToString() == "0" || listData[j].AdvaDevicRhythm.ToString() == "")
                                {
                                    mes.code = "300";
                                    mes.count = 0;
                                    mes.Message = "排程设备" + listData[j].eqp_id.ToString() + "未设置节拍!";
                                    mes.data = null;
                                    return list;
                                }
                                string sql1 = @"select wktme1_start,wktme2_start,wktme3_start,wktme4_start,wktme5_start,G.name
                                              from  TWkm_capac_plan  E
                                                left join TWkm_capac_plan_sub F on E.id=F.m_id
                                                left join TBas_wkshift_info G on F.wkshift_code=G.code
                                                where E.wkshop='CJ001'and E.eqp_typecode='SBLX001'  and E.ClassType='D'
                                              and CONVERT(varchar(100), F.wkdate, 23)='2022-10-11' and E.enable='Y'";
                                dynamicParams.Add("@wkshop", wkshpcode);
                                dynamicParams.Add("@eqp_typecode", listData[j].Style.ToString());
                                dynamicParams.Add("@classtype", listData[j].ClassType.ToString());
                                dynamicParams.Add("@wkdate", date.ToString("yyyy-MM-dd"));
                                dt1 = DapperHelper.selectdata(sql1, dynamicParams);
                                AdvancedSchedulingDeviceCont tbjson = new AdvancedSchedulingDeviceCont();
                                tbjson.AdvaDevicNumber = listData[j].eqp_id.ToString();
                                tbjson.AdvaDevicName = listData[j].name.ToString();
                                tbjson.AdvaDevicCropMob = listData[j].AdvaDevicCropMob.ToString();  //稼动率
                                tbjson.AdvaDevicRhythm = listData[j].AdvaDevicRhythm.ToString();    //生产节拍
                                if (dt1.Rows.Count > 0)
                                {
                                    tbjson.OneStartDate = dt1.Rows[0]["wktme1_start"].ToString();
                                    tbjson.TwoStartDate = dt1.Rows[0]["wktme2_start"].ToString();
                                    tbjson.ThreeStartDate = dt1.Rows[0]["wktme3_start"].ToString();
                                    tbjson.FourStartDate = dt1.Rows[0]["wktme4_start"].ToString();
                                    tbjson.FiveStartDate = dt1.Rows[0]["wktme5_start"].ToString();
                                    tbj.children.Add(tbjson);
                                    IsCap = true;
                                }
                                else
                                {
                                    tbjson.OneStartDate = "";
                                    tbjson.TwoStartDate = "";
                                    tbjson.ThreeStartDate = "";
                                    tbjson.FourStartDate = "";
                                    tbjson.FiveStartDate = "";
                                    tbj.children.Add(tbjson);
                                }
                            }
                            list.Add(tbj);
                        }
                        if (list.Select(p => p.children).ToList().Count > 0)
                        {
                            int one = list.Where(t => t.children.Select(s => s.OneStartDate).Any(x => x != "")).ToList().Count;
                            int two = list.Where(t => t.children.Select(s => s.TwoStartDate).Any(x => x != "")).ToList().Count;
                            int three = list.Where(t => t.children.Select(s => s.ThreeStartDate).Any(x => x != "")).ToList().Count;
                            int four = list.Where(t => t.children.Select(s => s.FourStartDate).Any(x => x != "")).ToList().Count;
                            int five = list.Where(t => t.children.Select(s => s.FiveStartDate).Any(x => x != "")).ToList().Count;
                            if (one <= 0 && two <= 0 && three <= 0 && four <= 0 && five <= 0)
                            {
                                mes.code = "300";
                                mes.count = 0;
                                mes.Message = "排程设备未设置产能!";
                                mes.data = null;
                            }
                        }
                    }
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "设备没有关联车间!";
                    mes.data = null;
                }
                return list;
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.Message = e.Message;
                mes.data = null;
            }
            return list;
        }
        #endregion
        #region[设备已排程信息]
        public static DataTable AlreadyScheduling(string wocode, string wkshpcode, string partcode, string botproccode, string startdate, string enddate)
        {
            var dynamicParams = new DynamicParameters();
            try
            {
                List<APSList> listData = SchedulingMethod.SchedulingMethodTF(wocode, wkshpcode, partcode);
                string[] empIds = listData.Select(a => a.eqp_id).ToArray();
                string str = string.Join(",", empIds);
                string s1 = string.Format("'{0}'", str.Replace(",", "','"));
                string sql = @"select B.wo_code,  B.eqp_code,B.time_start,B.time_end, 'S' status , B.alloc_qty,D.partname as part_name
                              from TK_Wrk_EqpAps B
                               left join TK_Wrk_Man C on B.wo_code=C.wo_code
                               left join  TMateriel_Info D on C.materiel_code=D.partcode
                               where  B.eqp_code in(@s1)
                              and convert(varchar(100),B.Time_Start,21)>=@startdate and convert(varchar(100),B.Time_End,21)<=@enddate order by time_end";
                dynamicParams.Add("@s1", s1);
                dynamicParams.Add("@startdate", startdate + " 00:00:00");
                dynamicParams.Add("@enddate", enddate + " 23:59:59");
                var dt_0 = DapperHelper.selectdata(sql, dynamicParams);
                if (dt == null || dt.Rows.Count == 0)
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return dt;
        }
        #endregion
        #region[排程数据提交]
        public static ToMessage SubmitAlreadyScheduling(string username, string wocode, string botprocecode, List<AlreadyScheduling> objs)
        {
            var sql = "";
            List<object> list = new List<object>();
            var dynamicParams = new DynamicParameters();
            try
            {
                string maxTime = objs.Max(t => Convert.ToDateTime(t.AlreEndDate).ToString("yyyy-MM-dd HH:mm"));  //最大值
                string minTime = objs.Min(t => Convert.ToDateTime(t.AlreEndDate).ToString("yyyy-MM-dd HH:mm"));  //最小值
                sql = @"select
                        A.id, A.status,
                        '0' BottFrointv,  convert(varchar(100),B.plan_enddate-0,21) Plan_end ,
                        convert(varchar(100),B.plan_startdate+0,21) plan_start
                        from TK_Wrk_Step A
                        left join TK_Wrk_Man B on A.wo_code=B.wo_code
                        where A.wo_code=@wocode and A.step_code=@botprocecode and A.isbott='Y'";
                dynamicParams.Add("@wocode", wocode);
                dynamicParams.Add("@botprocecode", botprocecode);
                var dt = DapperHelper.selectdata(sql, dynamicParams);
                string ID = dt.Rows[0]["ID"].ToString();     // mes_tk_wrk_step 表 瓶径工序行ID
                string status = dt.Rows[0]["STATUS"].ToString();
                Decimal nm = 0;                                                     //瓶径工序的前置天数
                Decimal nn = Decimal.Parse(dt.Rows[0]["BottFrointv"].ToString());   //瓶径工序的后置天数
                if (status != "NEW" && status != "SCHED")   //工序任务的状态已经派发(审核)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "当前排程任务已经派发,提交取消!";
                    mes.data = null;
                    return mes;
                }
                if (status == "SCHED")   //工序任务的状态已经排程
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "当前排程任务已经排程,提交取消!";
                    mes.data = null;
                    return mes;
                }
                list.Clear();
                //按工单删除设备任务表(日任务表)
                sql = @"delete TK_Wrk_EqpAps  where wo_code=@wocode";
                list.Add(new { str = sql, parm = new { wocode = wocode } });
                //按工单删除设备任务表(汇总表)
                sql = @"delete TK_Wrk_EqpApsSum  where wo_code=@wocode";
                list.Add(new { str = sql, parm = new { wocode = wocode } });
                //按工单删除设备任务表(汇总表)物料表
                sql = @"delete TK_Wrk_EqpSum_Allo  where wo_code=@wocode";
                list.Add(new { str = sql, parm = new { wocode = wocode } });
                float n = 0;  //累计排产总数
                for (int i = 0; i < objs.Count; i++)        //循环添加每个设备的机台任务
                {
                    sql = @"insert into TK_Wrk_EqpAps (wo_code,step_taid,eqp_code,time_start,time_end,alloc_qty,status)
                            values(@wo_code,@step_taid,@eqp_code,@time_start,@time_end,@alloc_qty,@status)";
                    list.Add(new { str = sql, parm = new { wo_code = wocode, step_taid = ID, eqp_code = objs[i].AlreDevicNumber, time_start = objs[i].AlreStartDate, time_end = objs[i].AlreEndDate, alloc_qty = objs[i].AlreQty, status = "NEW" } });
                    n = n + float.Parse(objs[i].AlreQty.ToString());
                }
                bool aa = DapperHelper.DoTransaction(list); //提交设备任务
                if (!aa)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "先预排,再点击提交!";
                    mes.data = null;
                    return mes;
                }
                list.Clear();
                //生成设备任务汇总表  (根据设备日任务表)
                sql = "select distinct eqp_code from TK_Wrk_EqpAps where wo_code=@wocode";
                dynamicParams.Add("@wocode", wocode);
                var dt1 = DapperHelper.selectdata(sql, dynamicParams);
                for (int i = 0; i < dt1.Rows.Count; i++)
                {
                    sql = @"insert into  TK_Wrk_EqpApsSum (wo_code,eqp_code,step_taid,p_date, t_date, qty,status)
                           select  min(wo_code),min(eqp_code),min(step_taid),min(time_start),max(time_end),sum(Alloc_Qty),'NEW' from TK_Wrk_EqpAps
                           where wo_code=@wocode and eqp_code=''";
                    list.Add(new { str = sql, parm = new { wocode = wocode, eqp_code = dt1.Rows[i]["EQP_CODE"].ToString() } });
                }
                bool aa1 = DapperHelper.DoTransaction(list); //提交设备任务
                if (!aa1)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "生成设备任务汇总表出错,排产失败!";
                    mes.data = null;
                    return mes;
                }
                list.Clear();
                //写入设备任务(汇总表)用料  计划数量*子件基本用量*(1+损耗率)/母件基本用量
                sql = @"insert into TK_Wrk_EqpSum_Allo(m_id, seq, invcode, qty,wo_code,pn_type)
                        select A.id M_id, B.seq,B.materiel_code,(round(A.qty,2)*BE.Base_Quantity*(1+BE.LOSS_QUANTITY/100))/BM.quantity  qty,A.wo_code,B.materieltype
                        from TK_Wrk_EqpApsSum A
                        left join TK_Wrk_Allo B on A.Wo_Code= B.Wo_Code
                        left join TBom_Deta BE  ON B.bom_id=BE.m_id and B.materiel_code=BE.smateriel_code
                        left join  TBom_Main BM on BE.m_Id=BM.id  where A.wo_code=@wocode";
                list.Add(new { str = sql, parm = new { wocode = wocode } });
                //更新 工序任务单的【瓶径工序】 排产预开工日期、排产预完工日期、状态:NEW===>SCHED 、已排产数量
                sql = @"update TK_Wrk_Step   set plan_startdate =convert(varchar(100),@plan_startdate,21),  plan_enddate =convert(varchar(100),@plan_enddate,21),  status = 'SCHED', sched_qty =@sched_qty where id =@id";
                list.Add(new { str = sql, parm = new { plan_startdate = minTime, plan_enddate = maxTime, sched_qty = n, id = ID } });
                //工单工序的“计划开机日期 = 瓶径工序的预开工日期 - 瓶径工序的前置日期)    主工单:计划完工日期 = 瓶径工序的预完工日期 + 瓶径工序的后置日期
                sql = @"update TK_Wrk_Step   set plan_startdate =convert(varchar(100),@plan_startdate,21),  plan_enddate =convert(varchar(100),@plan_enddate,21),  status = 'SCHED', sched_qty =@sched_qty where wo_code =@wocode and isbott='N'";
                list.Add(new
                {
                    str = sql,
                    parm = new
                    {
                        plan_startdate = Convert.ToDateTime(minTime).AddDays(Convert.ToDouble(-nm)).ToString("yyyy-MM-dd"),
                        plan_enddate = Convert.ToDateTime(maxTime).AddDays(Convert.ToDouble(nn)).ToString("yyyy-MM-dd"),
                        sched_qty = n,
                        wocode = wocode
                    }
                });
                //主工单的“计划开机日期 = 瓶径工序的预开工日期 - 瓶径工序的前置日期)    主工单:计划完工日期 = 瓶径工序的预完工日期 + 瓶径工序的后置日期
                sql = @"update mes_tk_wrk_man set status='SCHED',plan_startdate =convert(varchar(100),@plan_startdate,21),  plan_enddate =convert(varchar(100),@plan_enddate,21), exchag='Y',allocfag='N' where wo_code =@wocode";
                list.Add(new
                {
                    str = sql,
                    parm = new
                    {
                        plan_startdate = Convert.ToDateTime(minTime).AddDays(Convert.ToDouble(-nm)).ToString("yyyy-MM-dd"),
                        plan_enddate = Convert.ToDateTime(maxTime).AddDays(Convert.ToDouble(nn)).ToString("yyyy-MM-dd"),
                        sched_qty = n,
                        wocode = wocode
                    }
                });
                bool aa2 = DapperHelper.DoTransaction(list); //提交设备任务
                if (aa2)
                {
                    mes.code = "200";
                    mes.count = 0;
                    mes.Message = "提交排程成功!";
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.Message = "提交排程失败!";
                    mes.data = null;
                }
            }