lei zou 1 年之前
父节点
当前提交
33d17b6305

二进制
Database.db


+ 236 - 0
Layout/gridHomePosRes.xml

@@ -0,0 +1,236 @@
+<XtraSerializer version="1.0" application="View">
+  <property name="#LayoutVersion" />
+  <property name="#LayoutScaleFactor">@10,Width=1.14285719@10,Height=1.26666665</property>
+  <property name="Appearance" isnull="true" iskey="true">
+    <property name="Row" iskey="true" value="Row">
+      <property name="Options" isnull="true" iskey="true">
+        <property name="UseTextOptions">true</property>
+      </property>
+      <property name="TextOptions" isnull="true" iskey="true">
+        <property name="HAlignment">Center</property>
+      </property>
+    </property>
+    <property name="HeaderPanel" iskey="true" value="HeaderPanel">
+      <property name="Options" isnull="true" iskey="true">
+        <property name="UseTextOptions">true</property>
+      </property>
+      <property name="TextOptions" isnull="true" iskey="true">
+        <property name="HAlignment">Center</property>
+      </property>
+    </property>
+  </property>
+  <property name="OptionsBehavior" isnull="true" iskey="true">
+    <property name="Editable">false</property>
+  </property>
+  <property name="OptionsCustomization" isnull="true" iskey="true">
+    <property name="AllowFilter">false</property>
+    <property name="AllowQuickHideColumns">false</property>
+    <property name="AllowGroup">false</property>
+    <property name="AllowSort">false</property>
+    <property name="AllowMergedGrouping">False</property>
+  </property>
+  <property name="OptionsSelection" isnull="true" iskey="true">
+    <property name="EnableAppearanceFocusedCell">false</property>
+    <property name="MultiSelect">true</property>
+  </property>
+  <property name="OptionsView" isnull="true" iskey="true">
+    <property name="ColumnHeaderAutoHeight">True</property>
+    <property name="ShowDetailButtons">false</property>
+    <property name="ShowGroupPanel">false</property>
+  </property>
+  <property name="OptionsMenu" isnull="true" iskey="true">
+    <property name="EnableFooterMenu">false</property>
+    <property name="EnableGroupPanelMenu">false</property>
+  </property>
+  <property name="OptionsEditForm" isnull="true" iskey="true">
+    <property name="PopupEditFormWidth">1829</property>
+  </property>
+  <property name="FixedLineWidth">1</property>
+  <property name="IndicatorWidth">30</property>
+  <property name="ColumnPanelRowHeight">-1</property>
+  <property name="RowSeparatorHeight">0</property>
+  <property name="FooterPanelHeight">-1</property>
+  <property name="HorzScrollVisibility">Auto</property>
+  <property name="VertScrollVisibility">Auto</property>
+  <property name="RowHeight">13</property>
+  <property name="GroupRowHeight">-1</property>
+  <property name="GroupFormat">{0}: [#image]{1} {2}</property>
+  <property name="ChildGridLevelName" />
+  <property name="VertScrollTipFieldName" />
+  <property name="PreviewFieldName" />
+  <property name="GroupPanelText" />
+  <property name="NewItemRowText" />
+  <property name="LevelIndent">0</property>
+  <property name="PreviewIndent">0</property>
+  <property name="PreviewLineCount">-1</property>
+  <property name="ScrollStyle">LiveVertScroll, LiveHorzScroll</property>
+  <property name="FocusRectStyle">CellFocus</property>
+  <property name="HorzScrollStep">0</property>
+  <property name="ActiveFilterEnabled">true</property>
+  <property name="ViewCaptionHeight">-1</property>
+  <property name="Columns" iskey="true" value="11">
+    <property name="Item1" isnull="true" iskey="true">
+      <property name="Name">colTaskID</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">TaskID</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">0</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item2" isnull="true" iskey="true">
+      <property name="Name">colCxResID</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">CxResID</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">1</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item3" isnull="true" iskey="true">
+      <property name="Name">colCgResID</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">CgResID</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">2</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item4" isnull="true" iskey="true">
+      <property name="Name">colTarName</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">TarName</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">3</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item5" isnull="true" iskey="true">
+      <property name="Name">colTsName</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">TsName</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">4</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item6" isnull="true" iskey="true">
+      <property name="Name">colLonLat</property>
+      <property name="OptionsColumn" isnull="true" iskey="true">
+        <property name="ReadOnly">true</property>
+      </property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">LonLat</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">5</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item7" isnull="true" iskey="true">
+      <property name="Name">colMirrLonLat</property>
+      <property name="OptionsColumn" isnull="true" iskey="true">
+        <property name="ReadOnly">true</property>
+      </property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">MirrLonLat</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">6</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item8" isnull="true" iskey="true">
+      <property name="Name">colSigTime</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">SigTime</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">7</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item9" isnull="true" iskey="true">
+      <property name="Name">colID</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">ID</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">8</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item10" isnull="true" iskey="true">
+      <property name="Name">colCreateTime</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">CreateTime</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">9</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item11" isnull="true" iskey="true">
+      <property name="Name">colUpdateTime</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">UpdateTime</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">10</property>
+      <property name="Visible">true</property>
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+  </property>
+  <property name="ViewCaption" />
+  <property name="BorderStyle">Flat</property>
+  <property name="SynchronizeClones">true</property>
+  <property name="DetailTabHeaderLocation">Top</property>
+  <property name="Name">gridView2</property>
+  <property name="DetailHeight">875</property>
+  <property name="Tag" isnull="true" />
+  <property name="GroupSummary" iskey="true" value="0" />
+  <property name="ActiveFilterString" />
+  <property name="FormatRules" iskey="true" value="0" />
+  <property name="FormatConditions" iskey="true" value="0" />
+  <property name="GroupSummarySortInfoState" />
+  <property name="FindFilterText" />
+  <property name="FindPanelVisible">false</property>
+</XtraSerializer>

+ 154 - 0
Layout/gridHomeTask.xml

@@ -0,0 +1,154 @@
+<XtraSerializer version="1.0" application="View">
+  <property name="#LayoutVersion" />
+  <property name="#LayoutScaleFactor">@10,Width=1.14285719@10,Height=1.26666665</property>
+  <property name="Appearance" isnull="true" iskey="true">
+    <property name="Row" iskey="true" value="Row">
+      <property name="Options" isnull="true" iskey="true">
+        <property name="UseTextOptions">true</property>
+      </property>
+      <property name="TextOptions" isnull="true" iskey="true">
+        <property name="HAlignment">Center</property>
+      </property>
+    </property>
+    <property name="HeaderPanel" iskey="true" value="HeaderPanel">
+      <property name="Options" isnull="true" iskey="true">
+        <property name="UseTextOptions">true</property>
+      </property>
+      <property name="TextOptions" isnull="true" iskey="true">
+        <property name="HAlignment">Center</property>
+      </property>
+    </property>
+  </property>
+  <property name="OptionsBehavior" isnull="true" iskey="true">
+    <property name="Editable">false</property>
+  </property>
+  <property name="OptionsCustomization" isnull="true" iskey="true">
+    <property name="AllowFilter">false</property>
+    <property name="AllowQuickHideColumns">false</property>
+    <property name="AllowGroup">false</property>
+    <property name="AllowSort">false</property>
+    <property name="AllowMergedGrouping">False</property>
+  </property>
+  <property name="OptionsSelection" isnull="true" iskey="true">
+    <property name="EnableAppearanceFocusedCell">false</property>
+  </property>
+  <property name="OptionsView" isnull="true" iskey="true">
+    <property name="ColumnHeaderAutoHeight">True</property>
+    <property name="ShowDetailButtons">false</property>
+    <property name="ShowGroupPanel">false</property>
+    <property name="ShowIndicator">false</property>
+  </property>
+  <property name="OptionsMenu" isnull="true" iskey="true">
+    <property name="EnableFooterMenu">false</property>
+    <property name="EnableGroupPanelMenu">false</property>
+  </property>
+  <property name="OptionsEditForm" isnull="true" iskey="true">
+    <property name="PopupEditFormWidth">1829</property>
+  </property>
+  <property name="FixedLineWidth">1</property>
+  <property name="IndicatorWidth">-1</property>
+  <property name="ColumnPanelRowHeight">-1</property>
+  <property name="RowSeparatorHeight">0</property>
+  <property name="FooterPanelHeight">-1</property>
+  <property name="HorzScrollVisibility">Auto</property>
+  <property name="VertScrollVisibility">Auto</property>
+  <property name="RowHeight">13</property>
+  <property name="GroupRowHeight">-1</property>
+  <property name="GroupFormat">{0}: [#image]{1} {2}</property>
+  <property name="ChildGridLevelName" />
+  <property name="VertScrollTipFieldName" />
+  <property name="PreviewFieldName" />
+  <property name="GroupPanelText" />
+  <property name="NewItemRowText" />
+  <property name="LevelIndent">0</property>
+  <property name="PreviewIndent">0</property>
+  <property name="PreviewLineCount">-1</property>
+  <property name="ScrollStyle">LiveVertScroll, LiveHorzScroll</property>
+  <property name="FocusRectStyle">CellFocus</property>
+  <property name="HorzScrollStep">0</property>
+  <property name="ActiveFilterEnabled">true</property>
+  <property name="ViewCaptionHeight">-1</property>
+  <property name="Columns" iskey="true" value="5">
+    <property name="Item1" isnull="true" iskey="true">
+      <property name="Name">colTaskName</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">TaskName</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">0</property>
+      <property name="Visible">true</property>
+      <property name="Width">416</property>
+      <property name="AppearanceCell" isnull="true" iskey="true">
+        <property name="Options" isnull="true" iskey="true">
+          <property name="UseTextOptions">true</property>
+        </property>
+        <property name="TextOptions" isnull="true" iskey="true">
+          <property name="HAlignment">Near</property>
+        </property>
+      </property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item2" isnull="true" iskey="true">
+      <property name="Name">colPosType</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">PosType</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">1</property>
+      <property name="Visible">true</property>
+      <property name="Width">235</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item3" isnull="true" iskey="true">
+      <property name="Name">colID</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">ID</property>
+      <property name="ColumnEditName" />
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item4" isnull="true" iskey="true">
+      <property name="Name">colCreateTime</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">CreateTime</property>
+      <property name="ColumnEditName" />
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item5" isnull="true" iskey="true">
+      <property name="Name">colUpdateTime</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">UpdateTime</property>
+      <property name="ColumnEditName" />
+      <property name="Width">85</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+  </property>
+  <property name="ViewCaption" />
+  <property name="BorderStyle">Flat</property>
+  <property name="SynchronizeClones">true</property>
+  <property name="DetailTabHeaderLocation">Top</property>
+  <property name="Name">gridView1</property>
+  <property name="DetailHeight">875</property>
+  <property name="Tag" isnull="true" />
+  <property name="GroupSummary" iskey="true" value="0" />
+  <property name="ActiveFilterString" />
+  <property name="FormatRules" iskey="true" value="0" />
+  <property name="FormatConditions" iskey="true" value="0" />
+  <property name="GroupSummarySortInfoState" />
+  <property name="FindFilterText" />
+  <property name="FindPanelVisible">false</property>
+</XtraSerializer>

+ 195 - 0
Layout/gridXl.xml

@@ -0,0 +1,195 @@
+<XtraSerializer version="1.0" application="View">
+  <property name="#LayoutVersion" />
+  <property name="#LayoutScaleFactor">@10,Width=1.14285719@10,Height=1.35714281</property>
+  <property name="Appearance" isnull="true" iskey="true">
+    <property name="Row" iskey="true" value="Row">
+      <property name="Options" isnull="true" iskey="true">
+        <property name="UseTextOptions">true</property>
+      </property>
+      <property name="TextOptions" isnull="true" iskey="true">
+        <property name="HAlignment">Center</property>
+      </property>
+    </property>
+    <property name="HeaderPanel" iskey="true" value="HeaderPanel">
+      <property name="Options" isnull="true" iskey="true">
+        <property name="UseTextOptions">true</property>
+      </property>
+      <property name="TextOptions" isnull="true" iskey="true">
+        <property name="HAlignment">Center</property>
+      </property>
+    </property>
+  </property>
+  <property name="OptionsBehavior" isnull="true" iskey="true">
+    <property name="Editable">false</property>
+  </property>
+  <property name="OptionsCustomization" isnull="true" iskey="true">
+    <property name="AllowQuickHideColumns">false</property>
+    <property name="AllowGroup">false</property>
+    <property name="AllowMergedGrouping">False</property>
+  </property>
+  <property name="OptionsSelection" isnull="true" iskey="true">
+    <property name="EnableAppearanceFocusedCell">false</property>
+    <property name="MultiSelect">true</property>
+  </property>
+  <property name="OptionsView" isnull="true" iskey="true">
+    <property name="ColumnHeaderAutoHeight">True</property>
+    <property name="ShowDetailButtons">false</property>
+    <property name="ShowGroupPanel">false</property>
+  </property>
+  <property name="OptionsMenu" isnull="true" iskey="true">
+    <property name="EnableFooterMenu">false</property>
+    <property name="EnableGroupPanelMenu">false</property>
+  </property>
+  <property name="OptionsEditForm" isnull="true" iskey="true">
+    <property name="PopupEditFormWidth">914</property>
+  </property>
+  <property name="FixedLineWidth">2</property>
+  <property name="IndicatorWidth">30</property>
+  <property name="ColumnPanelRowHeight">-1</property>
+  <property name="RowSeparatorHeight">0</property>
+  <property name="FooterPanelHeight">-1</property>
+  <property name="HorzScrollVisibility">Auto</property>
+  <property name="VertScrollVisibility">Auto</property>
+  <property name="RowHeight">24</property>
+  <property name="GroupRowHeight">-1</property>
+  <property name="GroupFormat">{0}: [#image]{1} {2}</property>
+  <property name="ChildGridLevelName" />
+  <property name="VertScrollTipFieldName" />
+  <property name="PreviewFieldName" />
+  <property name="GroupPanelText" />
+  <property name="NewItemRowText" />
+  <property name="LevelIndent">-1</property>
+  <property name="PreviewIndent">-1</property>
+  <property name="PreviewLineCount">-1</property>
+  <property name="ScrollStyle">LiveVertScroll, LiveHorzScroll</property>
+  <property name="FocusRectStyle">CellFocus</property>
+  <property name="HorzScrollStep">0</property>
+  <property name="ActiveFilterEnabled">true</property>
+  <property name="ViewCaptionHeight">-1</property>
+  <property name="Columns" iskey="true" value="9">
+    <property name="Item1" isnull="true" iskey="true">
+      <property name="Name">colSatCode</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">SatCode</property>
+      <property name="ColumnEditName" />
+      <property name="Width">86</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item2" isnull="true" iskey="true">
+      <property name="Name">colSatName</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">SatName</property>
+      <property name="ColumnEditName" />
+      <property name="Width">86</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item3" isnull="true" iskey="true">
+      <property name="Name">colSat</property>
+      <property name="OptionsColumn" isnull="true" iskey="true">
+        <property name="ReadOnly">true</property>
+      </property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">Sat</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">0</property>
+      <property name="Visible">true</property>
+      <property name="Width">291</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item4" isnull="true" iskey="true">
+      <property name="Name">colTimeBJ</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">TimeBJ</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">1</property>
+      <property name="Visible">true</property>
+      <property name="Width">164</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item5" isnull="true" iskey="true">
+      <property name="Name">colLine1</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">Line1</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">2</property>
+      <property name="Visible">true</property>
+      <property name="Width">519</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item6" isnull="true" iskey="true">
+      <property name="Name">colLine2</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">Line2</property>
+      <property name="ColumnEditName" />
+      <property name="VisibleIndex">3</property>
+      <property name="Visible">true</property>
+      <property name="Width">524</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item7" isnull="true" iskey="true">
+      <property name="Name">colID</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">ID</property>
+      <property name="ColumnEditName" />
+      <property name="Width">86</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item8" isnull="true" iskey="true">
+      <property name="Name">colCreateTime</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">CreateTime</property>
+      <property name="ColumnEditName" />
+      <property name="Width">86</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+    <property name="Item9" isnull="true" iskey="true">
+      <property name="Name">colUpdateTime</property>
+      <property name="ImageAlignment">Near</property>
+      <property name="ImageIndex">-1</property>
+      <property name="FieldName">UpdateTime</property>
+      <property name="ColumnEditName" />
+      <property name="Width">86</property>
+      <property name="MinWidth">20</property>
+      <property name="MaxWidth">0</property>
+      <property name="UnboundDataTypeName" />
+    </property>
+  </property>
+  <property name="ViewCaption" />
+  <property name="BorderStyle">Flat</property>
+  <property name="SynchronizeClones">true</property>
+  <property name="DetailTabHeaderLocation">Top</property>
+  <property name="Name">gridView1</property>
+  <property name="DetailHeight">475</property>
+  <property name="Tag" isnull="true" />
+  <property name="GroupSummary" iskey="true" value="0" />
+  <property name="ActiveFilterString" />
+  <property name="FormatRules" iskey="true" value="0" />
+  <property name="FormatConditions" iskey="true" value="0" />
+  <property name="GroupSummarySortInfoState" />
+  <property name="FindFilterText" />
+  <property name="FindPanelVisible">false</property>
+</XtraSerializer>

+ 194 - 0
XdCxRhDW.App/Api/EphHelper.cs

@@ -0,0 +1,194 @@
+using DevExpress.Charts.Native;
+using DevExpress.XtraPrinting;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+namespace PosResAnalysis
+{
+    /// <summary>
+    /// 星历推算帮助类.该类调用了Tle2XYZ.exe进程
+    /// </summary>
+    public static class EphHelper
+    {
+        private static readonly DateTime dtZero = new DateTime(1970, 1, 1, 0, 0, 0, 0);
+        private static string exePath= "星历推算";
+        private const string exeName = "Tle2XYZ.exe";
+        /// <summary>
+        /// 设置【Tle2XYZ.exe】文件所在路径,支持相对路径
+        /// </summary>
+        public static void SetExePath(string path)
+        {
+            if (string.IsNullOrWhiteSpace(path)) return;
+            if (path.StartsWith("\\"))//相对路径要么开头不带\,要么是 .\
+                path = path.Remove(0, 1);
+            exePath = path;
+        }
+        /// <summary>
+        /// 推算双行星历
+        /// </summary>
+        /// <param name="tleStr">双行根数</param>
+        /// <param name="dt">指定时刻(北京时间)</param>
+        /// <returns></returns>
+        public static SatEphDto Calc(string tleStr, DateTime dt)
+        {
+            if (string.IsNullOrWhiteSpace(exePath))
+                throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
+            if (!Directory.Exists(exePath))
+                throw new Exception($"路径[{exePath}]不存在");
+            var exeFile = Path.Combine(exePath, exeName);
+            if (!File.Exists(exeFile))
+                throw new Exception($"文件[{exeFile}]不存在");
+            tleStr = tleStr.Replace(";", ";");
+            if (tleStr.EndsWith(";"))
+                tleStr = tleStr.Substring(0, tleStr.Length - 1);
+            tleStr = tleStr.Replace(";", ";");
+            var line1 = tleStr.Split(';')[0];
+            var line2 = tleStr.Split(';')[1];
+            var dtUtc = dt.AddHours(-8);
+            var timeSpan = (long)(dtUtc - dtZero).TotalSeconds;
+            Process p = new Process();
+            p.StartInfo.WorkingDirectory = exePath;
+            p.StartInfo.FileName = exeFile;
+            p.StartInfo.Arguments = $"-a \"{line1}\" -b \"{line2}\" -t {timeSpan} -p 1 -c 1";
+            p.StartInfo.CreateNoWindow = true;
+            p.StartInfo.RedirectStandardError = true;
+            p.StartInfo.RedirectStandardOutput = true;
+            p.StartInfo.UseShellExecute = false;
+            p.Start();
+            var succeed = p.WaitForExit(10000);
+            if (!succeed)
+            {
+                throw new Exception($"进程[{exeName}]超时未完成!");
+            }
+            return ParseOneResult(p.StandardOutput.ReadToEnd());
+        }
+
+        /// <summary>
+        /// 批量推算双行星历
+        /// </summary>
+        /// <param name="tleStr">双行根数</param>
+        /// <param name="start">起始时刻(北京)</param>
+        /// <param name="end">结束(北京)</param>
+        /// <param name="spanSeconds">推算间隔(秒)</param>
+        /// <returns></returns>
+        public static List<SatEphDto> CalcMult(string tleStr, DateTime start, DateTime end, int spanSeconds)
+        {
+            if (string.IsNullOrWhiteSpace(exePath))
+                throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
+            if (!Directory.Exists(exePath))
+                throw new Exception($"路径[{exePath}]不存在");
+            var exeFile = Path.Combine(exePath, exeName);
+            if (!File.Exists(exeFile))
+                throw new Exception($"文件[{exeFile}]不存在");
+            tleStr = tleStr.Replace(";", ";");
+            if (tleStr.EndsWith(";"))
+                tleStr = tleStr.Substring(0, tleStr.Length - 1);
+            tleStr = tleStr.Replace(";", ";");
+            var line1 = tleStr.Split(';')[0];
+            var line2 = tleStr.Split(';')[1];
+            var dtUtc = start.AddHours(-8);
+            var timeSpan = (long)(dtUtc - dtZero).TotalSeconds;
+            var c = (end - start).TotalSeconds / spanSeconds;
+            Process p = new Process();
+            var binPath = AppDomain.CurrentDomain.BaseDirectory;
+            p.StartInfo.WorkingDirectory = exePath;
+            p.StartInfo.FileName = exeFile;
+            p.StartInfo.Arguments = $"-a \"{line1}\" -b \"{line2}\" -t {timeSpan} -p {spanSeconds} -c {c + 1}";
+            p.StartInfo.CreateNoWindow = true;
+            p.StartInfo.RedirectStandardError = true;
+            p.StartInfo.RedirectStandardOutput = true;
+            p.StartInfo.UseShellExecute = false;
+            StringBuilder sb = new StringBuilder();
+            p.OutputDataReceived += (sender, e) => sb.Append(e.Data);
+            p.Start();
+            p.BeginOutputReadLine();
+            p.WaitForExit();//WaitForExit加了超时时间的话进程退出后不能保证异步流已经读取完成,这是.NET框架的BUG
+            return ParseResult(sb.ToString());
+        }
+        static List<SatEphDto> ParseResult(string result)
+        {
+            if (string.IsNullOrWhiteSpace(result))
+            {
+                throw new Exception("星历推算出现未知错误!");
+            }
+            var array = result.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
+            List<SatEphDto> list = new List<SatEphDto>();
+            foreach (var item in array)
+            {
+                var arrayItem = item.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
+                for (int i = 0; i < arrayItem.Length; i++)
+                {
+                    var dto = new SatEphDto
+                    {
+                        SatId = Convert.ToInt32(arrayItem[i++]),
+                        TleTime = dtZero.AddSeconds(Convert.ToInt64(arrayItem[i++])).AddHours(16),//内部有BUG需要多加8h
+                        SatTime = dtZero.AddSeconds(Convert.ToInt64(arrayItem[i++])).AddHours(8),//utc to beijing
+                        X = Math.Round(Convert.ToDouble(arrayItem[i++]), 3),
+                        Y = Math.Round(Convert.ToDouble(arrayItem[i++]), 3),
+                        Z = Math.Round(Convert.ToDouble(arrayItem[i++]), 3),
+                        VX = Math.Round(Convert.ToDouble(arrayItem[i++]), 3),
+                        VY = Math.Round(Convert.ToDouble(arrayItem[i++]), 3),
+                        VZ = Math.Round(Convert.ToDouble(arrayItem[i]), 3)
+                    };
+                    list.Add(dto);
+                }
+            }
+            return list;
+
+        }
+        static SatEphDto ParseOneResult(string result)
+        {
+            if (string.IsNullOrWhiteSpace(result))
+            {
+                throw new Exception("星历推算出现未知错误!");
+            }
+            result = result.Replace(";", "");
+            var array = result.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
+            int i = 0;
+            var dto = new SatEphDto
+            {
+                SatId = Convert.ToInt32(array[i++]),
+                TleTime = dtZero.AddSeconds(Convert.ToInt64(array[i++])).AddHours(16),//内部有BUG需要多加8h
+                SatTime = dtZero.AddSeconds(Convert.ToInt64(array[i++])).AddHours(8),//utc to beijing
+                X = Math.Round(Convert.ToDouble(array[i++]), 3),
+                Y = Math.Round(Convert.ToDouble(array[i++]), 3),
+                Z = Math.Round(Convert.ToDouble(array[i++]), 3),
+                VX = Math.Round(Convert.ToDouble(array[i++]), 3),
+                VY = Math.Round(Convert.ToDouble(array[i++]), 3),
+                VZ = Math.Round(Convert.ToDouble(array[i++]), 3)
+            };
+            return dto;
+
+        }
+    }
+    public class SatEphDto
+    {
+        public int SatId { get; set; }
+
+        public DateTime SatTime { get; set; }
+
+        public DateTime TleTime { get; set; }
+
+        public double X { get; set; }
+
+        public double Y { get; set; }
+
+        public double Z { get; set; }
+
+        public double VX { get; set; }
+
+        public double VY { get; set; }
+
+        public double VZ { get; set; }
+
+        public override string ToString()
+        {
+            return $"{X},{Y},{Z},{VX},{VY},{VZ}";
+        }
+
+    }
+}

+ 1 - 1
XdCxRhDW.App/Api/PosApi.cs

@@ -29,7 +29,7 @@ namespace XdCxRhDW.App.Api
 
 
         [DllImport(X2D1, EntryPoint = "SC_2X1D_DW", CallingConvention = CallingConvention.Cdecl)]//两星一地
-        private extern static void X2D1_POS_Core(double[] mainSat, double[] adjaSat, double[] cdbStation, double[] satStation1, double[] satStation2, double[] satStation3, double[] satStation4,
+        public extern static void X2D1_POS_Core(double[] mainSat, double[] adjaSat, double[] cdbStation, double[] satStation1, double[] satStation2, double[] satStation3, double[] satStation4,
              double[] satStation5, double[] refStation, double[] zone, double tarSxDto, double tarXdDto, double samp_main_dto, double samp_neigh_dto, double[] res);
 
         #endregion

+ 22 - 9
XdCxRhDW.App/MainForm.Designer.cs

@@ -30,6 +30,8 @@
         {
             this.components = new System.ComponentModel.Container();
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            DevExpress.Utils.SuperToolTip superToolTip1 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipItem toolTipItem1 = new DevExpress.Utils.ToolTipItem();
             this.ribbon = new DevExpress.XtraBars.Ribbon.RibbonControl();
             this.skinPaletteDropDownButtonItem1 = new DevExpress.XtraBars.SkinPaletteDropDownButtonItem();
             this.btnTask = new DevExpress.XtraBars.BarButtonItem();
@@ -49,6 +51,7 @@
             this.documentManager1 = new DevExpress.XtraBars.Docking2010.DocumentManager(this.components);
             this.tabbedView1 = new DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView(this.components);
             this.dockManager1 = new DevExpress.XtraBars.Docking.DockManager(this.components);
+            this.btnOpenApi = new DevExpress.XtraBars.BarButtonItem();
             ((System.ComponentModel.ISupportInitialize)(this.ribbon)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.documentManager1)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.tabbedView1)).BeginInit();
@@ -58,8 +61,8 @@
             // ribbon
             // 
             this.ribbon.CaptionBarItemLinks.Add(this.skinPaletteDropDownButtonItem1);
+            this.ribbon.CaptionBarItemLinks.Add(this.btnOpenApi);
             this.ribbon.DrawGroupCaptions = DevExpress.Utils.DefaultBoolean.False;
-            this.ribbon.EmptyAreaImageOptions.ImagePadding = new System.Windows.Forms.Padding(56, 62, 56, 62);
             this.ribbon.ExpandCollapseItem.Id = 0;
             this.ribbon.Items.AddRange(new DevExpress.XtraBars.BarItem[] {
             this.skinPaletteDropDownButtonItem1,
@@ -73,12 +76,11 @@
             this.btnXl,
             this.btnSat,
             this.btnCocTool,
-            this.btnErrFx});
+            this.btnErrFx,
+            this.btnOpenApi});
             this.ribbon.Location = new System.Drawing.Point(0, 0);
-            this.ribbon.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
-            this.ribbon.MaxItemId = 21;
+            this.ribbon.MaxItemId = 22;
             this.ribbon.Name = "ribbon";
-            this.ribbon.OptionsMenuMinWidth = 613;
             this.ribbon.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] {
             this.ribbonPage1});
             this.ribbon.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonControlStyle.MacOffice;
