li.shaoyi 2 лет назад
Родитель
Сommit
f21b22dd3f
100 измененных файлов с 213 добавлено и 3314 удалено
  1. 1 1
      oem/sbyj/config/appconfig.json
  2. 9 0
      src/packages/pc/assets/themes/default/default.less
  3. 1 1
      src/packages/pc/components/modules/delivery/index.vue
  4. 1 1
      src/packages/pc/components/modules/quote/tik/index.vue
  5. 10 9
      src/packages/pc/views/account/sign/components/sign/index.vue
  6. 1 2
      src/packages/pc/views/footer/goods/detail/components/transfer/index.vue
  7. 11 2
      src/packages/pc/views/footer/goods/order/cancel/index.vue
  8. 85 26
      src/packages/pc/views/footer/goods/order/clear/index.vue
  9. 7 4
      src/packages/pc/views/footer/goods/order/index.vue
  10. 1 2
      src/packages/pc/views/footer/goods/position/components/transfer/index.vue
  11. 1 2
      src/packages/pc/views/footer/presell/transferposition/listing/index.vue
  12. 1 2
      src/packages/pc/views/footer/spot/position/components/listing/index.vue
  13. 4 5
      src/packages/pc/views/market/trade/goods/list/listing/index.less
  14. 3 2
      src/packages/pc/views/market/trade/goods/list/listing/index.vue
  15. 4 0
      src/packages/pc/views/market/trade/presell/transfer/listing/index.less
  16. 53 15
      src/packages/pc/views/market/trade/presell/transfer/listing/index.vue
  17. 0 14
      src/packages/sbyj/components/base/banner/index.less
  18. 0 46
      src/packages/sbyj/components/base/banner/index.vue
  19. 0 62
      src/packages/sbyj/components/base/html-container/index.vue
  20. 0 12
      src/packages/sbyj/components/base/html-panel/index.less
  21. 0 42
      src/packages/sbyj/components/base/html-panel/index.vue
  22. 0 17
      src/packages/sbyj/components/base/iconfont/index.less
  23. 0 64
      src/packages/sbyj/components/base/iconfont/index.vue
  24. 0 72
      src/packages/sbyj/components/base/list/index.less
  25. 0 59
      src/packages/sbyj/components/base/list/index.vue
  26. 0 40
      src/packages/sbyj/components/base/popup/index.less
  27. 0 45
      src/packages/sbyj/components/base/popup/index.vue
  28. 0 4
      src/packages/sbyj/components/base/pull-refresh/index.less
  29. 0 114
      src/packages/sbyj/components/base/pull-refresh/index.vue
  30. 0 10
      src/packages/sbyj/components/base/qrcode-scan/index.less
  31. 0 79
      src/packages/sbyj/components/base/qrcode-scan/index.vue
  32. 0 13
      src/packages/sbyj/components/base/region/index.less
  33. 0 103
      src/packages/sbyj/components/base/region/index.vue
  34. 0 39
      src/packages/sbyj/components/base/router-transition/index.backup.less
  35. 0 83
      src/packages/sbyj/components/base/router-transition/index.less
  36. 0 18
      src/packages/sbyj/components/base/router-transition/index.vue
  37. 0 13
      src/packages/sbyj/components/base/select/index.less
  38. 0 96
      src/packages/sbyj/components/base/select/index.vue
  39. 0 47
      src/packages/sbyj/components/base/tabbar/index.less
  40. 0 69
      src/packages/sbyj/components/base/tabbar/index.vue
  41. 0 7
      src/packages/sbyj/components/base/tabbar/types.ts
  42. 0 28
      src/packages/sbyj/components/base/table/index.less
  43. 0 72
      src/packages/sbyj/components/base/table/index.vue
  44. 0 8
      src/packages/sbyj/components/base/table/types.ts
  45. 0 43
      src/packages/sbyj/components/base/uploader/index.vue
  46. 0 12
      src/packages/sbyj/components/base/waterfall/index.less
  47. 0 108
      src/packages/sbyj/components/base/waterfall/index.vue
  48. 0 27
      src/packages/sbyj/components/layouts/block/index.less
  49. 0 14
      src/packages/sbyj/components/layouts/block/index.vue
  50. 0 1
      src/packages/sbyj/components/layouts/footer/index.less
  51. 0 12
      src/packages/sbyj/components/layouts/footer/index.vue
  52. 0 25
      src/packages/sbyj/components/layouts/form/index.vue
  53. 0 30
      src/packages/sbyj/components/layouts/index.ts
  54. 0 23
      src/packages/sbyj/components/layouts/navback/index.less
  55. 0 30
      src/packages/sbyj/components/layouts/navback/index.vue
  56. 0 70
      src/packages/sbyj/components/layouts/navbar/index.less
  57. 0 75
      src/packages/sbyj/components/layouts/navbar/index.vue
  58. 0 6
      src/packages/sbyj/components/layouts/page/index.less
  59. 0 46
      src/packages/sbyj/components/layouts/page/index.vue
  60. 0 19
      src/packages/sbyj/components/layouts/scroll-view/index.less
  61. 0 120
      src/packages/sbyj/components/layouts/scroll-view/index.vue
  62. 0 25
      src/packages/sbyj/components/layouts/statusbar/index.vue
  63. 0 24
      src/packages/sbyj/components/layouts/view/index.less
  64. 0 38
      src/packages/sbyj/components/layouts/view/index.vue
  65. 0 30
      src/packages/sbyj/components/modules/contact/index.vue
  66. 0 3
      src/packages/sbyj/components/modules/echarts-line/index.less
  67. 0 55
      src/packages/sbyj/components/modules/echarts-line/index.vue
  68. 0 8
      src/packages/sbyj/components/modules/pdf/index.vue
  69. 0 17
      src/packages/sbyj/components/modules/quote/chart/index.less
  70. 0 110
      src/packages/sbyj/components/modules/quote/chart/index.vue
  71. 0 45
      src/packages/sbyj/components/modules/quote/chart/kline/index.less
  72. 0 114
      src/packages/sbyj/components/modules/quote/chart/kline/index.vue
  73. 0 33
      src/packages/sbyj/components/modules/quote/chart/timeline/index.less
  74. 0 36
      src/packages/sbyj/components/modules/quote/chart/timeline/index.vue
  75. 0 42
      src/packages/sbyj/components/modules/quote/forex/index.less
  76. 0 176
      src/packages/sbyj/components/modules/quote/forex/index.vue
  77. 0 23
      src/packages/sbyj/components/modules/quote/index.vue
  78. 0 90
      src/packages/sbyj/components/modules/quote/price/index.less
  79. 0 108
      src/packages/sbyj/components/modules/quote/price/index.vue
  80. 0 3
      src/packages/sbyj/components/modules/quote/tik/index.less
  81. 0 94
      src/packages/sbyj/components/modules/quote/tik/index.vue
  82. 0 30
      src/packages/sbyj/components/modules/receipt/index.vue
  83. 0 20
      src/packages/sbyj/components/modules/register-code/index.less
  84. 0 63
      src/packages/sbyj/components/modules/register-code/index.vue
  85. 0 47
      src/packages/sbyj/components/modules/reward/index.less
  86. 0 49
      src/packages/sbyj/components/modules/reward/index.vue
  87. 1 1
      src/packages/sbyj/main.ts
  88. 1 1
      src/packages/sbyj/views/delivery/components/completed/list/index.vue
  89. 1 1
      src/packages/sbyj/views/delivery/components/pending/list/index.vue
  90. 2 2
      src/packages/sbyj/views/delivery/components/processing/components/files/index.vue
  91. 2 2
      src/packages/sbyj/views/delivery/components/processing/components/pay-detail/index.vue
  92. 1 1
      src/packages/sbyj/views/delivery/components/processing/list/index.vue
  93. 1 1
      src/packages/sbyj/views/delivery/detail/file-list/index.vue
  94. 1 1
      src/packages/sbyj/views/delivery/detail/order-list/index.vue
  95. 3 3
      src/packages/sbyj/views/home/index.vue
  96. 1 1
      src/packages/sbyj/views/home/main/index.less
  97. 3 3
      src/packages/sbyj/views/home/main/index.vue
  98. 1 1
      src/packages/sbyj/views/market/list/index.less
  99. 1 1
      src/packages/sbyj/views/market/list/index.vue
  100. 1 1
      src/packages/sbyj/views/mine/index.less

+ 1 - 1
oem/sbyj/config/appconfig.json

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

+ 9 - 0
src/packages/pc/assets/themes/default/default.less

@@ -157,6 +157,11 @@
             --el-disabled-border-color: var(--el-input-border-color);
         }
 
+        .el-radio {
+            --el-radio-text-color: #7a8a94;
+            --el-color-primary: #3a87f7;
+        }
+
         .el-select {
             width: 100%;
         }
@@ -176,6 +181,10 @@
         }
     }
 
