Newer
Older
GHFX_REFACTOR / EMS_Forms / Form_TaskManager.cs
wxn on 28 Nov 2016 25 KB 管线定位
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using GeoScene.Data;
using GeoScene.Globe;
using DevComponents.DotNetBar;
using System.Data.OracleClient;

namespace Cyberpipe.EMS_Forms
{
    public partial class Form_TaksManager : Office2007Form
    {
        GSOGlobeControl globeControl1;
        DataTable dt;
//        OracleConnection conn;

        int maxPageIndex = 15;
        int rows = 0;

        public static bool IsOpen = false;

        public Form_TaksManager(GSOGlobeControl globeControl1)
        {
            this.globeControl1 = globeControl1;
            globeControl1.Globe.MemoryLayer.ObjectMinVisiblePixelSize = -1;
            InitializeComponent();

            winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
            winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);//查看详细

            winGridViewPager1.OnStartExport += new EventHandler(pager1_OnStartExport);
            winGridViewPager1.OnEndExport += new EventHandler(pager1_OnEndExport);

            winGridViewPager1.dataGridView1.MultiSelect = false;
        }

        private void button_new_Click(object sender, EventArgs e)
        {
            Form_EditTask form = new Form_EditTask(globeControl1);
            form.Show();
            Close();
        }

