li.shaoyi 1 månad sedan
förälder
incheckning
fad516c48a

BIN
oem/digital/app/splashscreen/1080x1920.png


BIN
oem/digital/app/splashscreen/480x853.png


BIN
oem/digital/app/splashscreen/720x1280.png


+ 2 - 2
oem/snhl/config/appconfig.json

@@ -1,8 +1,8 @@
 {
   "appId": "com.snhl.release",
   "appName": "三农互联",
-  "version": "1.0.5",
-  "versionCode": "100005",
+  "version": "1.0.6",
+  "versionCode": "100006",
   "apiUrl": "http://192.168.31.208:8080/cfg?key=test_208",
   "tradeChannel": "ws",
   "modules": [

+ 2 - 2
oem/snhl/manifest.json

@@ -156,8 +156,8 @@
                 ],
                 "abiFilters" : [ "arm64-v8a" ],
                 "autoSdkPermissions" : false,
-                "minSdkVersion" : 34,
-                "targetSdkVersion" : 34,
+                "minSdkVersion" : 32,
+                "targetSdkVersion" : 32,
                 "excludePermissions" : [
                     "<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\"/>",
                     "<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\"/>"

+ 17 - 0
src/constants/bank.ts

@@ -65,3 +65,20 @@ export function getGt_kksjdwName(bankmappedvalue: string) {
     const enums = getGt_kksjdwList()
     return getBankMappedValue(enums, bankmappedvalue)
 }
+
+/**
+ * 获取申请状态列表
+ * @returns 
+ */
+export function getBankApplyStatusList() {
+    return getEnumTypeList('bankapplystatus')
+}
+
+/**
+ * 获取申请状态名称
+ * @returns 
+ */
+export function getBankApplyStatusName(value: number) {
+    const enums = getBankApplyStatusList()
+    return getEnumTypeName(enums, value)
+}

+ 26 - 8
src/packages/digital/views/spot/components/order/index.vue

@@ -1,10 +1,11 @@
 <template>
-    <div class="g-detail-table">
+    <app-pull-refresh ref="pullRefreshRef" class="g-detail-table" v-model:loading="loading"
+        v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
         <table cellspacing="0" cellpadding="0" v-if="showDatePicker">
             <tbody>
                 <tr>
                     <td>
-                        <app-date-picker v-model="date" />
+                        <app-date-picker v-model="dateValue" @confirm="pullRefreshRef.refresh()" />
                     </td>
                 </tr>
             </tbody>
@@ -59,7 +60,7 @@
         </table>
         <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
             @closed="closeComponent" v-if="componentId" />
-    </div>
+    </app-pull-refresh>
 </template>
 
 <script lang="ts" setup>
@@ -71,12 +72,13 @@ import { useRequest } from '@/hooks/request'
 import { getBuyOrSellName, getOrderStatusName } from '@/constants/order'
 import { queryDigitalTradeOrderDetails } from '@/services/api/digital'
 import { useFuturesStore } from '@/stores'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import AppDatePicker from '@mobile/components/base/datepicker/index.vue'
 
 const props = defineProps({
     params: {
-        type: Object as PropType<Partial<Model.DigitalTradeOrderDetailsReq>>,
-        default: () => ({})
+        type: Object as PropType<Model.DigitalTradeOrderDetailsReq>,
+        required: true
     },
     showDatePicker: {
         type: Boolean,
@@ -89,13 +91,23 @@ const componentMap = new Map<string, unknown>([
 ])
 
 const futuresStore = useFuturesStore()
-const date = shallowRef('')
 const selectedRow = shallowRef<Model.DigitalTradeOrderDetailsRsp>()
 
+const pullRefreshRef = shallowRef()
+const dataList = shallowRef<Model.DigitalTradeOrderDetailsRsp[]>([])
+const dateValue = shallowRef(props.params.tradedate?.split('-') ?? [])
+
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
 
-const { dataList } = useRequest(queryDigitalTradeOrderDetails, {
-    defaultParams: props.params
+const { loading, pageIndex, pageCount, run } = useRequest(queryDigitalTradeOrderDetails, {
+    manual: props.showDatePicker,
+    defaultParams: props.params,
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    }
 })
 
 const tableList = computed(() => dataList.value.map((e) => {
@@ -109,6 +121,12 @@ const tableList = computed(() => dataList.value.map((e) => {
     }
 }))
 
+const onRefresh = () => {
+    run({
+        tradedate: dateValue.value.join('')
+    })
+}
+
 // 撤销
 const cancelOrder = (item: Model.DigitalTradeOrderDetailsRsp) => {
     selectedRow.value = item

+ 32 - 11
src/packages/digital/views/spot/components/statement/index.vue

@@ -1,10 +1,15 @@
 <template>
-    <div class="g-detail-list">
-        <dl>
-            <dt>
-                <app-date-picker v-model="date" />
-            </dt>
-        </dl>
+    <app-pull-refresh ref="pullRefreshRef" class="g-detail-table g-detail-list" v-model:loading="loading"
+        v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
+        <table cellspacing="0" cellpadding="0">
+            <tbody>
+                <tr>
+                    <td>
+                        <app-date-picker v-model="dateValue" @confirm="pullRefreshRef.refresh()" />
+                    </td>
+                </tr>
+            </tbody>
+        </table>
         <dl v-for="(item, index) in dataList" :key="index">
             <dt>
                 <span>{{ item.tradedate }}</span>
@@ -25,14 +30,15 @@
                 </span>
             </dd>
         </dl>
-    </div>
+    </app-pull-refresh>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
+import { PropType, shallowRef } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { getDigitalBusinessCodeName, getDigitalOperateTypeName, getDigitalCurrencyName } from '@/constants/order'
 import { queryTaaccountDigitalLogs } from '@/services/api/digital'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import AppDatePicker from '@mobile/components/base/datepicker/index.vue'
 
 const props = defineProps({
@@ -42,9 +48,24 @@ const props = defineProps({
     }
 })
 
-const date = shallowRef('')
+const pullRefreshRef = shallowRef()
+const dataList = shallowRef<Model.TaaccountDigitalLogsRsp[]>([])
+const dateValue = shallowRef(props.params.tradedate?.split('-') ?? [])
 
-const { dataList } = useRequest(queryTaaccountDigitalLogs, {
-    defaultParams: props.params
+const { loading, pageIndex, pageCount, run } = useRequest(queryTaaccountDigitalLogs, {
+    manual: true,
+    defaultParams: props.params,
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    }
 })
+
+const onRefresh = () => {
+    run({
+        tradedate: dateValue.value.join('')
+    })
+}
 </script>

+ 28 - 10
src/packages/digital/views/spot/components/trade/index.vue

@@ -1,10 +1,11 @@
 <template>
-    <div class="g-detail-table">
-        <table cellspacing="0" cellpadding="0">
+    <app-pull-refresh ref="pullRefreshRef" class="g-detail-table" v-model:loading="loading"
+        v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
+        <table cellspacing="0" cellpadding="0" v-if="showDatePicker">
             <tbody>
                 <tr>
                     <td>
-                        <app-date-picker v-model="date" />
+                        <app-date-picker v-model="dateValue" @confirm="pullRefreshRef.refresh()" />
                     </td>
                 </tr>
             </tbody>
@@ -50,21 +51,22 @@
                 </tr>
             </tbody>
         </table>
-    </div>
+    </app-pull-refresh>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef,PropType,computed } from 'vue'
+import { shallowRef, PropType, computed } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { getBuyOrSellName } from '@/constants/order'
 import { queryDigitalTradeTradeDetails } from '@/services/api/digital'
 import { useFuturesStore } from '@/stores'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import AppDatePicker from '@mobile/components/base/datepicker/index.vue'
 
 const props = defineProps({
     params: {
-        type: Object as PropType<Partial<Model.DigitalTradeTradeDetailsReq>>,
-        default: () => ({})
+        type: Object as PropType<Model.DigitalTradeTradeDetailsReq>,
+        required: true
     },
     showDatePicker: {
         type: Boolean,
@@ -73,10 +75,20 @@ const props = defineProps({
 })
 
 const futuresStore = useFuturesStore()
-const date = shallowRef('')
 
-const { dataList } = useRequest(queryDigitalTradeTradeDetails, {
-    defaultParams: props.params
+const pullRefreshRef = shallowRef()
+const dataList = shallowRef<Model.DigitalTradeTradeDetailsRsp[]>([])
+const dateValue = shallowRef(props.params.tradedate?.split('-') ?? [])
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryDigitalTradeTradeDetails, {
+    manual: props.showDatePicker,
+    defaultParams: props.params,
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    }
 })
 
 const tableList = computed(() => dataList.value.map((e) => {
@@ -89,4 +101,10 @@ const tableList = computed(() => dataList.value.map((e) => {
         quotecurrencycode: quoteItem?.quotecurrencycode
     }
 }))
+
+const onRefresh = () => {
+    run({
+        tradedate: dateValue.value.join('')
+    })
+}
 </script>

+ 5 - 5
src/packages/digital/views/spot/detail/index.vue

@@ -33,22 +33,22 @@
         </div>
         <Tabs v-model:active="tabIndex">
             <Tab title="充值">
-                <wallet-record />
+                <wallet-record :params="{ digitalaccountid, transfertypes: '1' }" />
             </Tab>
             <Tab title="提现">
-                <wallet-record />
+                <wallet-record :params="{ digitalaccountid, transfertypes: '2' }" />
             </Tab>
             <Tab title="转入">
-                <wallet-record />
+                <wallet-record :params="{ digitalaccountid, transfertypes: '3' }" />
             </Tab>
             <Tab title="转出">
-                <wallet-record />
+                <wallet-record :params="{ digitalaccountid, transfertypes: '4' }" />
             </Tab>
             <Tab title="委托">
                 <spot-order :params="{ digitalaccountid }" showDatePicker />
             </Tab>
             <Tab title="成交">
-                <spot-trade :params="{ digitalaccountid }" />
+                <spot-trade :params="{ digitalaccountid }" showDatePicker />
             </Tab>
             <Tab title="资金明细">
                 <spot-statement :params="{ digitalaccountid }" />

+ 43 - 11
src/packages/digital/views/wallet/components/record/index.vue

@@ -1,21 +1,22 @@
 <!-- 钱包-记录 -->
 <template>
-    <div class="g-detail-table">
+    <app-pull-refresh ref="pullRefreshRef" class="g-detail-table" v-model:loading="loading"
+        v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
         <table cellspacing="0" cellpadding="0">
             <tbody>
                 <tr>
                     <td>
-                        <app-date-picker v-model="date" />
+                        <app-date-picker v-model="dateValue" @confirm="pullRefreshRef.refresh()" />
                     </td>
                 </tr>
             </tbody>
         </table>
-        <table cellspacing="0" cellpadding="0">
+        <table cellspacing="0" cellpadding="0" v-for="(item, index) in dataList" :key="index">
             <thead>
                 <tr>
                     <th colspan="2">
                         <span>充值(USDT)</span>
-                        <time class="text-small">2025-09-01 11:11:11</time>
+                        <time class="text-small">{{ formatDate(item.applytime) }}</time>
                     </th>
                 </tr>
             </thead>
@@ -23,31 +24,62 @@
                 <tr>
                     <td>
                         <span class="text-small">申请单号</span>
-                        <span>4031718728455010011</span>
+                        <span>{{ item.applyid }}</span>
                     </td>
                     <td>
                         <span class="text-small">申请状态</span>
-                        <span>审核通过</span>
+                        <span>{{ getBankApplyStatusName(item.applystatus) }}</span>
                     </td>
                 </tr>
                 <tr>
                     <td>
                         <span class="text-small">申请金额(USDT)</span>
-                        <span>1000.000000</span>
+                        <span>{{ item.applyamount }}</span>
                     </td>
                     <td>
                         <span class="text-small">手续费(USDT)</span>
-                        <span>0.100000</span>
+                        <span>{{ item.charge }}</span>
                     </td>
                 </tr>
             </tbody>
         </table>
-    </div>
+    </app-pull-refresh>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { shallowRef, PropType } from 'vue'
+import { formatDate } from '@/filters'
+import { getBankApplyStatusName } from '@/constants/bank'
+import { useRequest } from '@/hooks/request'
+import { queryTaaccountDigitalChangeApplys } from '@/services/api/digital'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import AppDatePicker from '@mobile/components/base/datepicker/index.vue'
 
-const date = shallowRef('')
+const props = defineProps({
+    params: {
+        type: Object as PropType<Model.TaaccountDigitalChangeApplysReq>,
+        required: true
+    }
+})
+
+const pullRefreshRef = shallowRef()
+const dataList = shallowRef<Model.TaaccountDigitalChangeApplysRsp[]>([])
+const dateValue = shallowRef(props.params.applydate?.split('-') ?? [])
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryTaaccountDigitalChangeApplys, {
+    manual: true,
+    defaultParams: props.params,
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    }
+})
+
+const onRefresh = () => {
+    run({
+        applydate: dateValue.value.join('')
+    })
+}
 </script>

+ 1 - 1
src/packages/mobile/assets/themes/default/default.less

@@ -31,7 +31,7 @@
 
     /* Vant-Button */
     --van-button-border-width: 0;
-    --van-button-primary-background: #1e78b9;
+    --van-button-primary-background: #d82d42;
     --van-button-danger-background: #d82d42;
 
     /* Vant-Checkbox */

+ 15 - 10
src/packages/mobile/components/base/datepicker/index.vue

@@ -1,8 +1,8 @@
 <template>
     <div class="app-datepicker">
         <div @click="show = true">
-            <slot>
-                <span class="app-datepicker__placeholder">{{ modelValue || placeholder }}</span>
+            <slot :value="dateLabel">
+                <span class="app-datepicker__placeholder">{{ dateLabel || placeholder }}</span>
             </slot>
         </div>
         <Popup v-model:show="show" position="bottom" round>
@@ -12,13 +12,13 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, onMounted } from 'vue'
+import { ref, onMounted, computed, PropType } from 'vue'
 import { Popup, DatePicker } from 'vant'
 import moment from 'moment'
 
 const props = defineProps({
     modelValue: {
-        type: String,
+        type: Array as PropType<string[]>,
         required: true
     },
     // 分隔符
@@ -33,28 +33,33 @@ const props = defineProps({
     }
 })
 
-const emit = defineEmits(['update:modelValue'])
+const emit = defineEmits(['update:modelValue', 'confirm'])
 
 const show = ref(false)
-const currentDate = ref<string[]>([])
+
+const currentDate = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+const dateLabel = computed(() => currentDate.value.join(props.separator))
 
 const onCancel = () => {
     show.value = false
 }
 
 const onConfirm = () => {
-    emit('update:modelValue', currentDate.value.join(props.separator))
+    emit('confirm', currentDate.value)
     onCancel()
 }
 
 onMounted(() => {
-    if (props.modelValue) {
-        currentDate.value = props.modelValue.split(props.separator)
-    } else {
+    if (!props.modelValue.length) {
         const now = moment()
         const dateArray = [now.format('YYYY'), now.format('MM'), now.format('DD')]
         currentDate.value = dateArray
     }
+    onConfirm()
 })
 </script>
 

+ 8 - 0
src/packages/mobile/components/base/empty/index.less

@@ -0,0 +1,8 @@
+.app-empty {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    min-height: 200px;
+    text-align: center;
+    color: var(--van-empty-description-color);
+}

+ 12 - 0
src/packages/mobile/components/base/empty/index.vue

@@ -0,0 +1,12 @@
+<template>
+    <div class="app-empty">
+        <slot>暂无数据</slot>
+    </div>
+</template>
+
+<script lang="ts" setup>
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 1 - 1
src/packages/mobile/components/layouts/view/index.vue

@@ -1,7 +1,7 @@
 <template>
     <div ref="viewRef" class="app-view">
         <slot name="header"></slot>
-        <app-scroll-view :class="['app-view__body', flex && 'flex']">
+        <app-scroll-view :class="{ 'app-view__body': true, 'flex': flex }">
             <Loading class="app-view__loading" v-if="loading" />
             <slot></slot>
         </app-scroll-view>

+ 1 - 1
src/packages/mobile/views/report/index.vue

@@ -6,7 +6,7 @@
         <Report />
         <template #footer>
             <div class="g-form__footer">
-                <Button type="danger" block square @click="onSubmit(false)">{{ $t('operation.disagree') }}</Button>
+                <Button block square @click="onSubmit(false)">{{ $t('operation.disagree') }}</Button>
                 <Button type="primary" block square @click="onSubmit(true)">{{ $t('operation.agree') }}</Button>
             </div>
         </template>

+ 2 - 7
src/packages/snhl/router/index.ts

@@ -37,8 +37,7 @@ const routes: Array<RouteRecordRaw> = [
           ignoreAuth: true,
         },
         props: {
-          showYhkhfxgzs: false,
-          insetStyle: false
+          showYhkhfxgzs: false
         }
       }
     ]
@@ -90,8 +89,7 @@ const routes: Array<RouteRecordRaw> = [
           ignoreAuth: true,
         },
         props: {
-          showYhkhfxgzs: false,
-          insetStyle: false
+          showYhkhfxgzs: false
         }
       },
       {
@@ -100,9 +98,6 @@ const routes: Array<RouteRecordRaw> = [
         component: () => import('@mobile/views/user/forget/Index.vue'),
         meta: {
           ignoreAuth: true,
-        },
-        props: {
-          insetStyle: false
         }
       },
       {

+ 11 - 0
src/services/api/digital/index.ts

@@ -60,6 +60,17 @@ export function queryTaaccountDigitalLogs(config: RequestConfig<Model.TaaccountD
 }
 
 /**
+ * 获取数字账户变更申请表
+ */
+export function queryTaaccountDigitalChangeApplys(config: RequestConfig<Model.TaaccountDigitalChangeApplysReq>) {
+    return http.commonRequest<Model.TaaccountDigitalChangeApplysRsp[]>({
+        url: '/Digital/QueryTaaccountDigitalChangeApplys',
+        method: 'post',
+        params: config.data,
+    })
+}
+
+/**
  * 数字交易委托请求
  */
 export function digitalOrder(config: RequestConfig<Partial<Proto.DigitalOrderReq>>) {

+ 31 - 0
src/types/model/digital.d.ts

@@ -147,4 +147,35 @@ declare namespace Model {
         tradedate: string; // 创建交易日(yyyyMMdd)
         userid: number; // 用户ID
     }
+
+    /** 获取数字账户变更申请表 请求 */
+    interface TaaccountDigitalChangeApplysReq {
+        digitalaccountid: string; // 数字账户ID
+        applydate?: string; // 申请日期(yyyyMMdd)
+        transfertypes?: string; // 划转类型(多个逗号分隔) - 枚举digitaltransfertype(1:充值 2:提现 3:转入 4:转出)
+    }
+
+    /** 获取数字账户变更申请表 响应 */
+    interface TaaccountDigitalChangeApplysRsp {
+        accountid: number; // 资金账号ID (转入\转出)
+        actualamount: number; // 实际金额(申请金额 - 手续费)
+        applyamount: number; // 申请金额
+        applyid: string; // 申请ID(403+Unix秒时间戳(10位)+xxxxxx)
+        applystatus: number; // 申请状态 - 枚举"bankapplystatus"(1:待审核 2:审核中 3:审核通过 4:审核拒绝 5:审核失败 6:审核超时 7:已撤销)
+        applytime: string; // 申请时间
+        auditorid: number; // 审核人
+        audittime: string; // 审核时间
+        audittradedate: string; // 审核交易日(yyyyMMdd)
+        charge: number; // 手续费
+        currencyid: number; // 货币ID - 枚举"digitalcurrency"
+        digitalaccountid: string; // 数字账号ID
+        digitaltransfertype: number; // 划转类型 - 枚举"digitaltransfertype"(1:充值 2:提现 3:转入 4:转出)
+        handlestatus: number; // 处理状态 - 枚举"digitalhandlestatus"(1:账户服务处理开始 2:账户服务处理失败 3:账户服务处理成功 4:数字账户服务处理开始 5:数字账户服务处理失败 6:数字账户服务处理成功)
+        remark: string; // 备注
+        retcode: string; // 错误代码
+        revokerid: number; // 撤销人
+        revokesrc: number; // 撤销来源 - 枚举"operatesrc"(1:管理端 2:客户端)
+        revoketime: string; // 撤销时间
+        userid: number; // 用户ID
+    }
 }