@@ -90,7 +92,7 @@
             this.ribbon.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Show;
             this.ribbon.ShowQatLocationSelector = false;
             this.ribbon.ShowToolbarCustomizeItem = false;
-            this.ribbon.Size = new System.Drawing.Size(2502, 258);
+            this.ribbon.Size = new System.Drawing.Size(1347, 133);
             this.ribbon.Toolbar.ShowCustomizeItem = false;
             // 
             // skinPaletteDropDownButtonItem1
@@ -238,15 +240,25 @@
             "DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl",
             "DevExpress.XtraBars.ToolbarForm.ToolbarFormControl"});
             // 
+            // btnOpenApi
+            // 
+            this.btnOpenApi.Caption = "barButtonItem1";
+            this.btnOpenApi.Id = 21;
+            this.btnOpenApi.ImageOptions.SvgImage = ((DevExpress.Utils.Svg.SvgImage)(resources.GetObject("barButtonItem1.ImageOptions.SvgImage")));
+            this.btnOpenApi.Name = "btnOpenApi";
+            toolTipItem1.Text = "查看接口文档";
+            superToolTip1.Items.Add(toolTipItem1);
+            this.btnOpenApi.SuperTip = superToolTip1;
+            this.btnOpenApi.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.btnOpenApi_ItemClick);
+            // 
             // MainForm
             // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(13F, 29F);
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(2502, 1475);
+            this.ClientSize = new System.Drawing.Size(1347, 704);
             this.Controls.Add(this.ribbon);
             this.IconOptions.Icon = ((System.Drawing.Icon)(resources.GetObject("MainForm.IconOptions.Icon")));
             this.IsMdiContainer = true;