        private void Form_TaksManager_Load(object sender, EventArgs e)
        {
            try
            {
                dateTimePicker_end.Value = DateTime.Now;
                dateTimePicker_start.Value = DateTime.Now.AddDays(-6);

                LoadData();

//                conn = OledbHelper.sqlConnection();
                string sql = "select t.username from patroler t";
                DataTable dt = OracleUtils.ExecuteDataset(OracleUtils.ConnectionString, CommandType.Text, sql).Tables[0];
                comboBox_userName.Items.Add("不限");
                foreach(DataRow row in dt.Rows){
                    comboBox_userName.Items.Add(row[0].ToString());
                }

                sql = "select distinct 所属道路 from 标识器";
                using (OracleDataReader reader = OracleUtils.ExecuteReader(OracleUtils.ConnectionString, CommandType.Text, sql))
                {
                    combo_street.Items.Add("不限");
                    while (reader.Read())
                    {
                        combo_street.Items.Add(reader[0].ToString());
                    }
                }

                comboBox_state.Items.Add("不限");
                comboBox_state.Items.Add("下发任务");
                comboBox_state.Items.Add("接受任务");
                comboBox_state.Items.Add("开始任务");
                comboBox_state.Items.Add("任务执行中");
                comboBox_state.Items.Add("结束任务");

                if (!Utility.userRole.Contains("工单创建"))
                {
                    button_new.Visible = false;
                }

                IsOpen = true;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void Form_TaksManager_FormClosing(object sender, FormClosingEventArgs e)
        {
            globeControl1.Globe.MemoryLayer.RemoveAllFeature();
            IsOpen = false;
        }

        private void showThisForm()
        { 
            Show();
        }      

        //标签信息
        public class listID
        {
            public string MarkId;
            public int check = 0;
            public double x;
            public double y;
            public string checktime = "标签未定位";
            public long t = 0;
        }


        private void flyToTask(DataGridViewRow row, int taskState)
        {
            int dbID = 0;
            dbID = Convert.ToInt32(row.Cells["任务编号"].Value);
            string userName = Convert.ToString(row.Cells["任务执行人员"].Value);
            DateTime t = new DateTime();
            try
            {
                OracleConnection conn = null;
                List<listID> listIDs = new List<listID>();
                conn = OledbHelper.sqlConnection();
                conn.Open();
                OracleCommand cmd = new OracleCommand("select * from MARK_TASK where TASK_ID ='" + dbID + "'", conn);
                OracleDataReader dr = cmd.ExecuteReader();
                string condition = "";
                while (dr.Read())
                {
                    listID li = new listID();
                    li.MarkId = Convert.ToString(dr["MARK_ID"]);
                    condition += "'"+li.MarkId+"',";
                    if (Convert.ToInt32(dr["IS_CHECKED"]) == 1)
                    {
                        //Datatime
                        li.check = Convert.ToInt32(dr["IS_CHECKED"]);
                        li.checktime = Convert.ToString(dr["CHECKTIME"]);
                        t = (DateTime)dr["CHECKTIME"];
                        li.t = t.Year * 10000000000 + t.Day * 1000000 + t.Month * 100000000 + t.Hour * 10000 + t.Minute * 100 + t.Second;
                    }
                    listIDs.Add(li);
                }
                dr.Close();
                conn.Close();
                conn = OledbHelper.sqlConnection();
                conn.Open();
                cmd = new OracleCommand("select * from 标识器 where  编号 in("+condition.Substring(0,condition.Length-1)+")", conn);
                dr = cmd.ExecuteReader();

                int ID = GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=499885 +y_0=6 +ellps=krass +units=m +no_defs");

                double x = 558443.622;
                double y = 3451941.845;

                GSOGeoModel model = null;// new GSOGeoModel();

                string filepath;

                //GSOPoint3d p = new GSOPoint3d();
                GSOPoint3d po = new GSOPoint3d();
                GSOPoint3ds pnts = new GSOPoint3ds();
                GSOGeoPolyline3D line = new GSOGeoPolyline3D();

                while (dr.Read())
                {
                    string id = Convert.ToString(dr["编号"]);////
                    for (int i = 0; i < listIDs.Count; i++)
                    {
                       
                        if (id == Convert.ToString(listIDs[i].MarkId))
                        {
                            GSOFeature flagFeature = globeControl1.Globe.Layers.GetLayerByCaption("标识器").GetFeatureByID(int.Parse(Convert.ToString(dr["LSSYS_ID"])));
                            model = flagFeature.Geometry as GSOGeoModel;
                           
                            if (Convert.ToInt16(listIDs[i].check) == 1)
                            {
                                filepath = Application.StartupPath + "/EMSgcm/小旗子/lvqi/lvqi.gcm";
                                model.FilePath = filepath;
                            }
                            if (Convert.ToInt16(listIDs[i].check) == 0)
                            {
                                filepath = Application.StartupPath + "/EMSgcm/小旗子/hongqi/hongqi.gcm";

                                model.FilePath = filepath;
                            }

                          
                            GSOFeature f = new GSOFeature();

                            f.Geometry = model;
                            f.Name = "标识器:" + id;
                            GSOFeature newFeature = globeControl1.Globe.MemoryLayer.AddFeature(f);
                            GSOLabel label = new GSOLabel();
                            label.Text = "任务工单号:" + dbID + "\r\n" +
                                         "标识器编号:" + listIDs[i].MarkId + "\r\n" +
                                         "管线定位员:" + userName + "\r\n" +
                                         "定位时间:" + listIDs[i].checktime;
                            label.Style = new GSOLabelStyle();
                            label.Style.Opaque = 0.8; //设置标注的透明度,取值区间是0-1  
                            label.Style.TracktionLineType = EnumTracktionLineType.Solid;
                            label.Style.TextStyle.FontHeight = 10;
                            label.Style.TextStyle.FontName = "宋体";
                            label.Style.TractionLineEndPos = new GSOPoint2d(80, 60);
                            label.Style.BackBeginColor = Color.Cyan;
                            label.Style.BackEndColor = Color.White;

                            //bai
                            label.Style.MaxVisibleDistance = -1;
                            newFeature.Label = label;                          
                            listIDs[i].x = x;
                            listIDs[i].y = y;
                            if (taskState == 0 && i == 0)
                                globeControl1.Globe.JumpToFeature(newFeature, 200);
                        }
                    }
                }
                dr.Close();
                conn.Close();

                if(taskState == 1)
                {                    
                    conn = OledbHelper.sqlConnection();
                    conn.Open();
                    cmd = new OracleCommand("select * from POSITION", conn);
                    dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        po.X = Convert.ToDouble(dr["LONGITUDE"]);
                        po.Y = Convert.ToDouble(dr["LATITUDE"]);
                        po.Z = 2.5;
                        break;
                        //}
                    }
                    dr.Close();
                    conn.Close();
                    pnts.Add(po);

                    model = new GSOGeoModel();

                    filepath = Application.StartupPath + "/EMSgcm/hat/hat.gcm";

                    model.FilePath = filepath;
                    model.Position = po;
                    model.AltitudeMode = EnumAltitudeMode.Absolute;
                    GSOFeature f1 = new GSOFeature();
                    f1.Geometry = model;
                    double s = 0.1;
                    f1.Geometry.Scale(s, s, s);
                    GSOFeature newFeature1 = globeControl1.Globe.MemoryLayer.AddFeature(f1);

                    GSOLabel label1 = new GSOLabel();
                    label1.Text = "定位员:" + userName;
                    label1.Style = new GSOLabelStyle();
                    label1.Style.Opaque = 0.8; //设置标注的透明度,取值区间是0-1  
                    label1.Style.TracktionLineType = EnumTracktionLineType.Solid;
                    label1.Style.TextStyle.FontHeight = 20;
                    label1.Style.TextStyle.FontName = "黑体";
                    label1.Style.TractionLineEndPos = new GSOPoint2d(80, 60);
                    newFeature1.Label = label1;
                }
                //获取定位人员位置


                // 按扫描时间对任务点进行排序
                int m = 0;
                long time = 0;
                for (int ii = 0; ii < listIDs.Count; ii++)
                {
                    for (int k = ii; k < listIDs.Count; k++)
                    {
                        if (time < listIDs[k].t)
                        {
                            time = listIDs[k].t;
                            m = k;
                        }
                    }

                    if (listIDs[m].check == 1)
                    {
                        GSOPoint3d p = new GSOPoint3d();

                        p.X = listIDs[m].x;
                        p.Y = listIDs[m].y;
                        p.Z = 2.5;
                        pnts.Add(p);

                        time = listIDs[ii].t;
                        listIDs[ii].t = listIDs[m].t;
                        listIDs[m].t = time;

                        int i = 0;
                        i = listIDs[ii].check;
                        listIDs[ii].check = listIDs[m].check;
                        listIDs[m].check = i;

                        x = listIDs[ii].x;
                        listIDs[ii].x = listIDs[m].x;
                        listIDs[m].x = x;

                        y = listIDs[ii].y;
                        listIDs[ii].y = listIDs[m].y;
                        listIDs[m].y = y;
                    }
                    time = 0;
                }
                if (pnts.Count != 0)
                {
                    line.AddPart(pnts); //把节点添加到线上
                    line.AltitudeMode = EnumAltitudeMode.Absolute;
                    GSOSimpleLineStyle3D style1 = new GSOSimpleLineStyle3D(); //创建线的风格    
                    //style1.LineColor = Color.FromArgb(250, 255, 0, 255);
                    style1.LineColor = Color.Red;
                    style1.LineWidth = 3; //设置线的宽度为3
                    style1.VertexVisible = true; //显示线的节点

                    line.Style = style1; //把风格添加到线上
                    GSOFeature f2 = new GSOFeature();

                    f2.Geometry = line; //把线对象添加到几何对象上                
                    f2.Name = "轨迹"; //设置几何对象的名称
                    f2.SetFieldValue("description", "这是线的属性"); //设置几何对象的字段值
                    GSOFeature newFeature2 = globeControl1.Globe.MemoryLayer.AddFeature(f2);

                    globeControl1.Globe.JumpToFeature(newFeature2, 230);
                    globeControl1.Refresh();
                }
                //else
                //{
                //    if (pnts.Count == 0)
                //    {
                //        MessageBox.Show("未有任务探测记录!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //    }
                //}


            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                //conn.Close();
            }
        }

        private void button_search_Click(object sender, EventArgs e)
        {
            try
            {
                if (dateTimePicker_start.Value != null && dateTimePicker_end.Value != null)
                {
                    int compare = DateTime.Compare(dateTimePicker_start.Value, dateTimePicker_end.Value);
                    if (compare == 1)
                    {
                        MessageBox.Show("起始时间不能大于终止时间,请重新设置!", "提示");
                        return;
                    }
                }
                LoadData(1);
            }
            catch (Exception ex)
            {
                MessageBox.Show("查询失败:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

                      
        }

        /// <summary>
        /// 初始化分页表格
        /// </summary>
        private void initlizeDatagrid()
        {

            //控制表格显示的列,以及每一列要显示的列名
            winGridViewPager1.Dock = DockStyle.Fill;
            winGridViewPager1.dataGridView1.Dock = DockStyle.Fill;
            winGridViewPager1.AddColumnAlias("任务编号", "任务编号");
            //this.winGridViewPager1.AddColumnAlias("创建时间", "创建时间");
            //this.winGridViewPager1.AddColumnAlias("任务描述", "任务描述");
            //this.winGridViewPager1.AddColumnAlias("完成时间", "完成时间");
            winGridViewPager1.AddColumnAlias("任务描述", "任务描述");
            winGridViewPager1.AddColumnAlias("下发任务时间", "下发任务时间");
            winGridViewPager1.AddColumnAlias("接受任务时间", "接受任务时间");
            winGridViewPager1.AddColumnAlias("开始任务时间", "开始任务时间");
            //this.winGridViewPager1.AddColumnAlias("任务执行中时间", "任务执行中时间");
            winGridViewPager1.AddColumnAlias("完成任务时间", "完成任务时间");
            winGridViewPager1.AddColumnAlias("任务执行区域", "任务执行区域");
            winGridViewPager1.AddColumnAlias("任务状态", "任务状态");
            winGridViewPager1.AddColumnAlias("任务执行人员", "任务执行人员");

            //this.winGridViewPager1.DisplayColumns = "任务编号,创建时间,任务描述,完成时间,任务执行区域,任务状态,任务执行人员";
            winGridViewPager1.DisplayColumns = "任务编号,任务描述,下发任务时间,接受任务时间,开始任务时间,结束任务时间,任务执行区域,任务状态,任务执行人员";

            winGridViewPager1.BackColor = Color.LightCyan;//间隔颜色

            //隐藏右键功能按钮
            winGridViewPager1.dataGridView1.ContextMenuStrip.Items[1].Visible = false;
            winGridViewPager1.dataGridView1.ContextMenuStrip.Items[3].Visible = false;
            winGridViewPager1.dataGridView1.ContextMenuStrip.Items[4].Visible = false;
            winGridViewPager1.dataGridView1.ContextMenuStrip.Items[5].Visible = false;
            winGridViewPager1.dataGridView1.ContextMenuStrip.Items[6].Visible = false;
            winGridViewPager1.dataGridView1.ContextMenuStrip.Items[7].Visible = false;
            winGridViewPager1.dataGridView1.ContextMenuStrip.Items[2].Text = "查看任务信息";
            //右键菜单宽度
            winGridViewPager1.dataGridView1.ContextMenuStrip.AutoSize = false;
            winGridViewPager1.dataGridView1.ContextMenuStrip.Width = 150;
            //数据铺满表格
            winGridViewPager1.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            //控制间隔的颜色
            winGridViewPager1.BackColor = Color.LightCyan;//间隔颜色
            //控制每页显示的最大数据量
            winGridViewPager1.PagerInfo.RecordCount = rows;
            winGridViewPager1.PagerInfo.PageSize = maxPageIndex;
            winGridViewPager1.dataGridView1.Refresh();
            //winGridViewPager1.Controls.RemoveAt(1);

        }
        /// <summary>
        /// 页面刷新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void winGridViewPager1_OnPageChanged(object sender, EventArgs e)
        {
            LoadData();
        }

        void pager1_OnEndExport(object sender, EventArgs e)
        {

        }

        void pager1_OnStartExport(object sender, EventArgs e)
        {
            int pageIndex = winGridViewPager1.PagerInfo.CurrenetPageIndex;
            string where = GetSql();
            DataTable table = OracleUtils.ExecuteDataset(OracleUtils.ConnectionString, CommandType.Text, where).Tables[0];
            winGridViewPager1.AllToExport = table;
        }

        /// <summary>
        /// 查看详细信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void winGridViewPager1_OnEditSelected(object sender, EventArgs e)
        {
            DataGridView grid = sender as DataGridView;
            if (grid != null && grid.SelectedRows.Count > 0)
            {
                DataGridViewRow row = grid.SelectedRows[0];
                try
                {
                    int dbID = 0;
                    int taskStateInt = 0;
                    dbID = Convert.ToInt32(row.Cells["任务编号"].Value);
                    string taskState = row.Cells["任务状态"].Value.ToString();
                    taskStateInt = taskState.Equals("开始任务") ? 1 : 0;
                    string sql = "select dbid," +
                                  "     checktime," +
                                  "     mark_id," +
                                  "     task_id," +
                                  "     case is_checked" +
                                  "       when 0 then" +
                                  "        '未定位'" +
                                  "       when 1 then" +
                                  "        '已定位'" +
                                  "      else" +
                                  "        '未知'" +
                                  "     end as is_checked" +
                                  " from MARK_TASK where task_id='" + dbID + "' order by dbid";
                    DataTable taskInfoDt = OledbHelper.ExecuteDataTable(sql);
                    if (taskInfoDt == null || taskInfoDt.Rows.Count == 0)
                    {
                        MessageBox.Show("没有相应详细任务信息!", "提示");
                        return;
                    }
                    Hide();
                    flyToTask(row, taskStateInt);
                    Form_TaskInfo p = new Form_TaskInfo(globeControl1, taskInfoDt);
                    p.showParentForm += new Form_TaskInfo.Handle(showThisForm);//改变值的事件  
                    p.Show();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("编辑失败:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("没有选择记录", "提示");
            }

        }

        private void LoadData()
        {
            int pageIndex = winGridViewPager1.PagerInfo.CurrenetPageIndex;
            string sqlData = GetSql(pageIndex);
            initlizeDatagrid();
            DataTable table = OracleUtils.ExecuteDataset(OracleUtils.ConnectionString, CommandType.Text, sqlData).Tables[0];
            winGridViewPager1.DataSource = table.DefaultView;
            winGridViewPager1.Refresh();
        }

        private void LoadData(int pageIndex)
        {
            string sqlData = GetSql(pageIndex);
            initlizeDatagrid();
            DataTable table = OracleUtils.ExecuteDataset(OracleUtils.ConnectionString, CommandType.Text, sqlData).Tables[0];
            winGridViewPager1.DataSource = table.DefaultView;

            winGridViewPager1.Refresh();
        }

        private string GetSql()
        {
            string sqlCount = "select count(*) from taskinfo t where 1=1";

            string sqlData = "select dbid as 任务编号,descirption as 任务描述,deploytime as 下发任务时间," +
           "case taskstate when '接受任务' then finishtime else null end as 接受任务时间," +
           "case taskstate when '开始任务' then finishtime else null end as 开始任务时间," +
           "case taskstate when '任务执行中' then finishtime else null end as 任务执行中时间, " +
           "case taskstate when '结束任务' then finishtime else null end as 结束任务时间," +
           "street as 任务执行区域,taskstate as 任务状态,username as 任务执行人员 from taskinfo t";
            rows = int.Parse(OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, CommandType.Text, sqlCount).ToString());

            return sqlData;
        }

        private string GetSql(int pageIndex)
        {
            int minPage = (pageIndex - 1) * maxPageIndex + 1;
            int maxPage = pageIndex * maxPageIndex;
            string sqlCount = "select count(*) from taskinfo t where 1=1";
            string sqlData = "select dbid as 任务编号,descirption as 任务描述,deploytime as 下发任务时间," +
            "case taskstate when '接受任务' then finishtime else null end as 接受任务时间,"+
            "case taskstate when '开始任务' then finishtime else null end as 开始任务时间,"+
            "case taskstate when '任务执行中' then finishtime else null end as 任务执行中时间, "+
            "case taskstate when '结束任务' then finishtime else null end as 结束任务时间,"+
            "street as 任务执行区域,taskstate as 任务状态,username as 任务执行人员 " +
                "from (select t.*,rownum row_num from taskinfo t where 1=1";
            if (!String.IsNullOrEmpty(comboBox_userName.Text.Trim()) && !comboBox_userName.Text.Trim().Equals("不限"))
            {
                sqlCount += " and username='" + comboBox_userName.Text.Trim() + "' ";
                sqlData += " and username='" + comboBox_userName.Text.Trim() + "' ";
            }
            if (dateTimePicker_start.Value != null)
            {
                sqlCount += "and deploytime>=to_date('" + dateTimePicker_start.Value.ToShortDateString() + "','yyyy-MM-dd') ";
                sqlData += "and deploytime>=to_date('" + dateTimePicker_start.Value.ToShortDateString() + "','yyyy-MM-dd') ";
            }
            if (dateTimePicker_end.Value != null)
            {
                DateTime time = dateTimePicker_end.Value;
                time = time.AddDays(1);
                sqlCount += "and deploytime<=to_date('" + time.ToShortDateString() + "','yyyy-MM-dd') ";
                sqlData += "and deploytime<=to_date('" + time.ToShortDateString() + "','yyyy-MM-dd') ";
            }
            if (!String.IsNullOrEmpty(comboBox_state.Text.Trim()) && !comboBox_state.Text.Trim().Equals("不限"))
            {
                sqlCount += "and taskstate='" + comboBox_state.Text + "' ";
                sqlData += "and taskstate='" + comboBox_state.Text + "' ";
            }
            if (!String.IsNullOrEmpty(combo_street.Text.Trim()) && !combo_street.Text.Trim().Equals("不限"))
            {
                sqlCount += "and street='" + combo_street.Text + "' ";
                sqlData += "and street='" + combo_street.Text + "' ";
            }
            sqlData += " order by DBID desc)b " +
               "where(b.row_num between " + minPage + " and " + maxPage + ")";

            rows = int.Parse(OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, CommandType.Text, sqlCount).ToString());

            return sqlData;
        }


    }
}