/// <summary>
        /// JisPartBoxInfo - > jisCounterInfo
        /// </summary>
        /// <param name="jisPartBoxInfo"></param>
        /// <param name="jisCounterInfo"></param>
        private JisCounterInfo CreateJisCounterInfo(JisPartBoxInfo jisPartBoxInfo)
        {
            ///创建计数器
            JisCounterInfo jisCounterInfo = JisCounterBLL.CreateJisCounterInfo(loginUser);

            ///以物料拉动信息填充计数器
            JisCounterBLL.GetJisCounterInfo(jisPartBoxInfo, ref jisCounterInfo);
            ///
            jisCounterInfo.Id = new JisCounterBLL().InsertInfo(jisCounterInfo);
            if (jisCounterInfo.Id == 0)
            {
                throw new Exception("MC:0x00000454");///排序计数器创建失败
            }
            return(jisCounterInfo);
        }
        /// <summary>
        /// JIS
        /// </summary>
        /// <param name="vehiclePointStatusInfo"></param>
        /// <param name="jisPartBoxInfos"></param>
        /// <param name="jisCounterInfos"></param>
        /// <param name="jisMaintainInhouseLogisticStandardInfos"></param>
        /// <returns></returns>
        private string JisCounterDeal(VehiclePointStatusInfo vehiclePointStatusInfo, List <JisPartBoxInfo> jisPartBoxInfos, List <MaintainInhouseLogisticStandardInfo> jisMaintainInhouseLogisticStandardInfos)
        {
            ///
            StringBuilder stringBuilder = new StringBuilder();
            ///根据车辆状态信息中的生产订单号①获取到对应的生产订单物料清单、此处为了保障执行效率,需要根据已获取的物料拉动信息过滤获取物料清单
            List <PullOrderBomInfo> pullOrderBomInfos = new PullOrderBomBLL().GetList("" +
                                                                                      "[ZORDNO] = N'" + vehiclePointStatusInfo.OrderNo + "' and " +
                                                                                      "[ZCOMNO] in ('" + string.Join("','", jisMaintainInhouseLogisticStandardInfos.Select(d => d.PartNo).ToArray()) + "')", string.Empty);

            if (pullOrderBomInfos.Count == 0)
            {
                return(string.Empty);
            }
            ///
            foreach (JisPartBoxInfo jisPartBoxInfo in jisPartBoxInfos)
            {
                ///不是这个信息点的零件类忽略
                if (vehiclePointStatusInfo.StatusPointCode != jisPartBoxInfo.StatusPointCode)
                {
                    continue;
                }
                ///根据物料拉动信息外键获取计数器,未能成功获取时需要创建
                JisCounterInfo jisCounterInfo = new JisCounterBLL().GetInfoByPartBoxFid(jisPartBoxInfo.Fid.GetValueOrDefault());
                if (jisCounterInfo == null)
                {
                    jisCounterInfo = CreateJisCounterInfo(jisPartBoxInfo);
                }
                ///零件类对应的物料拉动信息
                List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = jisMaintainInhouseLogisticStandardInfos.Where(d => d.InhousePartClass == jisPartBoxInfo.PartBoxCode).ToList();
                if (maintainInhouseLogisticStandards.Count == 0)
                {
                    continue;
                }
                ///零件类过滤后的物料拉动信息对应的物料清单
                List <PullOrderBomInfo> pullOrderBoms = pullOrderBomInfos.Where(d => maintainInhouseLogisticStandards.Select(m => m.PartNo).Contains(d.Zcomno)).ToList();
                if (pullOrderBoms.Count == 0)
                {
                    continue;
                }
                ///当排序计数器的累计方式⑧为按车辆累计时
                if (jisPartBoxInfo.AccumulativeType.GetValueOrDefault() == (int)JisAccumulativeTypeConstants.VehicleAccumulative)
                {
                    ///本次可累计车辆数量
                    decimal vehicleQty           = jisCounterInfo.AccumulativeQty.GetValueOrDefault() - jisCounterInfo.CurrentQty.GetValueOrDefault();
                    int     vehicleCounterStatus = (int)JisCounterStatusConstants.Accumulating;
                    if (vehicleQty == 1)
                    {
                        vehicleCounterStatus = (int)JisCounterStatusConstants.AccumulativeCompletion;
                    }
                    ///
                    stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, 1, vehicleCounterStatus));
                }
                ///
                foreach (PullOrderBomInfo pullOrderBom in pullOrderBoms)
                {
                    ///匹配物料拉动信息的最小维度是 物料图号+供应商+工位,依次降低维度来获取唯一的物料拉动信息
                    MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandard = maintainInhouseLogisticStandards.FirstOrDefault(d =>
                                                                                                                                          d.PartNo == pullOrderBom.Zcomno && d.SupplierNum == pullOrderBom.SupplierNum && d.Location == pullOrderBom.Zloc);
                    ///物料图号+供应商
                    if (maintainInhouseLogisticStandard == null)
                    {
                        maintainInhouseLogisticStandard = maintainInhouseLogisticStandards.FirstOrDefault(d => d.PartNo == pullOrderBom.Zcomno && d.SupplierNum == pullOrderBom.SupplierNum);
                    }
                    ///物料图号
                    if (maintainInhouseLogisticStandard == null)
                    {
                        maintainInhouseLogisticStandard = maintainInhouseLogisticStandards.FirstOrDefault(d => d.PartNo == pullOrderBom.Zcomno);
                    }
                    ///未能成功获取到正确的物料拉动信息
                    if (maintainInhouseLogisticStandard == null)
                    {
                        continue;
                    }
                    ///当排序计数器的累计方式⑧为按车辆累计时
                    if (jisPartBoxInfo.AccumulativeType.GetValueOrDefault() == (int)JisAccumulativeTypeConstants.VehicleAccumulative)
                    {
                        stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, vehiclePointStatusInfo, maintainInhouseLogisticStandard, pullOrderBom.Zqty.GetValueOrDefault()));
                    }
                    ///当排序计数器的累计方式⑧为按器具累计时
                    if (jisPartBoxInfo.AccumulativeType.GetValueOrDefault() == (int)JisAccumulativeTypeConstants.UtensilAccumulative)
                    {
                        ///物料需求数量
                        decimal requireQty = pullOrderBom.Zqty.GetValueOrDefault();
                        while (requireQty > 0)
                        {
                            int jisCounterStatus = (int)JisCounterStatusConstants.Accumulating;
                            ///本次可累计数量
                            decimal currentQty = jisCounterInfo.AccumulativeQty.GetValueOrDefault() - jisCounterInfo.CurrentQty.GetValueOrDefault();
                            if (currentQty == 0)
                            {
                                break;
                            }
                            ///需求大于本次可累计
                            if (currentQty <= requireQty)
                            {
                                ///剩余需累计数量
                                requireQty -= currentQty;
                                ///累计完成
                                jisCounterStatus = (int)JisCounterStatusConstants.AccumulativeCompletion;
                            }
                            else
                            {
                                ///将需求赋予本次
                                currentQty = requireQty;
                                ///需求清空
                                requireQty = 0;
                            }
                            ///
                            stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, currentQty, jisCounterStatus));
                            ///
                            stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, vehiclePointStatusInfo, maintainInhouseLogisticStandard, currentQty));
                            ///当剩余需求数量大于零时,需要创建计数器
                            if (requireQty > 0)
                            {
                                jisCounterInfo = CreateJisCounterInfo(jisPartBoxInfo);
                            }
                        }
                    }
                    ///触发层级拉动
                    stringBuilder.AppendLine(TwdCounterBLL.LevelPullRequirementCounter(
                                                 maintainInhouseLogisticStandard,
                                                 pullOrderBom.Zqty.GetValueOrDefault(),
                                                 loginUser,
                                                 jisCounterInfo.Fid.GetValueOrDefault(),
                                                 jisCounterInfo.PartBoxCode));
                }
            }
            return(stringBuilder.ToString());
        }
        /// <summary>
        /// Handler
        /// </summary>
        public void Handler()
        {
            ///获取排序零件类中状态㉖为已启用的数据
            List <JisPartBoxInfo> jisPartBoxInfos = new JisPartBoxBLL().GetList(" and [STATUS] =" + (int)BasicDataStatusConstants.Enable + "", string.Empty);

            if (jisPartBoxInfos.Count == 0)
            {
                return;
            }
            ///获取零件类对应的计数器
            List <JisCounterInfo> jisCounterInfos = new JisCounterBLL().GetList("and [PART_BOX_FID] in ('" + string.Join("','", jisPartBoxInfos.Select(d => d.Fid).ToArray()) + "')", string.Empty);

            if (jisCounterInfos.Count == 0)
            {
                return;
            }
            ///对应的排序计数器日志
            List <JisCounterLogInfo> jisCounterLogInfos = new JisCounterLogBLL().GetList("and [COUNTER_FID] in ('" + string.Join("','", jisCounterInfos.Select(d => d.Fid).ToArray()) + "')", string.Empty);

            if (jisCounterLogInfos.Count == 0)
            {
                return;
            }
            ///计数器日志对应的生产订单
            List <PullOrdersInfo> pullOrdersInfos = new PullOrdersBLL().GetList("and [ORDER_NO] in ('" + string.Join("','", jisCounterLogInfos.Select(d => d.SourceData).ToArray()) + "')", string.Empty);

            if (pullOrdersInfos.Count == 0)
            {
                return;
            }
            ///对应的物料拉动信息
            List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandardInfos = new MaintainInhouseLogisticStandardBLL().GetList("and [STATUS] =" + (int)BasicDataStatusConstants.Enable + ""
                                                                                                                                               + " and [INHOUSE_PART_CLASS] in ('" + string.Join("','", jisPartBoxInfos.Select(d => d.PartBoxCode).ToArray()) + "')"
                                                                                                                                               + " and [PART_NO] in ('" + string.Join("','", jisCounterLogInfos.Select(d => d.PartNo).ToArray()) + "')", string.Empty);

            if (maintainInhouseLogisticStandardInfos.Count == 0)
            {
                return;
            }
            foreach (JisPartBoxInfo jisPartBoxInfo in jisPartBoxInfos)
            {
                ///零件类对应的物料拉动信息
                List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = maintainInhouseLogisticStandardInfos.Where(d => d.InhousePartClass == jisPartBoxInfo.PartBoxCode).ToList();
                ///计数器
                List <JisCounterInfo> jisCounters = new List <JisCounterInfo>();
                ///获取状态为20.累计完成的排序计数器
                jisCounters = jisCounterInfos.Where(d => d.Status == (int)JisCounterStatusConstants.AccumulativeCompletion && d.PartBoxFid == jisPartBoxInfo.Fid).ToList();
                ///若此时未能成功获取到状态为20.累计完成的排序计数器时,需要获取状态为10.正在累计的排序计数器,判断其创建时间加上最大累积时间是否已超过当前时间
                if (jisCounters.Count == 0)
                {
                    jisCounters = jisCounterInfos.Where(d => d.Status == (int)JisCounterStatusConstants.Accumulating && d.PartBoxFid == jisPartBoxInfo.Fid && d.CreateDate.AddMinutes(jisPartBoxInfo.MaxAccumulativeTime.GetValueOrDefault()) > DateTime.Now).ToList();
                }
                if (jisCounters.Count == 0)
                {
                    continue;
                }
                ///若已超过则需要首先标记排序计数器状态为20.累计完成,之后的逻辑按部就班走
                BLL.LES.CommonBLL.ExecuteNonQueryBySql(@"update[LES].[TT_MPM_JIS_COUNTER] set [STATUS]=" + (int)JisCounterStatusConstants.AccumulativeCompletion + ",[MODIFY_DATE] = getdate(),[MODIFY_USER] = '" + loginUser + "' where [ID] in (" + string.Join(",", jisCounters.Select(d => d.Id).ToArray()) + ");");
                ///根据计数器生成拉动单
                foreach (JisCounterInfo jisCounterInfo in jisCounters)
                {
                    ///sql
                    StringBuilder stringBuilder = new StringBuilder();
                    ///对应的排序计数器日志
                    List <JisCounterLogInfo> jisCounterLogs = jisCounterLogInfos.Where(d => d.CounterFid == jisCounterInfo.Fid).ToList();
                    if (jisCounterLogs.Count == 0)
                    {
                        continue;
                    }
                    ///计数器日志物料对应的物料拉动信息
                    List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogistics = (from maintainInhouseLogisticStandard in maintainInhouseLogisticStandards
                                                                                           join jisCounterLog in jisCounterLogs
                                                                                           on maintainInhouseLogisticStandard.PartNo equals jisCounterLog.PartNo
                                                                                           select maintainInhouseLogisticStandard).ToList();
                    if (maintainInhouseLogistics.Count == 0)
                    {
                        continue;
                    }
                    switch (jisPartBoxInfo.JisPullMode.GetValueOrDefault())
                    {
                    ///排序拉动
                    case (int)JisPullModeConstants.JisPull:
                        stringBuilder.AppendFormat(JisPull(jisPartBoxInfo, jisCounterInfo, jisCounterLogs, maintainInhouseLogistics, pullOrdersInfos, true));
                        break;

                    ///物料成套拉动
                    case (int)JisPullModeConstants.CompletePull:
                        stringBuilder.AppendFormat(JisPull(jisPartBoxInfo, jisCounterInfo, jisCounterLogs, maintainInhouseLogistics, pullOrdersInfos, false));
                        break;

                    default: continue;
                    }
                    ///数据库执行语句
                    if (stringBuilder.Length > 0)
                    {
                        stringBuilder.AppendFormat(@"update[LES].[TT_MPM_JIS_COUNTER] set [STATUS]=" + (int)JisCounterStatusConstants.GeneratedDocuments + ",[MODIFY_DATE] = getdate(),[MODIFY_USER] = '" + loginUser + "' where [ID] = " + jisCounterInfo.Id + "; ");
                        using (TransactionScope trans = new TransactionScope())
                        {
                            BLL.LES.CommonBLL.ExecuteNonQueryBySql(stringBuilder.ToString());
                            trans.Complete();
                        }
                    }
                }
            }
        }