-            this.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
             this.Name = "MainForm";
             this.Ribbon = this.ribbon;
             this.Text = "多模式融合定位平台";
@@ -281,5 +293,6 @@
         private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup3;
         private DevExpress.XtraBars.BarButtonItem btnCocTool;
         private DevExpress.XtraBars.BarButtonItem btnErrFx;
+        private DevExpress.XtraBars.BarButtonItem btnOpenApi;
     }
 }

+ 35 - 0
XdCxRhDW.App/MainForm.cs

@@ -17,6 +17,8 @@ using DevExpress.XtraEditors;
 using ExtensionsDev;
 using DevExpress.XtraBars.Forms;
 using XdCxRhDW.App.CorTools;
+using XdCxRhDW.App.EFContext;
+using System.Data.Entity;
 
 namespace XdCxRhDW
 {
@@ -74,5 +76,38 @@ namespace XdCxRhDW
             Application.Exit();
 
         }
+
+        private async void btnOpenApi_ItemClick(object sender, ItemClickEventArgs e)
+        {
+            using (RHDWContext db = new RHDWContext())
+            {
+                var settings = await db.SysSetings.FirstOrDefaultAsync();
+                if (settings == null)
+                {
+                    DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP地址和Http端口");
+                    return;
+                }
+                if (string.IsNullOrEmpty(settings.ServerIp))
+                {
+                    DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP地址和Http端口");
+                    return;
+                }
+                if (settings.HttpPort<1)
+                {
+                    DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP地址和Http端口");
+                    return;
+                }
+                string addr = $"http://{settings.ServerIp}:{settings.HttpPort}/swagger";
+                try
+                {
+                    System.Diagnostics.Process.Start(addr);
+                }
+                catch
+                {
+                    db.Dispose();
+                    DxHelper.MsgBoxHelper.ShowError($"无法打开默认浏览器,请手动查看接口文档.地址{addr}");
+                }
+            }
+        }
     }
 }

+ 118 - 88
XdCxRhDW.App/MainForm.resx

@@ -117,59 +117,87 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="barButtonItem1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAANYEAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTG9naWNhbCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KPC9z
+        dHlsZT4NCiAgPHBhdGggZD0iTTUsNGgyM1YzYzAtMC42LTAuNC0xLTEtMUg1QzMuMywyLDIsMy4zLDIs
+        NXYyMmMwLDEuNywxLjMsMywzLDNoMjJjMC42LDAsMS0wLjQsMS0xVjZINUM0LjQsNiw0LDUuNiw0LDUg
+        IEM0LDQuNCw0LjQsNCw1LDR6IE0xNiwyNGgtMnYtMmgyVjI0eiBNMTEuNiwxNC40YzAuMi0wLjUsMC40
+        LTAuOSwwLjctMS4zYzAuMy0wLjQsMC43LTAuNiwxLjEtMC44YzAuNC0wLjIsMC45LTAuMywxLjUtMC4z
+        ICBjMC43LDAsMS4zLDAuMSwxLjgsMC4zYzAuNSwwLjIsMC45LDAuNSwxLjIsMC44YzAuMywwLjMsMC41
+        LDAuNywwLjYsMWMwLjEsMC40LDAuMiwwLjcsMC4yLDFjMCwwLjQsMCwwLjctMC4xLDEgIGMtMC4xLDAu
+        My0wLjIsMC41LTAuMywwLjhjLTAuMSwwLjItMC4zLDAuNC0wLjQsMC42Yy0wLjIsMC4yLTAuMywwLjMt
+        MC41LDAuNGMtMC4yLDAuMS0wLjMsMC4zLTAuNSwwLjRjLTAuMiwwLjEtMC4zLDAuMy0wLjQsMC40ICBj
+        LTAuMSwwLjEtMC4zLDAuMy0wLjQsMC41Yy0wLjEsMC4yLTAuMiwwLjQtMC4yLDAuNnYwLjZoLTJ2LTAu
+        N2MwLTAuNCwwLjEtMC43LDAuMS0wLjljMC4xLTAuMywwLjItMC41LDAuMy0wLjcgIGMwLjEtMC4yLDAu
+        My0wLjQsMC40LTAuNWMwLjEtMC4xLDAuMy0wLjMsMC40LTAuNHMwLjMtMC4zLDAuNC0wLjRjMC4xLTAu
+        MSwwLjItMC4yLDAuMy0wLjRjMC4xLTAuMSwwLjItMC4zLDAuMi0wLjUgIGMwLjEtMC4yLDAuMS0wLjQs
+        MC4xLTAuNmMwLTAuNS0wLjEtMC45LTAuMy0xLjFjLTAuMi0wLjItMC41LTAuNC0wLjktMC40Yy0wLjMs
+        MC0wLjUsMC4xLTAuNywwLjJjLTAuMiwwLjEtMC40LDAuMy0wLjUsMC41ICBjLTAuMSwwLjItMC4yLDAu
+        NC0wLjMsMC43Yy0wLjEsMC4yLTAuMSwwLjUtMC4xLDAuOGgtMi4yQzExLjQsMTUuNCwxMS40LDE0Ljks
+        MTEuNiwxNC40eiIgY2xhc3M9IkJsdWUiIC8+DQo8L3N2Zz4L
+</value>
+  </data>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="btnTask.ImageOptions.LargeImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         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
-        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
-        gPsH74Mcs+ZboRcAAAAASUVORK5CYII=
+        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
+        gxyzk7AwVQAAAABJRU5ErkJggg==
 </value>
   </data>