+    &--vertical {
+        padding: 0 20px;
+    }
+
     &--horizontal {
         --el-text-color-regular: var(--color-secondary);
 

+ 1 - 1
src/packages/pc/components/modules/delivery/index.vue

@@ -115,8 +115,8 @@ const onCancel = (isRefresh = false) => {
 
 const onSubmit = async () => {
     if (dataList.value.some((e) => e.deliveryLot)) {
-        const errMessage: string[] = []
         loading.value = true
+        const errMessage: string[] = []
         for (let i = 0; i < dataList.value.length; i++) {
             const e = dataList.value[i]
             if (e.deliveryLot) {

+ 1 - 1
src/packages/pc/components/modules/quote/tik/index.vue

@@ -64,7 +64,7 @@ useRequest(queryMarketRun, {
 
 // 监听行情推送
 quoteWatch(props.goodsCode, (quote) => {
-    const { last = 0, lasttime = '', lastvolume = 0 } = quote as Partial<Model.QuoteDayRsp>
+    const { last = 0, lasttime = '', lastvolume = 0 } = quote
     if (last && lastvolume) {
         const list = dataList.value
         if (list.length > 19) {

+ 10 - 9
src/packages/pc/views/account/sign/components/sign/index.vue

@@ -1,8 +1,8 @@
 <!-- 账户管理-签约账号管理-签约 -->
 <template>
-    <app-drawer :title="bankInfo ? '修改签约账户' : '添加签约账户'" :width="800" v-model:show="show" :loading="loading"
+    <app-drawer :title="bankInfo ? '修改签约账户' : '添加签约账户'" :width="400" v-model:show="show" :loading="loading"
         :refresh="refresh">
-        <el-form ref="formRef" class="el-form--horizontal" label-width="150px" :model="formData" :rules="formRules">
+        <el-form ref="formRef" class="el-form--vertical" label-width="90px" :model="formData" :rules="formRules">
             <el-form-item label="开户银行" prop="OpenBankAccId">
                 <el-select v-model="formData.OpenBankAccId">
                     <el-option :label="item.bankname" :value="item.bankid" v-for="(item, index) in banklist" :key="index" />
@@ -17,7 +17,8 @@
                     :rules="formRules.BankAccountName" />
             </el-form-item>
             <template v-for="(item, index) in configs" :key="index">
-                <el-form-item :label="item.fieldname" :prop="item.fieldcode" v-if="item.usabletype === 1 || item.usabletype === userStore.userInfo?.userinfotype">
+                <el-form-item :label="item.fieldname" :prop="item.fieldcode"
+                    v-if="item.usabletype === 1 || item.usabletype === userStore.userInfo?.userinfotype">
                     <el-input :name="item.fieldcode" placeholder="请必须输入" v-model="item.value" />
                 </el-form-item>
             </template>
@@ -39,7 +40,7 @@ import { validateRules } from '@/constants/regex'
 import { useUserStore } from '@/stores'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
-const formRules: FormRules  = {
+const formRules: FormRules = {
     OpenBankAccId: [{
         message: '请选择银行信息',
         validator: () => {
@@ -80,10 +81,10 @@ const formSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
             if (formData.CusBankID) {
-                const obj:{[key:string]:unknown}=Object.create({})
-                configs.value.forEach((e)=>{
-                    if(e.value){
-                        obj[e.fieldcode]=e.value
+                const obj: { [key: string]: unknown } = Object.create({})
+                configs.value.forEach((e) => {
+                    if (e.value) {
+                        obj[e.fieldcode] = e.value
                     }
                     if (e.fieldcode === 'bank_branch_name') {
                         formData.OpenBankName = e.value
@@ -111,7 +112,7 @@ const formSubmit = () => {
                 ElMessage.error('未签约')
             }
         }
-    })  
+    })
 }
 
 </script>

+ 1 - 2
src/packages/pc/views/footer/goods/detail/components/transfer/index.vue

@@ -1,8 +1,7 @@
 <!-- 商品订单-持仓明细-转让 -->
 <template>
     <app-drawer title="转让" :width="800" v-model:show="show" :loading="loading" :refresh="refresh">
-        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" label-position="left" :model="formData"
-            :rules="formRules">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" :model="formData" :rules="formRules">
             <el-form-item label="商品代码/名称">
                 <span>{{ selectedRow.goodscode }}/{{ selectedRow.goodsname }}</span>
             </el-form-item>

+ 11 - 2
src/packages/pc/views/footer/goods/order/cancel/index.vue

@@ -11,8 +11,9 @@
 
 <script lang="ts" setup>
 import { ref, PropType } from 'vue'
-import AppDrawer from '@pc/components/base/drawer/index.vue'
+import { ElMessage } from 'element-plus'
 import { useCancelOrder } from '@/business/trade'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const props = defineProps({
     selectedRows: {
@@ -33,15 +34,23 @@ const onCancel = (isRefresh = false) => {
 
 const onCancelSumit = async () => {
     loading.value = true
+    const errMessage: string[] = []
     for (let i = 0; i < props.selectedRows.length; i++) {
         const { orderid, marketid, goodsid } = props.selectedRows[i]
         ///  参数信息
         formData.Header = { MarketID: marketid, GoodsID: goodsid }
         formData.OldOrderId = orderid
         /// 提交
-        await cancelSubmit()
+        await cancelSubmit().catch((err) => {
+            errMessage.push(err)
+        })
     }
     loading.value = false
+    if (errMessage.length) {
+        ElMessage.error('部分撤单失败:' + errMessage[0])
+    } else {
+        ElMessage.success('撤单成功')
+    }
     onCancel(true)
 }
 </script>

+ 85 - 26
src/packages/pc/views/footer/goods/order/clear/index.vue

@@ -1,52 +1,111 @@
-<!-- 商品订单-委托-一键全撤 -->
+<!-- 商品订单-委托-撤 -->
 <template>
-    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
-        <div class="g-text-message">确认要全部撤销吗?</div>
+    <app-drawer title="快撤" v-model:show="show" :width="400" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--vertical" label-width="80px" :model="formModel" :rules="formRules"
+            @submit.prevent>
+            <el-form-item label="委托方向">
+                <el-radio-group v-model="formModel.buyOrSell">
+                    <el-radio v-for="(item, index) in getBuyOrSellList()" :key="index" :label="item.value">
+                        {{ item.label }}
+                    </el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item prop="price" label="撤销价格">
+                <el-input-number ref="priceRef" placeholder="请输入" v-model="formModel.price" @keyup.enter="submitFocus" />
+            </el-form-item>
+        </el-form>
         <template #footer>
             <el-button type="info" @click="onCancel(false)">取消</el-button>
-            <el-button type="primary" @click="onCancelSumit()">提交</el-button>
+            <el-button ref="submitRef" type="primary" @click="onCancelSumit()">提交</el-button>
         </template>
     </app-drawer>
 </template>
 
 <script lang="ts" setup>
-import { ref } from 'vue'
-import { ElMessage } from 'element-plus'
-import { queryTradeOrderDetail } from '@/services/api/order'
+import { onMounted, ref, reactive, PropType } from 'vue'
+import { FormInstance, FormRules, ElMessage } from 'element-plus'
+import { BuyOrSell, getBuyOrSellList } from '@/constants/order'
 import { useCancelOrder } from '@/business/trade'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
+const props = defineProps({
+    dataList: {
+        type: Object as PropType<Model.TradeOrderDetailRsp[]>,
+        required: true
+    }
+})
+
 const { cancelSubmit, formData } = useCancelOrder()
+const formRef = ref<FormInstance>()
+const priceRef = ref()
+const submitRef = ref()
 const loading = ref(false)
 const show = ref(true)
 const refresh = ref(false)
 
+const formModel = reactive<{ buyOrSell: BuyOrSell; price?: number; }>({
+    buyOrSell: BuyOrSell.Buy
+})
+
+const formRules: FormRules = {
+    price: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (value) {
+                callback()
+            } else {
+                callback(new Error('请输入撤销价格'))
+            }
+        }
+    }]
+}
+
+// 提交按钮获取焦点
+const submitFocus = () => {
+    submitRef.value.ref.focus()
+}
+
 const onCancel = (isRefresh = false) => {
     show.value = false
     refresh.value = isRefresh
 }
 
 const onCancelSumit = () => {
-    loading.value = true
-    queryTradeOrderDetail({
-        data: {
-            tradeMode: '50',
-            orderStatus: '3,7,12'
+    formRef.value?.validate(async (valid) => {
+        if (valid) {
+            loading.value = true
+            const errMessage: string[] = []
+            const selectedRows = props.dataList.filter((e) => {
+                if (formModel.price) {
+                    switch (formModel.buyOrSell) {
+                        case BuyOrSell.Buy:
+                            return e.buyorsell === BuyOrSell.Buy && e.orderprice <= formModel.price
+                        case BuyOrSell.Sell:
+                            return e.buyorsell === BuyOrSell.Sell && e.orderprice >= formModel.price
+                    }
+                }
+                return false
+            })
+            for (let i = 0; i < selectedRows.length; i++) {
+                const { orderid, marketid, goodsid } = selectedRows[i]
+                ///  参数信息
+                formData.Header = { MarketID: marketid, GoodsID: goodsid }
+                formData.OldOrderId = orderid
+                /// 提交
+                await cancelSubmit().catch((err) => {
+                    errMessage.push(err)
+                })
+            }
+            loading.value = false
+            if (errMessage.length) {
+                ElMessage.error('部分撤单失败:' + errMessage[0])
+            } else if (selectedRows.length) {
+                ElMessage.success('撤单成功')
+            }
+            onCancel(true)
         }
-    }).then(async (res) => {
-        for (let i = 0; i < res.data.length; i++) {
-            const { orderid, marketid, goodsid } = res.data[i]
-            ///  参数信息
-            formData.Header = { MarketID: marketid, GoodsID: goodsid }
-            formData.OldOrderId = orderid
-            /// 提交
-            await cancelSubmit()
-        }
-        loading.value = false
-        onCancel(true)
-    }).catch((err) => {
-        loading.value = false
-        ElMessage.error('提交失败:' + err)
     })
 }
+
+onMounted(() => priceRef.value?.focus())
 </script>

+ 7 - 4
src/packages/pc/views/footer/goods/order/index.vue

@@ -3,8 +3,11 @@
     <app-table :data="dataList" selection-type="multiple" v-model:columns="tableColumns" :loading="loading"
         @selection-change="onTableSelect">
         <template #headerRight>
-            <el-button type="danger" size="small" :disabled="selectedRows.length === 0"
-                @click="openComponent('cancel')">撤销</el-button>
+            <div class="buttonbar">
+                <el-button type="primary" size="small" :disabled="selectedRows.length === 0"
+                    @click="openComponent('cancel')">撤销</el-button>
+                <el-button type="primary" size="small" @click="openComponent('clear')">快撤</el-button>
+            </div>
         </template>
         <!-- 类型' -->
         <template #buyorsell="{ value }">
@@ -19,7 +22,7 @@
             {{ formatDate(value) }}
         </template>
         <template #footer>
-            <component ref="componentRef" v-bind="{ selectedRows }" :is="componentMap.get(componentId)"
+            <component ref="componentRef" v-bind="{ dataList, selectedRows }" :is="componentMap.get(componentId)"
                 @closed="closeComponent" v-if="componentId" />
         </template>
     </app-table>
@@ -37,7 +40,7 @@ import eventBus from '@/services/bus'
 
 const componentMap = new Map<string, unknown>([
     ['cancel', defineAsyncComponent(() => import('./cancel/index.vue'))], // 撤单
-    //['clear', defineAsyncComponent(() => import('./clear/index.vue'))], // 一键全
+    ['clear', defineAsyncComponent(() => import('./clear/index.vue'))], // 
 ])
 
 const dataList = ref<Model.TradeOrderDetailRsp[]>([])

+ 1 - 2
src/packages/pc/views/footer/goods/position/components/transfer/index.vue

@@ -1,8 +1,7 @@
 <!-- 商品订单-合约汇总-转让 -->
 <template>
     <app-drawer title="转让" :width="800" v-model:show="show" :loading="loading" :refresh="refresh">
-        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" label-position="left" :model="formData"
-            :rules="formRules">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" :model="formData" :rules="formRules">
             <el-form-item label="商品代码/名称">
                 <span>{{ selectedRow.goodscode }}/{{ selectedRow.goodsname }}</span>
             </el-form-item>

+ 1 - 2
src/packages/pc/views/footer/presell/transferposition/listing/index.vue

@@ -1,8 +1,7 @@
 <!-- 预售转让-转让持仓-转让 -->
 <template>
     <app-drawer title="转让" v-model:show="show" :loading="loading" :refresh="refresh" :width="800">
-        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" label-position="left" :model="formData"
-            :rules="formRules">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" :model="formData" :rules="formRules">
             <el-form-item label="商品代码/名称">
                 <span>{{ selectedRow.goodscode }}/{{ selectedRow.goodsname }}</span>
             </el-form-item>

+ 1 - 2
src/packages/pc/views/footer/spot/position/components/listing/index.vue

@@ -1,8 +1,7 @@
 <!-- 现货仓单-现货明细-挂牌 -->
 <template>
     <app-drawer title="挂牌" v-model:show="show" :loading="loading" :refresh="refresh" :width="800">
-        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" label-position="left" :model="formData"
-            :rules="formRules">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" :model="formData" :rules="formRules">
             <el-form-item label="商品代码/名称">
                 <span>{{ selectedRow.wrstandardcode }}/{{ selectedRow.wrstandardname }}</span>
             </el-form-item>

+ 4 - 5
src/packages/pc/views/market/trade/goods/list/listing/index.less

@@ -22,6 +22,10 @@
         padding: 10px;
         border-left: 1px solid #363f45;
 
+        .el-form {
+            padding: 0;
+        }
+
         .header-title {
             text-align: center;
             margin-bottom: 15px;
@@ -39,10 +43,5 @@
                 flex: 1;
             }
         }
-
-        .el-radio {
-            --el-radio-text-color: #7a8a94;
-            --el-color-primary: #3a87f7;
-        }
     }
 }

+ 3 - 2
src/packages/pc/views/market/trade/goods/list/listing/index.vue

@@ -137,7 +137,7 @@ const formRules: FormRules = {
             if (value) {
                 callback()
             } else {
-                callback(new Error('请输入挂牌数量'))
+                callback(new Error('请输入数量'))
             }
         }
     }],
@@ -193,6 +193,7 @@ const onSubmit = (buildType: number) => {
                 formData.BuildType = buildType
 
                 formSubmit().then(() => {
+                    formData.OrderQty = undefined
                     ElMessage.success('挂牌成功')
                 }).catch((err) => {
                     ElMessage.error('挂牌失败:' + err)
@@ -229,7 +230,7 @@ const getOrderPrice = () => {
     }
 }
 
-watch([() => selectedGoodsId, () => orderPriceType.value], () => {
+watch([selectedGoodsId, orderPriceType], () => {
     formData.OrderPrice = getOrderPrice()
 })
 

+ 4 - 0
src/packages/pc/views/market/trade/presell/transfer/listing/index.less

@@ -22,6 +22,10 @@
         padding: 10px;
         border-left: 1px solid #363f45;
 
+        .el-form {
+            padding: 0;
+        }
+
         .header-title {
             text-align: center;
             margin-bottom: 15px;

+ 53 - 15
src/packages/pc/views/market/trade/presell/transfer/listing/index.vue

@@ -7,7 +7,7 @@
             <h4 class="header-title">订单交易</h4>
             <el-form ref="formRef" class="el-form--vertical" label-width="60px" :model="formData" :rules="formRules">
                 <el-form-item prop="GoodsID" label="商品">
-                    <el-select placeholder="请选择" v-model="selectedGoodsId" filterable>
+                    <el-select placeholder="请选择" v-model="selectedGoodsId" filterable @change="onGoodsChange">
                         <el-option :label="item.goodsname" :value="item.goodsid" v-for="(item, index) in marketGoodsList"
                             :key="index" />
                     </el-select>
@@ -22,7 +22,7 @@
                 <el-form-item prop="OrderPrice" label="价格">
                     <div class="el-form-item--col">
                         <el-input-number ref="priceRef" placeholder="请输入" :min="0" :step="priceStep"
-                            :precision="selectedGoods?.decimalplace" v-model="formData.OrderPrice"
+                            :precision="selectedGoods?.decimalplace" :disabled="isDisabled" v-model="formData.OrderPrice"
                             @keyup.enter="qtyInputFocus" />
                         <div v-if="selectedGoods">
                             <div class="row-price g-price-up">
@@ -116,6 +116,12 @@ const priceStep = computed(() => {
     return 1
 })
 
+// 价格类型
+const orderPriceType = computed(() => settingStore.getSettingValue('orderPriceType'))
+
+// 是否禁用价格输入
+const isDisabled = computed(() => [3, 4].includes(orderPriceType.value))
+
 const formRules: FormRules = {
     OrderPrice: [{
         required: true,
@@ -134,7 +140,7 @@ const formRules: FormRules = {
             if (value) {
                 callback()
             } else {
-                callback(new Error('请输入挂牌数量'))
+                callback(new Error('请输入数量'))
             }
         }
     }],
@@ -162,8 +168,12 @@ const onRadioChange = (value: number) => {
 
 const onPriceClick = (buyorsell: BuyOrSell, value: number) => {
     formData.BuyOrSell = buyorsell === BuyOrSell.Sell ? BuyOrSell.Buy : BuyOrSell.Sell
-    formData.OrderPrice = value
-    priceInputFocus()
+    if (isDisabled.value) {
+        qtyInputFocus()
+    } else {
+        formData.OrderPrice = value
+        priceInputFocus()
+    }
 }
 
 // 提交挂牌
@@ -192,10 +202,10 @@ const onSubmit = () => {
                     ElMessage.error('挂牌失败:' + err)
                 }).finally(() => {
                     const focusType = settingStore.getSettingValue('orderFocusType')
-                    if (focusType === 1) {
-                        priceInputFocus()
-                    } else {
+                    if (focusType === 2 || isDisabled.value) {
                         qtyInputFocus()
+                    } else {
+                        priceInputFocus()
                     }
                 })
             })
@@ -203,11 +213,7 @@ const onSubmit = () => {
     })
 }
 
-const goodsChange = () => {
-    const { last = 0, presettle = 0 } = selectedGoods.value ?? {}
-    formData.OrderPrice = last || presettle
-    formData.OrderQty = qtyStep.value
-
+const onGoodsChange = () => {
     if (selectedGoodsId.value) {
         getMineTradePositionExs({
             goodsid: selectedGoodsId.value
@@ -215,9 +221,41 @@ const goodsChange = () => {
     }
 }
 
-watch(selectedGoodsId, () => goodsChange())
+const getOrderPrice = () => {
+    const { last, bid, ask, presettle = 0 } = selectedGoods.value ?? {}
+    const price = last || presettle
+    // 1=现价,2=对手价,3=实时价,4=实时对手价
+    switch (orderPriceType.value) {
+        case 1:
+        case 3:
+            return price
+        case 2:
+        case 4:
+            if (formData.BuyOrSell === BuyOrSell.Buy) {
+                return ask || price
+            } else {
+                return bid || price
+            }
+        default:
+            return 0
+    }
+}
+
+watch([selectedGoodsId, orderPriceType], () => {
+    formData.OrderPrice = getOrderPrice()
+})
 
-onMounted(() => goodsChange())
+watch([() => formData.BuyOrSell, () => selectedGoods.value?.last, () => selectedGoods.value?.bid, () => selectedGoods.value?.ask], () => {
+    if (isDisabled.value) {
+        formData.OrderPrice = getOrderPrice()
+    }
+})
+
+onMounted(() => {
+    formData.OrderPrice = getOrderPrice()
+    formData.OrderQty = qtyStep.value
+    onGoodsChange()
+})
 </script>
 
 <style lang="less">

+ 0 - 14
src/packages/sbyj/components/base/banner/index.less

@@ -1,14 +0,0 @@
-.app-banner {
-    background-color: #ddd;
-
-    .van-swipe {
-        &-item {
-            font-size: 0;
-
-            img {
-                width: 100%;
-                height: 100%;
-            }
-        }
-    }
-}

+ 0 - 46
src/packages/sbyj/components/base/banner/index.vue

@@ -1,46 +0,0 @@
-<template>
-    <div class="app-banner" :style="`min-height: ${swipeHeight};`">
-        <Swipe :autoplay="5000" indicator-color="white" lazy-render>
-            <SwipeItem v-for="(src, index) in dataList" :key="index" :style="`height: ${swipeHeight};`">
-                <slot :src="src">
-                    <img :src="getFileUrl(src)" @click="onClick(index)" />
-                </slot>
-            </SwipeItem>
-        </Swipe>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { PropType, computed } from 'vue'
-import { Swipe, SwipeItem } from 'vant'
-import { getFileUrl } from '@/filters'
-
-const props = defineProps({
-    //数据列表
-    dataList: {
-        type: Array as PropType<string[]>,
-        default: () => ([])
-    },
-    height: {
-        type: [Number, String],
-        default: 180,
-    }
-})
-
-const emit = defineEmits(['click'])
-
-const swipeHeight = computed(() => {
-    if (typeof props.height === 'number') {
-        return props.height + 'px'
-    }
-    return props.height
-})
-
-const onClick = (index: number) => {
-    emit('click', index)
-}
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 62
src/packages/sbyj/components/base/html-container/index.vue

@@ -1,62 +0,0 @@
-<template>
-    <div ref="htmlRef" v-html="context"></div>
-</template>
-  
-<script lang="ts" setup>
-import { shallowRef, onMounted, onUnmounted } from 'vue'
-import plus from '@/utils/h5plus'
-import PhotoSwipeLightbox, { SlideData } from 'photoswipe/lightbox'
-import 'photoswipe/style.css'
-
-defineProps({
-    context: {
-        type: String,
-        default: ''
-    }
-})
-
-let lightbox: PhotoSwipeLightbox = null
-const htmlRef = shallowRef<HTMLElement>()
-
-onMounted(() => {
-    const el = htmlRef.value
-    if (el) {
-        el.querySelectorAll('a').forEach((e) => {
-            const href = e.href
-            e.onclick = () => plus.openURL(href)
-            e.removeAttribute('href')
-        })
-
-        if (!lightbox) {
-            lightbox = new PhotoSwipeLightbox({
-                gallery: el,
-                children: 'img',
-                pswpModule: () => import('photoswipe'),
-            })
-
-            // https://photoswipe.com/data-sources/#custom-html-markup
-            lightbox.addFilter('domItemData', (itemData: SlideData, el: HTMLImageElement) => {
-                if (el) {
-                    itemData.src = el.src
-                    itemData.w = el.naturalWidth
-                    itemData.h = el.naturalHeight
-                    itemData.msrc = el.src
-                }
-                return itemData
-            })
-
-            lightbox.on('beforeOpen', () => plus.hideStatusBar())
-            lightbox.on('close', () => plus.showStatusBar())
-            lightbox.init()
-        }
-    }
-})
-
-onUnmounted(() => {
-    if (lightbox) {
-        lightbox.destroy()
-        lightbox = null
-    }
-})
-</script>
-  

+ 0 - 12
src/packages/sbyj/components/base/html-panel/index.less

@@ -1,12 +0,0 @@
-.app-html {
-    display: flex;
-    flex-direction: column;
-    height: 100%;
-    padding: .2rem;
-
-    iframe {
-        flex: 1;
-        background-color: #fff;
-        border: 0;
-    }
-}

+ 0 - 42
src/packages/sbyj/components/base/html-panel/index.vue

@@ -1,42 +0,0 @@
-<template>
-    <div class="app-html">
-        <iframe ref="iframeRef" :src="url" v-if="show" />
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-//import http from '@/services/http'
-
-defineProps({
-    url: {
-        type: String,
-        required: true
-    },
-})
-
-const iframeRef = shallowRef<HTMLIFrameElement>()
-const show = shallowRef(false)
-
-setTimeout(() => {
-    show.value = true
-}, 200)
-
-// ios 不支持请求本地文件
-// http.request<string>({
-//     url: props.url,
-//     method: 'get',
-//     responseEncoding: 'utf-8'
-// }).then((res) => {
-//     const iframe = iframeRef.value?.contentWindow
-//     if (iframe) {
-//         iframe.document.open()
-//         iframe.document.write(res)
-//         iframe.document.close()
-//     }
-// })
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 17
src/packages/sbyj/components/base/iconfont/index.less

@@ -1,17 +0,0 @@
-.app-iconfont {
-    display        : inline-flex;
-    justify-content: center;
-    align-items    : center;
-
-    &__icon {
-        width         : 1em;
-        height        : 1em;
-        vertical-align: -0.15em;
-        fill          : currentColor;
-        overflow      : hidden;
-    }
-
-    &__label {
-        line-height: 1;
-    }
-}

+ 0 - 64
src/packages/sbyj/components/base/iconfont/index.vue

@@ -1,64 +0,0 @@
-<template>
-    <div ref="iconfontRef" class="app-iconfont">
-        <svg :class="['app-iconfont__icon', active && 'is-active']" aria-hidden="true" :style="iconStyles">
-            <use :xlink:href="activeIconName" :fill="activeColor" v-if="active" />
-            <use :xlink:href="iconName" :fill="color" v-else />
-        </svg>
-        <span class="app-iconfont__label">
-            <slot></slot>
-        </span>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, computed, PropType, onMounted } from 'vue'
-
-const props = defineProps({
-    icon: {
-        type: String,
-        required: true
-    },
-    color: String,
-    size: String,
-    active: Boolean,
-    activeIcon: String,
-    activeColor: String,
-    // 标签方向
-    labelDirection: {
-        type: String as PropType<'left' | 'right' | 'top' | 'bottom'>,
-        default: 'right',
-    },
-})
-
-const iconfontRef = shallowRef<HTMLDivElement>()
-const iconName = computed(() => '#' + props.icon)
-const activeIconName = computed(() => '#' + (props.activeIcon ?? props.icon))
-
-const iconStyles = computed(() => ({
-    fontSize: props.size
-}))
-
-onMounted(() => {
-    const el = iconfontRef.value
-    if (el) {
-        switch (props.labelDirection) {
-            case 'left': {
-                el.style.setProperty('flex-direction', 'row-reverse')
-                break
-            }
-            case 'top': {
-                el.style.setProperty('flex-direction', 'column-reverse')
-                break
-            }
-            case 'bottom': {
-                el.style.setProperty('flex-direction', 'column')
-                break
-            }
-        }
-    }
-})
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 72
src/packages/sbyj/components/base/list/index.less

@@ -1,72 +0,0 @@
-.app-list {
-    min-width: 100%;
-    background-color: #fff;
-    overflow-x: auto;
-    padding: 0 .32rem;
-
-    &__table {
-        width: 100%;
-        text-align: center;
-
-        th {
-            font-size: .24rem;
-            font-weight: normal;
-            color: #999;
-            white-space: nowrap;
-        }
-
-        td {
-            white-space: nowrap;
-        }
-    }
-
-    &__row {
-        position: relative;
-
-        &::after {
-            content: '';
-            position: absolute;
-            bottom: 0;
-            right: 0;
-            left: 0;
-            pointer-events: none;
-            border-bottom: 1px solid #eee;
-            transform: scaleY(.5);
-        }
-    }
-
-    &__column {
-        padding: .12rem .16rem;
-    }
-
-    &__header &__column {
-        padding: 0 .16rem;
-    }
-
-    &__column:first-child &__cell {
-        align-items: flex-start;
-        padding-left: 0;
-    }
-
-    &__column:last-child &__cell {
-        align-items: flex-end;
-        padding-right: 0;
-    }
-
-    &__cell {
-        display: flex;
-        flex-direction: column;
-        justify-content: center;
-        gap: .04rem;
-        min-height: .72rem;
-
-        .text-small {
-            font-size: .24rem;
-            color: #999;
-        }
-    }
-
-    &__body &__cell {
-        font-size: .28rem;
-    }
-}

+ 0 - 59
src/packages/sbyj/components/base/list/index.vue

@@ -1,59 +0,0 @@
-<template>
-    <div class="app-list">
-        <table class="app-list__table" cellspacing="0" cellpadding="0">
-            <!-- <colgroup>
-                <col :width="colWidth" v-for="i in columns.length" :key="i" />
-            </colgroup> -->
-            <thead class="app-list__header" v-if="showHeader">
-                <tr class="app-list__row">
-                    <th class="app-list__column" v-for="(column, i) in columns" :key="i">
-                        <div class="app-list__cell">{{ column.label }}</div>
-                    </th>
-                </tr>
-            </thead>
-            <tbody class="app-list__body">
-                <template v-for="(row, i) in dataList" :key="i">
-                    <tr class="app-list__row" @click="rowClick(row, i)">
-                        <td class="app-list__column" :class="column.className" v-for="(column, n) in columns"
-                            :key="i + n.toString()">
-                            <div class="app-list__cell">
-                                <slot :name="column.prop" :value="row[column.prop]" :row="row">{{ row[column.prop] }}
-                                </slot>
-                            </div>
-                        </td>
-                    </tr>
-                </template>
-            </tbody>
-        </table>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { PropType } from 'vue'
-
-defineProps({
-    dataList: {
-        type: Array,
-        required: true,
-    },
-    columns: {
-        type: Array as PropType<Model.TableColumn[]>,
-        required: true,
-    },
-    showHeader: {
-        type: Boolean,
-        default: true
-    }
-})
-
-const emit = defineEmits(['rowClick'])
-//const colWidth = computed(() => (100 / props.columns.length) + '%')
-
-const rowClick = (row: unknown, index: number) => {
-    emit('rowClick', row, index)
-}
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 40
src/packages/sbyj/components/base/popup/index.less

@@ -1,40 +0,0 @@
-.app-popup {
-    .app-modal__container {
-        min-height: 50%;
-        border-radius: var(--van-popup-round-border-radius, .28rem) var(--van-popup-round-border-radius, .28rem) 0 0;
-        overflow: hidden;
-    }
-
-    .app-view {
-        background-color: #fff;
-    }
-
-    &__header {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        background-color: #fff;
-        padding: .32rem;
-        padding-bottom: 0;
-
-        .title {
-            font-size: .32rem;
-            font-weight: bold;
-        }
-    }
-
-    &__container {
-        background-color: #fff;
-
-        padding: .2rem;
-    }
-
-    &__footer {
-        background-color: #fff;
-        padding-top: .48rem;
-
-        &:empty {
-            display: none;
-        }
-    }
-}

+ 0 - 45
src/packages/sbyj/components/base/popup/index.vue

@@ -1,45 +0,0 @@
-<template>
-    <app-modal class="app-popup" :show="show" direction="bottom" width="100%" @mask="closed">
-        <app-view class="g-form">
-            <template #header>
-                <slot name="header">
-                    <div class="app-popup__header">
-                        <div class="title">{{ title }}</div>
-                        <Icon name="close" size=".36rem" @click="closed" />
-                    </div>
-                </slot>
-            </template>
-            <div class="app-popup__container">
-                <slot></slot>
-            </div>
-            <template #footer>
-                <div class="g-form__footer app-popup__footer inset">
-                    <slot name="footer"></slot>
-                </div>
-            </template>
-        </app-view>
-    </app-modal>
-</template>
-
-<script lang="ts" setup>
-import { Icon } from 'vant'
-import AppModal from '@/components/base/modal/index.vue'
-
-defineProps({
-    show: {
-        type: Boolean,
-        default: false
-    },
-    title: String
-})
-
-const emit = defineEmits(['update:show'])
-
-const closed = () => {
-    emit('update:show', false)
-}
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 4
src/packages/sbyj/components/base/pull-refresh/index.less

@@ -1,4 +0,0 @@
-.app-pull-refresh {
-    height: 100%;
-    overflow-y: auto;
-}

+ 0 - 114
src/packages/sbyj/components/base/pull-refresh/index.vue

@@ -1,114 +0,0 @@
-<template>
-    <PullRefresh class="app-pull-refresh" v-model="refreshing" @refresh="onRefresh">
-        <slot name="header"></slot>
-        <List ref="listRef" v-model:loading="showLoading" v-model:error="showError" :finished="finished" @load="onLoad">
-            <slot></slot>
-            <template #finished>
-                <span>{{ finishedText }}</span>
-            </template>
-            <template #error>
-                <span>{{ errorText }}</span>
-            </template>
-        </List>
-        <slot name="footer"></slot>
-    </PullRefresh>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, computed, nextTick, watch } from 'vue'
-import { List, PullRefresh, ListInstance } from 'vant'
-
-const props = defineProps({
-    loading: {
-        type: Boolean,
-        default: false,
-    },
-    pageIndex: {
-        type: Number,
-        default: 1,
-    },
-    pageCount: {
-        type: Number,
-        default: 1,
-    },
-    error: {
-        type: Boolean,
-        default: false,
-    },
-    finishedText: {
-        type: String,
-        default: '没有更多了',
-    },
-    errorText: {
-        type: String,
-        default: '请求失败,点击重新加载',
-    }
-})
-
-const emit = defineEmits(['update:loading', 'update:pageIndex', 'update:error', 'refresh'])
-const listRef = shallowRef<ListInstance>()
-const refreshing = shallowRef(false) // 是否处于下拉加载状态
-const finished = shallowRef(false) // 是否已加载完成所有数据
-const currentPage = shallowRef(props.pageIndex)
-
-const showLoading = computed({
-    get: () => props.loading,
-    set: (val) => emit('update:loading', val)
-})
-
-const showError = computed({
-    get: () => props.error,
-    set: (val) => emit('update:error', val)
-})
-
-// 上拉加载
-const onLoad = () => {
-    showLoading.value = false
-    if (refreshing.value) {
-        currentPage.value = 1
-    }
-    nextTick(() => {
-        if (currentPage.value <= props.pageCount) {
-            emit('refresh')
-        } else {
-            refreshing.value = false
-            finished.value = true
-        }
-    })
-}
-
-// 下拉刷新
-const onRefresh = () => {
-    // 下拉刷新过程中,可能会触发上拉加载,导致发送两次请求,所以先将 finished 设为 true,完成后再设为 false
-    finished.value = true
-    onLoad()
-}
-
-watch(showLoading, (status) => {
-    if (!status) {
-        finished.value = false
-        if (refreshing.value) {
-            refreshing.value = false
-        }
-        if (!showError.value) {
-            currentPage.value++
-        }
-    }
-})
-
-watch(currentPage, (val) => {
-    emit('update:pageIndex', val)
-})
-
-// 暴露组件属性给父组件调用
-defineExpose({
-    refresh: () => {
-        currentPage.value = 1
-        onRefresh()
-    },
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 10
src/packages/sbyj/components/base/qrcode-scan/index.less

@@ -1,10 +0,0 @@
-.app-qrcode-scan {
-    &__camera {
-        position: fixed;
-        bottom  : 0;
-        left    : 0;
-        z-index : 1000;
-        width   : 100vw;
-        height  : 30vh;
-    }
-}

+ 0 - 79
src/packages/sbyj/components/base/qrcode-scan/index.vue

@@ -1,79 +0,0 @@
-<template>
-    <div class="app-qrcode-scan">
-        <div @click="scan">
-            <slot>
-                <Button type="primary">扫一扫</Button>
-            </slot>
-        </div>
-        <div id="camera" class="app-qrcode-scan__camera"></div>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { onMounted, shallowRef } from 'vue'
-import { Button, showFailToast } from 'vant'
-import { Html5Qrcode } from 'html5-qrcode'
-import plus from '@/utils/h5plus'
-
-const emit = defineEmits(['success'])
-const html5QrCode = shallowRef<Html5Qrcode>()
-const showCamera = shallowRef(false)
-
-const scan = () => {
-    plus.onPlusReady((plus) => {
-        const barcode = plus.barcode.create('barcode', [plus.barcode.QR], {
-            background: '#fff',
-            frameColor: '#07c160',
-            scanbarColor: '#07c160',
-            top: '100px',
-            left: '0px',
-            width: '100%',
-            height: '580px',
-            position: 'static'
-        });
-        barcode.onmarked = (type: any, result: any) => {
-            console.log('扫码成功', type, result)
-            emit('success', result)
-            barcode.close()
-        }
-        barcode.onerror = (err: any) => {
-            console.log('扫码失败', err)
-            showFailToast('扫码失败')
-        }
-        plus.webview.currentWebview().append(barcode);//必要的
-    })
-}
-
-const onScan = () => {
-    Html5Qrcode.getCameras().then(devices => {
-        if (devices && devices.length) {
-            html5QrCode.value?.start(
-                {
-                    facingMode: 'environment'
-                },
-                {
-                    fps: 10,
-                    qrbox: { width: 250, height: 250 }
-                },
-                (decodedText) => {
-                    emit('success', decodedText)
-                },
-                (err) => {
-                    console.log('html5QrCode', err)
-                }).catch(() => {
-                    showFailToast('获取设备信息失败')
-                })
-        }
-    }).catch(() => {
-        showFailToast('您需要授予相机访问权限')
-    })
-}
-
-onMounted(() => {
-    html5QrCode.value = new Html5Qrcode('camera')
-})
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 13
src/packages/sbyj/components/base/region/index.less

@@ -1,13 +0,0 @@
-.app-region {
-    flex       : 1;
-    display    : flex;
-    align-items: center;
-
-    &__input {
-        flex: 1;
-    }
-
-    input {
-        width: 100%;
-    }
-}

+ 0 - 103
src/packages/sbyj/components/base/region/index.vue

@@ -1,103 +0,0 @@
-<template>
-    <div class="app-region" @click="onClick">
-        <slot :label="inputValue">
-            <input class="app-region__input" v-model="inputValue" :placeholder="placeholder" readonly />
-        </slot>
-        <Popup v-model:show="show" position="bottom" teleport="body" round>
-            <Cascader :title="title" v-model="selectedValue" :options="options" @close="show = false" @change="onChange"
-                @finish="onFinish" />
-        </Popup>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, computed, watch } from 'vue'
-import { Popup, Cascader, CascaderOption } from 'vant'
-import axios from 'axios'
-
-const props = defineProps({
-    modelValue: {
-        type: [String, Number],
-        default: 0
-    },
-    label: {
-        type: String,
-    },
-    title: {
-        type: String,
-        default: '请选择地区'
-    },
-    readonly: {
-        type: Boolean,
-        default: false
-    },
-    placeholder: {
-        type: String,
-        default: '请选择'
-    },
-})
-
-const emit = defineEmits(['update:modelValue', 'update:label', 'change', 'finish'])
-const show = shallowRef(false) // 是否弹出选择器
-const inputValue = shallowRef(props.label)
-const options = shallowRef<CascaderOption[]>([])
-
-// 选中的值
-const selectedValue = computed({
-    get: () => props.modelValue,
-    set: (val) => emit('update:modelValue', val)
-})
-
-const onClick = () => {
-    if (!props.readonly) {
-        show.value = true
-    }
-}
-
-// 选中项变化时触发
-const onChange = ({ value }: { value: string | number }) => {
-    emit('change', value)
-}
-
-// 全部选项选择完毕后触发
-const onFinish = ({ selectedOptions }: { selectedOptions: CascaderOption[] }) => {
-    const selection = selectedOptions.map((e) => e.value)
-    show.value = false
-    inputValue.value = selectedOptions.map((option) => option.text).join(' ')
-
-    emit('update:modelValue', [...selection].pop())
-    emit('update:label', inputValue.value)
-    emit('finish', selection)
-}
-
-// 扁平列表树形化
-const arrayToTree = (list: Model.Region[]) => {
-    const getChildren = (parent?: string) => {
-        const result: CascaderOption[] = []
-        list.forEach((e) => {
-            if (e.parentcode === parent) {
-                const children = getChildren(e.divisioncode)
-                result.push({
-                    text: e.divisionname,
-                    value: e.autoid,
-                    children: children.length ? children : undefined,
-                })
-            }
-        })
-        return result
-    }
-    return getChildren('0086')
-}
-
-watch(() => props.label, (val) => {
-    inputValue.value = val
-})
-
-axios('./config/address.json').then((res) => {
-    options.value = arrayToTree(res.data)
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 39
src/packages/sbyj/components/base/router-transition/index.backup.less

@@ -1,39 +0,0 @@
-/* 动画时长 */
-@transition-duration: 220ms;
-
-/* 无过渡效果 */
-.delay-enter-active,
-.delay-leave-active {
-    transition-duration: @transition-duration;
-}
-
-.route-in-enter-active,
-.route-in-leave-active,
-.route-out-enter-active,
-.route-out-leave-active {
-    pointer-events: none;
-    position: absolute;
-    transition-property: transform;
-    transition-duration: @transition-duration;
-    background-color: #fff;
-}
-
-.route-in-enter-from {
-    z-index: 1;
-    transform: translate3d(100%, 0, 0);
-}
-
-.route-out-enter-from {
-    z-index: 1;
-    transform: translate3d(-100%, 0, 0);
-}
-
-.route-out-leave-active {
-    transform: translate3d(100%, 0, 0);
-    transition-timing-function: ease-in;
-}
-
-.route-in-leave-active {
-    transform: translate3d(-100%, 0, 0);
-    transition-timing-function: ease-in;
-}

+ 0 - 83
src/packages/sbyj/components/base/router-transition/index.less

@@ -1,83 +0,0 @@
-/* 动画时长 */
-@transition-duration: 220ms;
-
-/* 无过渡效果 */
-.delay-enter-active,
-.delay-leave-active {
-    transition-duration: @transition-duration;
-}
-
-.route-in-leave-from,
-.route-in-enter-from,
-.route-out-enter-from,
-.route-out-enter-from {
-    will-change: transform, opacity;
-}
-
-.route-in-leave-to,
-.route-in-enter-active,
-.route-out-leave-active,
-.route-out-enter-to {
-    pointer-events: none;
-    transition: transform @transition-duration;
-}
-
-.route-in-leave-from {
-    &::after {
-        content: '';
-        opacity: 0;
-    }
-}
-
-.route-in-leave-to {
-    &::after {
-        content: '';
-        position: absolute;
-        z-index: 100;
-        top: 0;
-        left: 0;
-        width: 100vw;
-        height: 100vh;
-        background-color: rgba(0, 0, 0, .5);
-        opacity: 1;
-        transition: opacity @transition-duration;
-    }
-}
-
-.route-in-enter-from {
-    transform: translate3d(100%, 0, 0);
-}
-
-.route-in-enter-active {
-    position: absolute;
-    z-index: 1000;
-    top: 0;
-}
-
-.route-out-leave-active {
-    position: absolute;
-    z-index: 1000;
-    transform: translate3d(100%, 0, 0);
-}
-
-.route-out-enter-from {
-    &::after {
-        content: '';
-        opacity: 1;
-    }
-}
-
-.route-out-enter-to {
-    &::after {
-        content: '';
-        position: absolute;
-        z-index: 100;
-        top: 0;
-        left: 0;
-        width: 100vw;
-        height: 100vh;
-        background-color: rgba(0, 0, 0, .5);
-        opacity: 0;
-        transition: opacity @transition-duration;
-    }
-}

+ 0 - 18
src/packages/sbyj/components/base/router-transition/index.vue

@@ -1,18 +0,0 @@
-<template>
-    <transition :name="transitionName">
-        <slot></slot>
-    </transition>
-</template>
-  
-<script lang="ts" setup>
-defineProps({
-    transitionName: {
-        type: String,
-        default: 'delay'
-    }
-})
-</script>
-  
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 13
src/packages/sbyj/components/base/select/index.less

@@ -1,13 +0,0 @@
-.app-select {
-    flex       : 1;
-    display    : flex;
-    align-items: center;
-
-    &__input {
-        flex: 1;
-    }
-
-    input {
-        width: 100%;
-    }
-}

+ 0 - 96
src/packages/sbyj/components/base/select/index.vue

@@ -1,96 +0,0 @@
-<template>
-    <div class="app-select" @click="onClick">
-        <slot :label="inputValue">
-            <input class="'app-select__input'" v-model="inputValue" :placeholder="placeholder" readonly />
-        </slot>
-        <Popup v-model:show="show" position="bottom" teleport="body" round>
-            <Picker :columns="columns" @cancel="onCancel" @confirm="onConfirm" />
-        </Popup>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, computed, PropType, watch } from 'vue'
-import { Popup, Picker, PickerConfirmEventParams, FieldInstance } from 'vant'
-
-const props = defineProps({
-    modelValue: {
-        type: [Number, String]
-    },
-    options: {
-        type: Array,
-        default: () => ([])
-    },
-    optionProps: {
-        type: Object as PropType<{ label?: string; value?: string; }>,
-        default: () => ({
-            label: 'label',
-            value: 'value'
-        })
-    },
-    readonly: {
-        type: Boolean,
-        default: false
-    },
-    placeholder: {
-        type: String,
-        default: '请选择'
-    },
-})
-
-const emit = defineEmits(['update:show', 'update:modelValue', 'confirm'])
-const fieldRef = shallowRef<FieldInstance>()
-const show = shallowRef(false) // 是否弹出选择器
-const selectedIndex = shallowRef(-1)
-
-const columns = computed(() => {
-    if (props.options) {
-        return props.options.map((e) => ({
-            text: e[props.optionProps.label],
-            value: e[props.optionProps.value],
-        }))
-    }
-    return []
-})
-
-// 当前输入框的值
-const inputValue = computed(() => {
-    const item = props.options[selectedIndex.value]
-    if (item) {
-        return item[props.optionProps.label] ?? ''
-    }
-    return ''
-})
-
-const onClick = () => {
-    if (!props.readonly) {
-        show.value = true
-    }
-}
-
-const onCancel = () => {
-    show.value = false
-}
-
-const onConfirm = ({ selectedIndexes: [index], selectedValues: [value] }: PickerConfirmEventParams) => {
-    show.value = false
-    if (selectedIndex.value !== index) {
-        // 更新当前选中的值
-        selectedIndex.value = index
-        fieldRef.value?.validate()
-
-        emit('update:modelValue', value)
-        emit('confirm', value, index)
-    }
-}
-
-watch(() => [props.modelValue, props.options], ([value, items]) => {
-    selectedIndex.value = items.findIndex((e) => e[props.optionProps.value]?.toString() === value?.toString())
-}, {
-    immediate: true
-})
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 47
src/packages/sbyj/components/base/tabbar/index.less

@@ -1,47 +0,0 @@
-.app-tabbar {
-    height          : 1rem;
-    background-color: #fff;
-
-    &__wrapper {
-        bottom    : 0;
-        display   : flex;
-        width     : 100%;
-        height    : ~"calc(1rem - 1px)";
-        border-top: 1px solid #eee;
-        box-sizing: content-box;
-    }
-
-    &__item {
-        flex           : 1;
-        display        : flex;
-        flex-direction : column;
-        justify-content: center;
-        align-items    : center;
-        height         : inherit;
-        cursor         : pointer;
-
-        [class^='g-icon'] {
-            display        : flex;
-            flex-direction : column;
-            justify-content: center;
-            align-items    : center;
-
-            img {
-                width     : .44rem;
-                height    : .44rem;
-                object-fit: contain;
-            }
-
-            span {
-                font-size : .24rem;
-                margin-top: .05rem;
-            }
-
-            &:before {
-                width    : .44rem;
-                height   : .44rem;
-                font-size: .44rem;
-            }
-        }
-    }
-}

+ 0 - 69
src/packages/sbyj/components/base/tabbar/index.vue

@@ -1,69 +0,0 @@
-<template>
-  <div class="app-tabbar">
-    <div class="app-tabbar__wrapper" :style="styles">
-      <template v-for="(item, index) in dataList" :key="index">
-        <div :class="['app-tabbar__item', 'app-tabbar__item--' + item.name, dataIndex === index && 'is-active']"
-          @click="onClick(index)">
-          <slot :item="item" :index="index">
-            <!--判断是否图片图标-->
-            <template v-if="item.iconType === 'image'">
-              <div :class="['g-icon', dataIndex === index && 'active']">
-                <img :src="item.activeIcon" v-if="dataIndex === index" />
-                <img :src="item.icon" v-else />
-                <span>{{ item.label }}</span>
-              </div>
-            </template>
-            <template v-else>
-              <app-iconfont label-direction="bottom" :icon="item.icon" :active-icon="item.activeIcon"
-                :active="dataIndex === index">{{ item.label }}</app-iconfont>
-            </template>
-          </slot>
-        </div>
-      </template>
-    </div>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { PropType, computed } from 'vue'
-import { Tabbar } from './types'
-import { useGlobalStore } from '@/stores'
-import AppIconfont from '@/packages/sbyj/components/base/iconfont/index.vue'
-
-const emit = defineEmits(['click'])
-
-const props = defineProps({
-  // 数据列表
-  dataList: {
-    type: Array as PropType<Tabbar[]>,
-    default: () => ([]),
-  },
-  // 当前标签索引
-  dataIndex: {
-    type: Number,
-    default: 0,
-  },
-  // 是否固定在底部
-  fixed: {
-    type: Boolean,
-    default: false,
-  }
-})
-
-const globalStore = useGlobalStore()
-
-const styles = computed(() => ({
-  position: props.fixed ? 'fixed' : 'static',
-  width: globalStore.clientWidth + 'px',
-}))
-
-const onClick = (index: number) => {
-  if (props.dataIndex !== index) {
-    emit('click', index)
-  }
-}
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 7
src/packages/sbyj/components/base/tabbar/types.ts

@@ -1,7 +0,0 @@
-export interface Tabbar {
-    name: string;
-    label: string;
-    iconType?: 'iconfont' | 'image';
-    icon: string;
-    activeIcon?: string;
-}

+ 0 - 28
src/packages/sbyj/components/base/table/index.less

@@ -1,28 +0,0 @@
-.app-table {
-    overflow: auto;
-
-    &__body {
-        width           : 100%;
-        text-align      : center;
-        background-color: #fff;
-        margin-bottom   : .2rem;
-        border          : 0;
-    }
-
-    & thead &__row {
-        background-color: #d9e2ed;
-    }
-
-    & thead &__cell {
-        padding: .12rem 0;
-    }
-
-    & tbody &__row {
-        background-color: #fff
-    }
-
-    & tbody &__cell {
-        color  : #666;
-        padding: .12rem 0;
-    }
-}

+ 0 - 72
src/packages/sbyj/components/base/table/index.vue

@@ -1,72 +0,0 @@
-<template>
-    <div class="app-table">
-        <table class="app-table__body" cellspacing="0" cellpadding="0">
-            <thead>
-                <Draggable class="app-table__row" :list="columns" tag="tr" item-key="key">
-                    <template #header v-if="$slots.expand">
-                        <th class="app-table__cell expand"></th>
-                    </template>
-                    <template #item="{ element }">
-                        <th class="app-table__cell">{{ element.label }}</th>
-                    </template>
-                </Draggable>
-            </thead>
-            <tbody>
-                <template v-for="(row, i) in dataList" :key="i">
-                    <tr class="app-table__row" @click="rowClick(i)">
-                        <td class="app-table__cell expand" v-if="$slots.expand">
-                            <Icon name="arrow-down" v-if="selectedIndex === i" />
-                            <Icon name="arrow" v-else />
-                        </td>
-                        <td class="app-table__cell" :class="column.className" v-for="(column, n) in columns"
-                            :key="i + n.toString()">
-                            <slot :name="column.prop" :value="row[column.prop]" :row="row">{{ row[column.prop] }}</slot>
-                        </td>
-                    </tr>
-                    <!-- expand -->
-                    <tr class="app-table__row expand" v-show="selectedIndex === i" v-if="$slots.expand">
-                        <td class="app-table__cell" :colspan="columns.length + 1">
-                            <slot name="expandRow" :row="row"></slot>
-                        </td>
-                    </tr>
-                </template>
-            </tbody>
-        </table>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { PropType, ref } from 'vue'
-import { Icon } from 'vant'
-import { TableColumn } from './types'
-import Draggable from 'vuedraggable'
-
-const emit = defineEmits(['rowClick'])
-
-const props = defineProps({
-    // 数据列表
-    dataList: {
-        type: Array,
-        default: () => ([]),
-    },
-    columns: {
-        type: Array as PropType<TableColumn[]>,
-        default: () => ([]),
-    },
-})
-
-const selectedIndex = ref(-1);
-
-const rowClick = (index: number) => {
-    if (selectedIndex.value === index) {
-        selectedIndex.value = -1;
-    } else {
-        selectedIndex.value = index;
-    }
-    emit('rowClick', index, props.dataList[index]);
-}
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 8
src/packages/sbyj/components/base/table/types.ts

@@ -1,8 +0,0 @@
-export interface TableColumn {
-    prop: string;
-    label: string;
-    className?: string;
-    align?: string;
-    width?: number;
-    sort?: number;
-}

+ 0 - 43
src/packages/sbyj/components/base/uploader/index.vue

@@ -1,43 +0,0 @@
-<template>
-    <Uploader v-model="fileList" :max-count="1" :max-size="5 * 1024 * 1024" @oversize="onOversize" :after-read="afterRead"
-        @delete="onDelete" />
-</template>
-
-<script lang="ts" setup>
-import { ref } from 'vue'
-import { showFailToast, Uploader, UploaderFileListItem } from 'vant'
-import service from '@/services'
-import axios from 'axios'
-
-const emit = defineEmits(['success'])
-const fileList = ref<UploaderFileListItem[]>([])
-
-const onOversize = () => {
-    showFailToast('图片大小不能超过 5Mb')
-}
-
-// eslint-disable-next-line
-const afterRead = (file: any) => {
-    const data = new FormData()
-    data.append('file', file.file)
-
-    file.status = 'uploading'
-    file.message = '上传中...'
-    axios.post(service.getConfig('uploadUrl'), data).then(res => {
-        if (res.status == 200) {
-            file.status = 'success'
-            file.message = '上传成功'
-            if (res.data.length) {
-                emit('success', res.data[0].filePath)
-            }
-        } else {
-            file.status = 'failed'
-            file.message = '上传失败'
-        }
-    })
-}
-
-const onDelete = () => {
-    emit('success', '')
-}
-</script>

+ 0 - 12
src/packages/sbyj/components/base/waterfall/index.less

@@ -1,12 +0,0 @@
-.app-waterfall {
-    ul {
-        position: relative;
-
-        li {
-            position: absolute;
-            opacity: 0;
-            color: #333;
-            //transition: opacity .2s;
-        }
-    }
-}

+ 0 - 108
src/packages/sbyj/components/base/waterfall/index.vue

@@ -1,108 +0,0 @@
-<template>
-    <div class="app-waterfall">
-        <ul ref="warterfallRef">
-            <li v-for="(item, index) in dataList" :key="index">
-                <slot :item="item">{{ item }}</slot>
-            </li>
-        </ul>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, watch, nextTick, onActivated } from 'vue'
-
-const props = defineProps({
-    //数据列表
-    dataList: {
-        type: Array,
-        default: () => ([])
-    },
-    //列数
-    column: {
-        type: Number,
-        default: 2
-    },
-    //间距
-    gap: {
-        type: Number,
-        default: 10
-    }
-})
-
-const warterfallRef = shallowRef<HTMLDivElement>()
-const total = shallowRef(0)
-const hightList: number[] = [] //瀑布流高度列表
-
-const render = () => {
-    nextTick(async () => {
-        const el = warterfallRef.value
-        if (el) {
-            const nodes = el.querySelectorAll('li')
-
-            for (let i = total.value; i < nodes.length; i++) {
-                const li = nodes[i]
-                const images = li.querySelectorAll('img')
-
-                // 等待所有图片加载完成
-                for (let n = 0; n < images.length; n++) {
-                    await new Promise<void>((resolve) => {
-                        if (images[n].complete) {
-                            resolve()
-                        } else {
-                            images[n].onload = () => {
-                                resolve()
-                            }
-                            images[n].onerror = () => {
-                                resolve()
-                            }
-                        }
-                    })
-                }
-
-                if (!el.offsetWidth) {
-                    // 在 keepalive 组件下,如果在数据未全部加载出来之前跳转了页面,这会导致元素获取不到宽度,从而影响瀑布流布局的正常显示
-                    // 所以需要停止还未加载完成的数据渲染,待页面重新打开后继续加载
-                    break
-                }
-
-                const space = (props.column - 1) * props.gap // 总间距
-                const width = (el.offsetWidth - space) / props.column // 每列的宽度
-
-                li.style.width = width + 'px'
-                li.style.opacity = '1'
-
-                //判断是否首行
-                if (i < props.column) {
-                    li.style.top = '0'
-                    li.style.left = (width * i) + (props.gap * i) + 'px'
-                    hightList.push(li.offsetHeight + props.gap)
-                } else {
-                    const minHeight = Math.min(...hightList) // 获取数组中最小值
-                    const index = hightList.findIndex((e) => e === minHeight) // 最小值的索引位置
-                    li.style.top = minHeight + 'px'
-                    li.style.left = (width * index) + (props.gap * index) + 'px'
-                    hightList[index] += li.offsetHeight + props.gap
-                }
-
-                total.value++
-            }
-
-            const maxHeight = Math.max(...hightList); // 获取数组中最大值
-            el.style.height = (maxHeight - props.gap) + 'px'
-        }
-    })
-}
-
-watch(() => props.dataList, () => render())
-
-onActivated(() => {
-    // 对未完成加载的数据进行渲染
-    if (props.dataList.length > total.value) {
-        render()
-    }
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 27
src/packages/sbyj/components/layouts/block/index.less

@@ -1,27 +0,0 @@
-.app-block {
-    padding: .2rem;
-    padding-bottom: 0;
-
-    &:last-of-type {
-        padding-bottom: .2rem;
-    }
-
-    &__wrapper {
-        background-color: #fff;
-        border-radius: .1rem;
-        overflow: hidden;
-    }
-
-    &.bg &__wrapper {
-        //background: #fff url('../../../assets/images/block-bg.png') no-repeat center bottom;
-        background-size: 100%;
-    }
-
-    &.flex &__wrapper {
-        display: flex;
-    }
-
-    &.flex--column &__wrapper {
-        flex-direction: column;
-    }
-}

+ 0 - 14
src/packages/sbyj/components/layouts/block/index.vue

@@ -1,14 +0,0 @@
-<template>
-    <div class="app-block">
-        <div class="app-block__wrapper">
-            <slot></slot>
-        </div>
-    </div>
-</template>
-
-<script lang="ts" setup>
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 1
src/packages/sbyj/components/layouts/footer/index.less

@@ -1 +0,0 @@
-.app-footer {}

+ 0 - 12
src/packages/sbyj/components/layouts/footer/index.vue

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

+ 0 - 25
src/packages/sbyj/components/layouts/form/index.vue

@@ -1,25 +0,0 @@
-<template>
-    <div class="app-form">
-        <div class="app-form__header">
-            <slot name="header"></slot>
-        </div>
-        <Form ref="formRef" class="app-form__body" @submit="formSubmit">
-            <slot></slot>
-        </Form>
-        <div class="app-form__footer">
-            <slot name="footer"></slot>
-        </div>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { Form, FormInstance } from 'vant'
-
-const emit = defineEmits(['submit'])
-const formRef = shallowRef<FormInstance>()
-
-const formSubmit = () => {
-    emit('submit')
-}
-</script>

+ 0 - 30
src/packages/sbyj/components/layouts/index.ts

@@ -1,30 +0,0 @@
-import { App } from 'vue'
-import AppPage from './page/index.vue'
-import AppView from './view/index.vue'
-import AppScrollView from './scroll-view/index.vue'
-import AppStatusbar from './statusbar/index.vue'
-import AppNavback from './navback/index.vue'
-import AppNavbar from './navbar/index.vue'
-import AppFooter from './footer/index.vue'
-import AppBlock from './block/index.vue'
-
-const components = {
-    AppPage,
-    AppView,
-    AppFooter,
-    AppScrollView,
-    AppStatusbar,
-    AppNavback,
-    AppNavbar,
-    AppBlock,
-}
-
-const install = (app: App) => {
-    for (const [key, value] of Object.entries(components)) {
-        app.component(key, value); //注册全局组件
-    }
-}
-
-export default {
-    install,
-}

+ 0 - 23
src/packages/sbyj/components/layouts/navback/index.less

@@ -1,23 +0,0 @@
-.app-navback {
-    position: fixed;
-    left: 0;
-    top: 0;
-    z-index: 1;
-    display: inline-flex;
-
-    &:empty {
-        display: none;
-    }
-
-    >.van-icon {
-        display: inline-flex;
-        align-items: center;
-        justify-content: center;
-        height: var(--navbar-height);
-        line-height: 1;
-        font-size: .36rem;
-        color: var(--navbar-backbutton-color);
-        cursor: pointer;
-        padding: 0 .28rem;
-    }
-}

+ 0 - 30
src/packages/sbyj/components/layouts/navback/index.vue

@@ -1,30 +0,0 @@
-<template>
-    <app-statusbar class="app-navback" @click="goback">
-        <slot>
-            <Icon name="arrow-left" />
-        </slot>
-    </app-statusbar>
-</template>
-
-<script lang="ts" setup>
-import { useAttrs } from 'vue'
-import { useRouter } from 'vue-router'
-import { Icon } from 'vant'
-
-const emit = defineEmits<{ (event: string, ...args: unknown[]): void }>()
-const router = useRouter()
-const attrs = useAttrs()
-
-// 返回按钮事件
-const goback = () => {
-    if (attrs.onBack) {
-        emit('back')
-    } else {
-        router.go(-1)
-    }
-}
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 70
src/packages/sbyj/components/layouts/navbar/index.less

@@ -1,70 +0,0 @@
-.app-navbar {
-    z-index: 100;
-
-    &__wrapper {
-        background: var(--navbar-background);
-        color: var(--navbar-color);
-    }
-
-    &__backbutton {
-        position: absolute;
-        z-index: 1;
-
-        &:empty {
-            display: none;
-        }
-
-        >.van-icon {
-            display: inline-flex;
-            align-items: center;
-            justify-content: center;
-            height: var(--navbar-height);
-            line-height: 1;
-            font-size: .36rem;
-            color: var(--navbar-backbutton-color);
-            cursor: pointer;
-            padding: 0 .28rem;
-        }
-    }
-
-    &__header {
-        display: flex;
-        align-items: center;
-
-        .column {
-            flex: 1;
-            display: inline-flex;
-            justify-content: center;
-            align-items: center;
-            height: var(--navbar-height);
-            white-space: nowrap;
-
-            &-block {
-                display: flex;
-                justify-content: center;
-                align-items: center;
-                height: 100%;
-            }
-
-            &--left>.column-block {
-                margin-right: auto;
-            }
-
-            &--right>.column-block {
-                padding-right: .28rem;
-                margin-left: auto;
-            }
-
-            &--center {
-                flex: auto;
-                font-size: .36rem;
-            }
-        }
-    }
-
-    &__footer {
-        &:empty {
-            display: none;
-        }
-    }
-}

+ 0 - 75
src/packages/sbyj/components/layouts/navbar/index.vue

@@ -1,75 +0,0 @@
-<template>
-  <div class="app-navbar" :style="styles">
-    <app-navback class="app-navbar__backbutton" @back="goback" v-if="showBackButton" />
-    <app-statusbar class="app-navbar__wrapper" @ready="onReady">
-      <div class="app-navbar__header">
-        <div class="column column--left">
-          <div class="column-block">
-            <slot name="left"></slot>
-          </div>
-        </div>
-        <div class="column column--center">
-          <div class="column-block">
-            <slot>
-              <span>{{ title }}</span>
-            </slot>
-          </div>
-        </div>
-        <div class="column column--right">
-          <div class="column-block">
-            <slot name="right"></slot>
-          </div>
-        </div>
-      </div>
-      <div class="app-navbar__footer">
-        <slot name="footer"></slot>
-      </div>
-    </app-statusbar>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { useAttrs, computed } from 'vue'
-import { useRouter } from 'vue-router'
-import { useGlobalStore } from '@/stores'
-
-const emit = defineEmits<{ (event: string, ...args: unknown[]): void }>()
-
-const props = defineProps({
-  // 导航栏标题
-  title: String,
-  // 是否固定导航栏
-  fixed: Boolean,
-  // 是否显示返回按钮
-  showBackButton: {
-    type: Boolean,
-    default: true,
-  }
-})
-
-const router = useRouter();
-const attrs = useAttrs();
-const globalStore = useGlobalStore()
-
-const styles = computed(() => ({
-  position: props.fixed ? 'fixed' : 'static',
-  width: globalStore.clientWidth + 'px',
-}))
-
-// 返回按钮事件
-const goback = () => {
-  if (attrs.onBack) {
-    emit('back');
-  } else {
-    router.go(-1);
-  }
-}
-
-const onReady = (el: HTMLElement) => {
-  emit('ready', el);
-}
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 6
src/packages/sbyj/components/layouts/page/index.less

@@ -1,6 +0,0 @@
-.app-page {
-    width: 100%;
-    height: 100%;
-    overflow-y: auto;
-    background-color: #f6f6f6;
-}

+ 0 - 46
src/packages/sbyj/components/layouts/page/index.vue

@@ -1,46 +0,0 @@
-<template>
-  <router-view class="app-page" v-slot="{ Component, route }">
-    <RouterTransition :transition-name="state.transitionName" @leave="onLeave" @after-enter="onAfterEnter">
-      <!-- 缓存组件,前进刷新,后退缓存 -->
-      <keep-alive :exclude="state.excludeViews">
-        <component :is="handleComponent(Component, route)" :key="getRouteKey(route)" />
-      </keep-alive>
-    </RouterTransition>
-  </router-view>
-</template>
-
-<script lang="ts" setup>
-import { RouteLocationNormalized, RouteRecordNormalized, RouteRecordName } from 'vue-router'
-import animateRouter from '@mobile/router/animateRouter'
-import RouterTransition from '@/packages/sbyj/components/base/router-transition/index.vue'
-import http from '@/services/http'
-
-const { state } = animateRouter
-
-// 手动给组件添加 name 属性,处理缓存 exclude 无效的问题
-const handleComponent = (component: Record<'type', { name: RouteRecordName | undefined }>, route: RouteRecordNormalized) => {
-  if (component) {
-    component.type.name = route.name
-  }
-  return component
-}
-
-// key 的作用是当 $route.query 参数发生变化时会刷新页面
-// 不直接使用 $route.fullPath 的原因是每次都会刷新页面,导致嵌套路由缓存失效
-const getRouteKey = (route: RouteLocationNormalized) => {
-  const qs = Object.keys(route.query)
-  return qs.length ? route.fullPath : undefined
-}
-
-const onLeave = () => {
-  http.pending = true
-}
-
-const onAfterEnter = () => {
-  http.pending = false
-}
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 19
src/packages/sbyj/components/layouts/scroll-view/index.less

@@ -1,19 +0,0 @@
-.app-scroll-view {
-    height    : 100%;
-    overflow-y: auto;
-
-    &__header {
-        position: fixed;
-        top     : 0;
-        z-index : 1;
-
-        &:empty {
-            display: none;
-        }
-
-        &.after {
-            opacity: 0;
-            z-index: -1;
-        }
-    }
-}

+ 0 - 120
src/packages/sbyj/components/layouts/scroll-view/index.vue

@@ -1,120 +0,0 @@
-<template>
-  <div ref="scrollRef" class="app-scroll-view">
-    <div ref="afterHeaderRef" class="app-scroll-view__header after">
-      <slot name="afterHeader"></slot>
-    </div>
-    <div ref="beforeHeaderRef" class="app-scroll-view__header before">
-      <slot name="beforeHeader"></slot>
-    </div>
-    <slot></slot>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { ref, onMounted, onActivated, onDeactivated, watch } from 'vue'
-
-const props = defineProps({
-  // 滚动元素名称(用于不同组件缓存滚动条位置)
-  scrollName: {
-    type: String,
-    default: 'default',
-  },
-  // 滚动条位置
-  scrollTop: {
-    type: Number,
-    default: 0,
-  },
-})
-
-const emit = defineEmits(['update:scrollTop', 'scroll'])
-const scrollRef = ref<HTMLDivElement>()
-const beforeHeaderRef = ref<HTMLDivElement>() // 前标题栏
-const afterHeaderRef = ref<HTMLDivElement>() // 后标题栏
-const scrollMap = new Map<string, number>()
-
-// 设置透明样式
-const setOpacity = (style: CSSStyleDeclaration, value: number) => {
-  if (value > 1) {
-    style.setProperty('opacity', '1')
-  } else if (value < 0) {
-    style.setProperty('opacity', '0')
-    style.setProperty('z-index', '-1')
-  } else {
-    style.setProperty('opacity', value.toString())
-    style.setProperty('z-index', '1')
-  }
-}
-
-// 监听滚动条位置
-const onScroll = (e: Event) => {
-  const el = e.target as HTMLDivElement
-  const beforeHeaderEl = beforeHeaderRef.value
-  const afterHeaderEl = afterHeaderRef.value
-  scrollMap.set(props.scrollName, el.scrollTop)
-
-  // 滚动隐藏标题栏
-  if (beforeHeaderEl) {
-    const { clientHeight, style } = beforeHeaderEl
-    const alpha = (clientHeight * 2 - el.scrollTop) / clientHeight
-    setOpacity(style, alpha)
-  }
-  // 滚动显示标题栏
-  if (afterHeaderEl) {
-    const { clientHeight, style } = afterHeaderEl
-    const alpha = (el.scrollTop - clientHeight) / clientHeight
-    setOpacity(style, alpha)
-  }
-
-  emit('update:scrollTop', el.scrollTop)
-  emit('scroll', el)
-}
-
-// 设置滚动条位置
-const setScrollTop = (callback?: (el: HTMLDivElement) => void) => {
-  const el = scrollRef.value
-  if (el) {
-    el.style.setProperty('opacity', '0')
-    el.scrollTop = scrollMap.get(props.scrollName) ?? 0
-
-    window.setTimeout(() => {
-      el.style.setProperty('opacity', '1')
-      callback && callback(el)
-    }, 0)
-  }
-}
-
-onMounted(() => {
-  window.setTimeout(() => {
-    const scrollEl = scrollRef.value
-    const beforeHeaderEl = beforeHeaderRef.value
-
-    if (scrollEl && beforeHeaderEl) {
-      scrollEl.style.setProperty('padding-top', beforeHeaderEl.clientHeight + 'px')
-    }
-  }, 0)
-
-  const addScrollListener = (el: HTMLDivElement) => {
-    el.addEventListener('scroll', onScroll) // 监听滚动条事件
-  }
-
-  // 组件挂载后调用
-  setScrollTop(addScrollListener)
-
-  // 缓存组件时调用
-  onActivated(() => {
-    setScrollTop(addScrollListener)
-  })
-
-  // 缓存组件被移除时调用
-  onDeactivated(() => {
-    const el = scrollRef.value
-    el?.removeEventListener('scroll', onScroll) // 移除滚动条事件
-  })
-})
-
-watch(() => props.scrollName, () => setScrollTop())
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 0 - 25
src/packages/sbyj/components/layouts/statusbar/index.vue

@@ -1,25 +0,0 @@
-<template>
-  <div ref="statusbarElement" class="app-statusbar">
-    <slot></slot>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { ref, onMounted, nextTick } from 'vue'
-import plus from '@/utils/h5plus'
-
-const emit = defineEmits(['ready']);
-
-const statusbarElement = ref<HTMLElement>();
-
-// 组件挂载完成
-onMounted(() => {
-  const el = statusbarElement.value;
-
-  plus.getStatusBarHeight((height) => {
-    el?.style.setProperty('padding-top', height + 'px');
-  })
-
-  nextTick(() => emit('ready', el));
-})
-</script>

+ 0 - 24
src/packages/sbyj/components/layouts/view/index.less

@@ -1,24 +0,0 @@
-.app-view {
-    display: flex;
-    flex-direction: column;
-    height: 100%;
-    background-color: #f6f6f6;
-    -webkit-overflow-scrolling: touch;
-
-    &__loading {
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        height: 50%;
-    }
-
-    &__body {
-        flex: 1;
-        overflow-y: auto;
-
-        &.flex {
-            display: flex;
-            flex-direction: column;
-        }
-    }
-}

+ 0 - 38
src/packages/sbyj/components/layouts/view/index.vue

@@ -1,38 +0,0 @@
-<template>
-    <div ref="viewRef" class="app-view">
-        <slot name="header"></slot>
-        <app-scroll-view :class="['app-view__body', flex && 'flex']">
-            <Loading class="app-view__loading" v-if="loading" />
-            <slot></slot>
-        </app-scroll-view>
-        <slot name="footer"></slot>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, onMounted } from 'vue'
-import { Loading } from 'vant'
-
-defineProps({
-    // 显示一个加载动画
-    loading: {
-        type: Boolean,
-        default: false
-    },
-    flex: {
-        type: Boolean,
-        default: false
-    },
-})
-
-const emit = defineEmits(['ready'])
-const viewRef = shallowRef()
-
-onMounted(() => {
-    emit('ready', viewRef.value)
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 30
src/packages/sbyj/components/modules/contact/index.vue

@@ -1,30 +0,0 @@
-<template>
-    <app-modal direction="right" height="100%" v-model:show="showModal">
-        <app-address :show-radio="true" @change="onChange" />
-    </app-modal>
-</template>
-
-<script lang="ts" setup>
-import { computed } from 'vue'
-import AppModal from '@/components/base/modal/index.vue'
-import AppAddress from '@/packages/sbyj/views/mine/address/Index.vue'
-
-const props = defineProps({
-    show: {
-        type: Boolean,
-        default: false
-    }
-})
-
-const emit = defineEmits(['update:show', 'change'])
-
-const showModal = computed({
-    get: () => props.show,
-    set: (val) => emit('update:show', val)
-})
-
-const onChange = (item: Model.UserReceiveInfoRsp) => {
-    showModal.value = false
-    emit('change', item)
-}
-</script>

+ 0 - 3
src/packages/sbyj/components/modules/echarts-line/index.less

@@ -1,3 +0,0 @@
-.app-echats-line {
-    height: 4rem;
-}

+ 0 - 55
src/packages/sbyj/components/modules/echarts-line/index.vue

@@ -1,55 +0,0 @@
-<template>
-    <div class="app-echats-line">
-        <template v-if="loading">
-            <div class="app-echats-line__tip">正在加载...</div>
-        </template>
-        <template v-else-if="isEmpty">
-            <div class="app-echats-line__tip">暂无数据</div>
-        </template>
-        <template v-else>
-            <!-- <ul class="legend">
-                <li class="legend-item">收盘: {{ selectedItem.price }}</li>
-            </ul> -->
-            <app-echarts :option="options.line" v-model:dataIndex="dataIndex" @ready="initOptions" />
-        </template>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, PropType, watch } from 'vue'
-import { useLineChart } from '@/hooks/echarts/line'
-import { EchartsDataset } from '@/hooks/echarts/line/types'
-import AppEcharts from '@/components/base/echarts/index.vue'
-
-const props = defineProps({
-    loading: {
-        type: Boolean,
-        default: false
-    },
-    dataList: {
-        type: Object as PropType<EchartsDataset['line']['source']>,
-        required: true
-    },
-})
-
-const { options, dataIndex, initData, initOptions } = useLineChart()
-const isEmpty = shallowRef(false)
-
-watch(() => props.loading, (status) => {
-    if (status) {
-        isEmpty.value = false
-    } else {
-        if (props.dataList.price.length) {
-            initData(props.dataList)
-        } else {
-            isEmpty.value = true
-        }
-    }
-}, {
-    immediate: true
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 8
src/packages/sbyj/components/modules/pdf/index.vue

@@ -1,8 +0,0 @@
-<template>
-    <div class="app-pdf">
-
-    </div>
-</template>
-
-<script lang="ts" setup>
-</script>

+ 0 - 17
src/packages/sbyj/components/modules/quote/chart/index.less

@@ -1,17 +0,0 @@
-.app-quote-chart {
-    background-color: #fff;
-
-    &__header {
-        display: flex;
-        align-items: center;
-        background-color: #f2f2f2;
-
-        .van-tabs {
-            flex: 1;
-
-            &__nav {
-                background-color: transparent;
-            }
-        }
-    }
-}

+ 0 - 110
src/packages/sbyj/components/modules/quote/chart/index.vue

@@ -1,110 +0,0 @@
-<template>
-    <div class="app-quote-chart">
-        <div class="app-quote-chart__header">
-            <Tabs v-model:active="tabIndex" :before-change="onTabChange">
-                <Tab title="分时" />
-                <Tab>
-                    <template #title>
-                        <Popover :actions="actions" @select="onPopoverSelect">
-                            <template #reference>{{ selectedText || '分钟' }}</template>
-                        </Popover>
-                    </template>
-                </Tab>
-                <Tab title="日线" />
-                <Tab title="周线" />
-                <Tab title="月线" />
-            </Tabs>
-            <Icon name="setting-o" style="padding: 0 .32rem;" v-if="false" />
-        </div>
-        <TimeLine v-bind="{ goodsCode }" v-if="tabIndex === 0" />
-        <KLine v-bind="{ goodsCode, cycleType }" v-else />
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { Tab, Tabs, Popover, Icon, PopoverAction } from 'vant'
-import { ChartCycleType } from '@/constants/chart'
-import TimeLine from './timeline/index.vue'
-import KLine from './kline/index.vue'
-
-defineProps({
-    goodsCode: {
-        type: String,
-        required: true
-    }
-})
-
-const tabIndex = shallowRef(0) // 当前选中的标签
-const selectedText = shallowRef('') // 当前选中的分钟线
-const cycleType = shallowRef(ChartCycleType.Minutes) // 图表周期类型
-
-const actions = [
-    { text: '1分钟' },
-    { text: '5分钟', },
-    { text: '30分钟', },
-    { text: '60分钟', },
-    { text: '4小时', }
-]
-
-// 切换图表
-const onTabChange = (index: number) => {
-    switch (index) {
-        case 1: {
-            return false
-        }
-        case 2: {
-            cycleType.value = ChartCycleType.Day
-            return true
-        }
-        case 3: {
-            cycleType.value = ChartCycleType.Week
-            return true
-        }
-        case 4: {
-            cycleType.value = ChartCycleType.Month
-            return true
-        }
-        default: {
-            return true
-        }
-    }
-}
-
-// 切换分钟
-const onPopoverSelect = (action: PopoverAction) => {
-    tabIndex.value = 1
-    selectedText.value = action.text
-
-    switch (action.text) {
-        case '1分钟': {
-            cycleType.value = ChartCycleType.Minutes
-            break
-        }
-        case '5分钟': {
-            cycleType.value = ChartCycleType.Minutes5
-            break
-        }
-        case '30分钟': {
-            cycleType.value = ChartCycleType.Minutes30
-            break
-        }
-        case '60分钟': {
-            cycleType.value = ChartCycleType.Minutes60
-            break
-        }
-        case '2小时': {
-            cycleType.value = ChartCycleType.Hours2
-            break
-        }
-        case '4小时': {
-            cycleType.value = ChartCycleType.Hours4
-            break
-        }
-    }
-}
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 45
src/packages/sbyj/components/modules/quote/chart/kline/index.less

@@ -1,45 +0,0 @@
-.app-echats-kline {
-    display: flex;
-    flex-direction: column;
-    height: 8rem;
-
-    &__tip {
-        margin: auto;
-    }
-
-    &__container {
-        flex: 1;
-        display: flex;
-        flex-direction: column;
-
-        .app-echarts {
-            flex: 1;
-        }
-
-        .legend {
-            display: flex;
-            color: #7a8a94;
-            font-size: 12px;
-            padding: 4px 4%;
-            margin: 0;
-
-            &-item {
-                &:not(:first-child) {
-                    margin-left: 10px;
-                }
-            }
-        }
-    }
-
-    .app-tabs {
-        height: 3rem;
-
-        .tabs {
-            padding: .1rem;
-
-            &-item {
-                font-size: .24rem;
-            }
-        }
-    }
-}

+ 0 - 114
src/packages/sbyj/components/modules/quote/chart/kline/index.vue

@@ -1,114 +0,0 @@
-<template>
-    <div class="app-echats-kline">
-        <div class="app-echats-kline__tip" v-if="loading">正在加载...</div>
-        <div class="app-echats-kline__tip" v-else-if="isEmpty">暂无数据</div>
-        <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.candlestick" v-model:dataIndex="dataIndex" @ready="mainReady" />
-            </div>
-            <app-tabs direction="bottom" :data-list="chartSeriesTypeList" @change="tabChange" v-if="showIndicator">
-                <!-- MACD -->
-                <div class="app-echats-kline__container" v-if="activeSeriesType === ChartSeriesType.MACD">
-                    <ul class="legend">
-                        <li class="legend-item">MACD: {{ selectedItem.macd }}</li>
-                        <li class="legend-item">DIF: {{ selectedItem.dif }}</li>
-                        <li class="legend-item">DEA: {{ selectedItem.dea }}</li>
-                    </ul>
-                    <app-echarts :option="options.macd" v-model:dataIndex="dataIndex" @ready="indicatorReady" />
-                </div>
-                <!-- VOL -->
-                <div class="app-echats-kline__container" v-if="activeSeriesType === ChartSeriesType.VOL">
-                    <ul class="legend">
-                        <li class="legend-item">VOL: {{ selectedItem.vol }}</li>
-                    </ul>
-                    <app-echarts :option="options.vol" v-model:dataIndex="dataIndex" @ready="indicatorReady" />
-                </div>
-                <!-- KDJ -->
-                <div class="app-echats-kline__container" v-if="activeSeriesType === ChartSeriesType.KDJ">
-                    <ul class="legend">
-                        <li class="legend-item">K: {{ selectedItem.k }}</li>
-                        <li class="legend-item">D: {{ selectedItem.d }}</li>
-                        <li class="legend-item">J: {{ selectedItem.j }}</li>
-                    </ul>
-                    <app-echarts :option="options.kdj" v-model:dataIndex="dataIndex" @ready="indicatorReady" />
-                </div>
-                <!-- CCI -->
-                <div class="app-echats-kline__container" v-if="activeSeriesType === ChartSeriesType.CCI">
-                    <ul class="legend">
-                        <li class="legend-item">CCI: {{ selectedItem.cci }}</li>
-                    </ul>
-                    <app-echarts :option="options.cci" v-model:dataIndex="dataIndex" @ready="indicatorReady" />
-                </div>
-            </app-tabs>
-        </template>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { PropType, watch, shallowRef } from 'vue'
-import { echarts } from '@/components/base/echarts/core'
-import { ChartCycleType, ChartSeriesType, getChartSeriesTypeList } from '@/constants/chart'
-import { useCandlestickChart } from '@/hooks/echarts/candlestick'
-import AppEcharts from '@/components/base/echarts/index.vue'
-import AppTabs from '@/components/base/tabs/index.vue'
-
-const props = defineProps({
-    goodsCode: {
-        type: String,
-        default: '',
-    },
-    // 周期类型
-    cycleType: {
-        type: Number as PropType<ChartCycleType>,
-        default: ChartCycleType.Minutes,
-    },
-    // 是否显示指标
-    showIndicator: {
-        type: Boolean,
-        default: true,
-    },
-})
-
-const { loading, dataIndex, isEmpty, options, selectedItem, initData, initOptions } = useCandlestickChart(props.goodsCode);
-const activeSeriesType = shallowRef(ChartSeriesType.MACD); // 当前选中的指标
-const chartGroup = new Map<string, echarts.ECharts>(); // 图表联动实例组
-const chartSeriesTypeList = getChartSeriesTypeList();
-
-// 指标切换
-const tabChange = (index: number) => {
-    activeSeriesType.value = chartSeriesTypeList[index].value;
-    setTimeout(() => {
-        initOptions();
-    }, 0);
-}
-
-const mainReady = (chart: echarts.ECharts) => {
-    chartGroup.set('main', chart);
-    initOptions();
-}
-
-const indicatorReady = (chart: echarts.ECharts) => {
-    chartGroup.set('indicator', chart);
-    echarts.connect([...chartGroup.values()]); // 图表联动
-}
-
-// 监听周期选择变化
-watch(() => props.cycleType, (val) => {
-    initData(val);
-}, {
-    immediate: true
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 33
src/packages/sbyj/components/modules/quote/chart/timeline/index.less

@@ -1,33 +0,0 @@
-.app-echats-timeline {
-    display: flex;
-    flex-direction: column;
-    height: 260px;
-
-    &__tip {
-        margin: auto;
-    }
-
-    &__container {
-        flex: 1;
-        display: flex;
-        flex-direction: column;
-
-        .app-echarts {
-            flex: 1;
-        }
-
-        .legend {
-            display: flex;
-            color: #7a8a94;
-            font-size: 12px;
-            padding: 4px 4%;
-            margin: 0;
-
-            &-item {
-                &:not(:first-child) {
-                    margin-left: 10px;
-                }
-            }
-        }
-    }
-}

+ 0 - 36
src/packages/sbyj/components/modules/quote/chart/timeline/index.vue

@@ -1,36 +0,0 @@
-<template>
-    <div class="app-echats-timeline">
-        <template v-if="loading">
-            <div class="app-echats-timeline__tip">正在加载...</div>
-        </template>
-        <template v-else-if="isEmpty">
-            <div class="app-echats-timeline__tip">暂无数据</div>
-        </template>
-        <template v-else>
-            <div class="app-echats-timeline__container">
-                <ul class="legend" v-if="false">
-                    <li class="legend-item">MA5: {{ selectedItem.ma5 }}</li>
-                </ul>
-                <app-echarts :option="options.timeline" v-model:dataIndex="dataIndex" @ready="initOptions" />
-            </div>
-        </template>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { useTimelineChart } from '@/hooks/echarts/timeline'
-import AppEcharts from '@/components/base/echarts/index.vue'
-
-const props = defineProps({
-    goodsCode: {
-        type: String,
-        default: '',
-    },
-})
-
-const { loading, dataIndex, isEmpty, options, selectedItem, initOptions } = useTimelineChart(props.goodsCode)
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 42
src/packages/sbyj/components/modules/quote/forex/index.less

@@ -1,42 +0,0 @@
-.app-quote-forex {
-    display: flex;
-    background-color: #fff;
-    margin-top: .2rem;
-
-    dl {
-        flex: 1;
-        padding: .24rem;
-
-        dt {
-            display: flex;
-            justify-content: space-between;
-            padding-bottom: .24rem;
-
-            span {
-                &:last-child {
-                    font-size: .24rem;
-                    color: #999;
-                }
-            }
-        }
-
-        dd {
-            display: flex;
-            font-size: .24rem;
-            text-align: center;
-            padding: .1rem 0;
-
-            span {
-                flex: 1;
-
-                &:first-child {
-                    text-align: left;
-                }
-
-                &:last-child {
-                    text-align: right;
-                }
-            }
-        }
-    }
-}

+ 0 - 176
src/packages/sbyj/components/modules/quote/forex/index.vue

@@ -1,176 +0,0 @@
-<template>
-    <div class="app-quote-forex">
-        <dl>
-            <dt>
-                <span>卖挂牌</span>
-                <span @click="onMoreClick(BuyOrSell.Sell)" v-if="showMore">更多
-                    <Icon name="arrow" />
-                </span>
-            </dt>
-            <template v-for="(item, index) in sellList" :key="index">
-                <dd :class="active === 'sell_' + index ? 'is-active' : ''" @click="onPriceClick(BuyOrSell.Sell, index)">
-                    <span>{{ item.label }}</span>
-                    <span :class="item.color">{{ handleNumberValue(item.price.toFixed(quote?.decimalplace)) }}</span>
-                    <span>{{ handleNumberValue(item.qty) }}</span>
-                </dd>
-            </template>
-        </dl>
-        <dl>
-            <dt>
-                <span>买挂牌</span>
-                <span @click="onMoreClick(BuyOrSell.Buy)" v-if="showMore">更多
-                    <Icon name="arrow" />
-                </span>
-            </dt>
-            <template v-for="(item, index) in buyList" :key="index">
-                <dd :class="active === 'buy_' + index ? 'is-active' : ''" @click="onPriceClick(BuyOrSell.Buy, index)">
-                    <span>{{ item.label }}</span>
-                    <span :class="item.color">{{ handleNumberValue(item.price.toFixed(quote?.decimalplace)) }}</span>
-                    <span>{{ handleNumberValue(item.qty) }}</span>
-                </dd>
-            </template>
-        </dl>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, computed, useAttrs } from 'vue'
-import { Icon } from 'vant'
-import { handleNumberValue } from '@/filters'
-import { BuyOrSell } from '@/constants/order'
-import { useFuturesStore } from '@/stores'
-
-const props = defineProps({
-    goodsCode: {
-        type: String,
-        required: true
-    },
-    showMore: {
-        type: Boolean,
-        default: true
-    }
-})
-
-const emit = defineEmits<{ (event: string, ...args: unknown[]): void }>()
-const attrs = useAttrs()
-const futuresStore = useFuturesStore()
-const quote = computed(() => futuresStore.getGoodsQuote(props.goodsCode).value)
-const active = shallowRef('')
-
-const buyList = computed(() => {
-    const item = quote.value
-    if (item) {
-        const result = [
-            {
-                label: '买一',
-                price: item.bid,
-                qty: item.bidvolume,
-                color: item.bidColor,
-            },
-            {
-                label: '买二',
-                price: item.bid2,
-                qty: item.bidvolume2,
-                color: item.bid2Color,
-            },
-            {
-                label: '买三',
-                price: item.bid3,
-                qty: item.bidvolume3,
-                color: item.bid3Color,
-            },
-            {
-                label: '买四',
-                price: item.bid4,
-                qty: item.bidvolume4,
-                color: item.bid4Color,
-            },
-            {
-                label: '买五',
-                price: item.bid5,
-                qty: item.bidvolume5,
-                color: item.bid5Color,
-            }
-        ]
-        return result.slice(0, item.quotegear || 1)
-    }
-    return []
-})
-
-const sellList = computed(() => {
-    const item = quote.value
-    if (item) {
-        const result = [
-            {
-                label: '卖一',
-                price: item.ask,
-                qty: item.askvolume,
-                color: item.askColor,
-            },
-            {
-                label: '卖二',
-                price: item.ask2,
-                qty: item.askvolume2,
-                color: item.ask2Color,
-            },
-            {
-                label: '卖三',
-                price: item.ask3,
-                qty: item.askvolume3,
-                color: item.ask3Color,
-            },
-            {
-                label: '卖四',
-                price: item.ask4,
-                qty: item.askvolume4,
-                color: item.ask4Color,
-            },
-            {
-                label: '卖五',
-                price: item.ask5,
-                qty: item.askvolume5,
-                color: item.ask5Color,
-            }
-        ]
-        return result.slice(0, item.quotegear || 1)
-    }
-    return []
-})
-
-const onPriceClick = (buyorsell: BuyOrSell, index: number) => {
-    if (attrs.onPriceClick) {
-        switch (buyorsell) {
-            case BuyOrSell.Buy: {
-                onBuyClick(index)
-                break
-            }
-            case BuyOrSell.Sell: {
-                onSellClick(index)
-                break
-            }
-        }
-    }
-}
-
-const onBuyClick = (index: number) => {
-    const { bid, presettle } = quote.value ?? {}
-    const item = buyList.value[index]
-    active.value = 'buy_' + index
-    emit('priceClick', BuyOrSell.Buy, item.price || bid || presettle)
-}
-
-const onSellClick = (index: number) => {
-    const { ask, presettle } = quote.value ?? {}
-    const item = sellList.value[index]
-    active.value = 'sell_' + index
-    emit('priceClick', BuyOrSell.Sell, item.price || ask || presettle)
-}
-
-const onMoreClick = (buyorsell: BuyOrSell) => {
-    emit('moreClick', buyorsell)
-}
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 23
src/packages/sbyj/components/modules/quote/index.vue

@@ -1,23 +0,0 @@
-<template>
-    <div class="app-quote">
-        <Price v-bind="{ goodsCode }" />
-        <Chart v-bind="{ goodsCode }" />
-        <Forex v-bind="{ goodsCode }" v-if="showForex" />
-        <Tik v-bind="{ goodsCode }" />
-    </div>
-</template>
-
-<script lang="ts" setup>
-import Price from './price/index.vue'
-import Chart from './chart/index.vue'
-import Forex from './forex/index.vue'
-import Tik from './tik/index.vue'
-
-defineProps({
-    goodsCode: {
-        type: String,
-        required: true
-    },
-    showForex: Boolean,
-})
-</script>

+ 0 - 90
src/packages/sbyj/components/modules/quote/price/index.less

@@ -1,90 +0,0 @@
-.app-quote-price {
-    color: #333;
-    background-color: #fff;
-    padding: .2rem 0;
-
-    .van-divider {
-        margin: 0;
-    }
-
-    &__main {
-        display: flex;
-        align-items: center;
-        text-align: center;
-
-        .block {
-            &-left {
-                width: 3rem;
-
-                .top-content {
-                    font-size: .56rem;
-                    margin-bottom: .1rem;
-                }
-
-                .bottom-content {
-                    font-size: .32rem;
-
-                    span {
-                        +span {
-                            margin-left: .2rem;
-                        }
-
-                        &.g-price-up {
-                            &::before {
-                                content: '+';
-                            }
-                        }
-                    }
-                }
-            }
-
-            &-right {
-                flex: 1;
-
-                ul {
-                    display: flex;
-                    flex-wrap: wrap;
-
-                    li {
-                        display: flex;
-                        flex-direction: column;
-                        width: calc(~'100% / 3');
-                        margin-bottom: .2rem;
-
-                        span {
-                            &:first-child {
-                                color: #888;
-                                font-size: .24rem;
-                                margin-bottom: .1rem;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    &__more {
-        ul {
-            display: flex;
-            flex-wrap: wrap;
-            width: 100%;
-            background-color: #fff;
-
-            li {
-                display: flex;
-                justify-content: space-between;
-                align-items: center;
-                width: 50%;
-                padding: .1rem .24rem;
-
-                span {
-                    &:first-child {
-                        font-size: .24rem;
-                        color: #888;
-                    }
-                }
-            }
-        }
-    }
-}

+ 0 - 108
src/packages/sbyj/components/modules/quote/price/index.vue

@@ -1,108 +0,0 @@
-<template>
-    <div class="app-quote-price">
-        <div class="app-quote-price__main" v-if="quote">
-            <div class="block-left">
-                <div class="top-content">
-                    <span :class="quote.lastColor">{{ handleNumberValue(quote.last.toFixed(quote.decimalplace)) }}</span>
-                </div>
-                <div class="bottom-content">
-                    <span :class="quote.lastColor">{{ quote.rise.toFixed(quote.decimalplace) }}</span>
-                    <span :class="quote.lastColor">{{ parsePercent(quote.change) }}</span>
-                </div>
-            </div>
-            <div class="block-right">
-                <ul>
-                    <li>
-                        <span>开盘</span>
-                        <span :class="quote.openedColor">
-                            {{ handleNumberValue(quote.opened.toFixed(quote.decimalplace)) }}
-                        </span>
-                    </li>
-                    <li>
-                        <span>最高</span>
-                        <span :class="quote.highestColor">
-                            {{ handleNumberValue(quote.highest.toFixed(quote.decimalplace)) }}
-                        </span>
-                    </li>
-                    <li>
-                        <span>涨停</span>
-                        <span class="g-price-up">{{ handleNumberValue(quote.limitup.toFixed(quote.decimalplace)) }}</span>
-                    </li>
-                    <li>
-                        <span>昨结</span>
-                        <span>{{ handleNumberValue(quote.presettle.toFixed(quote.decimalplace)) }}</span>
-                    </li>
-                    <li>
-                        <span>最低</span>
-                        <span :class="quote.lowestColor">{{ handleNumberValue(quote.lowest.toFixed(quote.decimalplace))
-                        }}</span>
-                    </li>
-                    <li>
-                        <span>跌停</span>
-                        <span class="g-price-down">{{ handleNumberValue(quote.limitdown.toFixed(quote.decimalplace))
-                        }}</span>
-                    </li>
-                </ul>
-            </div>
-        </div>
-        <Divider @click="showMore = !showMore">
-            <Icon :name="showMore ? 'arrow-up' : 'arrow-down'" />
-        </Divider>
-        <div class="app-quote-price__more" v-if="quote">
-            <ul v-show="showMore">
-                <li>
-                    <span>买量</span>
-                    <span>{{ handleNumberValue(quote.bidvolume) }}</span>
-                </li>
-                <li>
-                    <span>卖量</span>
-                    <span>{{ handleNumberValue(quote.askvolume) }}</span>
-                </li>
-                <li>
-                    <span>买价</span>
-                    <span :class="quote.bidColor">{{ handleNumberValue(quote.bid.toFixed(quote.decimalplace)) }}</span>
-                </li>
-                <li>
-                    <span>卖价</span>
-                    <span :class="quote.askColor">{{ handleNumberValue(quote.ask.toFixed(quote.decimalplace)) }}</span>
-                </li>
-                <li>
-                    <span>均价</span>
-                    <span :class="quote.averagepriceColor">{{
-                        handleNumberValue(quote.averageprice.toFixed(quote.decimalplace)) }}</span>
-                </li>
-                <li>
-                    <span>振幅</span>
-                    <span>{{ parsePercent(quote.amplitude) }}</span>
-                </li>
-            </ul>
-        </div>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, onMounted, onUnmounted } from 'vue'
-import { Icon, Divider } from 'vant'
-import { parsePercent, handleNumberValue } from '@/filters'
-import { useFuturesStore } from '@/stores'
-import quoteSocket from '@/services/websocket/quote'
-
-const props = defineProps({
-    goodsCode: {
-        type: String,
-        required: true
-    }
-})
-
-const futuresStore = useFuturesStore()
-const subscribe = quoteSocket.createSubscribe()
-const quote = futuresStore.getGoodsQuote(props.goodsCode)
-const showMore = shallowRef(false)
-
-onMounted(() => subscribe.start(props.goodsCode))
-onUnmounted(() => subscribe.stop())
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 3
src/packages/sbyj/components/modules/quote/tik/index.less

@@ -1,3 +0,0 @@
-.app-quote-tik {
-    margin-top: .2rem;
-}

+ 0 - 94
src/packages/sbyj/components/modules/quote/tik/index.vue

@@ -1,94 +0,0 @@
-<template>
-    <AppList class="app-quote-tik" :columns="columns" :data-list="dataList">
-        <template #TS="{ value }">
-            {{ formatDate(value, 'HH:mm:ss') }}
-        </template>
-        <template #PE="{ value }">
-            <span>{{ handleNumberValue(value) }}</span>
-        </template>
-        <template #Vol="{ value }">
-            <span>{{ handleNumberValue(value) }}</span>
-        </template>
-    </AppList>
-</template>
-
-<script lang="ts" setup>
-import { ref, watch } from 'vue'
-import { formatDate, handleNumberValue } from '@/filters'
-import { useRequest } from '@/hooks/request'
-import { queryHistoryTikDatas, queryMarketRun } from '@/services/api/market'
-import { useFuturesStore } from '@/stores'
-import AppList from '../../../base/list/index.vue'
-
-const props = defineProps({
-    goodsCode: {
-        type: String,
-        required: true
-    },
-})
-
-const futuresStore = useFuturesStore()
-const quote = futuresStore.getGoodsQuote(props.goodsCode)
-const dataList = ref<Model.HistoryTikDatasRsp[]>([])
-
-const columns: Model.TableColumn[] = [
-    { prop: 'TS', label: '时间' },
-    { prop: 'PE', label: '最新价' },
-    { prop: 'Vol', label: '现量' },
-]
-
-const { run: getHistoryTikDatas } = useRequest(queryHistoryTikDatas, {
-    manual: true,
-    params: {
-        goodsCode: props.goodsCode,
-        count: 10
-    },
-    onSuccess: (res) => {
-        dataList.value = res.data
-    }
-})
-
-useRequest(queryMarketRun, {
-    params: {
-        marketID: quote.value?.marketid
-    },
-    onSuccess: (res) => {
-        const market = res.data[0]
-        if (market) {
-            getHistoryTikDatas({
-                startTime: formatDate(market.startTime),
-                endTime: formatDate(market.endTime),
-            })
-        }
-    }
-})
-
-watch(() => quote.value?.last, () => {
-    if (quote.value) {
-        const list = dataList.value
-        if (list.length > 9) {
-            // 移除列表最后一条记录
-            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,
-        })
-    }
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 30
src/packages/sbyj/components/modules/receipt/index.vue

@@ -1,30 +0,0 @@
-<template>
-    <app-modal direction="right" height="100%" v-model:show="showModal">
-        <app-invoice :show-radio="true" @change="onChange" />
-    </app-modal>
-</template>
-
-<script lang="ts" setup>
-import { computed } from 'vue'
-import AppModal from '@/components/base/modal/index.vue'
-import AppInvoice from '@/packages/sbyj/views/mine/invoice/Index.vue'
-
-const props = defineProps({
-    show: {
-        type: Boolean,
-        default: false
-    }
-})
-
-const emit = defineEmits(['update:show', 'change'])
-
-const showModal = computed({
-    get: () => props.show,
-    set: (val) => emit('update:show', val)
-})
-
-const onChange = (item: Model.WrUserReceiptInfoRsp) => {
-    showModal.value = false
-    emit('change', item)
-}
-</script>

+ 0 - 20
src/packages/sbyj/components/modules/register-code/index.less

@@ -1,20 +0,0 @@
-.app-register-code {
-    &__wrapper {
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        justify-content: center;
-        min-height: 4rem;
-        padding: .32rem;
-    }
-
-    &__qrcode {
-        max-width: 4.8rem;
-        max-height: 4.8rem;
-    }
-
-    &__content {
-        font-size: .32rem;
-        font-weight: bold;
-    }
-}

+ 0 - 63
src/packages/sbyj/components/modules/register-code/index.vue

@@ -1,63 +0,0 @@
-<template>
-    <Dialog class="app-register-code" teleport="body" v-model:show="showDialog" :show-confirm-button="showConfirmButton"
-        confirm-button-text="保存" show-cancel-button @confirm="onConfirm">
-        <div class="app-register-code__wrapper">
-            <div class="app-register-code__canvas">
-                <app-qrcode class="app-register-code__qrcode" v-model="base64Data" :text="qrContent"
-                    :logo="require('../../../assets/logo.svg')" />
-            </div>
-            <div class="app-register-code__content" :data-clipboard-text="props.text" v-copy="onCopy">{{ props.text }}</div>
-        </div>
-    </Dialog>
-</template>
-
-<script lang="ts" setup>
-import { computed, shallowRef } from 'vue'
-import { Dialog, showFailToast, showSuccessToast } from 'vant'
-import service from '@/services'
-import plus from '@/utils/h5plus'
-import AppQrcode from '@/components/base/qrcode/index.vue'
-
-const props = defineProps({
-    show: {
-        type: Boolean,
-        default: false
-    },
-    text: String,
-})
-
-const emit = defineEmits(['update:show'])
-const showConfirmButton = shallowRef(false)
-const base64Data = shallowRef('')
-
-const qrContent = computed(() => {
-    const url = service.getConfig('mobileOpenUrl')
-    return url + '/#/?code=' + props.text
-})
-
-const showDialog = computed({
-    get: () => props.show,
-    set: (val) => emit('update:show', val)
-})
-
-const onCopy = (status: boolean) => {
-    if (status) {
-        showSuccessToast('复制成功')
-    } else {
-        showFailToast('复制失败')
-    }
-}
-
-// 保存二维码
-const onConfirm = () => {
-    plus.saveImage(base64Data.value, 'thj_' + (props.text ?? new Date().getTime()))
-}
-
-plus.onPlusReady(() => {
-    showConfirmButton.value = true
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 47
src/packages/sbyj/components/modules/reward/index.less

@@ -1,47 +0,0 @@
-.app-reward {
-    display        : flex;
-    justify-content: center;
-    align-items    : center;
-
-    &__wrapper {
-        position : relative;
-        font-size: 200%;
-        color    : #ffff00;
-        width    : 4.93rem;
-        height   : 6.39rem;
-
-        .content {
-            position  : absolute;
-            top       : 1.2rem;
-            width     : 100%;
-            text-align: center;
-            transition: transform 500ms;
-
-            &.is-hide {
-                transform: scale(0)
-            }
-
-            &.is-show {
-                transform: scale(1)
-            }
-
-            h1 {
-                font-size  : .8em;
-                font-weight: bold;
-            }
-
-            p {
-                font-size  : 1.3em;
-                font-weight: bold;
-            }
-        }
-
-        .buttons {
-            position  : absolute;
-            bottom    : -.8rem;
-            color     : #fff;
-            text-align: center;
-            width     : 100%;
-        }
-    }
-}

+ 0 - 49
src/packages/sbyj/components/modules/reward/index.vue

@@ -1,49 +0,0 @@
-<template>
-    <Overlay class="app-reward" :show="show">
-        <div class="app-reward__wrapper" @click.stop>
-            <img class="image"
-                :src="require(showRedEnvelope ? '@/packages/sbyj/assets/images/hongbao-open.png' : '@/packages/sbyj/assets/images/hongbao.png')"
-                @click="showRedEnvelope = true" />
-            <div class="content" v-if="!showRedEnvelope">
-                <h1>{{ title }}</h1>
-            </div>
-            <div :class="['content', showRedEnvelope ? 'is-show' : 'is-hide']">
-                <h1>恭喜获得红包</h1>
-                <p>{{ value?.toFixed(2) }}</p>
-            </div>
-            <div class="buttons" v-if="showRedEnvelope">
-                <Icon name="close" @click="emit('click')" />
-            </div>
-        </div>
-    </Overlay>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, watch } from 'vue'
-import { Overlay, Icon } from 'vant'
-
-const props = defineProps({
-    show: {
-        type: Boolean,
-        default: false
-    },
-    value: {
-        type: Number,
-        default: 0
-    },
-    title: String,
-})
-
-const emit = defineEmits(['click'])
-const showRedEnvelope = shallowRef(false)
-
-watch(() => props.show, (status) => {
-    if (status) {
-        showRedEnvelope.value = false
-    }
-})
-</script>
-
-<style lang="less" scoped>
-@import './index.less';
-</style>

+ 1 - 1
src/packages/sbyj/main.ts

@@ -6,7 +6,7 @@ import router from './router'
 import directives from '@/directives' // 自定义指令集
 //import 'default-passive-events'
 import '@/utils/h5plus' // 加载html5+
-import layouts from './components/layouts' // 全局布局组件
+import layouts from '@mobile/components/layouts' // 全局布局组件
 import 'vant/lib/index.css'
 import './assets/iconfont/iconfont.js'
 import './assets/themes/style.less' // 主题样式

+ 1 - 1
src/packages/sbyj/views/delivery/components/completed/list/index.vue

@@ -65,7 +65,7 @@ import { useComponent } from '@/hooks/component'
 import { useRequest } from '@/hooks/request'
 import { queryMyTradeGoodsDeliveryOfflines } from '@/services/api/order'
 import { Button } from 'vant'
-import AppPullRefresh from '@/packages/sbyj/components/base/pull-refresh/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const dataList = shallowRef<Model.MyTradeGoodsDeliveryOfflineRsp[]>([])
 const selectedRow = shallowRef<Model.MyTradeGoodsDeliveryOfflineRsp>()

+ 1 - 1
src/packages/sbyj/views/delivery/components/pending/list/index.vue

@@ -64,7 +64,7 @@ import { useComponent } from '@/hooks/component'
 import { useRequest } from '@/hooks/request'
 import { queryMyTradeGoodsDeliveryOfflines } from '@/services/api/order'
 import { Button } from 'vant'
-import AppPullRefresh from '@/packages/sbyj/components/base/pull-refresh/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const dataList = shallowRef<Model.MyTradeGoodsDeliveryOfflineRsp[]>([])
 const selectedRow = shallowRef<Model.MyTradeGoodsDeliveryOfflineRsp>()

+ 2 - 2
src/packages/sbyj/views/delivery/components/processing/components/files/index.vue

@@ -23,8 +23,8 @@ import { shallowRef, PropType } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
 import { queryMyDeliveryOfflineOperateLogs } from '@/services/api/order'
-import AppPullRefresh from '@/packages/sbyj/components/base/pull-refresh/index.vue'
-import AppList from '@/packages/sbyj/components/base/list/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+import AppList from '@mobile/components/base/list/index.vue'
 import AppModal from '@/components/base/modal/index.vue'
 
 const dataList = shallowRef<Model.MyDeliveryOfflineOperateLogRsp[]>([])

+ 2 - 2
src/packages/sbyj/views/delivery/components/processing/components/pay-detail/index.vue

@@ -29,8 +29,8 @@ import { shallowRef, PropType } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
 import { queryMyDeliveryOfflineOperateLogs } from '@/services/api/order'
-import AppPullRefresh from '@/packages/sbyj/components/base/pull-refresh/index.vue'
-import AppList from '@/packages/sbyj/components/base/list/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+import AppList from '@mobile/components/base/list/index.vue'
 import AppModal from '@/components/base/modal/index.vue'
 import { getDeliveryPayModeName, getConfirmStatusName } from '@/constants/order'
 

+ 1 - 1
src/packages/sbyj/views/delivery/components/processing/list/index.vue

@@ -69,7 +69,7 @@ import { useRequest } from '@/hooks/request'
 import { queryMyTradeGoodsDeliveryOfflines } from '@/services/api/order'
 import { Button } from 'vant'
 import { fullloading, dialog } from '@/utils/vant'
-import AppPullRefresh from '@/packages/sbyj/components/base/pull-refresh/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import { deliveryClientOperator } from '@/services/api/trade'
 
 const dataList = shallowRef<Model.MyTradeGoodsDeliveryOfflineRsp[]>([])

+ 1 - 1
src/packages/sbyj/views/delivery/detail/file-list/index.vue

@@ -28,7 +28,7 @@ import { getFileUrl } from '@/filters'
 import { useRequest } from '@/hooks/request'
 import { queryMyDeliveryOfflineOperateLogs } from '@/services/api/order'
 import AppModal from '@/components/base/modal/index.vue'
-import AppPullRefresh from '../../../../components/base/pull-refresh/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const props = defineProps({
     selectedRow: {

+ 1 - 1
src/packages/sbyj/views/delivery/detail/order-list/index.vue

@@ -56,7 +56,7 @@ import { getGoodsUnitName } from '@/constants/unit'
 import { useRequest } from '@/hooks/request'
 import { queryMyDeliveryofflinedetails } from '@/services/api/order'
 import AppModal from '@/components/base/modal/index.vue'
-import AppPullRefresh from '../../../../components/base/pull-refresh/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const props = defineProps({
     selectedRow: {

+ 3 - 3
src/packages/sbyj/views/home/index.vue

@@ -15,14 +15,14 @@
 <script lang="ts" setup>
 import { shallowRef, nextTick, watch, onMounted } from 'vue'
 import { fullloading, dialog } from '@/utils/vant'
-import { Tabbar } from '@/packages/sbyj/components/base/tabbar/types'
+import { Tabbar } from '@mobile/components/base/tabbar/types'
 import { getAppUpdateInfo } from '@/services/api/common'
 import { useNavigation } from '@mobile/router/navigation'
 import { useLogin } from '@/business/login'
 import { useLoginStore } from '@/stores'
 import plus from '@/utils/h5plus'
-import AppTabbar from '@/packages/sbyj/components/base/tabbar/index.vue'
-import RouterTransition from '@/packages/sbyj/components/base/router-transition/index.vue'
+import AppTabbar from '@mobile/components/base/tabbar/index.vue'
+import RouterTransition from '@mobile/components/base/router-transition/index.vue'
 
 const { route, routerTo, getGlobalUrlParams } = useNavigation()
 const { userLogin } = useLogin()

+ 1 - 1
src/packages/sbyj/views/home/main/index.less

@@ -1,4 +1,4 @@
-@import '@/packages/sbyj/assets/themes/base/mixin.less';
+@import '@mobile/assets/themes/base/mixin.less';
 
 .home-main {
     &__banner {

+ 3 - 3
src/packages/sbyj/views/home/main/index.vue

@@ -27,7 +27,7 @@
         <CellGroup class="article">
           <Cell class="home-main__titlebar" value="更多" @click="switchTab(2)" is-link>
             <template #title>
-              <img src="@/packages/sbyj/assets/icons/fire.png" />
+              <img src="../../../assets/icons/fire.png" />
               <span>市场资讯</span>
             </template>
           </Cell>
@@ -47,8 +47,8 @@ import { Cell, CellGroup, PullRefresh } from "vant";
 import { formatDate } from "@/filters";
 import { useNavigation } from '@mobile/router/navigation';
 import { queryImageConfigs, getJ10News } from "@/services/api/common";
-import Banner from '@/packages/sbyj/components/base/banner/index.vue'
-import Iconfont from '@/packages/sbyj/components/base/iconfont/index.vue'
+import Banner from '@mobile/components/base/banner/index.vue'
+import Iconfont from '@mobile/components/base/iconfont/index.vue'
 
 const { routerTo, setGlobalUrlParams } = useNavigation();
 const refreshing = shallowRef(false); // 是否处于加载中状态

+ 1 - 1
src/packages/sbyj/views/market/list/index.less

@@ -2,7 +2,7 @@
     &-header {
         .app-statusbar {
             height: 2.94rem;
-            background: url('@/packages/sbyj/assets/images/market-title-bg.jpg') no-repeat center top;
+            background: url('../../../assets/images/market-title-bg.jpg') no-repeat center top;
             background-size: 100% auto;
         }
     }

+ 1 - 1
src/packages/sbyj/views/market/list/index.vue

@@ -42,7 +42,7 @@ import { computed, onUnmounted } from 'vue'
 import { handleNumberValue, formatDecimal } from '@/filters'
 import { useNavigation } from '@mobile/router/navigation'
 import quoteSocket from '@/services/websocket/quote'
-import AppList from '@/packages/sbyj/components/base/list/index.vue'
+import AppList from '@mobile/components/base/list/index.vue'
 import { useRequest } from '@/hooks/request'
 import { queryTouristGoods, queryTouristQuoteDay } from '@/services/api/goods'
 import { useFuturesStore } from '@/stores'

+ 1 - 1
src/packages/sbyj/views/mine/index.less

@@ -1,4 +1,4 @@
-@import '@/packages/sbyj/assets/themes/base/mixin.less';
+@import '@mobile/assets/themes/base/mixin.less';
 
 .mine {
     @backgroundImage: linear-gradient(var(--navbar-background), var(--navbar-background) 3rem, transparent 3rem);

Некоторые файлы не были показаны из-за большого количества измененных файлов