using com.hnshituo.core.webapp.vo;
using Common;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace MeterSceneLibrary
{
    /// <summary>
    /// 在计量界面就需要先判断当前的
    /// 得到流程数据后可知道是先毛后皮还是先皮后毛，然后进入对应的逻辑判断
    /// </summary>
    public class SceneControl
    {
        /// <summary>
        /// 这个是非内倒的业务，内倒的业务是没有预报信息的
        /// </summary>
        /// <param name="scale"></param>
        /// <param name="ResultMessage"></param>
        /// <returns></returns>
        public bool WeightMeter(PreTrackScale scale, CoreAppUser appUser, out string ResultMessage)
        {
            if (appUser == null)
            {
                appUser = new CoreAppUser()
                {
                    userClass = "",
                    userid = "",
                    userGroup = "",
                    username = ""
                };
            }

            ResultMessage = "";
            //界面已经验证了重量稳定等，当前已进行了界面锁定的情况下
            if (PbCache.isLockFrm)
            {
                Log lg = Log.GetInstance();

                //校验数据库中的一次计量数据的检斤类型是否与当前的检斤类型一致
                MeterWorkCarActualFirstService mwcfs = new MeterWorkCarActualFirstService();
                RESTfulResult<List<MeterWorkCarActualFirst>> rmX = mwcfs.doQueryWf(new MeterWorkCarActualFirst { valueFlag = "1", carNo = scale.carNo });
                if (!rmX.Succeed)
                {
                    lg.WriteLog(3, "一次计量数据查询异常！" + rmX.ResultMessage);
                    PbCache.ResultMessage = "获取一次计量数据异常！请点击[语音求助]！";
                    return false;
                }
                else
                {
                    if (rmX.Data != null && rmX.Data.Count == 1 && !rmX.Data[0].meterTypeName.Equals(scale.meterTypeName))
                    {
                        ResultMessage = "已经存在一次计量信息";
                        lg.WriteLog(3, "一次计量数据的类型[" + rmX.Data[0].meterTypeName + "]与当前的业务类型[" + scale.meterTypeName + "]不一致，请点击[返回主界面]重新选择业务类型！");
                        PbCache.ResultMessage = "一次计量数据的类型[" + rmX.Data[0].meterTypeName + "]与当前的业务类型[" + scale.meterTypeName + "]不一致，请点击[返回主界面]重新选择业务类型！";
                        return false;
                    }
                }

                MeterWorkPreLinkService mwpps = new MeterWorkPreLinkService();
                //获取预环节流程信息
                RESTfulResult<List<MeterWorkPreLink>> rm = mwpps.doQueryWf(new MeterWorkPreLink { valueFlag = "0", predictionNo = scale.predictionNo });
                if (!rm.Succeed)
                {
                    PbCache.ResultMessage = "获取预环节信息失败，请点击语音求助";
                    ResultMessage = "未找到预环节信息";
                    return false;
                }
                else
                {
                    if (rm.Data == null || rm.Data.Count == 0)
                    {
                        PbCache.ResultMessage = "未找到预报[" + scale.predictionNo + "]的预环节信息，请点击语音求助";
                        ResultMessage = "未找到预环节信息";
                        return false;
                    }
                    rm.Data = rm.Data.OrderBy(s => s.seqNo).ToList();
                    if (rm.Data[0].linkCode != "001021003" && rm.Data[0].linkCode != "001021005") //一次或结净环节
                    {
                        // PbCache.ResultMessage = string.Format("当前预环节为[{0}],需为一次或结净才能进行计量",rm.Data[0].linkName);
                        PbCache.ResultMessage = string.Format("未进行[{0}],不允许进行计量操作！", rm.Data[0].linkName);
                        if ("卸货确认".Equals(rm.Data[0].linkName))
                        {
                            ResultMessage = "未进行卸货确认";
                        }
                        else if ("装货确认".Equals(rm.Data[0].linkName))
                        {
                            ResultMessage = "未进行装货确认";
                        }
                        else
                        {
                            ResultMessage = "未处于一次或结净计量环节无法计量";
                        }
                        return false;
                    }

                    if (scale.predictionType == "2")
                    {
                        RESTfulResult<int> rmx = mwpps.combinedLink(new MeterWorkPreLink { predictionNo = scale.predictionNo });
                        if (!rmx.Succeed)
                        {
                            PbCache.ResultMessage = "一车联运预报获取是否卸货信息失败，请点击语音求助";
                            ResultMessage = "获取是否卸货信息失败";
                            return false;
                        }
                        else if (rmx.Data != 0) //非0则不允许计量
                        {
                            PbCache.ResultMessage = "一车联运预报车辆存在一条未卸货确认预报，请进行卸货确认或语音求助!";
                            ResultMessage = "未进行卸货确认";
                            return false;
                        }
                    }
                }

                //验证是否存在历史未卸货/装货的数据；传参有点别扭，请注意
                if (!string.IsNullOrEmpty(scale.carNo))
                {
                    RESTfulResult<List<MeterWorkPreLink>> rmXh = mwpps.doQueryNoXh(new MeterWorkPreLink { predictionNo = scale.carNo });
                    if (rm.Succeed && rmXh.Data != null && rmXh.Data.Count > 0)
                    {
                        PbCache.ResultMessage = "当前车辆存在未进行["+ rmXh.Data[0].linkName + "]的历史数据，请进行卸货确认或语音求助!";
                        ResultMessage = "未进行卸货确认";
                        return false;
                    }
                }

                //有环节信息后则根据环节取查询场景
                //根据预报编号找场景信息（场景固定为上秤计量场景），根据该信息能得到是先毛还是先皮，另外预报中一个有一车联运还是一车一预报
                string sql = @"select scene_code sceneCode,
                                  scene_name sceneName,
                                  scene_order_num sceneOrderNum
                             from METER_WORK_METER_SCENE
                                where link_no='" + (rm.Data[0].linkNo) + "'"; // and PREDICTION_NO='" + scale.predictionNo + "'

                PbModelDbService<List<MeterWorkMeterScene>> pb = new PbModelDbService<List<MeterWorkMeterScene>>();
                RESTfulResult<List<MeterWorkMeterScene>> rms = pb.executeSqlDataWf(sql);
                if (!rms.Succeed)
                {
                    PbCache.ResultMessage = "获取预场景信息失败，请点击语音求助";
                    ResultMessage = "未找到计量场景配置信息";
                    return false;
                }
                else if (rms.Data == null || rms.Data.Count == 0)
                {
                    PbCache.ResultMessage = "未找到环节[" + (rm.Data[0].linkNo) + "]的计量场景配置信息，请点击语音求助";
                    ResultMessage = "未找到计量场景配置信息";
                    return false;
                }

                if (scale.predictionType == "0")
                {
                    scale.meterNum = scale.meterNum == null ? 1 : scale.meterNum.Value + 1;
                }

                //有场景信息后，需要让场景与类关联，然后 循环rms得到类编号，然后依次调用即可
                RESTfulResult<rtInfo> strRm = new RESTfulResult<rtInfo>();
                PbCache.ResultMessage = "";// 先置为空，然后进行再下面的 foreach 中进行提示信息赋值，若都没有向里面写值，则提示“未找到计量场景配置信息，请点击语音求助”
                foreach (MeterWorkMeterScene scene in rms.Data.OrderBy(s => s.sceneOrderNum).ToList())
                {
                    foreach (MeterWorkSceneRegister sCls in PbCache.ltSceneRegister)
                    {
                        if (scene.sceneCode == sCls.sceneCode)
                        {
                            ExecuteMethod em = new ExecuteMethod();
                            strRm = em.GetAndExecuteMethod<rtInfo>("MeterSceneLibrary", sCls.sceneUrl, "MeterMethod", new object[] { scale, appUser, rm });
                            if (strRm.Succeed)
                            {
                                if (strRm.Data.isError)
                                {
                                    //如果是报错则直接不执行，并写入信息到界面，同时调用语音播报
                                    ResultMessage = strRm.Data.resultInfo;
                                    return false;
                                }

                                if (strRm.Data.result) //说明：标识当前跑了一个场景成功了；场景完成后则返回，不再进行下一个场景的执行操作；
                                {
                                    ResultMessage = strRm.Data.resultInfo; //语音提示文件
                                    return strRm.Data.result;
                                }
                                else
                                {
                                    //说明：不满足场景的的要求，不能进行return，继续下一个场景，若所有的场景都失败，则提示“未找到计量场景配置信息”
                                    //ResultMessage = strRm.Data.resultInfo;
                                    //return strRm.Data.result;  //2021-3-18 杨秀东注释；要处理一车联运（多场景）的数据；问题：提示信息会出现问题
                                }
                            }
                            else
                            {
                                PbCache.ResultMessage = "获取预场景信息失败，请点击语音求助";
                                ResultMessage = "未找到计量场景配置信息";
                                //这里是未找到方法的情况
                                lg.WriteLog(3, "获取场景失败！" + strRm.ResultMessage);
                                //break;
                                return false;
                            }
                        }
                    }
                }
                //2021年3月18日 杨秀东处理；若提示信息为空，则提示此信息，提示语句在此方法体外；不管true或者false都会执行
                if (PbCache.ResultMessage == "")
                    PbCache.ResultMessage = "未找到计量场景配置信息，请点击语音求助";
                if (ResultMessage == "")
                    ResultMessage = "未找到计量场景配置信息";
                return false;
            }
            else
            {
                return false;
            }
        }
    }
}