-  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
   <data name="btnTask.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
         dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAADMUAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
@@ -263,7 +291,7 @@
   </data>
   <data name="btnCg.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
         dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAIDAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
@@ -283,7 +311,7 @@
   </data>
   <data name="btnCx.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
         dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAFsEAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
@@ -309,7 +337,7 @@
   </data>
   <data name="btnDw.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
         dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAPgCAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
@@ -329,7 +357,7 @@
   </data>
   <data name="btnSet.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
         dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAO4DAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
@@ -353,7 +381,7 @@
   </data>
   <data name="btnTx.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
         dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGcDAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
@@ -375,7 +403,7 @@
   </data>
   <data name="btnXl.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjEsIFZlcnNpb249MjMuMS42
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi4z
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
         dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAPMDAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
@@ -400,48 +428,50 @@
   <data name="btnSat.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
-        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAPdEVYdFRpdGxlAFNhdGVsaXRlOxVk56QAAAILSURB
-        VDhPjZHNaxNRFMULhS7daF37FwhmoQjdGMWt4EYScGM6oSC4GE2NhtbRYBonaUK+TUxmFTQfJoGEiApi
-        BZMomEUdA6FuBZGmuBDaSkOv546TIe1U7IXfvHnv3XPee/dOENF/abVaB8J7fz/7YmaueB68Akd4Pi6q
-        1+vuXC73LZ1OW5PJpNkAostgW376iTC+4LWRuNFo3KvVasNqtUqJRGJgMoDAAYbP3n5l8W9gHYm73e6J
-        SqWyVSqVKBqNDmOx2I09Bkh2gV3ljSYeWoXHs5lMZgqnfsCp20tLvvm7njs/Q6HQRiQSmWfT/QbS7PIK
-        i3fPCU9u2+329WKxuNbpdKjX61E4HN7x+R56IDo6utVBT5CAG++bKhQKa+12mwaDAfX7fcItCIINFo1j
-        KiI75/P5dxgNcbPZJEVRKB6Pvy6Xy3qmrh03wJtPiaJ4EjfYYgNVVTUx2kbBYHAVz5jEDY0WmwxSqZSE
-        6pLT6dyEgFB1ymazFAgEPttstvWL15YXIDRabDLgkO5LZa/3AQmCsOn3+39B3JBlefKCIyrPzBVovMUm
-        g5u3xGPgy+LiwnO0i1wu12kuFJL3tBhc4nxNe9X7chp81w2ugOP8j5MlYOF/CIwWAwevcWgG18MrZ4Cq
-        r/0z2AS49akWmoFH+WgRk+8Jowp+6HuHCqMGj0qrFnAWTPP88NDEH/j96Y9kjSwpAAAAAElFTkSuQmCC
+        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAPdEVYdFRpdGxlAFNhdGVsaXRlOxVk56QAAAIoSURB
+        VDhPlZLBa9NQHMcHgx296Dz7Fwj2oAjvYhWvghdpYRe3lgcDD2k7p2UzWuzaviyhTZPa2ORUtC81DTRU
+        piBWMK0Fe6i1UOZVEFmHB2GbWPbkVVtiMxn+4Bd+L/l9P+/l930zhJCZ49K27SOTfvv9mAoA8WUA8QsA
+        8Qm6doqq1eqqqqqf8/m8V5ZlNwBAfB1AfJB68p4AiJ87AZZl3TNNc1ipVIgkSQMXAEC8CCAePn39iYp/
+        AIi9Y3G73T5jGMa+ruskk8kMRVG89RcAQBwBEB9qr0bioTfwaElRlDnLst6ZpnmwsRFfuRu9843n+d10
+        Or1CodMAdmmzTsWHlwKPb/v9/h2M8Xaz2SS9Xo8IgvAzHn8YlWX55PhUR/0CCyBelSRprlQqbTcaDTIY
+        DEi/3yemaRJZlnepyJmuIVJysVh8Y9v2RFyr1YimaSSbzb4sl8uTXpeNiqKcYxjmrCRJ+xTQ7XZHYlVV
+        CcdxHUEQZp0WuwC5XI4VRZEEg8E9juOIYRikUCgQhNAHn8+3c/Xm5prTYheABnufLcdiD0ggENhLJBLf
+        EUJWKpWavbKYSQFYIk6LXYBQmDkVCjMf19fXnvE8TyKRyHk6qGmLAcTXaP9IuxDbml+IbX35A7gRCjOn
+        aY0QYhFCHlo7LaaXbbzhCLAs1C8sC/Xu5Bj/iLHFzncjQFRreRj5LYlqrW5Ua311NhwXkxkk9Y4nqXcu
+        JvXOPF3/T/4C+P3pj1/PMtcAAAAASUVORK5CYII=
 </value>
   </data>
   <data name="btnSat.ImageOptions.LargeImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         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
-        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
-        2GJTAAAAAElFTkSuQmCC
+        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
 </value>
   </data>
   <metadata name="documentManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

+ 2 - 0
XdCxRhDW.App/Model/SysSetings.cs

@@ -13,5 +13,7 @@ namespace XdCxRhDW.App.Model
     {
         public string ServerIp { get; set; }
         public int Port { get; set; }
+
+        public int HttpPort { get; set; }
     }
 }

+ 3 - 1
XdCxRhDW.App/Model/XlInfo.cs

@@ -18,7 +18,7 @@ namespace XdCxRhDW.App.Model
         [Display(Name = "卫星")]
         public string Sat => $"{SatName}({SatCode})";
 
-        [Display(Name ="星历时间(北京)")]
+        [Display(Name = "星历时间(北京)")]
         public DateTime TimeBJ { get; set; }
 
         [Display(Name = "双行根数1")]
@@ -27,5 +27,7 @@ namespace XdCxRhDW.App.Model
         [Display(Name = "双行根数2")]
         public string Line2 { get; set; }
 
+        public string TwoLine => $"{Line1};{Line2}";
+
     }
 }

+ 1 - 0
XdCxRhDW.App/Program.cs

@@ -11,6 +11,7 @@ using System.Reflection;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using XdCxRhDW.App.WebAPI;
 
 namespace XdCxRhDW
 {

+ 8 - 5
XdCxRhDW.App/Properties/licenses.licx

@@ -1,9 +1,12 @@
-DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
 DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraMap.MapControl, DevExpress.XtraMap.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
 DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
 DevExpress.XtraEditors.SearchLookUpEdit, DevExpress.XtraGrid.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraMap.MapControl, DevExpress.XtraMap.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraBars.Docking2010.DocumentManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
 DevExpress.XtraEditors.ImageComboBoxEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a

+ 45 - 6
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -37,6 +37,9 @@ using XdCxRhDW.Dto;
 using XdCxRhDW.App.Api;
 using System.Windows.Controls;
 using XdCxRhDW.App.WebAPI;
+using Microsoft.Owin.Hosting;
+using XdCxRhDW.App.App.Properties;
+using System.Web.Http;
 
 namespace XdCxRhDW.App.UserControl
 {
@@ -98,7 +101,7 @@ namespace XdCxRhDW.App.UserControl
             }
             catch (Exception ex)
             {
-                Serilog.Log.Error(ex,"加载任务信息异常");
+                Serilog.Log.Error(ex, "加载任务信息异常");
                 DxHelper.MsgBoxHelper.ShowError("加载任务信息异常");
             }
             gridHomeTask.DataSource = list;
@@ -106,6 +109,28 @@ namespace XdCxRhDW.App.UserControl
             this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58"));
             this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57"));
             gridView1.CustomDrawCell += GridView1_CustomDrawCell;
+            using (RHDWContext db = new RHDWContext())
+            {
+                var settings = await db.SysSetings.FirstOrDefaultAsync();
+                if (settings == null)
+                {
+                    DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
+                    return;
+                }
+                try
+                {
+                    StartOptions options = new StartOptions();
+                    options.Urls.Add($"http://+:{settings.HttpPort}");
+                    httpServer = WebApp.Start<Startup>(options);
+                }
+                catch (Exception ex)
+                {
+                    httpServer = null;
+                    Serilog.Log.Error(ex, "启动Http定位接口服务失败!");
+                    DxHelper.MsgBoxHelper.ShowWarning($"启动Http定位接口服务失败!");
+                }
+            }
+
             WaitHelper.CloseForm();
         }
 
@@ -253,6 +278,7 @@ namespace XdCxRhDW.App.UserControl
                 }
             }
         }
+        IDisposable httpServer;
         TcpServer server;
         private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
@@ -283,7 +309,20 @@ namespace XdCxRhDW.App.UserControl
                             server.OnDataReceived += this.Server_OnDataReceived;
                             server.Start(settings.Port);
                         }
-                        RestApiServer.StartUp();
+                        if (httpServer == null)
+                        {
+                            try
+                            {
+                                StartOptions options = new StartOptions();
+                                options.Urls.Add($"http://+:{settings.HttpPort}");
+                                httpServer = WebApp.Start<Startup>(options);
+                            }
+                            catch (Exception ex)
+                            {
+                                Serilog.Log.Error(ex, "启动任务异常,Http定位接口服务启动失败");
+                                DxHelper.MsgBoxHelper.ShowError($"启动任务异常,Http定位接口服务启动失败");
+                            }
+                        }
                         var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
                         item.TaskState = EnumTaskState.Running;
                         await db.SaveChangesAsync();
@@ -294,7 +333,7 @@ namespace XdCxRhDW.App.UserControl
                 catch (Exception ex)
                 {
                     Serilog.Log.Error(ex, "启动任务异常");
-                    DxHelper.MsgBoxHelper.ShowError("启动任务异常");
+                    DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}");
                 }
             }
             else
@@ -319,7 +358,7 @@ namespace XdCxRhDW.App.UserControl
                 catch (Exception ex)
                 {
                     Serilog.Log.Error(ex, "停止任务异常");
-                    DxHelper.MsgBoxHelper.ShowError("停止任务异常");
+                    DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}");
                 }
             }
             gridView1.RefreshData();
@@ -473,7 +512,7 @@ namespace XdCxRhDW.App.UserControl
             }
             catch (Exception ex)
             {
-                Serilog.Log.Error(ex,"接收到推送消息后处理异常");
+                Serilog.Log.Error(ex, "接收到推送消息后处理异常");
             }
         }
 
@@ -501,7 +540,7 @@ namespace XdCxRhDW.App.UserControl
             }
             catch (Exception ex)
             {
-                Serilog.Log.Error(ex,"删除定位结果异常");
+                Serilog.Log.Error(ex, "删除定位结果异常");
                 DxHelper.MsgBoxHelper.ShowError("删除定位结果异常");
             }
         }

+ 64 - 30
XdCxRhDW.App/UserControl/CtrlSysSettings.Designer.cs

@@ -30,14 +30,16 @@ namespace XdCxRhDW.App.UserControl
         private void InitializeComponent()
         {
             this.tablePanel1 = new DevExpress.Utils.Layout.TablePanel();
-            this.btnSave = new DevExpress.XtraEditors.SimpleButton();
             this.layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            this.btnSave = new DevExpress.XtraEditors.SimpleButton();
             this.txtPort = new DevExpress.XtraEditors.TextEdit();
             this.txtIp = new DevExpress.XtraEditors.ComboBoxEdit();
             this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
             this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
             this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
             this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.txtHttpPort = new DevExpress.XtraEditors.TextEdit();
+            this.layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
             ((System.ComponentModel.ISupportInitialize)(this.tablePanel1)).BeginInit();
             this.tablePanel1.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).BeginInit();
