VueWebCoreApi/Tools/ScanStartReport.cs
@@ -13,7 +13,7 @@
        public static ToMessage mes = new ToMessage(); //定义全局返回信息对象
        #region[生产开报工:自制工序任务开报工判断:工单+工序条码]
        #region[生产开报工:自制工序任务开报工判断:工单+工序条码,按序生产]
        /// <summary>
        /// 扫码信息为工单+工序条码
        /// </summary>
@@ -385,7 +385,7 @@
        }
        #endregion
        #region[生产开报工:外协工序任务开报工判断:工单号+工序]
        #region[生产开报工:外协工序任务开报工判断:工单号+工序,按序收发料]
        /// <summary>
        /// 生产开报工:外协工序任务开报工判断:工单号+工序
        /// </summary>
@@ -1046,5 +1046,456 @@
            return mes;
        }
        #endregion
        #region[生产开报工:自制工序任务开报工判断:工单+工序条码,不按序生产]
        /// <summary>
        /// 扫码信息为工单+工序条码
        /// </summary>
        /// <param name="ordercode">工单编号</param>
        /// <param name="stepcode">工序编码</param>
        /// <returns></returns>
        public static ToMessage NoZZEncodingSeach(string ordercode, string stepcode)
        {
            var sql = "";
            string flwtype = ""; //工序属性
            string isbott = ""; //首道工序
            string isend = "";  //末道工序
            List<object> list = new List<object>();
            ScanStartReportData rt = new ScanStartReportData();
            var dynamicParams = new DynamicParameters();
            try
            {
                //判断当前工单是否关闭
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and status='CLOSED'";
                dynamicParams.Add("@ordercode", ordercode);
                var da0 = DapperHelper.selectdata(sql, dynamicParams);
                if (da0.Rows.Count > 0)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.message = "当前工单已关闭,不允许开报工操作!";
                    mes.data = null;
                    return mes;
                }
                //1.根据工单+工序查找当前工序是否首道工序
                sql = @"select A.wo_code,P.partcode,P.partname,P.partspec, T.stepcode,T.stepname,A.stepprice,A.seq,T.flwtype,T.descr,A.status,A.plan_qty,A.isbott,A.isend,L.torg_code,L.torg_name
                        from TK_Wrk_Step A
                        left join  TStep T on A.step_code=T.stepcode
                        left join  TK_Wrk_Man M on A.wo_code=M.wo_code
                        left join  TMateriel_Info P on M.materiel_code=P.partcode
                        left join  TOrganization L on M.wkshp_code=L.torg_code
                        where A.wo_code=@ordercode and A.step_code=@stepcode";
                dynamicParams.Add("@ordercode", ordercode);
                dynamicParams.Add("@stepcode", stepcode);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                if (data.Rows.Count > 0)
                {
                    rt.wkshopcode = data.Rows[0]["torg_code"].ToString(); //车间编码
                    rt.wkshopname = data.Rows[0]["torg_name"].ToString(); //车间名称
                    rt.wo_code = data.Rows[0]["WO_CODE"].ToString(); //工单号
                    rt.partnumber = data.Rows[0]["PARTCODE"].ToString(); //产品编码
                    rt.partname = data.Rows[0]["PARTNAME"].ToString(); //产品名称
                    rt.partspec = data.Rows[0]["PARTSPEC"].ToString(); //产品规格
                    rt.stepcode = data.Rows[0]["STEPCODE"].ToString(); //工序编码
                    rt.stepname = data.Rows[0]["STEPNAME"].ToString(); //工序名称
                    rt.stepdesc = data.Rows[0]["DESCR"].ToString(); //工序描述
                    rt.stepprice = data.Rows[0]["STEPPRICE"].ToString(); //工序工价
                    rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                    flwtype = data.Rows[0]["FLWTYPE"].ToString();//获取工序属性
                    isbott = data.Rows[0]["ISBOTT"].ToString();//首道工序
                    isend = data.Rows[0]["ISEND"].ToString();//末道工序
                    rt.seq = data.Rows[0]["SEQ"].ToString();//工序序号
                    //获取当前工序下道工序
                    sql = @"select A.isbott,A.isend,T.stepcode,T.stepname,A.stepprice from TK_Wrk_Step A
                            left join  TStep T on A.step_code=T.stepcode
                            where A.wo_code=@ordercode and A.seq=@seq+1 ";
                    dynamicParams.Add("@ordercode", ordercode);
                    dynamicParams.Add("@seq", decimal.Parse(data.Rows[0]["SEQ"].ToString()));
                    var dt = DapperHelper.selectdata(sql, dynamicParams);
                    if (dt.Rows.Count > 0) //有下道工序
                    {
                        rt.nextstepcode = dt.Rows[0]["STEPCODE"].ToString();//下道工序编码
                        rt.nextstepname = dt.Rows[0]["STEPNAME"].ToString();//下道工序名称
                        rt.nextstepprice = dt.Rows[0]["STEPPRICE"].ToString(); //下道工序工价
                    }
                    if (isend == "Y")  //当前工序是末道工序
                    {
                        rt.nextstepcode = "";//data.Rows[0]["STEPCODE"].ToString();//当前工序编码
                        rt.nextstepname = "";// data.Rows[0]["STEPNAME"].ToString();//当前工序名称
                        rt.nextstepprice = "";// data.Rows[0]["STEPPRICE"].ToString();//当前工序工价
                    }
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.message = "当前工序任务不存在!";
                    mes.data = null;
                    return mes;
                }
                switch (flwtype)
                {
                    case "Z":  //自制工序
                        //首道工序时,判断是否有报工记录
                        sql = @"select *   from TK_Wrk_Record where wo_code=@ordercode and step_code=@stepcode and style='B'";
                        dynamicParams.Add("@ordercode", ordercode);
                        dynamicParams.Add("@stepcode", stepcode);
                        var data1 = DapperHelper.selectdata(sql, dynamicParams);
                        if (data1.Rows.Count > 0)
                        {
                            decimal good_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("GOOD_QTY")).Sum();  //报工总数量
                            decimal ng_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();  //不良数量
                            decimal laborbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //工废数量
                            decimal materielbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //料废数量
                                                                                                                                    //剩余可报工数量=任务数量-(报工数量+不良数量+工废废数量+料废数量)
                            decimal kbqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - (good_qty + ng_qty + laborbad_qty + materielbad_qty);
                            if (kbqty <= 0)//无可报工数量
                            {
                                mes.code = "300";
                                mes.count = 0;
                                mes.message = "当前工序无可报工数量!";
                                mes.data = null;
                                return mes;
                            }
                            else
                            {
                                rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                                rt.noreportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - good_qty - ng_qty - laborbad_qty - materielbad_qty;  //未报数量=任务数量-已报数量-不良数量-工废数量-料废数量
                                rt.reportqty = good_qty + ng_qty + laborbad_qty + materielbad_qty;             //已报数量=报工数量+不良数量+工废数量+料废数量
                                mes.code = "200";
                                mes.count = 1;
                                mes.message = "查找成功!";
                                mes.data = rt;
                            }
                        }
                        else
                        {
                            rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                            rt.noreportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //未报数量
                            rt.reportqty = 0;                                                    //已报数量
                            mes.code = "200";
                            mes.count = 1;
                            mes.message = "查找成功!";
                            mes.data = rt;
                        }
                        break;
                    case "W":  //外协工序
                        mes.code = "300";
                        mes.count = 0;
                        mes.message = "当前工单工序任务为外协,请前往外协操作标签页操作!";
                        mes.data = null;
                        break;
                    default:   //自制+外协工序
                        break;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.message = e.Message;
                mes.data = null;
                return mes;
            }
            return mes;
        }
        #endregion
        #region[生产开报工:外协工序任务开报工判断:工单号+工序,按序收发料]
        /// <summary>
        /// 扫码信息为工单+工序条码
        /// </summary>
        /// <param name="ordercode">工单编号</param>
        /// <param name="stepcode">工序编码</param>
        /// <returns></returns>
        public static ToMessage NoWXEncodingSeach(string SelectType, string ordercode, string stepcode)
        {
            var sql = "";
            string flwtype = ""; //工序属性
            string isbott = ""; //首道工序
            string isend = "";  //末道工序
            List<object> list = new List<object>();
            ScanStartReportDataOut rt = new ScanStartReportDataOut();
            var dynamicParams = new DynamicParameters();
            try
            {
                //判断当前工单是否关闭
                sql = @"select *   from TK_Wrk_Man where wo_code=@ordercode and status='CLOSED'";
                dynamicParams.Add("@ordercode", ordercode);
                var da0 = DapperHelper.selectdata(sql, dynamicParams);
                if (da0.Rows.Count > 0)
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.message = "当前工单已关闭,不允许开报工操作!";
                    mes.data = null;
                    return mes;
                }
                //1.根据工单+工序查找当前工序是否首道工序
                sql = @"select A.wo_code,P.partcode,P.partname,P.partspec, T.stepcode,T.stepname,A.seq,T.flwtype,T.descr,A.stepprice,A.status,A.plan_qty,A.isbott,A.isend,L.torg_code,L.torg_name
                        from TK_Wrk_Step A
                        left join  TStep T on A.step_code=T.stepcode
                        left join  TK_Wrk_Man M on A.wo_code=M.wo_code
                        left join  TMateriel_Info P on M.materiel_code=P.partcode
                        left join  TOrganization L on M.wkshp_code=L.torg_code
                        where A.wo_code=@ordercode and A.step_code=@stepcode";
                dynamicParams.Add("@ordercode", ordercode);
                dynamicParams.Add("@stepcode", stepcode);
                var data = DapperHelper.selectdata(sql, dynamicParams);
                if (data.Rows.Count > 0)
                {
                    rt.wkshopcode = data.Rows[0]["torg_code"].ToString(); //车间编码
                    rt.wkshopname = data.Rows[0]["torg_name"].ToString(); //车间名称
                    rt.wo_code = data.Rows[0]["WO_CODE"].ToString(); //工单号
                    rt.partnumber = data.Rows[0]["PARTCODE"].ToString(); //产品编码
                    rt.partname = data.Rows[0]["PARTNAME"].ToString(); //产品名称
                    rt.partspec = data.Rows[0]["PARTSPEC"].ToString(); //产品规格
                    rt.stepcode = data.Rows[0]["STEPCODE"].ToString(); //工序编码
                    rt.stepname = data.Rows[0]["STEPNAME"].ToString(); //工序名称
                    rt.stepdesc = data.Rows[0]["DESCR"].ToString(); //工序描述
                    rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //任务数量
                    rt.stepprice = data.Rows[0]["STEPPRICE"].ToString(); //工序工价
                    flwtype = data.Rows[0]["FLWTYPE"].ToString();//获取工序属性
                    isbott = data.Rows[0]["ISBOTT"].ToString();//首道工序
                    isend = data.Rows[0]["ISEND"].ToString();//末道工序
                    rt.seq = data.Rows[0]["SEQ"].ToString();//工序序号
                    //获取当前工序下道工序
                    sql = @"select A.isbott,A.isend,T.stepcode,T.stepname,A.stepprice from TK_Wrk_Step A
                            left join  TStep T on A.step_code=T.stepcode
                            where A.wo_code=@ordercode and A.seq=@seq+1 ";
                    dynamicParams.Add("@ordercode", ordercode);
                    dynamicParams.Add("@seq", decimal.Parse(data.Rows[0]["SEQ"].ToString()));
                    var dt = DapperHelper.selectdata(sql, dynamicParams);
                    if (dt.Rows.Count > 0) //有下道工序
                    {
                        rt.nextstepcode = dt.Rows[0]["STEPCODE"].ToString();//下道工序编码
                        rt.nextstepname = dt.Rows[0]["STEPNAME"].ToString();//下道工序名称
                        rt.nextstepprice = dt.Rows[0]["STEPPRICE"].ToString(); //下道工序工价
                    }
                    if (isend == "Y")  //当前工序是末道工序
                    {
                        rt.nextstepcode = "";// data.Rows[0]["STEPCODE"].ToString();//当前工序编码
                        rt.nextstepname = "";// data.Rows[0]["STEPNAME"].ToString();//当前工序名称
                        rt.nextstepprice = ""; //data.Rows[0]["NEXTSTEPPRICE"].ToString();//下道工序工价
                    }
                }
                else
                {
                    mes.code = "300";
                    mes.count = 0;
                    mes.message = "当前扫码工序任务不存在!";
                    mes.data = null;
                    return mes;
                }
                switch (SelectType)
                {
                    case "OUT": //发料
                        switch (flwtype)
                        {
                            case "Z":
                                mes.code = "300";
                                mes.count = 0;
                                mes.message = "当前标签为自制标签,请前往自制操作标签页扫码!";
                                mes.data = null;
                                break;
                            case "W":
                                //1.判断是否有发料记录
                                sql = @"select *   from TK_Wrk_OutRecord R
                                            left join TCustomer C on R.wx_code=C.code
                                            where R.wo_code=@ordercode and R.step_code=@stepcode and R.style='F'";
                                dynamicParams.Add("@ordercode", ordercode);
                                dynamicParams.Add("@stepcode", stepcode);
                                var data0 = DapperHelper.selectdata(sql, dynamicParams);
                                if (data0.Rows.Count > 0)  //有发料记录
                                {
                                    decimal fqty = data0.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();  //发料数量
                                    decimal ng_qty = data0.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();// 不良数量
                                    decimal laborbad_qty = data0.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //工废数量
                                    decimal materielbad_qty = data0.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //料废数量
                                    decimal kfqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()) - fqty - ng_qty - laborbad_qty - materielbad_qty; //剩余可发数量
                                    if (kfqty <= 0)
                                    {
                                        mes.code = "300";
                                        mes.count = 0;
                                        mes.message = "当前工序无可发料数量!";
                                        mes.data = null;
                                        return mes;
                                    }
                                    else
                                    {
                                        rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                        rt.noreportqty = kfqty;                                              //未发数量=剩余可发数量
                                        rt.reportqty = fqty;                                                 //已发数量= 发料数量
                                        rt.startqty = kfqty;                                                 //发料数量=剩余可发数量
                                        mes.code = "200";
                                        mes.count = 2;
                                        mes.message = "查询成功!";
                                        mes.data = rt;
                                    }
                                }
                                else
                                {
                                    rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                    rt.noreportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString()); //未发数量=任务数量
                                    rt.reportqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());   //已发数量=任务数量
                                    rt.startqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());    //发料数量=任务数量
                                    mes.code = "200";
                                    mes.count = 2;
                                    mes.message = "弹窗发料界面!";
                                    mes.data = rt;
                                }
                                break;
                            default:
                                break;
                        }
                        break;
                    case "IN": //收料
                        switch (flwtype)
                        {
                            case "Z"://自制
                                mes.code = "300";
                                mes.count = 0;
                                mes.message = "当前标签为自制标签,请前往自制操作标签页扫码!";
                                mes.data = null;
                                break;
                            case "W":
                                //1.判断是否有发料记录
                                sql = @"select R.wo_code,R.step_code,R.wx_code as code,C.name,R.materiel_code,
                                            isnull(sum(R.fqty),0) as fqty,isnull(sum(R.sqty),0) as sqty,isnull(sum(R.ng_qty),0) as ng_qty,isnull(sum(R.laborbad_qty),0) as laborbad_qty,isnull(sum(R.materielbad_qty),0) as materielbad_qty
                                            from TK_Wrk_OutRecord R
                                            left join TCustomer C on R.wx_code=C.code
                                            where R.wo_code=@ordercode and R.step_code=@stepcode and R.style='F'
                                            group by R.wo_code,R.step_code,R.wx_code,C.name,R.materiel_code";
                                dynamicParams.Add("@ordercode", ordercode);
                                dynamicParams.Add("@stepcode", stepcode);
                                var data0 = DapperHelper.selectdata(sql, dynamicParams);
                                if (data0.Rows.Count > 0)  //有发料记录
                                {
                                    //1.判断是否有收料记录
                                    sql = @"select R.wo_code,R.step_code,R.wx_code as code,C.name,R.materiel_code,
                                                isnull(sum(R.fqty),0) as fqty,isnull(sum(R.sqty),0) as sqty,isnull(sum(R.ng_qty),0) as ng_qty,isnull(sum(R.laborbad_qty),0) as laborbad_qty,isnull(sum(R.materielbad_qty),0) as materielbad_qty
                                                from TK_Wrk_OutRecord R
                                                left join TCustomer C on R.wx_code=C.code
                                                where R.wo_code=@ordercode and R.step_code=@stepcode and R.style='S'
                                                group by R.wo_code,R.step_code,R.wx_code,C.name,R.materiel_code";
                                    dynamicParams.Add("@ordercode", ordercode);
                                    dynamicParams.Add("@stepcode", stepcode);
                                    var data1 = DapperHelper.selectdata(sql, dynamicParams);
                                    if (data1.Rows.Count > 0) //有收料记录
                                    {
                                        decimal fqty = data0.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();//本道发料数量
                                        decimal sqty = data1.AsEnumerable().Select(d => d.Field<decimal>("SQTY")).Sum();//本道收料数量
                                        decimal ng_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("NG_QTY")).Sum();//本道不良数量
                                        decimal laborbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("LABORBAD_QTY")).Sum();  //本道工废数量
                                        decimal materielbad_qty = data1.AsEnumerable().Select(d => d.Field<decimal>("MATERIELBAD_QTY")).Sum();  //本道料废数量
                                                                                                                                                //剩余可发数量=本道发料数量-本道收料数量-本道不良数量-本道工废数量-本道料废数量
                                        decimal ksqty = fqty - sqty - ng_qty - laborbad_qty - materielbad_qty;
                                        if (ksqty <= 0)
                                        {
                                            mes.code = "300";
                                            mes.count = 0;
                                            mes.message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 无可收料数量!";
                                            mes.data = null;
                                            return mes;
                                        }
                                        else
                                        {
                                            rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                            rt.noreportqty = ksqty;                                              //未收数量=本道发料数量
                                            rt.reportqty = sqty + ng_qty + laborbad_qty + materielbad_qty;          //已收数量
                                            rt.startqty = ksqty;                                                  //收料数量=本道发料数量
                                            data0.Merge(data1);//将指定的dt合并
                                            rt.list = data0.AsEnumerable().GroupBy(r => new
                                            {
                                                wo_code = r["wo_code"],
                                                step_code = r["step_code"],
                                                code = r["code"],
                                                name = r["name"]
                                            }).Select(g => new
                                            {
                                                Name = g.Key.code,
                                                tp = g.Key.name,
                                                fqty = g.Sum(i => (decimal)i["fqty"]),
                                                sqty = g.Sum(i => (decimal)i["sqty"]),
                                                ng_qty = g.Sum(i => (decimal)i["ng_qty"]),
                                                laborbad_qty = g.Sum(i => (decimal)i["laborbad_qty"]),
                                                materielbad_qty = g.Sum(i => (decimal)i["materielbad_qty"])
                                            }).ToList();
                                            mes.code = "200";
                                            mes.count = 3;
                                            mes.message = "弹窗收料界面!";
                                            mes.data = rt;
                                        }
                                    }
                                    else
                                    {
                                        decimal fqty = data0.AsEnumerable().Select(d => d.Field<decimal>("FQTY")).Sum();//本道发料数量
                                        rt.planqty = decimal.Parse(data.Rows[0]["PLAN_QTY"].ToString());     //任务数量
                                        rt.noreportqty = fqty;                                               //未收数量=本道发料数量
                                        rt.reportqty = 0;                                                    //已收数量
                                        rt.startqty = fqty;                                                  //收料数量=本道发料数量
                                                                                                             //
                                        data0.Merge(data1);//将指定的dt合并
                                        rt.list = data0.AsEnumerable().GroupBy(r => new
                                        {
                                            wo_code = r["wo_code"],
                                            step_code = r["step_code"],
                                            code = r["code"],
                                            name = r["name"]
                                        }).Select(g => new
                                        {
                                            Name = g.Key.code,
                                            tp = g.Key.name,
                                            fqty = g.Sum(i => (decimal)i["fqty"]),
                                            sqty = g.Sum(i => (decimal)i["sqty"]),
                                            ng_qty = g.Sum(i => (decimal)i["ng_qty"]),
                                            laborbad_qty = g.Sum(i => (decimal)i["laborbad_qty"]),
                                            materielbad_qty = g.Sum(i => (decimal)i["materielbad_qty"])
                                        }).ToList();
                                        mes.code = "200";
                                        mes.count = 3;
                                        mes.message = "弹窗收料界面!";
                                        mes.data = rt;
                                    }
                                }
                                else
                                {
                                    mes.code = "300";
                                    mes.count = 0;
                                    mes.message = "当前工序:" + data.Rows[0]["STEPNAME"].ToString() + " 未发料,请先发料!";
                                    mes.data = null;
                                    return mes;
                                }
                                break;
                            default:
                                break;
                        }
                        break;
                    default:
                        break;
                }
            }
            catch (Exception e)
            {
                mes.code = "300";
                mes.count = 0;
                mes.message = e.Message;
                mes.data = null;
                return mes;
            }
            return mes;
        }
        #endregion
    }
}