public ActionResult GetEmployeeCounts()
        {
            ReportManager    manager = new ReportManager();
            List <CounterBO> list    = manager.GetBarChartData();
            CounterVO        vo      = fillCounter(list);
            JsonResult       json    = Json(vo);

            json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            return(json);
        }
        private CounterVO fillCounter(List <CounterBO> list)
        {
            CounterVO vo = new CounterVO();

            vo.Data     = new decimal[list.Count];
            vo.DataAxis = new string[list.Count];
            for (int i = 0; i < list.Count; i++)
            {
                CounterBO bo = list[i];
                vo.Data[i]     = bo.Data;
                vo.DataAxis[i] = bo.DataAxis;
            }

            return(vo);
        }
        private void Counter()
        {
            _counterVOs.Clear();

            // 1. 获取Damage计算结果,找到时间片>1的第一个时间点
            foreach (DamageVO damageVO in _returnDamageVOs)
            {
                // 只要井和车
                if (damageVO.platform != "发射井" && damageVO.platform != "发射车")
                {
                    continue;
                }

                StatusTimeRangesVO statusTime = damageVO.statusTimeRanges.Where(it => it.Status > 1).FirstOrDefault();
                if (statusTime != null)
                {
                    long     startTimeUtc   = (long)statusTime.StartTimeUtc;
                    DateTime?dt             = MyCore.Utils.DataTimeUtil.ToDateTime(startTimeUtc);
                    DateTime?dt0            = null;
                    double   prepareTimeUtc = 0;

                    if (dt != null)
                    {
                        dt0 = dt.Value.AddSeconds(-damageVO.prepareTime);

                        //prepareTimeUtc = DataTimeUtil.ToTimestamp(dt0.Value,false);
                        // 不要基于毫秒算,用秒
                        prepareTimeUtc = startTimeUtc - damageVO.prepareTime;

                        CounterVO counter = new CounterVO();
                        counter.launchUnitInfo = damageVO.launchUnitInfo;
                        counter.timeRanges.Add(new TimeRange(0, prepareTimeUtc, 0));
                        counter.timeRanges.Add(new TimeRange(prepareTimeUtc, startTimeUtc, 1));
                        counter.timeRanges.Add(new TimeRange(startTimeUtc, MyCore.Utils.Const.TimestampMax, 2));
                        counter.nonce    = Guid.NewGuid().ToString();
                        counter.name     = damageVO.name;                                        //2020-10-11
                        counter.useState = damageVO.useState == null ? "未知" : damageVO.useState; //2020-10-13


                        _counterVOs.Add(counter);
                    }
                }
                else
                {
                    // 没有收到打击
                    CounterVO counter = new CounterVO();
                    counter.launchUnitInfo = damageVO.launchUnitInfo;
                    counter.timeRanges.Add(new TimeRange(0, MyCore.Utils.Const.TimestampMax, 0));
                    counter.nonce    = Guid.NewGuid().ToString();
                    counter.name     = damageVO.name;                                        //2020-10-11
                    counter.useState = damageVO.useState == null ? "未知" : damageVO.useState; //2020-10-13

                    _counterVOs.Add(counter);
                }
            }
            // 判断“counters”与“_reallyCounters”的“timeRanges”是否有变化?
            if (_counterVOs.Count() == _returnCounterVOs.Count())
            {
                for (int i = 0; i < _counterVOs.Count(); i++)
                {
                    CounterVO previousCounterVO = _returnCounterVOs[i];
                    CounterVO currentCounterVO  = _counterVOs[i];

                    // 如果没有变化,把上一次的nonce值赋给这次的
                    if (previousCounterVO.Equals(currentCounterVO))
                    {
                        currentCounterVO.nonce = previousCounterVO.nonce;
                    }
                }
            }

            lock (_counterLocker)//锁
            {
                _returnCounterVOs = Clone(_counterVOs);
            }
        }