@@ -48,6 +50,8 @@ namespace XdCxRhDW.App.UserControl
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtHttpPort.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).BeginInit();
             this.SuspendLayout();
             // 
             // tablePanel1
@@ -62,53 +66,54 @@ namespace XdCxRhDW.App.UserControl
             this.tablePanel1.Name = "tablePanel1";
             this.tablePanel1.Rows.AddRange(new DevExpress.Utils.Layout.TablePanelRow[] {
             new DevExpress.Utils.Layout.TablePanelRow(DevExpress.Utils.Layout.TablePanelEntityStyle.Relative, 1F),
-            new DevExpress.Utils.Layout.TablePanelRow(DevExpress.Utils.Layout.TablePanelEntityStyle.Absolute, 248F),
+            new DevExpress.Utils.Layout.TablePanelRow(DevExpress.Utils.Layout.TablePanelEntityStyle.Absolute, 340F),
             new DevExpress.Utils.Layout.TablePanelRow(DevExpress.Utils.Layout.TablePanelEntityStyle.Relative, 1F)});
-            this.tablePanel1.Size = new System.Drawing.Size(567, 509);
+            this.tablePanel1.Size = new System.Drawing.Size(716, 628);
             this.tablePanel1.TabIndex = 0;
             this.tablePanel1.UseSkinIndents = true;
             // 
-            // btnSave
-            // 
-            this.btnSave.Location = new System.Drawing.Point(12, 209);
-            this.btnSave.Name = "btnSave";
-            this.btnSave.Size = new System.Drawing.Size(172, 23);
-            this.btnSave.StyleController = this.layoutControl1;
-            this.btnSave.TabIndex = 4;
-            this.btnSave.Text = "保存";
-            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
-            // 
             // layoutControl1
             // 
             this.tablePanel1.SetColumn(this.layoutControl1, 1);
             this.layoutControl1.Controls.Add(this.btnSave);
             this.layoutControl1.Controls.Add(this.txtPort);
             this.layoutControl1.Controls.Add(this.txtIp);
+            this.layoutControl1.Controls.Add(this.txtHttpPort);
             this.layoutControl1.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.layoutControl1.Location = new System.Drawing.Point(186, 132);
+            this.layoutControl1.Location = new System.Drawing.Point(260, 146);
             this.layoutControl1.Name = "layoutControl1";
             this.layoutControl1.Root = this.Root;
             this.tablePanel1.SetRow(this.layoutControl1, 1);
-            this.layoutControl1.Size = new System.Drawing.Size(196, 244);
+            this.layoutControl1.Size = new System.Drawing.Size(196, 336);
             this.layoutControl1.TabIndex = 0;
             this.layoutControl1.Text = "layoutControl1";
             // 
+            // btnSave
+            // 
+            this.btnSave.Location = new System.Drawing.Point(12, 296);
+            this.btnSave.Name = "btnSave";
+            this.btnSave.Size = new System.Drawing.Size(172, 28);
+            this.btnSave.StyleController = this.layoutControl1;
+            this.btnSave.TabIndex = 4;
+            this.btnSave.Text = "保存";
+            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+            // 
             // txtPort
             // 
             this.txtPort.EditValue = "16010";
-            this.txtPort.Location = new System.Drawing.Point(12, 124);
+            this.txtPort.Location = new System.Drawing.Point(12, 134);
             this.txtPort.Name = "txtPort";
-            this.txtPort.Size = new System.Drawing.Size(172, 20);
+            this.txtPort.Size = new System.Drawing.Size(172, 22);
             this.txtPort.StyleController = this.layoutControl1;
             this.txtPort.TabIndex = 5;
             // 
             // txtIp
             // 
-            this.txtIp.Location = new System.Drawing.Point(12, 29);
+            this.txtIp.Location = new System.Drawing.Point(12, 30);
             this.txtIp.Name = "txtIp";
             this.txtIp.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
             new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
-            this.txtIp.Size = new System.Drawing.Size(172, 20);
+            this.txtIp.Size = new System.Drawing.Size(172, 22);
             this.txtIp.StyleController = this.layoutControl1;
             this.txtIp.TabIndex = 4;
             // 
@@ -119,9 +124,10 @@ namespace XdCxRhDW.App.UserControl
             this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
             this.layoutControlItem1,
             this.layoutControlItem2,
-            this.layoutControlItem3});
+            this.layoutControlItem3,
+            this.layoutControlItem4});
             this.Root.Name = "Root";
-            this.Root.Size = new System.Drawing.Size(196, 244);
+            this.Root.Size = new System.Drawing.Size(196, 336);
             this.Root.TextVisible = false;
             // 
             // layoutControlItem1
@@ -130,44 +136,68 @@ namespace XdCxRhDW.App.UserControl
             this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
             this.layoutControlItem1.MinSize = new System.Drawing.Size(76, 41);
             this.layoutControlItem1.Name = "layoutControlItem1";
-            this.layoutControlItem1.Size = new System.Drawing.Size(176, 75);
+            this.layoutControlItem1.Size = new System.Drawing.Size(176, 84);
             this.layoutControlItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
             this.layoutControlItem1.Text = "本机IP";
             this.layoutControlItem1.TextLocation = DevExpress.Utils.Locations.Top;
-            this.layoutControlItem1.TextSize = new System.Drawing.Size(72, 14);
+            this.layoutControlItem1.TextSize = new System.Drawing.Size(70, 14);
             // 
             // layoutControlItem2
             // 
             this.layoutControlItem2.Control = this.txtPort;
-            this.layoutControlItem2.Location = new System.Drawing.Point(0, 75);
+            this.layoutControlItem2.Location = new System.Drawing.Point(0, 84);
             this.layoutControlItem2.MinSize = new System.Drawing.Size(76, 61);
             this.layoutControlItem2.Name = "layoutControlItem2";
             this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 22, 2);
-            this.layoutControlItem2.Size = new System.Drawing.Size(176, 74);
+            this.layoutControlItem2.Size = new System.Drawing.Size(176, 82);
             this.layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
-            this.layoutControlItem2.Text = "数据接收端口";
+            this.layoutControlItem2.Text = "TCP接口端口";
             this.layoutControlItem2.TextLocation = DevExpress.Utils.Locations.Top;
-            this.layoutControlItem2.TextSize = new System.Drawing.Size(72, 14);
+            this.layoutControlItem2.TextSize = new System.Drawing.Size(70, 14);
             // 
             // layoutControlItem3
             // 
             this.layoutControlItem3.Control = this.btnSave;
-            this.layoutControlItem3.Location = new System.Drawing.Point(0, 149);
+            this.layoutControlItem3.Location = new System.Drawing.Point(0, 236);
             this.layoutControlItem3.MinSize = new System.Drawing.Size(35, 26);
             this.layoutControlItem3.Name = "layoutControlItem3";
             this.layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 50, 2);
-            this.layoutControlItem3.Size = new System.Drawing.Size(176, 75);
+            this.layoutControlItem3.Size = new System.Drawing.Size(176, 80);
             this.layoutControlItem3.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
             this.layoutControlItem3.TextSize = new System.Drawing.Size(0, 0);
             this.layoutControlItem3.TextVisible = false;
             // 
+            // txtHttpPort
+            // 
+            this.txtHttpPort.EditValue = "8091";
+            this.txtHttpPort.Location = new System.Drawing.Point(12, 216);
+            this.txtHttpPort.Name = "txtHttpPort";
+            this.txtHttpPort.Size = new System.Drawing.Size(172, 22);
+            this.txtHttpPort.StyleController = this.layoutControl1;
+            this.txtHttpPort.TabIndex = 5;
+            // 
+            // layoutControlItem4
+            // 
+            this.layoutControlItem4.Control = this.txtHttpPort;
+            this.layoutControlItem4.ControlAlignment = System.Drawing.ContentAlignment.TopLeft;
+            this.layoutControlItem4.CustomizationFormText = "TCP接口端口";
+            this.layoutControlItem4.Location = new System.Drawing.Point(0, 166);
+            this.layoutControlItem4.MinSize = new System.Drawing.Size(76, 61);
+            this.layoutControlItem4.Name = "layoutControlItem4";
+            this.layoutControlItem4.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 22, 2);
+            this.layoutControlItem4.Size = new System.Drawing.Size(176, 70);
+            this.layoutControlItem4.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem4.Text = "TCP接口端口";
+            this.layoutControlItem4.TextLocation = DevExpress.Utils.Locations.Top;
+            this.layoutControlItem4.TextSize = new System.Drawing.Size(70, 14);
+            // 
             // CtrlSysSettings
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.Controls.Add(this.tablePanel1);
             this.Name = "CtrlSysSettings";
-            this.Size = new System.Drawing.Size(567, 509);
+            this.Size = new System.Drawing.Size(716, 628);
             this.Load += new System.EventHandler(this.CtrlSysSettings_Load);
             ((System.ComponentModel.ISupportInitialize)(this.tablePanel1)).EndInit();
             this.tablePanel1.ResumeLayout(false);
@@ -179,6 +209,8 @@ namespace XdCxRhDW.App.UserControl
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtHttpPort.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).EndInit();
             this.ResumeLayout(false);
 
         }
@@ -194,5 +226,7 @@ namespace XdCxRhDW.App.UserControl
         private DevExpress.XtraEditors.SimpleButton btnSave;
         private DevExpress.XtraEditors.ComboBoxEdit txtIp;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraEditors.TextEdit txtHttpPort;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
     }
 }

+ 3 - 1
XdCxRhDW.App/UserControl/CtrlSysSettings.cs

@@ -50,6 +50,7 @@ namespace XdCxRhDW.App.UserControl
                     {
                         this.txtIp.Text = res.ServerIp;
                         this.txtPort.Text = res.Port.ToString();
+                        this.txtHttpPort.Text=res.HttpPort.ToString();
                     }
                 }
             }
@@ -72,6 +73,7 @@ namespace XdCxRhDW.App.UserControl
                         {
                             ServerIp = txtIp.Text,
                             Port = Convert.ToInt32(txtPort.Text),
+                            HttpPort=Convert.ToInt32(txtHttpPort.Text)
                         };
                         db.SysSetings.Add(res);
                     }
@@ -81,7 +83,7 @@ namespace XdCxRhDW.App.UserControl
                         res.Port = Convert.ToInt32(txtPort.Text);
                     }
                     await db.SaveChangesAsync();
-                    DxHelper.MsgBoxHelper.ShowError("配置信息保存成功!");
+                    DxHelper.MsgBoxHelper.ShowInfo("配置信息保存成功!");
                 }
             }
             catch (Exception ex)

+ 11 - 10
XdCxRhDW.App/UserControl/CtrlXl.cs

