li.shaoyi 1 년 전
부모
커밋
e53f7241d0

+ 1 - 1
app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "trading",
-  "version": "1.0.12",
+  "version": "1.0.5",
   "main": "main.js",
   "dependencies": {
     "electron-updater": "^6.1.4",

+ 3 - 3
oem/gstj/androidPrivacy.json

@@ -1,14 +1,14 @@
 {
     "version": "1",
     "prompt": "template",
-    "title": "隐私政策",
-    "message": "  请你务必审慎阅读、充分理解“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"http://8.130.36.162:8070/demo_register/html/yszc.htm\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+    "title": "用户协议和隐私政策",
+    "message": "  请你务必审慎阅读、充分理解“用户协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"http://8.130.178.15:8070/gstj_register/html/yhxy.htm\">《用户协议》</a>和<a href=\"http://8.130.178.15:8070/gstj_register/html/yszc.htm\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
     "buttonAccept": "同意并接受",
     "buttonRefuse": "拒绝",
     "hrefLoader": "system|default",
     "second": {
         "title": "确认提示",
-        "message": "  进入应用前,你需先同意<a href=\"http://8.130.36.162:8070/demo_register/html/yszc.htm\">《隐私政策》</a>,否则将退出应用。",
+        "message": "  进入应用前,你需先同意<a href=\"http://8.130.178.15:8070/gstj_register/html/yhxy.htm\">《用户协议》</a>和<a href=\"http://8.130.178.15:8070/gstj_register/html/yszc.htm\">《隐私政策》</a>,否则将退出应用。",
         "buttonAccept": "同意并继续",
         "buttonRefuse": "退出应用"
     },

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

@@ -1,8 +1,8 @@
 {
   "appId": "com.muchinfo.gstj",
   "appName": "甘肃碳交",
-  "version": "1.0.21",
-  "versionCode": "100021",
+  "version": "1.0.24",
+  "versionCode": "100024",
   "apiUrl": "http://192.168.31.205:8080/cfg?key=test_205",
   "tradeChannel": "ws",
   "modules": [

+ 4 - 3
oem/gstj/manifest.json

@@ -5,9 +5,9 @@
     "name" : "甘肃碳交",
     /*应用名称,程序桌面图标名称*/
     "version" : {
-        "name" : "1.0.21",
+        "name" : "1.0.24",
         /*应用版本名称*/
-        "code" : 100021
+        "code" : 100024
     },
     "description" : "",
     /*应用描述信息*/
@@ -155,7 +155,8 @@
                 ],
                 "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ],
                 "autoSdkPermissions" : false,
-                "minSdkVersion" : 26
+                "minSdkVersion" : 29,
+                "targetSdkVersion" : 30
             },
             /*使用Native.js调用原生安卓API需要使用到的系统权限*/
             "orientation" : [ "portrait-primary" ],

+ 1 - 1
public/config/appconfig.json

@@ -3,7 +3,7 @@
   "appName": "多元世纪",
   "version": "1.0.5",
   "versionCode": "10005",
-  "apiUrl": "http://192.168.31.205:8080/cfg?key=test_205",
+  "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
   "tradeChannel": "ws",
   "modules": [
     "register",

+ 41 - 20
src/packages/mobile/components/base/table/index.less

@@ -1,28 +1,49 @@
 .app-table {
-    overflow: auto;
-
-    &__body {
-        width           : 100%;
-        text-align      : center;
-        background-color: #fff;
-        margin-bottom   : 10px;
-        border          : 0;
-    }
+    --vxe-table-row-height-default:50px;
+    --vxe-table-border-color: #eee;
 
-    & thead &__row {
-        background-color: #d9e2ed;
-    }
+    background-color: #fff;
+    padding: 0 16px;
 
-    & thead &__cell {
-        padding: 6px 0;
-    }
+    .vxe-table--header {
+        .vxe-header--column {
+            background-color: #fff;
+
+            &:first-child {
+                text-align: left;
+            }
+        }
 
-    & tbody &__row {
-        background-color: #fff
+        .vxe-cell {
+            font-size: 12px;
+            font-weight: normal;
+            color: #999;
+            white-space: nowrap;
+
+            .text-small {
+                font-size: 12px;
+                color: #999;
+            }
+        }
     }
 
-    & tbody &__cell {
-        color  : #666;
-        padding: 6px 0;
+    .vxe-table--body {
+        .vxe-body--column {
+            &:first-child {
+                text-align: left;
+            }
+        }
+
+        .vxe-cell {
+            display: flex;
+            flex-direction: column;
+            line-height: normal;
+            white-space: nowrap;
+
+            .text-small {
+                font-size: 12px;
+                color: #999;
+            }
+        }
     }
 }

+ 19 - 51
src/packages/mobile/components/base/table/index.vue

@@ -1,72 +1,40 @@
 <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>
+        <vxe-table :data="dataList" border="inner" align="center" show-overflow>
+            <template v-for="(item, index) in tableColumns" :key="index">
+                <vxe-column :field="item.prop" :title="item.label" :min-width="item.width" :fixed="item.fixed">
+                    <template #default="{ row, rowIndex }">
+                        <slot :name="item.prop" :row="row" :index="rowIndex" :value="row[item.prop]">
+                            {{ row[item.prop] }}
+                        </slot>
                     </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>
+                </vxe-column>
+            </template>
+        </vxe-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'])
+import { PropType, computed } from 'vue'
 
 const props = defineProps({
     // 数据列表
     dataList: {
         type: Array,
-        default: () => ([]),
+        required: true,
     },
     columns: {
-        type: Array as PropType<TableColumn[]>,
-        default: () => ([]),
+        type: Array as PropType<Model.TableColumn[]>,
+        required: true,
     },
 })
 
-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]);
-}
+const tableColumns = computed(() => props.columns.map((item) => ({
+    width: 80,
+    ...item
+})))
 </script>
 
-<style lang="less" scoped>
+<style lang="less">
 @import './index.less';
 </style>

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

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

+ 3 - 0
src/packages/mobile/main.ts

@@ -9,6 +9,8 @@ import '@/utils/h5plus' // 加载html5+
 import 'hqchart/src/jscommon/umychart.resource/font/iconfont.css'
 import layouts from './components/layouts' // 全局布局组件
 import 'vant/lib/index.css'
+import VXETable from 'vxe-table'
+import 'vxe-table/lib/style.css'
 import './assets/themes/style.less' // 主题样式
 // import { timerInterceptor } from '@/utils/timer'
 // import { useGlobalStore } from '@/stores'
@@ -18,6 +20,7 @@ import './assets/themes/style.less' // 主题样式
 const app = createApp(App)
 app.use(router)
 app.use(directives)
+app.use(VXETable)
 app.use(layouts)
 app.mount('#app')
 

+ 13 - 3
src/packages/mobile/views/order/position/components/goods/list/Index.vue

@@ -46,7 +46,7 @@
                 <div class="g-order-list__btnbar" v-if="item.enableqty">
                     <Button size="small" @click="showComponent('close', item)" round>转让</Button>
                     <Button size="small" @click="showComponent(item.trademode === 16 ? 'delivery16' : 'delivery50', item)"
-                        round v-if="globalStore.hasSystemModule('delivery')">交收</Button>
+                        round v-if="showDelivery(item)">交收</Button>
                 </div>
             </div>
         </div>
@@ -60,9 +60,9 @@ import { shallowRef, computed, defineAsyncComponent } from 'vue'
 import { Button } from 'vant'
 import { useComponent } from '@/hooks/component'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
-import { getBuyOrSellName } from '@/constants/order'
+import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
 import { formatDecimal, handleNumberValue } from '@/filters'
-import { useGlobalStore, usePositionStore } from '@/stores'
+import { useGlobalStore, useUserStore, usePositionStore } from '@/stores'
 
 const componentMap = new Map<string, unknown>([
     ['close', defineAsyncComponent(() => import('../close/Index.vue'))],
@@ -71,6 +71,7 @@ const componentMap = new Map<string, unknown>([
 ])
 
 const globalStore = useGlobalStore()
+const userStore = useUserStore()
 const positionStore = usePositionStore()
 const selectedRow = shallowRef<Model.TradePositionRsp>()
 const pullRefreshRef = shallowRef()
@@ -81,6 +82,15 @@ const { componentRef, componentId, openComponent, closeComponent } = useComponen
     pullRefreshRef.value?.refresh()
 })
 
+const showDelivery = (row: Model.TradePositionRsp) => {
+    if (globalStore.hasSystemModule('delivery')) {
+        // #5741
+        const market = userStore.userData.markets.find((e) => e.marketid === row.marketid)
+        return row.buyorsell === BuyOrSell.Buy || market?.isdeliverysellercanapply === 1
+    }
+    return false
+}
+
 // 持仓列表刷新
 const onRefresh = () => {
     positionStore.getTradePosition()

+ 12 - 5
src/packages/pc/views/footer/goods/position/index.vue

@@ -29,8 +29,8 @@
 <script lang="ts" setup>
 import { shallowRef, computed, onMounted } from 'vue'
 import { handleNumberValue, formatDecimal } from '@/filters'
-import { getBuyOrSellName } from '@/constants/order'
-import { usePositionStore } from '@/stores'
+import { BuyOrSell, getBuyOrSellName } from '@/constants/order'
+import { usePositionStore, useUserStore } from '@/stores'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
 
@@ -38,6 +38,7 @@ defineProps({
     code: String
 })
 
+const userStore = useUserStore()
 const positionStore = usePositionStore()
 
 const positionList = computed(() => positionStore.getPositionListByTradeMode(50, 16))
@@ -59,12 +60,18 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
 const handleOperateButtons = (row: Model.TradePositionRsp) => {
     const buttons = ['bottom_goods_position_transfer']
     switch (row.trademode) {
-        case 16:
+        case 16: {
             buttons.push('bottom_goods_position_delivery16')
             break;
-        case 50:
-            buttons.push('bottom_goods_position_delivery50')
+        }
+        case 50: {
+            // #5741
+            const market = userStore.userData.markets.find((e) => e.marketid === row.marketid)
+            if (row.buyorsell === BuyOrSell.Buy || market?.isdeliverysellercanapply === 1) {
+                buttons.push('bottom_goods_position_delivery50')
+            }
             break;
+        }
     }
     return buttons
 }

+ 52 - 43
src/types/model/account.d.ts

@@ -131,49 +131,58 @@ declare global {
 
         /** 市场 */
         interface Market {
-            auctionwrtype: number;//竞拍仓单类型 - 1:无仓单 2:有仓单 3;有无仓单均可
-            canacceptquote: number;//确认行权是否接收行情 - 0:不接受 1:接受 [可确认权的挂牌期权市场可配置]
-            cangoodsexercise: number;//[期权]是否可现货行权- 0:否 1:是
-            cangoodsexercisetype: number;//可现货行权期权类型 - 1:认购 2认沽 3:认购认沽 [CanGoodsExercise = 1时可设置]
-            canmanualquotestrike: number;//是否可手动报行权价- 0:否 1:是 [期权]
-            canmutistage: number;//是否可多段运行 – 0:不可 1:可 [挂牌期权]
-            canpreexercise: number;//[期权]是否可预申报- 0:否 1:是
-            clearinterval: number;//待开市间隔(交易市场开盘前多久发市场待开市信号(单位分钟))
-            contracttmp: string;//合同模板[荷兰式][竞价式][仓单贸易]
-            exchareaid: number;//所属交易所,可以没有
-            goodstype: number;//商品类型 - 1:交易商品 2:仓单商品
-            hasrebate: number;//是否返利[竞价式] 0:不返,1:返利 – 根据系统参数088显示或隐藏
-            hastradecredit: number;//是否交易授信[做市收益权] - 0:不授信 1:授信
-            haswr: number;//[竞拍]是否需要仓单 - 0:不需要 1:需要-作废
-            isdeductmargin: number;//竞拍违约是否扣除保证金[竞拍-降价式] - 0:不扣 1:扣除
-            isrecordsource: number;//是否记录成交源 - 0:不记录 1:记录 [所有权]
-            isreleasemargin: number;//成交参与保证金是否释放[竞价式] - 0:不释放 1释放
-            marginformula: number;//持仓保证金公式 - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权)
-            marginformula2: number;//持仓保证金公式(仅受托竞价) - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权)
-            marketid: number;//市场ID正常5位,前三位固定:两位表示交易模式, 一位表示交易属性(1:收益权,2:所有权) 其它特殊市场:0-系统 1-交割服务 2-账户服务3-履约服务 4-仓单服务 5-积分服务 6-银行服务
-            marketname: string;//市场名称
-            marketserviceid: number;//市场服务ID
-            marketstatus: number;//生效状态(ValidStatus枚举): 1:待生效 2:正常 3:注销
-            markettype: number;//市场类型- 1:非交易服务 2:交易服务
-            matchermode: number;//指定对手模式[仓单贸易模式专用] - 1:任意对手
-            openmethod: number;//开盘模式 - 0 自动 1手动
-            otcuserid: number;//场外期权做市商[场外期权]
-            outersynctime: string;//外部同步时间点(h24:mi:ss)[场外期权]
-            pendingflag: number;//待开市时间标识[通道交易-对冲] - 0:当日 1:上日
-            pendingtime: string;//待开市时间通道交易-对冲
-            performancetempid: number;//履约计划模板ID - 作废
-            premiumquotemode: number;//权利金报价方式 - 1:自动 2:手动
-            rebateratio: number;//返利比率[竞价式]
-            reckonorder: number;//结算顺序
-            reckonpricealgorithm: number;//结算价算法: 1:最后多少笔成交价加权平均 2:最后多少秒成交价加权平均 3:全天加权平均 4:最后一口价 5.买一价 6.卖一价 7.买一卖一均价 8.外部结算价
-            reckonpriceparam: number;//结算价参数
-            reckontime: string;//结算时间通道交易-对冲
-            roleprioritytype: number;//角色优先类型 - 1:无 2:报价商优先 3:非报价商优先 [16:挂牌点选]
-            selllistingauditflag: number;//卖挂牌是否需要审核(仓单贸易) - 0:不需要 1:需要
-            trademarkettype: number;//交易市场类型 - 1:合约市场 2:外部市场 3:仓单市场
-            trademode: number;//交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
-            tradeproperty: number;//交易属性 - 1:收益权(可做空) 2:所有权(不可做空) 3:期权 4:现货 5:参考行情 6:通道交易 7:币交易 8:场外期权
-            tradetype: number;//下单方式[通道交易] - 1:直接转单 2:净头寸下单
+            auctionwrtype: number; // 竞拍仓单类型 - 1:无仓单 2:有仓单 3;有无仓单均可
+            canacceptquote: number; // 确认行权是否接收行情 - 0:不接受 1:接受 [可确认权的挂牌期权市场可配置]
+            cangoodsexercise: number; // [期权]是否可现货行权- 0:否 1:是
+            cangoodsexercisetype: number; // 可现货行权期权类型 - 1:认购 2认沽 3:认购认沽 [CanGoodsExercise = 1时可设置]
+            canmanualquotestrike: number; // 是否可手动报行权价- 0:否 1:是 [期权]
+            canmutistage: number; // 是否可多段运行 – 0:不可 1:可 [挂牌期权]
+            canpreexercise: number; // [期权]是否可预申报- 0:否 1:是
+            clearinterval: number; // 待开市间隔(交易市场开盘前多久发市场待开市信号(单位分钟))
+            contracttmp: string; // 合同模板[荷兰式][竞价式][仓单贸易]
+            deliverymode: number; // 交收方式(50模式) 1:配对交收 2:强平日交收
+            exchareaid: number; // 所属交易所,可以没有
+            financemarketid: number; // 融资回购市场ID [仓单贸易]
+            forceclosemode: number; // 定期强平方式 - 1:到期结 2:日结 3:周结 4:月结 [收益权] 枚举-forceCloseMode
+            forceclosevalue: number; // 定期强平参数 [收益权](周结、月结)
+            goodstype: number; // 商品类型 - 1:交易商品 2:仓单商品
+            hasrebate: number; // 是否返利[竞价式] 0:不返,1:返利 -- 根据系统参数088显示或隐藏
+            hastradecredit: number; // 是否交易授信[做市收益权] - 0:不授信 1:授信
+            haswr: number; // [竞拍]是否需要仓单 - 0:不需要 1:需要-作废
+            isdeductmargin: number; // 竞拍违约是否扣除保证金[竞拍-降价式] - 0:不扣 1:扣除
+            isdeliverybuyerpayonline: number; // 交收买方是否线上支付(50模式) - 0:否 1:是
+            isdeliverysellercanapply: number; // 卖方是否可申请交收(50模式 - DeliveryMode = 2时) - 0:否 1:是
+            isrecordsource: number; // 是否记录成交源 - 0:不记录 1:记录 [所有权]
+            isreleasemargin: number; // 成交参与保证金是否释放[竞价式] - 0:不释放 1释放
+            isupdatereckonprice: number; // 输入结算价标识 - 0:系统生成 1:手工输入(自动) 2:手工输入(手动)
+            marginformula: number; // 持仓保证金公式 - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权)
+            marginformula2: number; // 持仓保证金公式(仅受托竞价) - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权)
+            marketid: number; // 市场ID正常5位,前三位固定:两位表示交易模式, 一位表示交易属性(1:收益权,2:所有权) 其它特殊市场:0-系统 1-交割服务 2-账户服务3-履约服务 4-仓单服务 5-积分服务 6-银行服务
+            marketname: string; // 市场名称
+            marketserviceid: number; // 市场服务ID
+            marketstatus: number; // 生效状态(ValidStatus枚举): 1:待生效 2:正常 3:注销
+            markettype: number; // 市场类型- 1:非交易服务 2:交易服务
+            matchermode: number; // 指定对手模式[仓单贸易模式专用] - 1:任意对手
+            openmethod: number; // 开盘模式 - 0 自动 1手动
+            otcuserid: number; // 场外期权做市商[场外期权]
+            outersynctime: string; // 外部同步时间点(h24:mi:ss)[场外期权]
+            paylaterflag: number; // 是否支持后付 - 0:不支持 1;支持 - [挂牌点选 所有权、预售挂牌支持]
+            pendingflag: number; // 待开市时间标识[通道交易-对冲] - 0:当日 1:上日
+            pendingtime: string; // 待开市时间通道交易-对冲
+            performancetempid: number; // 履约计划模板ID - 作废
+            premiumquotemode: number; // 权利金报价方式 - 1:自动 2:手动
+            rebateratio: number; // 返利比率[竞价式]
+            reckonorder: number; // 结算顺序
+            reckonpricealgorithm: number; // 结算价算法: 1:最后多少笔成交价加权平均 2:最后多少秒成交价加权平均 3:全天加权平均 4:最后一口价 5.买一价 6.卖一价 7.买一卖一均价 8.外部结算价
+            reckonpriceparam: number; // 结算价参数
+            reckontime: string; // 结算时间通道交易-对冲
+            roleprioritytype: number; // 角色优先类型 - 1:无 2:报价商优先 3:非报价商优先 [16:挂牌点选]
+            selllistingauditflag: number; // 卖挂牌是否需要审核(仓单贸易) - 0:不需要 1:需要
+            trademarkettype: number; // 交易市场类型 - 1:合约市场 2:外部市场 3:仓单市场
+            trademode: number; // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
+            tradeproperty: number; // 交易属性 - 1:收益权(可做空) 2:所有权(不可做空) 3:期权 4:现货 5:参考行情 6:通道交易 7:币交易 8:场外期权
+            tradetype: number; // 下单方式[通道交易] - 1:直接转单 2:净头寸下单
+            updatereckonpriceinterval: number; // 输入结算价时长(分钟) [1:手工输入(自动)]
         }
 
         /** 系统参数 */

+ 15 - 11
src/types/model/table.d.ts

@@ -1,13 +1,17 @@
-declare namespace Model {
-    interface TableColumn {
-        prop: string;
-        label: string;
-        className?: string;
-        align?: string;
-        width?: number;
-        sortable?: boolean;
-        show?: boolean;
-        fixed?: string;
-        decimal?: number; // 保留小数点位数
+import { VxeColumnPropTypes } from 'vxe-table'
+
+declare global {
+    namespace Model {
+        interface TableColumn {
+            prop: string;
+            label: string;
+            className?: string;
+            align?: string;
+            width?: number;
+            sortable?: boolean;
+            show?: boolean;
+            fixed?: VxeColumnPropTypes.Fixed;
+            decimal?: number; // 保留小数点位数
+        }
     }
 }