li.shaoyi před 2 roky
rodič
revize
94abb110a3

+ 1 - 1
public/config/appconfig.json

@@ -1,5 +1,5 @@
 {
   "version": "1.0.0",
   "versionCode": "100000",
-  "apiUrl": "http://192.168.31.158:18240/cfg?key=dev_104"
+  "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204"
 }

+ 1 - 1
src/hooks/echarts/candlestick/dataset.ts

@@ -37,7 +37,7 @@ export function useDataset() {
     }
 
     // 处理行情数据
-    const handleData = (rawData: Model.QueryHistoryDatasRsp[], onReady?: () => void) => {
+    const handleData = (rawData: Model.HistoryDatasRsp[], onReady?: () => void) => {
         for (let i = 0; i < rawData.length; i++) {
             const { o, c, h, l, ts: date, f, tv } = rawData[i];
             if (f) dataset.invalid.push(i); // 添加补充数据的索引位置

+ 1 - 1
src/hooks/echarts/timeline/dataset.ts

@@ -38,7 +38,7 @@ export function useDataset() {
     }
 
     // 处理行情数据
-    const handleData = (rawData: Model.QueryTSDataRsp, onReady?: () => void) => {
+    const handleData = (rawData: Model.TSDataRsp, onReady?: () => void) => {
         const { date, close, ma5 } = dataset.timeline.source;
         const { preSettle, decimalPlace, runSteps, historyDatas } = rawData;
 

+ 36 - 34
src/hooks/echarts/timeline/index.ts

@@ -1,24 +1,25 @@
-import { ref, computed, watch } from 'vue'
+import { ref, computed, watch, getCurrentInstance } from 'vue'
 //import { timerInterceptor } from '@/utils/timer'
 import { queryTSData } from '@/services/api/quote'
 import { useFuturesStore } from '@/stores'
 import { useDataset } from './dataset'
 import { useOptions } from './options'
-import moment from 'moment';
+import moment from 'moment'
 
 export function useTimelineChart(goodscode: string) {
+    const context = getCurrentInstance()
     const futuresStore = useFuturesStore()
-    const { dataset, handleData, clearData, calcIndicator } = useDataset();
-    const { options, initOptions, updateOptions } = useOptions(dataset);
+    const { dataset, handleData, clearData, calcIndicator } = useDataset()
+    const { options, initOptions, updateOptions } = useOptions(dataset)
 
-    const loading = ref(false);
-    const isEmpty = ref(false);
-    const dataIndex = ref(-1); // 当前数据索引值
-    const quote = futuresStore.getQuoteInfo(goodscode); // 实时行情
+    const loading = ref(false)
+    const isEmpty = ref(false)
+    const dataIndex = ref(-1) // 当前数据索引值
+    const quote = futuresStore.getQuoteInfo(goodscode) // 实时行情
 
     // 当前选中的数据项
     const selectedItem = computed(() => {
-        const { close, ma5 } = dataset.timeline.source;
+        const { close, ma5 } = dataset.timeline.source
         return {
             close: close[dataIndex.value] ?? '--',
             ma5: ma5[dataIndex.value] ?? '--'
@@ -29,10 +30,10 @@ export function useTimelineChart(goodscode: string) {
      * 初始化数据
      */
     const initData = () => {
-        clearData();
-        dataIndex.value = -1;
-        isEmpty.value = true;
-        loading.value = true;
+        clearData()
+        dataIndex.value = -1
+        isEmpty.value = true
+        loading.value = true
 
         // 获取历史行情
         queryTSData({
@@ -40,14 +41,15 @@ export function useTimelineChart(goodscode: string) {
                 goodsCode: goodscode
             }
         }).then((res) => {
-            const { historyDatas } = res.data;
+            const { historyDatas, startTime, endTime } = res.data
             if (historyDatas.length) {
-                dataIndex.value = historyDatas.length - 1;
-                isEmpty.value = false;
-                handleData(res.data);
+                dataIndex.value = historyDatas.length - 1
+                isEmpty.value = false
+                handleData(res.data)
             }
+            context?.emit('ready', startTime, endTime)
         }).finally(() => {
-            loading.value = false;
+            loading.value = false
         })
     }
 
@@ -56,34 +58,34 @@ export function useTimelineChart(goodscode: string) {
      */
     const updateChart = () => {
         if (quote.value) {
-            const { last, lasttime } = quote.value;
-            const { close, ma5 } = dataset.timeline.source;
-            const lastIndex = close.length - 1; // 历史数据最后索引位置
-            const cycleMilliseconds = 60 * 1000; // 一分钟毫秒数
+            const { last, lasttime } = quote.value
+            const { close, ma5 } = dataset.timeline.source
+            const lastIndex = close.length - 1 // 历史数据最后索引位置
+            const cycleMilliseconds = 60 * 1000 // 一分钟毫秒数
 
-            const oldTime = lastIndex === -1 ? moment(lasttime) : moment(dataset.rawDate[lastIndex]); // 历史行情最后时间
-            const diffTime = moment(lasttime).valueOf() - oldTime.valueOf(); // 计算时间差
+            const oldTime = lastIndex === -1 ? moment(lasttime) : moment(dataset.rawDate[lastIndex]) // 历史行情最后时间
+            const diffTime = moment(lasttime).valueOf() - oldTime.valueOf() // 计算时间差
 
             if (diffTime > cycleMilliseconds * 2) {
                 // 时间间隔超过两个周期,重新请求历史数据
-                //timerInterceptor.debounce(() => initData(), 1000, 'updateChart');
+                //timerInterceptor.debounce(() => initData(), 1000, 'updateChart')
             } else {
                 // 判断时间差是否大于周期时间
                 if (lastIndex === -1 || diffTime > cycleMilliseconds) {
-                    oldTime.add(cycleMilliseconds, 'ms');
-                    const lastDate = oldTime.format('YYYY-MM-DD HH:mm:ss');
+                    oldTime.add(cycleMilliseconds, 'ms')
+                    const lastDate = oldTime.format('YYYY-MM-DD HH:mm:ss')
 
                     // 新增分时数据
-                    dataset.rawDate.push(lastDate);
-                    close.push(last);
+                    dataset.rawDate.push(lastDate)
+                    close.push(last)
                     ma5.push('-')
                 } else {
-                    close[lastIndex] = last; // 更新最后一条记录的收盘价
+                    close[lastIndex] = last // 更新最后一条记录的收盘价
                 }
 
                 // 更新各种指标
-                calcIndicator(lastIndex === -1 ? 0 : lastIndex);
-                updateOptions();
+                calcIndicator(lastIndex === -1 ? 0 : lastIndex)
+                updateOptions()
             }
         }
     }
@@ -91,11 +93,11 @@ export function useTimelineChart(goodscode: string) {
     // 监听行情推送
     watch(() => quote.value?.last, () => {
         if (!loading.value && !isEmpty.value) {
-            updateChart();
+            updateChart()
         }
     })
 
-    initData();
+    initData()
 
     return {
         loading,

+ 0 - 6
src/packages/mobile/components/modules/echarts-timeline/index.vue

@@ -9,13 +9,7 @@
         <template v-else>
             <div class="app-echats-kline__container">
                 <ul class="legend">
-                    <li class="legend-item">开: {{ selectedItem.open }}</li>
-                    <li class="legend-item">收: {{ selectedItem.close }}</li>
-                    <li class="legend-item">高: {{ selectedItem.highest }}</li>
-                    <li class="legend-item">低: {{ selectedItem.lowest }}</li>
                     <li class="legend-item">MA5: {{ selectedItem.ma5 }}</li>
-                    <li class="legend-item">MA10: {{ selectedItem.ma10 }}</li>
-                    <li class="legend-item">MA15: {{ selectedItem.ma15 }}</li>
                 </ul>
                 <app-echarts :option="options.timeline" v-model:dataIndex="dataIndex" @ready="initOptions" />
             </div>

+ 1 - 5
src/packages/mobile/views/bank/statement/Index.vue

@@ -16,9 +16,6 @@
                     <span>{{ formatDate(value, 'YYYY-MM-DD') }}</span>
                     <span>{{ formatDate(value, 'HH:mm:ss') }}</span>
                 </template>
-                <template #businesscode="{ value }">
-                    {{ getAccountBusinessCodeName(value) }}
-                </template>
             </app-list>
         </app-pull-refresh>
     </app-view>
@@ -29,7 +26,6 @@ import { shallowRef } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
 import { useNavigation } from '@/hooks/navigation'
-import { getAccountBusinessCodeName } from '@/constants/bank'
 import { queryAmountLog } from '@/services/api/bank'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import AppList from '@mobile/components/base/list/index.vue'
@@ -40,7 +36,7 @@ const error = shallowRef(false)
 
 const columns: Model.TableColumn[] = [
     { prop: 'createtime', label: '时间' },
-    { prop: 'businesscode', label: '操作类型' },
+    { prop: 'operatetypename', label: '操作类型' },
     { prop: 'amount', label: '金额' },
 ]
 

+ 1 - 5
src/packages/mobile/views/bank/statement/history/Index.vue

@@ -10,9 +10,6 @@
                     <span>{{ formatDate(value, 'YYYY-MM-DD') }}</span>
                     <span>{{ formatDate(value, 'HH:mm:ss') }}</span>
                 </template>
-                <template #businesscode="{ value }">
-                    {{ getAccountBusinessCodeName(value) }}
-                </template>
             </app-list>
         </app-pull-refresh>
     </app-view>
@@ -22,7 +19,6 @@
 import { shallowRef } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
-import { getAccountBusinessCodeName } from '@/constants/bank'
 import { queryHisAmountLog } from '@/services/api/bank'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import AppList from '@mobile/components/base/list/index.vue'
@@ -32,7 +28,7 @@ const error = shallowRef(false)
 
 const columns: Model.TableColumn[] = [
     { prop: 'createtime', label: '时间' },
-    { prop: 'businesscode', label: '操作类型' },
+    { prop: 'operatetypename', label: '操作类型' },
     { prop: 'amount', label: '金额' },
 ]
 

+ 80 - 18
src/packages/mobile/views/market/detail/Index.vue

@@ -4,29 +4,30 @@
             <app-navbar title="商品详情" />
         </template>
         <div class="market-detail__quote" v-if="quote">
-            <ul>
-                <li>
-                    <span>{{ quote.last }}</span>
-                </li>
+            <ul class="price">
+                <li :class="quote.lastColor">{{ quote.last }}</li>
+                <li :class="quote.lastColor">{{ handleNumberValue(quote.rise.toFixed(quote.decimalplace)) }}</li>
+                <li :class="quote.lastColor">{{ parsePercent(quote.change) }}</li>
+            </ul>
+            <ul class="time">
+                <li>{{ formatDate(quote.lasttime, 'MM-DD HH:mm:ss') }}</li>
+            </ul>
+            <ul class="info">
                 <li>
                     <span>卖价</span>
-                    <span>{{ quote.ask }}</span>
+                    <span :class="quote.askColor">{{ quote.ask }}</span>
                 </li>
                 <li>
                     <span>开盘</span>
                     <span>{{ quote.opened }}</span>
                 </li>
                 <li>
-                    <span>{{ handleNumberValue(quote.rise.toFixed(quote.decimalplace)) }}</span>
-                    <span>{{ parsePercent(quote.change) }}</span>
-                </li>
-                <li>
                     <span>买价</span>
-                    <span>{{ quote.bid }}</span>
+                    <span :class="quote.bidColor">{{ quote.bid }}</span>
                 </li>
                 <li>
                     <span>均价</span>
-                    <span>{{ }}</span>
+                    <span>{{ quote.averageprice }}</span>
                 </li>
                 <li>
                     <span>昨结</span>
@@ -34,19 +35,19 @@
                 </li>
                 <li>
                     <span>最高</span>
-                    <span>{{ quote.highest }}</span>
+                    <span :class="quote.highestColor">{{ quote.highest }}</span>
                 </li>
                 <li>
                     <span>结算</span>
-                    <span>{{ }}</span>
+                    <span>{{ quote.settle }}</span>
                 </li>
                 <li>
                     <span>昨收</span>
-                    <span>{{ }}</span>
+                    <span>{{ quote.preclose }}</span>
                 </li>
                 <li>
                     <span>最低</span>
-                    <span>{{ quote.lowest }}</span>
+                    <span :class="quote.lowestColor">{{ quote.lowest }}</span>
                 </li>
             </ul>
         </div>
@@ -55,19 +56,28 @@
                 <Tab :title="item.label" :name="item.value" />
             </template>
         </Tabs>
-        <component :is="componentMap.get('echartsTimeline')" v-bind="{ goodscode }" v-if="active === ChartCycleType.Time" />
+        <component :is="componentMap.get('echartsTimeline')" v-bind="{ goodscode }" @ready="onReady"
+            v-if="active === ChartCycleType.Time" />
         <component :is="componentMap.get('echartsKline')" v-bind="{ goodscode, cycleType: active }" v-else />
+        <AppList :columns="columns" :data-list="dataList">
+            <template #TS="{ value }">
+                {{ formatDate(value, 'HH:mm') }}
+            </template>
+        </AppList>
     </app-view>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, onMounted, onUnmounted, defineAsyncComponent } from 'vue'
+import { ref, shallowRef, onMounted, onUnmounted, defineAsyncComponent, watch } from 'vue'
 import { Tab, Tabs } from 'vant'
-import { parsePercent, handleNumberValue } from '@/filters'
+import { parsePercent, handleNumberValue, formatDate } from '@/filters'
 import { getChartCycleTypeList, ChartCycleType } from '@/constants/chart'
 import { useNavigation } from '@/hooks/navigation'
+import { useRequest } from '@/hooks/request'
+import { queryHistoryTikDatas } from '@/services/api/market'
 import { useFuturesStore } from '@/stores'
 import quoteSocket from '@/services/websocket/quote'
+import AppList from '@mobile/components/base/list/index.vue'
 
 const componentMap = new Map<string, unknown>([
     ['echartsTimeline', defineAsyncComponent(() => import('@mobile/components/modules/echarts-timeline/index.vue'))],
@@ -81,6 +91,58 @@ const active = shallowRef(ChartCycleType.Time)
 
 const quote = futuresStore.getQuoteInfo(goodscode)
 const subscribe = quoteSocket.addSubscribe([goodscode])
+const dataList = ref<Model.HistoryTikDatasRsp[]>([])
+
+const { run } = useRequest(queryHistoryTikDatas, {
+    manual: true,
+    params: {
+        goodsCode: goodscode,
+        count: 20
+    },
+    onSuccess: (res) => {
+        dataList.value = res.data
+    }
+})
+
+const columns: Model.TableColumn[] = [
+    { prop: 'TS', label: '时间' },
+    { prop: 'PE', label: '最新价' },
+    { prop: 'Vol', label: '现量' },
+]
+
+const onReady = (startTime: string, endTime: string) => {
+    if (!dataList.value.length) {
+        run({
+            startTime: formatDate(startTime),
+            endTime: formatDate(endTime),
+        })
+    }
+}
+
+watch(() => quote.value?.last, () => {
+    if (quote.value) {
+        const list = dataList.value
+        if (list.length > 19) {
+            // 移除列表最后一条记录
+            list.pop()
+        }
+        // 向列表开头添加新纪录
+        list.unshift({
+            AV: 0,
+            Ask: 0,
+            BV: 0,
+            Bid: 0,
+            HI: 0,
+            HV: 0,
+            PE: quote.value.last,
+            TDR: 0,
+            TK: 0,
+            TS: quote.value.lasttime,
+            TT: 0,
+            Vol: quote.value.lastvolume,
+        })
+    }
+})
 
 onMounted(() => subscribe.start())
 

+ 32 - 2
src/packages/mobile/views/market/detail/index.less

@@ -1,14 +1,44 @@
 .market-detail {
+    background-color: #fff;
+
     &__quote {
-        ul {
+        padding: .2rem 0;
+
+        .price {
+            display: flex;
+            align-items: center;
+            padding: 0 .2rem;
+
+            li {
+                &:first-child {
+                    font-size: .44rem;
+                }
+
+                +li {
+                    margin-left: .2rem;
+                }
+            }
+        }
+
+        .time {
+            font-size: .24rem;
+            color: #999;
+            padding: 0 .2rem;
+            margin-top: .1rem;
+        }
+
+        .info {
             display: flex;
             flex-wrap: wrap;
+            margin-top: .2rem;
 
             li {
                 display: flex;
                 justify-content: space-between;
+                gap: .2rem;
                 width: ~"calc(100% / 3)";
-                padding: 0 .2rem;
+                font-size: .26rem;
+                padding: .04rem .2rem;
             }
         }
     }

+ 107 - 3
src/packages/mobile/views/news/detail/Index.vue

@@ -1,8 +1,112 @@
 <template>
-    <app-view>
-
+    <app-view class="news-details">
+        <template #header>
+            <app-navbar title="资讯详情">
+                <!-- <template #right>
+                    <div @click="sendShareMessage" v-if="plus.hasPlus()">
+                        <Icon name="share" size=".36rem" />
+                    </div>
+                    <div :data-clipboard-text="getNewsShareUrl(newsId)" v-copy="onCopy" v-else>
+                        <Icon name="share" size=".36rem" />
+                    </div>
+                </template> -->
+            </app-navbar>
+        </template>
+        <section class="news-details__container" v-if="data">
+            <h1>{{ data.title }}</h1>
+            <h4>
+                <span>来源:</span>
+                <img :src="getFileUrl(data.srclogo)" v-if="data.srclogo" />
+                <span @click="openUrl(data?.srcurl)" style="color:dodgerblue" v-if="data.srcname">{{ data.srcname }}</span>
+                <span>{{ formatDate(data.publishdate, 'YYYY-MM-DD') }}</span>
+                <span style="margin-left: auto;">阅览数: {{ data.hits }}</span>
+            </h4>
+            <HtmlContainer :context="formatHtmlString(data.context)" v-if="data.context" />
+            <p style="color: #999;margin-top: .24rem;font-size: .24rem;" v-if="data.author">作者: {{ data.author }}</p>
+        </section>
+        <template v-if="dataList.length">
+            <Divider>热门资讯</Divider>
+            <CellGroup class="news-details__list">
+                <template v-for="(item, index) in dataList" :key="index">
+                    <Cell class="article-item" title-class="article-item__title" value-class="article-item__time"
+                        :title="item.title" :value="formatDate(item.publishdate, 'MM/DD')"
+                        :to="{ name: 'news-details', query: { id: item.id } }" replace />
+                </template>
+            </CellGroup>
+        </template>
     </app-view>
 </template>
 
 <script lang="ts" setup>
-</script>
+import { CellGroup, Cell, Divider, showFailToast, showToast, Icon } from 'vant'
+import { formatDate, getFileUrl, getNewsShareUrl, formatHtmlString } from '@/filters'
+import { useNavigation } from '@/hooks/navigation'
+import { useRequest } from '@/hooks/request'
+import { queryNewTitles, queryNewContents } from '@/services/api/news'
+import plus from '@/utils/h5plus'
+import HtmlContainer from '@mobile/components/base/html-container/index.vue'
+
+const { getQueryString } = useNavigation()
+const newsId = getQueryString('id')
+
+const { dataList, run } = useRequest(queryNewTitles, {
+    manual: true,
+    params: {
+        pagesize: 10,
+    },
+    onSuccess: (res) => {
+        dataList.value = res.data.filter((e) => e.id.toString() !== newsId)
+    }
+})
+
+const { data } = useRequest(queryNewContents, {
+    params: {
+        ids: newsId
+    },
+    onSuccess: (res) => {
+        if (res.data.length) {
+            const details = res.data[0]
+            data.value = details
+            run({ columnid: details.columnid })
+        } else {
+            run()
+        }
+    }
+})
+
+// 跳转链接
+const openUrl = (url?: string) => {
+    if (url) {
+        plus.openURL(url)
+    }
+}
+
+// 分享消息
+const sendShareMessage = () => {
+    if (data.value) {
+        plus.systemShare({
+            title: data.value.title,
+            href: getNewsShareUrl(newsId),
+        }).catch((err) => {
+            showFailToast(err)
+        })
+    } else {
+        showFailToast('文章不存在,分享失败')
+    }
+}
+
+const onCopy = (status: boolean) => {
+    if (status) {
+        showToast({
+            message: '已复制,快去粘贴吧~',
+            position: 'bottom',
+        })
+    } else {
+        showFailToast('复制失败')
+    }
+}
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 58 - 0
src/packages/mobile/views/news/detail/index.less

@@ -0,0 +1,58 @@
+@import '@mobile/assets/themes/base/mixin.less';
+
+.news-details {
+    background-color: #fff;
+
+    .app-view__body {
+        padding-bottom: 1.2rem;
+    }
+
+    &__container {
+        padding: .32rem;
+
+        >h1 {
+            font-size: .35rem;
+            font-weight: bold;
+        }
+
+        >h4 {
+            display: flex;
+            align-items: center;
+            gap: .12rem;
+            font-size: .24rem;
+            color: #999;
+            padding: .32rem 0;
+
+            img {
+                width: .48rem;
+                height: .48rem;
+                border-radius: 50%;
+                font-size: 0;
+            }
+        }
+
+        >p {
+            font-size: .28rem;
+            line-height: .48rem;
+
+            img {
+                max-width: 100%;
+            }
+        }
+    }
+
+    &__list {
+        .article-item {
+            &__title {
+                span {
+                    .mixin-text-overflow()
+                }
+            }
+
+            &__time {
+                flex: initial;
+                margin-left: .48rem;
+            }
+        }
+    }
+}

+ 72 - 5
src/packages/mobile/views/news/list/Index.vue

@@ -1,8 +1,75 @@
 <template>
-    <app-view>
-
-    </app-view>
+  <app-view class="news-list" flex>
+    <template #header>
+      <app-navbar title="市场资讯" />
+    </template>
+    <Tabs v-model:active="currentColumnId" @change="onClickTab">
+      <template v-for="(item, index) in siteColumns" :key="index">
+        <Tab :name="item.id" :title="item.columnname" />
+      </template>
+    </Tabs>
+    <app-pull-refresh ref="pullRefreshRef" class="news-list__container" v-model:loading="loading" v-model:error="error"
+      v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
+      <Empty v-if="!dataList.length" />
+      <template v-for="(item, index) in dataList" :key="index">
+        <Cell class="article-item" title-class="article-item__title" value-class="article-item__time" :title="item.title"
+          :value="formatDate(item.publishdate, 'MM/DD')" :to="{ name: 'news-details', query: { id: item.id } }" />
+      </template>
+    </app-pull-refresh>
+  </app-view>
 </template>
-
+  
 <script lang="ts" setup>
-</script>
+import { shallowRef } from 'vue'
+import { Cell, Tab, Tabs, Empty } from 'vant'
+import { formatDate } from '@/filters'
+import { useRequest } from '@/hooks/request'
+import { querySiteColumnDetail, querySiteColumnConfig } from '@/services/api/news'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+
+const pullRefreshRef = shallowRef()
+const dataList = shallowRef<Model.SiteColumnDetailRsp[]>([])
+const siteColumns = shallowRef<Model.SiteColumnConfigRsp[]>([])
+const currentColumnId = shallowRef(0)
+const error = shallowRef(false)
+
+/// 查询栏目配置
+const getSiteColumnConfig = querySiteColumnConfig().then((res) => {
+  siteColumns.value = res.data
+  /// 默认第一个
+  if (res.data.length) {
+    currentColumnId.value = res.data[0].id
+  }
+})
+
+const { loading, pageIndex, pageCount, run } = useRequest(querySiteColumnDetail, {
+  manual: true,
+  params: {
+    pagesize: 20,
+  },
+  onSuccess: (res) => {
+    if (pageIndex.value === 1) {
+      dataList.value = []
+    }
+    dataList.value.push(...res.data)
+  },
+  onError: () => {
+    error.value = true
+  }
+})
+
+const onRefresh = () => {
+  getSiteColumnConfig.then(() => {
+    run({ columnid: currentColumnId.value })
+  })
+}
+
+// Tab触发
+const onClickTab = () => {
+  pullRefreshRef.value?.refresh()
+}
+</script>
+  
+<style lang="less">
+@import './index.less';
+</style>

+ 20 - 0
src/packages/mobile/views/news/list/index.less

@@ -0,0 +1,20 @@
+@import '@mobile/assets/themes/base/mixin.less';
+
+.news-list {
+    &__container {
+        padding-top: .2rem;
+
+        .article-item {
+            &__title {
+                span {
+                    .mixin-text-overflow()
+                }
+            }
+
+            &__time {
+                flex       : initial;
+                margin-left: .48rem;
+            }
+        }
+    }
+}

+ 2 - 0
src/services/api/bank/index.ts

@@ -109,6 +109,7 @@ export function queryHisAmountLog(config: RequestConfig<Model.HisAmountLogReq> =
         url: '/TaAccount/QueryHisAmountLog',
         params: {
             accountID: accountStore.accountId.toString(),
+            pageflag: 1,
             ...config.data
         },
     })
@@ -122,6 +123,7 @@ export function queryAmountLog(config: RequestConfig<Model.AmountLogReq> = {}) {
         url: '/TaAccount/QueryAmountLog',
         params: {
             accountID: accountStore.accountId.toString(),
+            pageflag: 1,
             ...config.data
         },
     })

+ 10 - 0
src/services/api/market/index.ts

@@ -38,4 +38,14 @@ export function queryThjSpotQuoteConfig(config: RequestConfig<Model.ThjSpotQuote
         url: '/Ferroalloy/QueryThjSpotQuoteConfig',
         params: config.data,
     })
+}
+
+/**
+ * 查询行情Tik数据
+ */
+export function queryHistoryTikDatas(config: RequestConfig<Model.HistoryTikDatasReq> = {}) {
+    return http.commonRequest<Model.HistoryTikDatasRsp[]>({
+        url: '/Quote/QueryHistoryTikDatas',
+        params: config.data,
+    })
 }

+ 1 - 1
src/services/api/trade/index.ts

@@ -2,7 +2,7 @@ import { v4 } from 'uuid'
 import http from '@/services/http'
 import { RequestConfig } from '@/services/http/types'
 import { ClientType } from '@/constants/client'
-import { useLoginStore, useAccountStore,useUserStore } from '@/stores'
+import { useLoginStore, useAccountStore } from '@/stores'
 
 const loginStore = useLoginStore()
 const accountStore = useAccountStore()

+ 7 - 3
src/services/websocket/build/index.ts

@@ -15,6 +15,8 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
     private host;
     /** WebSocket 对象 */
     private ws?: WebSocket;
+    /** WebSocket 协议 */
+    private protocols: string | string[];
     /** 心跳定时器 */
     private beatTimer = 0;
     /** 心跳发送时间 */
@@ -52,9 +54,10 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
     /** 消息超时时长,默认为15秒 */
     timeoutInterval = 15 * 1000;
 
-    constructor(pkg: Package<T>, host = '') {
+    constructor(pkg: Package<T>, host = '', protocols = '') {
         this.Package = pkg;
         this.host = host;
+        this.protocols = protocols;
     }
 
     /**
@@ -65,6 +68,7 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
             clearTimeout(this.reconnectTimer);
             this.stopHeartBeat();
             this.host = host || this.host;
+            this.protocols = protocols || this.protocols;
             this.connState = 'Connecting';
             console.log(this.host, '正在连接');
 
@@ -146,7 +150,7 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
     private startHeartBeat() {
         this.beatTimer = window.setTimeout(() => {
             this.beatTimerId = moment(new Date()).format('HH:mm:ss');
-            //console.log(this.host, '发送心跳', this.beatTimerId);
+            console.log(this.host, '发送心跳', this.beatTimerId);
             // 发送心跳
             switch (this.Package) {
                 case Package40: {
@@ -326,7 +330,7 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
             switch (p.mainClassNumber) {
                 case 0x12: {
                     // 接收到心跳回复
-                    //console.log(this.host, '收到心跳回复', this.beatTimerId);
+                    console.log(this.host, '收到心跳回复', this.beatTimerId);
                     this.stopHeartBeat();
                     this.startHeartBeat();
                     break;

+ 6 - 0
src/stores/modules/futures.ts

@@ -29,6 +29,7 @@ export const useFuturesStore = defineStore(() => {
             const { goodsid, goodscode, goodsname, goodsgroupid, marketid, decimalplace } = cur
             const quoteDayInfo = state.quoteDayList.find((e) => e.goodscode.toUpperCase() === goodscode.toUpperCase())
             const {
+                averageprice = 0,
                 last = 0,
                 bid = 0,
                 ask = 0,
@@ -39,11 +40,13 @@ export const useFuturesStore = defineStore(() => {
                 holdvolume = 0,
                 holdincrement = 0,
                 presettle = 0,
+                preclose = 0,
                 totalturnover = 0,
                 opened = 0,
                 highest = 0,
                 lowest = 0,
                 lasttime = '',
+                settle = 0,
             } = quoteDayInfo ?? {}
 
             const rise = last ? last - presettle : 0   // 涨跌额/涨跌: 最新价 - 昨结价
@@ -62,6 +65,7 @@ export const useFuturesStore = defineStore(() => {
             }
 
             const item: Model.Futures = {
+                averageprice,
                 marketid,
                 goodsgroupid,
                 goodsid,
@@ -82,10 +86,12 @@ export const useFuturesStore = defineStore(() => {
                 holdvolume,
                 holdincrement,
                 presettle,
+                preclose,
                 totalturnover,
                 opened,
                 highest,
                 lowest,
+                settle,
                 bidColor: handleColor(bid),
                 askColor: handleColor(ask),
                 lastColor: handleColor(last),

+ 2 - 0
src/types/model/bank.d.ts

@@ -188,6 +188,7 @@ declare namespace Model {
         marketname: string; // 市场名称
         moneyticket: number; // 资金流水号:银行端流水号
         operatetype: number; // 资金操作类型 (AccountFundCmdOp)- 101:入金 102:入金手续费 103:出金 104:出金冻结 105:出金解冻 106:出金手续费 107:出金手续费冻结 108:出金手续费解冻 201:交易冻结 202:交易解冻 203:交易占用 204:交易解占用 205:交易手续费冻结 206:交易手续费解冻 207:交易手续费 208:交易货款 209:交易盈亏 301:交割冻结 302:交割解冻 303:交割手续费 304:交割手续费冻结 305:交割手续费解冻 306:交割货款 307:交割税款 401:结算盈亏 402:结算递延费 403:分润收入 404:延期分润 501:授信增加 502:授信减少 503:转积分 504:转入 505:转出 506:转出冻结 507:转出解冻 601:履约金额冻结 602:履约最大冻结 603:履约金额解冻 604:履约扣款 605:履约收款 606:履约违约手续费 607:履约违约收入 608:履约最大扣款 701:供应链金融冻结 702:供应链金融解冻 703:供应链金融最大冻结 704:供应链金融利息 705:供应链金融货款 706:供应链金融押金 707:供应链金融最大扣款 801:仓单贸易冻结 802:仓单贸易解冻 803:仓单贸易首付款 804:仓单贸易最大扣款 901:商城扣款冻结 902:商城扣款解冻 903:商城扣款 904:商城收款 1001:期权冻结 1002:期权解冻 1003:期权权力金 1004:期权手续费冻结 1005:期权手续费解冻 1006:期权手续费 1007:期权盈亏 1101:营销扣款 1102:营销收款
+        operatetypename: string; // 资金操作类型名称(显示)
         relationorderid: string; // 关联单号
         remark: string; // 备注
         trademode: number; // 交易模式
@@ -270,6 +271,7 @@ declare namespace Model {
         // 资金流水号:银行端流水号
         moneyticket: number
         // 资金操作类型 (AccountFundCmdOp)- 101:入金 102:入金手续费 103:出金 104:出金冻结 105:出金解冻 106:出金手续费 107:出金手续费冻结 108:出金手续费解冻 201:交易冻结 202:交易解冻 203:交易占用 204:交易解占用 205:交易手续费冻结 206:交易手续费解冻 207:交易手续费 208:交易货款 209:交易盈亏 301:交割冻结 302:交割解冻 303:交割手续费 304:交割手续费冻结 305:交割手续费解冻 306:交割货款 307:交割税款 401:结算盈亏 402:结算递延费 403:分润收入 404:延期分润 501:授信增加 502:授信减少 503:转积分 504:转入 505:转出 506:转出冻结 507:转出解冻 601:履约金额冻结 602:履约最大冻结 603:履约金额解冻 604:履约扣款 605:履约收款 606:履约违约手续费 607:履约违约收入 608:履约最大扣款 701:供应链金融冻结 702:供应链金融解冻 703:供应链金融最大冻结 704:供应链金融利息 705:供应链金融货款 706:供应链金融押金 707:供应链金融最大扣款 801:仓单贸易冻结 802:仓单贸易解冻 803:仓单贸易首付款 804:仓单贸易最大扣款 901:商城扣款冻结 902:商城扣款解冻 903:商城扣款 904:商城收款 1001:期权冻结 1002:期权解冻 1003:期权权力金 1004:期权手续费冻结 1005:期权手续费解冻 1006:期权手续费 1007:期权盈亏 1101:营销扣款 1102:营销收款
+        operatetypename: string; // 资金操作类型名称(显示)
         operatetype: number
         // 关联单号
         relationorderid: string

+ 28 - 0
src/types/model/market.d.ts

@@ -39,8 +39,34 @@ declare namespace Model {
         wrstandardname: string; // 现货商品名称
     }
 
+    /** 查询行情Tik数据 请求 */
+    interface HistoryTikDatasReq {
+        goodsCode: string, // 商品代码
+        startTime?: string, // 开始时间,格式:yyyy-MM-dd HH:mm:ss
+        endTime?: string, // 结束时间,格式:yyyy-MM-dd HH:mm:ss
+        count?: number, // 条数
+        isAsc?: boolean, // 是否按时间顺序排序(默认为时间倒序排序)
+    }
+
+    /** 查询行情Tik数据 响应 */
+    interface HistoryTikDatasRsp {
+        AV: number; // 卖量
+        Ask: number; // 卖价
+        BV: number; // 买量
+        Bid: number; // 买价
+        HI: number; // 单笔持仓
+        HV: number; // 持仓量
+        PE: number; // 现价
+        TDR: number; // 交易方向,0:买 1:卖
+        TK: number; // 交易类型
+        TS: string; // 行情时间文本
+        TT: number; // 现金额
+        Vol: number; // 现量
+    }
+
     /** 期货行情 */
     interface Futures {
+        averageprice: number; // 均价
         marketid: number; // 所属市场ID
         goodsgroupid: number; // 所属商品组ID
         goodsid: number; // 商品ID
@@ -61,6 +87,7 @@ declare namespace Model {
         holdvolume: number; // 持仓量
         holdincrement: number; // 日增
         presettle: number; // 昨结价
+        preclose: number; // 昨收
         totalturnover: number; // 金额
         opened: number; // 开盘
         highest: number; // 最高
@@ -73,5 +100,6 @@ declare namespace Model {
         openedColor: string;// 开盘颜色
         highestColor: string;// 最高颜色
         lowestColor: string;// 最低颜色
+        settle: number; // 结算价
     }
 }