@@ -57,20 +57,19 @@ namespace XdCxRhDW.App.UserControl
 
         private async void btnImp_Click(object sender, EventArgs e)
         {
+            //https://www.space-track.org/documentation#tle网站上有星历文件格式说明
+            string line = null;
             try
             {
                 this.Enabled = false;
                 await Task.Run(async () =>
                 {
-                    var lines = File.ReadAllLines(btnOpen.Text);
+                    var lines = File.ReadAllLines(btnOpen.Text).ToList();
+                    lines.RemoveAll(p => string.IsNullOrWhiteSpace(p));
                     List<XlInfo> tmp = new List<XlInfo>();
-                    for (int i = 0; i < lines.Length; i += 3)
+                    for (int i = 0; i < lines.Count; i += 3)
                     {
-                        if (string.IsNullOrWhiteSpace(lines[i]))
-                        {
-                            i -= 2;
-                            continue;
-                        }
+                        line = lines[i];
                         var satName = lines[i].Trim();
                         if (satName.StartsWith("0 "))
                             satName = satName.Substring(2).Trim();
@@ -83,7 +82,7 @@ namespace XdCxRhDW.App.UserControl
                             Line2 = lines[i + 2],
                             SatCode = Convert.ToInt32(lines[i + 1].Substring(2, 5))
                         };
-                        var timeStr = lines[i + 1].Substring(18, 14);
+                        var timeStr = lines[i + 1].Substring(18, 14).Replace(" ","");//https://www.space-track.org/documentation#tle星历接口中说这里面可以接受空格
                         var yearStr = timeStr.Substring(0, 2);
                         var dayStr = timeStr.Substring(2, timeStr.Length - 2);
                         var day = Convert.ToDouble(dayStr);
@@ -110,12 +109,14 @@ namespace XdCxRhDW.App.UserControl
                         await db.SaveChangesAsync();
                     }
                     await LoadData();
-
+                   
                 });
+                Serilog.Log.Information("星历导入成功");
+                DxHelper.MsgBoxHelper.ShowInfo("星历导入成功");
             }
             catch (Exception ex)
             {
-                Serilog.Log.Error(ex,"星历导入异常");
+                Serilog.Log.Error(ex, $"{line}星历导入异常");
                 DxHelper.MsgBoxHelper.ShowError("星历导入异常");
             }
             finally

+ 180 - 0
XdCxRhDW.App/WebAPI/Controllers/BaseController.cs

@@ -0,0 +1,180 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web;
+using System.Web.Http;
+
+namespace XdCxRhDW.App.WebAPI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    [RoutePrefix("")]
+    public class BaseController : ApiController
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="url"></param>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        public static string PostRequest(string url, HttpContent data)
+        {
+            try
+            {
+                var handler = new HttpClientHandler() { UseCookies = false };
+                HttpClient client = new HttpClient(handler);
+                client.Timeout = TimeSpan.FromSeconds(10);
+                var message = new HttpRequestMessage(HttpMethod.Post, url);
+                message.Content = data;
+                var response = client.SendAsync(message).Result;
+                response.EnsureSuccessStatusCode();
+                var result = response.Content.ReadAsStringAsync().Result;
+                return result;
+            }
+            catch (Exception ex)
+            {
+                throw ex;
+            }
+        }
+
+        /// <summary>
+        /// Http返回结果
+        /// </summary>
+        public class AjaxResult<T>
+        {
+            /// <summary>
+            /// 返回数据
+            /// </summary>
+            public T data { get; set; }
+            /// <summary>
+            /// 返回消息
+            /// </summary>
+            public string msg { get; set; } = "ok";
+            /// <summary>
+            /// 0正确 -1错误
+            /// </summary>
+            public int code { get; set; } = 200;
+
+        }
+        /// <summary>
+        /// Http返回结果
+        /// </summary>
+        public class AjaxResult
+        {
+            /// <summary>
+            /// 返回数据
+            /// </summary>
+            public object data { get; set; }
+            /// <summary>
+            /// 返回消息
+            /// </summary>
+            public string msg { get; set; } = "ok";
+            /// <summary>
+            /// 0正确 -1错误
+            /// </summary>
+            public int code { get; set; } = 200;
+
+        }
+        /// <summary>
+        /// 返回成功
+        /// </summary>
+        /// <param name="data">返回的数据</param>
+        /// <returns></returns>
+        protected AjaxResult Success(object data = null)
+        {
+            AjaxResult res = new AjaxResult
+            {
+                code = 200,
+                msg = "请求成功!",
+                data = data
+            };
+            return res;
+        }
+
+        /// <summary>
+        /// 返回成功
+        /// </summary>
+        /// <param name="msg">返回的消息</param>
+        /// <param name="data">返回的数据</param>
+        /// <returns></returns>
+        protected AjaxResult Success(string msg, object data)
+        {
+            AjaxResult res = new AjaxResult
+            {
+                code = 200,
+                msg = msg,
+                data = data
+            };
+            return res;
+        }
+
+        /// <summary>
+        /// 返回错误
+        /// </summary>
+        /// <param name="msg">错误提示</param>
+        /// <returns></returns>
+        protected AjaxResult Error(string msg)
+        {
+            AjaxResult res = new AjaxResult
+            {
+                code = 0,
+                msg = msg,
+                data = null
+            };
+            return res;
+        }
+        /// <summary>
+        /// 返回错误
+        /// </summary>
+        /// <param name="msg">错误提示</param>
+        /// <returns></returns>
+        protected AjaxResult<T> Error<T>(string msg)
+        {
+            AjaxResult<T> res = new AjaxResult<T>
+            {
+                code = 0,
+                msg = msg,
+                data = default
+            };
+            return res;
+        }
+
+        #region WebAPI 获取传统Context
+        /// <summary>
+        /// Context
+        /// </summary>
+        public HttpContextBase Context
+        {
+            get
+            {
+                return (HttpContextBase)Request.Properties["MS_HttpContext"];
+            }
+        }
+        /// <summary>
+        /// Request
+        /// </summary>
+        public HttpRequestBase HttpRequest
+        {
+            get
+            {
+                return Context.Request;
+            }
+        }
+        /// <summary>
+        /// Response
+        /// </summary>
+        public HttpResponseBase HttpResponse
+        {
+            get
+            {
+                return Context.Response;
+            }
+        }
+        #endregion
+    }
+}

+ 126 - 0
XdCxRhDW.App/WebAPI/Controllers/PosController.cs

@@ -0,0 +1,126 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Entity;
+using System.Data.SqlClient;
+using System.Data.SQLite;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+using PosResAnalysis;
+using Serilog;
+using XdCxRhDw.Dto;
+using XdCxRhDW.App.Api;
+using XdCxRhDW.App.EFContext;
+using XdCxRhDW.App.Model;
+using XdCxRhDW.App.WebAPI.DTO;
+using XdCxRhDW.Dto;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;
+using static XdCxRhDw.CpuCgTools.FormCpuCg;
+
+namespace XdCxRhDW.App.WebAPI
+{
+    /// <summary>
+    /// 定位功能相关接口
+    /// </summary>
+    public class PosController : BaseController
+    {
+        /// <summary>
+        /// 执行两星一地定位
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<AjaxResult> PosX2D1Async(X2D1PosDto dto)
+        {
+            using (RHDWContext db = new RHDWContext())
+            {
+                var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync();
+                if (runTask == null)
+                {
+                    Serilog.Log.Warning($"接收到两星一地定位参数,由于任务没有运行中忽略本次定位!");
+                    return Error($"多模式融合定位平台没有启动两星一地定位任务");
+                }
+                var listTx = await db.TxInfos.ToListAsync();
+                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
+                var parameter2 = new SQLiteParameter("@satcode", dto.MainSatID);
+                var parameter3 = new SQLiteParameter("@satcode", dto.AdjaSatID);
+                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
+                if (xlInfo1 == null)
+                {
+                    Serilog.Log.Error($"未找到卫星[{dto.MainSatID}]的双行根数星历");
+                    return Error($"未找到卫星[{dto.MainSatID}]的双行根数星历");
+                }
+
+                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
+                if (xlInfo2 == null)
+                {
+                    Serilog.Log.Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历");
+                    return Error($"未找到卫星[{dto.AdjaSatID}]的双行根数星历");
+                }
+                Serilog.Log.Information($"卫星{dto.MainSatID}使用{xlInfo1.TwoLine}进行星历推算");
+                Serilog.Log.Information($"卫星{dto.AdjaSatID}使用{xlInfo2.TwoLine}进行星历推算");
+                var ephMain = EphHelper.Calc(xlInfo1.TwoLine, dto.SigTime);
+                var ephAdja = EphHelper.Calc(xlInfo2.TwoLine, dto.SigTime);
+                var cgRes = db.CgRes.Add(new Model.CgRes()
+                {
+                    SigTime = dto.SigTime,
+                    DtoSx = dto.SxDto,
+                    DfoSx = dto.SxDfo,
+                    SnrSx = dto.SxSnr,
+                    DtoCdb = dto.XdDto,
+                    DfoCdb = dto.XdDfo,
+                    SnrCdb = dto.XdSnr,
+                    YbMain = dto.MainYbDto,
+                    YbAdja = dto.AdjaYbDto,
+                    MainX = ephMain.X,
+                    MainY = ephMain.Y,
+                    MainZ = ephMain.Z,
+                    AdjaX = ephAdja.X,
+                    AdjaY = ephAdja.Y,
+                    AdjaZ = ephAdja.Z,
+                });
+                var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
+                var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb);
+                var cxTx = listTx.Find(p => p.TxType == EnumTxType.Cx);
+                var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
+                double[] mainSat = new double[3] { ephMain.X, ephMain.Y, ephMain.Z };
+                double[] adjaSat = new double[3] { ephAdja.X, ephAdja.Y, ephAdja.Z };
+                double[] satStation = new double[3] { satTx.Lon, satTx.Lat, 0 };
+                double[] cdbStation = new double[3] { cdbTx.Lon, cdbTx.Lat, 0 };
+                double[] refStation = new double[3] { refTx.Lon, refTx.Lat, 0 };
+                double[] zone = new double[] { -85, 85, -180, 180 }; //定位区域
+                double[] res = new double[6];
+                PosApi.X2D1_POS_Core(mainSat, adjaSat, cdbStation, satStation, satStation, satStation, satStation, satStation, refStation, zone, dto.SxDto / 1e6, dto.XdDto / 1e6, dto.MainYbDto / 1e6, dto.AdjaYbDto / 1e6, res);
+                PosRes posRes = new PosRes()
+                {
+                    SigTime = dto.SigTime,
+                    TaskID = runTask.ID,
+                    CgResID = cgRes.ID,
+                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
+                    TsName = dto.TsName,
+                    PosLon = res[0],
+                    PosLat = res[1],
+                    MirrLon = res[3],
+                    MirrLat = res[4],
+                };
+                db.PosRes.Add(posRes);
+                await db.SaveChangesAsync();
+            }
+            return Success();
+        }
+
+        /// <summary>
+        /// 查询定位结果(暂未实现)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        [HttpGet]
+        public async Task<AjaxResult<PosResDto>> GetPosRes(PosResQueryDto dto)
+        {
+            await Task.Delay(100);
+            return Error<PosResDto>("该功能暂未实现!");
+        }
+
+    }
+}

+ 0 - 26
XdCxRhDW.App/WebAPI/Controllers/X2D1CgController.cs

@@ -1,26 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Web.Http;
-using XdCxRhDW.App.WebAPI.DTO;
-
-namespace XdCxRhDW.App.WebAPI
-{
-    public class X2D1CgController : ApiController
-    {
-        [HttpGet]
-        public Test Get()
-        {
-            return new Test() { Msg = "http get接口测试成功" };
-           // return "Hi!, Self-Hosted Web Api Application Get";
-        }
-
-
-        public string Get(int id)
-        {
-            return $"Hi!, Self-Hosted Web Api Application Get With Id:{id} ";
-        }
-    }
-}

+ 1 - 2
XdCxRhDW.App/WebAPI/DTO/test.cs

@@ -6,8 +6,7 @@ using System.Threading.Tasks;
 
 namespace XdCxRhDW.App.WebAPI.DTO
 {
-    public class Test
+    class Test
     {
-        public string Msg { get; set; }
     }
 }

+ 0 - 53
XdCxRhDW.App/WebAPI/RestApiServer.cs

@@ -1,53 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Web.Http.SelfHost;
-
-namespace XdCxRhDW.App.WebAPI
-{
-    public class RestApiServer
-    {
-        public const int PORT = 8091;
-
-        private static HttpSelfHostServer _server;
-        public static void StartUp()
-        {
-            string host = string.Empty;
-
-            host ="127.0.0.1";
-            try
-            {
-                if (_server != null)
-                {
-                    _server.CloseAsync().Wait();
-                    _server.Dispose();
-                    _server = null;
-                }
-
-                string baseAddress = $"http://{host}:{PORT}";
-                var config = new HttpSelfHostConfiguration(baseAddress);
-                Console.WriteLine();
-                Routes.ConfigureRoutes(config);
-                Console.WriteLine("Instantiating The Server...");
-                _server = new HttpSelfHostServer(config);
-                _server.OpenAsync().Wait();
-                Console.WriteLine("Server is Running Now and listen : " + baseAddress);
-            }
-            catch (Exception e)
-            {
-                throw e;
-            }
-        }
-
-        public static void ShutDown()
-        {
-            if (_server != null)
-            {
-                _server.CloseAsync();
-                _server.Dispose();
-            }
-        }
-    }
-}

+ 0 - 23
XdCxRhDW.App/WebAPI/Routes.cs

@@ -1,23 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Text;
-using System.Threading.Tasks;
-using System.Web.Http.Routing;
-using System.Web.Http.SelfHost;
-using System.Web.Http;
-
-namespace XdCxRhDW.App.WebAPI
-{
-    public class Routes
-    {
-        public static void ConfigureRoutes(HttpSelfHostConfiguration config)
-        {
-            config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
-            config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");
-            config.Routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
-            config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
-        }
-    }
-}

+ 186 - 0
XdCxRhDW.App/WebAPI/Startup.cs

@@ -0,0 +1,186 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Net.Http;
+using System.Text;
+using System.Web.Http;
+using System.Web.Http.Filters;
+using System.Web.Http.Routing;
+using System.Xml;
+using Microsoft.Owin;
+using Microsoft.Owin.Cors;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+using Owin;
+using Swashbuckle.Application;
+using Swashbuckle.Swagger;
+using XdCxRhDW.App.WebAPI;
+
+[assembly: OwinStartup(typeof(XdCxRhDW.App.WebAPI.Startup))]
+
+namespace XdCxRhDW.App.WebAPI
+{
+    class Startup
+    {
+        public void Configuration(IAppBuilder app)
+        {
+            HttpConfiguration config = new HttpConfiguration();
+
+            JsonSerializerSettings setting = new JsonSerializerSettings()
+            {
+                //日期类型默认格式化处理
+                DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
+                DateFormatString = "yyyy-MM-dd HH:mm:ss",
+                //驼峰样式
+                ContractResolver = new CamelCasePropertyNamesContractResolver(),
+                //空值处理
+                //NullValueHandling = NullValueHandling.Ignore,
+                //设置序列化的最大层数
+                MaxDepth = 10,
+                //解决json序列化时的循环引用问题
+                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
+            };
+            config.Formatters.JsonFormatter.SerializerSettings = setting;
+            config.Formatters.Remove(config.Formatters.XmlFormatter);
+
+            config.Filters.Add(new HandlerErrorAttribute());
+
+            //config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
+            config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");
+            //config.Routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
+            //config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
+            ConfigureSwagger(config);
+            //添加路由路径
+            config.MapHttpAttributeRoutes();
+            app.UseCors(CorsOptions.AllowAll);
+
+            //app.Use<LoggingMiddleware>();
+            app.UseWebApi(config);
+
+        }
+        private static void ConfigureSwagger(HttpConfiguration config)
+        {
+            var thisAssembly = typeof(Startup).Assembly;
+            config.EnableSwagger(c =>
+             {
+                 c.SingleApiVersion("v1", "多模式融合定位平台Http接口");
+
+                 //设置接口描述xml路径地址
+                 var webApiXmlPath1 = $"{AppDomain.CurrentDomain.BaseDirectory}{Path.GetFileNameWithoutExtension(System.AppDomain.CurrentDomain.FriendlyName)}.xml";
+                 c.IncludeXmlComments(webApiXmlPath1);
+                 var webApiXmlPath2 = $"{AppDomain.CurrentDomain.BaseDirectory}XdCxRhDw.Dto.xml";
+                 c.IncludeXmlComments(webApiXmlPath2);
+                 c.UseFullTypeNameInSchemaIds();
+                 //加入控制器描述
+                 c.CustomProvider((defaultProvider) => new SwaggerControllerDescProvider(defaultProvider, webApiXmlPath1));
+             })
+             .EnableSwaggerUi(c =>
+             {
+                 c.InjectJavaScript(thisAssembly, "XdCxRhDW.App.WebAPI.Swagger.js");
+                 c.DocumentTitle("");
+             });
+        }
+
+        public class HandlerErrorAttribute : ExceptionFilterAttribute
+        {
+            /// <summary>
+            /// 控制器方法中出现异常,会调用该方法捕获异常
+            /// </summary>
+            /// <param name="context">提供使用</param>
+            public override void OnException(HttpActionExecutedContext context)
+            {
+                base.OnException(context);
+                Serilog.Log.Error(context.Exception, context.Exception.Message);
+                //LogFile.WriteError(context.Exception.Message);
+                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.OK)
+                {
+                    Content = new StringContent(
+                   JsonConvert.SerializeObject(
+                    new
+                    {
+                        code = -1,
+                        data = "",
+                        msg = context.Exception.Message
+                    }), Encoding.UTF8, "text/json")
+                });
+            }
+        };
+
+        public class SwaggerControllerDescProvider : ISwaggerProvider
+        {
+            private readonly ISwaggerProvider _swaggerProvider;
+            private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
+            private readonly string _xml;
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="swaggerProvider"></param>
+            /// <param name="xml">xml文档路径</param>
+            public SwaggerControllerDescProvider(ISwaggerProvider swaggerProvider, string xml)
+            {
+                _swaggerProvider = swaggerProvider;
+                _xml = xml;
+            }
+
+            public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
+            {
+
+                var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
+                SwaggerDocument srcDoc = null;
+                //只读取一次
+                if (!_cache.TryGetValue(cacheKey, out srcDoc))
+                {
+                    srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
+
+                    srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } };
+                    _cache.TryAdd(cacheKey, srcDoc);
+                }
+                return srcDoc;
+            }
+
+            /// <summary>
+            /// 从API文档中读取控制器描述
+            /// </summary>
+            /// <returns>所有控制器描述</returns>
+            public ConcurrentDictionary<string, string> GetControllerDesc()
+            {
+                string xmlpath = _xml;
+                ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
+                if (File.Exists(xmlpath))
+                {
+                    XmlDocument xmldoc = new XmlDocument();
+                    xmldoc.Load(xmlpath);
+                    string type = string.Empty, path = string.Empty, controllerName = string.Empty;
+
+                    string[] arrPath;
+                    int length = -1, cCount = "Controller".Length;
+                    XmlNode summaryNode = null;
+                    foreach (XmlNode node in xmldoc.SelectNodes("//member"))
+                    {
+                        type = node.Attributes["name"].Value;
+                        if (type.StartsWith("T:"))
+                        {
+                            //控制器
+                            arrPath = type.Split('.');
+                            length = arrPath.Length;
+                            controllerName = arrPath[length - 1];
+                            if (controllerName.EndsWith("Controller"))
+                            {
+                                //获取控制器注释
+                                summaryNode = node.SelectSingleNode("summary");
+                                string key = controllerName.Remove(controllerName.Length - cCount, cCount);
+                                if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
+                                {
+                                    controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
+                                }
+                            }
+                        }
+                    }
+                }
+                return controllerDescDict;
+            }
+        }
+    }
+}

+ 124 - 0
XdCxRhDW.App/WebAPI/Swagger.js

@@ -0,0 +1,124 @@
+'use strict';
+
+/**
+ * Translator for documentation pages.
+ */
+window.SwaggerTranslator = {
+    _words: [],
+
+    translate: function () {
+        var $this = this;
+        $('[data-sw-translate]').each(function () {
+            $(this).html($this._tryTranslate($(this).html()));
+            $(this).val($this._tryTranslate($(this).val()));
+            $(this).attr('title', $this._tryTranslate($(this).attr('title')));
+        });
+    },
+    setControllerSummary: function () {
+        $.ajax({
+            type: "get",
+            async: true,
+            url: $("#input_baseUrl").val(),
+            dataType: "json",
+            success: function (data) {
+                var summaryDict = data.ControllerDesc;
+                var id, controllerName, strSummary;
+                $("#resources_container .resource").each(function (i, item) {
+                    id = $(item).attr("id");
+                    if (id) {
+                        controllerName = id.substring(9);
+                        strSummary = summaryDict[controllerName];
+                        if (strSummary) {
+                            $(item).children(".heading").children(".options").first().prepend('<li class="controller-summary" style="color: #10a54a;font-weight:bold" title="' + strSummary + '">' + strSummary + '</li>');
+                        }
+                    }
+                });
+            }
+        });
+    },
+    _tryTranslate: function (word) {
+        return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;
+    },
+
+    learn: function (wordsMap) {
+        this._words = wordsMap;
+    }
+};
+$("#validator").remove();
+
+/* jshint quotmark: double */
+window.SwaggerTranslator.learn({
+    "Warning: Deprecated": "警告:已过时",
+    "Implementation Notes": "实现备注",
+    "Response Class": "响应类",
+    "Status": "状态",
+    "Parameters": "参数",
+    "Parameter": "参数",
+    "Value": "值",
+    "Description": "描述",
+    "Parameter Type": "参数类型",
+    "Data Type": "数据类型",
+    "Response Messages": "响应消息",
+    "HTTP Status Code": "HTTP状态码",
+    "Reason": "原因",
+    "Response Model": "响应模型",
+    "Request URL": "请求URL",
+    "Response Body": "响应体",
+    "Response Code": "响应码",
+    "Response Headers": "响应头",
+    "Hide Response": "隐藏响应",
+    "Headers": "头",
+    "Try it out!": "试一下!",
+    "Show/Hide": "显示/隐藏",
+    "List Operations": "显示操作",
+    "Expand Operations": "展开操作",
+    "Raw": "原始",
+    "can't parse JSON.  Raw result": "无法解析JSON. 原始结果",
+    "Model Schema": "模型架构",
+    "Model": "模型",
+    "apply": "应用",
+    "Username": "用户名",
+    "Password": "密码",
+    "Terms of service": "服务条款",
+    "Created by": "创建者",
+    "See more at": "查看更多:",
+    "Contact the developer": "联系开发者",
+    "api version": "api版本",
+    "Response Content Type": "响应Content Type",
+    "fetching resource": "正在获取资源",
+    "fetching resource list": "正在获取资源列表",
+    "Explore": "浏览",
+    "Show Swagger Petstore Example Apis": "显示 Swagger Petstore 示例 Apis",
+    "Can't read from server.  It may not have the appropriate access-control-origin settings.": "无法从服务器读取。可能没有正确设置access-control-origin。",
+    "Please specify the protocol for": "请指定协议:",
+    "Can't read swagger JSON from": "无法读取swagger JSON于",
+    "Finished Loading Resource Information. Rendering Swagger UI": "已加载资源信息。正在渲染Swagger UI",
+    "Unable to read api": "无法读取api",
+    "from path": "从路径",
+    "server returned": "服务器返回"
+});
+
+
+$(function () {
+    window.SwaggerTranslator.translate();
+    window.SwaggerTranslator.setControllerSummary();
+    // document.title = "API描述文档";
+    $('body').append('<style type="text/css">.controller-summary{color:#10a54a !important;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px;text-align:right;cursor:default;} </style>');
+    $("#logo").html("接口描述").attr("href", "");
+/*    $(".info_title").html("WEBAPI文档");*/
+
+});
+
+(function () {
+    $(function () {
+        $('#input_apiKey').show();
+        var x_url = top.location.href.substring(0, top.location.href.indexOf('/swagger'));
+
+        $('#input_apiKey').on('change', function () {
+            var key = this.value;
+            if (key && key.trim() !== '') {
+                swaggerUi.api.clientAuthorizations.add("key", new SwaggerClient.ApiKeyAuthorization("Authorization", 'Bearer ' + key, "header"));
+            }
+        });
+    });
+})();

+ 49 - 5
XdCxRhDW.App/XdCxRhDW.App.csproj

@@ -28,6 +28,7 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <Prefer32Bit>false</Prefer32Bit>
+    <DocumentationFile>bin\Debug\多模式融合定位平台.xml</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -76,6 +77,21 @@
       <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="Microsoft.Owin, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Owin.4.2.2\lib\net45\Microsoft.Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin.Cors, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Owin.Cors.4.2.2\lib\net45\Microsoft.Owin.Cors.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin.Host.HttpListener, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Owin.Host.HttpListener.4.2.2\lib\net45\Microsoft.Owin.Host.HttpListener.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin.Hosting, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Owin.Hosting.4.2.2\lib\net45\Microsoft.Owin.Hosting.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
+    </Reference>
     <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
       <Private>True</Private>
@@ -83,6 +99,9 @@
     <Reference Include="Newtonsoft.Json.Bson, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.Bson.1.0.2\lib\net45\Newtonsoft.Json.Bson.dll</HintPath>
     </Reference>
+    <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
+      <HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
+    </Reference>
     <Reference Include="PresentationCore" />
     <Reference Include="PresentationFramework" />
     <Reference Include="Serilog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
@@ -101,6 +120,9 @@
       <HintPath>..\packages\SQLite.CodeFirst.1.7.0.34\lib\net45\SQLite.CodeFirst.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="Swashbuckle.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd1bb07a5ac7c7bc, processorArchitecture=MSIL">
+      <HintPath>..\packages\Swashbuckle.Core.5.6.0\lib\net40\Swashbuckle.Core.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
@@ -143,12 +165,22 @@
       <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
     </Reference>
     <Reference Include="System.Transactions" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.Cors">
+      <HintPath>..\packages\Microsoft.AspNet.Cors.5.3.0\lib\net45\System.Web.Cors.dll</HintPath>
+    </Reference>
     <Reference Include="System.Web.Http, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.AspNet.WebApi.Core.5.3.0\lib\net45\System.Web.Http.dll</HintPath>
     </Reference>
+    <Reference Include="System.Web.Http.Owin, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.AspNet.WebApi.Owin.5.3.0\lib\net45\System.Web.Http.Owin.dll</HintPath>
+    </Reference>
     <Reference Include="System.Web.Http.SelfHost, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.AspNet.WebApi.SelfHost.5.3.0\lib\net45\System.Web.Http.SelfHost.dll</HintPath>
     </Reference>
+    <Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
+    </Reference>
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
@@ -157,8 +189,12 @@
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
+    <Reference Include="WebActivatorEx, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4, processorArchitecture=MSIL">
+      <HintPath>..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Api\EphHelper.cs" />
     <Compile Include="Basic\BaseVm.cs" />
     <Compile Include="Basic\BindingData.cs" />
     <Compile Include="Basic\ColorHelper.cs" />
@@ -285,10 +321,10 @@
     <Compile Include="UserControl\CtrlXl.Designer.cs">
       <DependentUpon>CtrlXl.cs</DependentUpon>
     </Compile>
-    <Compile Include="WebAPI\Controllers\X2D1CgController.cs" />
+    <Compile Include="WebAPI\Controllers\BaseController.cs" />
+    <Compile Include="WebAPI\Controllers\PosController.cs" />
     <Compile Include="WebAPI\DTO\Test.cs" />
-    <Compile Include="WebAPI\Routes.cs" />
-    <Compile Include="WebAPI\RestApiServer.cs" />
+    <Compile Include="WebAPI\Startup.cs" />
     <EmbeddedResource Include="CorTools\CorToolForm.resx">
       <DependentUpon>CorToolForm.cs</DependentUpon>
     </EmbeddedResource>
@@ -376,6 +412,13 @@
     </None>
   </ItemGroup>
   <ItemGroup>
+    <None Include="星历推算\readme.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="星历推算\Tle2XYZ.exe">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <EmbeddedResource Include="WebAPI\Swagger.js" />
     <Content Include="xcorr\dmc.exe">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
@@ -388,10 +431,11 @@
   <Import Project="packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
   <Import Project="packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
   <PropertyGroup>
-    <PostBuildEvent>del *.xml
+    <PostBuildEvent>del DevExpress*.xml,EntityFramework*.xml,Serilog*.xml,Newtonsoft*.xml
+del System*.xml,Microsoft*.xml
 copy $(SolutionDir)tips.txt tips.txt
 copy $(SolutionDir)geo.txt geo.txt
-copy $(SolutionDir)DataBase.db DataBase.db
+
 
 if not exist "AddIns" md AddIns
 move /Y *.dll AddIns

+ 13 - 0
XdCxRhDW.App/packages.config

@@ -1,11 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="EntityFramework" version="6.4.4" targetFramework="net472" />
+  <package id="Microsoft.AspNet.Cors" version="5.3.0" targetFramework="net472" />
   <package id="Microsoft.AspNet.WebApi.Client" version="6.0.0" targetFramework="net472" />
   <package id="Microsoft.AspNet.WebApi.Core" version="5.3.0" targetFramework="net472" />
+  <package id="Microsoft.AspNet.WebApi.Owin" version="5.3.0" targetFramework="net472" />
+  <package id="Microsoft.AspNet.WebApi.OwinSelfHost" version="5.3.0" targetFramework="net472" />
   <package id="Microsoft.AspNet.WebApi.SelfHost" version="5.3.0" targetFramework="net472" />
+  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.3.0" targetFramework="net472" />
+  <package id="Microsoft.Owin" version="4.2.2" targetFramework="net472" />
+  <package id="Microsoft.Owin.Cors" version="4.2.2" targetFramework="net472" />
+  <package id="Microsoft.Owin.Host.HttpListener" version="4.2.2" targetFramework="net472" />
+  <package id="Microsoft.Owin.Hosting" version="4.2.2" targetFramework="net472" />
+  <package id="Microsoft.Web.Infrastructure" version="2.0.0" targetFramework="net472" />
   <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net472" />
   <package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net472" />
+  <package id="Owin" version="1.0" targetFramework="net472" />
   <package id="Serilog" version="3.1.1" targetFramework="net472" />
   <package id="Serilog.Sinks.Async" version="1.5.0" targetFramework="net472" />
   <package id="Serilog.Sinks.Console" version="5.0.1" targetFramework="net472" />
@@ -13,6 +23,8 @@
   <package id="SQLite" version="3.13.0" targetFramework="net472" />
   <package id="SQLite.CodeFirst" version="1.7.0.34" targetFramework="net472" />
   <package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.118.0" targetFramework="net472" />
+  <package id="Swashbuckle" version="5.6.0" targetFramework="net472" />
+  <package id="Swashbuckle.Core" version="5.6.0" targetFramework="net472" />
   <package id="System.Buffers" version="4.5.1" targetFramework="net472" />
   <package id="System.Data.SQLite" version="1.0.118.0" targetFramework="net472" />
   <package id="System.Data.SQLite.Core" version="1.0.118.0" targetFramework="net472" />
@@ -23,4 +35,5 @@
   <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
   <package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
   <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
+  <package id="WebActivatorEx" version="2.2.0" targetFramework="net472" />
 </packages>

二进制
XdCxRhDW.App/星历推算/Tle2XYZ.exe


+ 8 - 0
XdCxRhDW.App/星历推算/readme.txt

@@ -0,0 +1,8 @@
+Tle2XYZ输入及输出的时间戳都是UTC时间戳
+-t 时间  相对于1970-1-1 8时的秒数
+-a "line1" -b "line2" -t 1672718400
+-p 周期
+-c 次数
+
+
+-a "1 23467U 95003A   22364.32362671 -.00000025  00000+0  00000+0 0  9992" -b "2 23467   9.8007  17.1777 0001795 205.8937 164.3833  1.00270390102276" -t 1672718400 -p 1 -c 1

+ 40 - 0
XdCxRhDw.Dto/PosResDto.cs

@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDw.Dto
+{
+    /// <summary>
+    /// 定位结果DTO
+    /// </summary>
+    public class PosResDto
+    {
+        /// <summary>
+        /// 信号时刻
+        /// </summary>
+        public DateTime SigTime { get; set; }
+
+        /// <summary>
+        /// 目标位置经度
+        /// </summary>
+        public double Lon { get; set; }
+
+        /// <summary>
+        /// 目标位置纬度
+        /// </summary>
+        public double Lat { get; set; }
+
+        /// <summary>
+        /// 镜像点经度
+        /// </summary>
+        public double? MirrLon { get; set; }
+
+        /// <summary>
+        /// 镜像点纬度
+        /// </summary>
+        public double? MirrLat { get; set; }
+
+    }
+}

+ 24 - 0
XdCxRhDw.Dto/PosResQueryDto.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDw.Dto
+{
+    /// <summary>
+    /// 定位结果查询参数DTO
+    /// </summary>
+    public class PosResQueryDto
+    {
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime BeginTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
+    }
+}

+ 3 - 0
XdCxRhDw.Dto/SendDto.cs

@@ -6,6 +6,9 @@ using System.Threading.Tasks;
 
 namespace XdCxRhDW.Dto
 {
+    /// <summary>
+    /// 定位参数模型
+    /// </summary>
     public class SendDto
     {
         /// <summary>

+ 82 - 0
XdCxRhDw.Dto/X2D1PosDto.cs

@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDw.Dto
+{
+    /// <summary>
+    /// 两星一地定位参数DTO
+    /// </summary>
+    public class X2D1PosDto
+    {
+        /// <summary>
+        /// 主星编号
+        /// </summary>
+        public int MainSatID { get; set; }
+
+        /// <summary>
+        /// 邻星编号
+        /// </summary>
+        public int AdjaSatID { get; set; }
+
+        /// <summary>
+        /// 信号时刻(北京时间)
+        /// </summary>
+        public DateTime SigTime { get; set; }
+
+        /// <summary>
+        /// 目标双星时差(us)
+        /// </summary>
+        public double SxDto { get; set; }
+
+        /// <summary>
+        /// 目标双星频差(Hz)
+        /// </summary>
+        public double SxDfo { get; set; }
+
+        /// <summary>
+        /// 目标双星信噪比(dB)
+        /// </summary>
+        public double SxSnr { get; set; }
+
+        /// <summary>
+        /// 目标星地时差(us)
+        /// </summary>
+        public double XdDto { get; set; }
+
+
+        /// <summary>
+        /// 目标星地频差(Hz)
+        /// </summary>
+        public double XdDfo { get; set; }
+
+        /// <summary>
+        /// 目标星地信噪比(dB)
+        /// </summary>
+        public double XdSnr { get; set; }
+
+
+        /// <summary>
+        /// 参考样本主时差(us)
+        /// </summary>
+        public double MainYbDto { get; set; }
+
+        /// <summary>
+        /// 参考样本邻时差(us)
+        /// </summary>
+        public double AdjaYbDto { get; set; }
+
+
+        /// <summary>
+        /// 目标名称(可空)
+        /// </summary>
+        public string TarName { get; set; }
+
+        /// <summary>
+        /// 时隙名称(可空)
+        /// </summary>
+        public string TsName { get; set; }
+    }
+}

+ 4 - 0
XdCxRhDw.Dto/XdCxRhDw.Dto.csproj

@@ -24,6 +24,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Debug\XdCxRhDw.Dto.xml</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -45,8 +46,11 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="PosResQueryDto.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="SendDto.cs" />
+    <Compile Include="PosResDto.cs" />
+    <Compile Include="X2D1PosDto.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>