li.shaoyi 1 year ago
parent
commit
32c6b68aef

+ 1 - 1
app/package.json

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

+ 3 - 0
file/android/fxgl.txt

@@ -87,6 +87,9 @@ http://118.190.217.127:8280/cfg?key=szt_sp
 模拟盘
 cn.muchinfo.gzcj_demo_v1.0.0.apk
 http://140.210.215.73:8280/cfg?key=gzcj_demo
+实盘
+cn.muchinfo.gzcj_release_v1.0.0.apk
+http://139.9.233.200:8280/cfg?key=gzcj_sp
 
 
 南海国际

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

@@ -1,8 +1,8 @@
 {
   "appId": "com.muchinfo.gzcj",
   "appName": "贵州茶交",
-  "version": "1.0.0",
-  "versionCode": "100000",
+  "version": "1.0.1",
+  "versionCode": "100001",
   "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
   "tradeChannel": "ws",
   "modules": [

+ 1 - 1
public/config/appconfig.json

@@ -2,7 +2,7 @@
   "appId": "com.muchinfo.app",
   "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",
   "modules": [
     "register",
     "delivery"

+ 1 - 0
src/packages/pc/views/market/trade/index.vue

@@ -18,6 +18,7 @@ import quoteSocket from '@/services/websocket/quote'
 const componentMap = new Map<string, unknown>([
     ['tradeModel_50', defineAsyncComponent(() => import('./goods/list/index.vue'))], // 订单挂牌
     ['tradeModel_51', defineAsyncComponent(() => import('./presell/ballot/index.vue'))], // 预售中签
+    ['tradeModel_48', defineAsyncComponent(() => import('./presell/bidding/index.vue'))], // 竞拍预售
     ['tradeModel_49', defineAsyncComponent(() => import('./presell/transfer/index.vue'))], // 定金转让
     ['tradeModel_17', defineAsyncComponent(() => import('./spot/index.vue'))], // 现货挂牌
     ['tradeModel_46', defineAsyncComponent(() => import('./swap/index.vue'))], // 掉期市场

+ 115 - 0
src/packages/pc/views/market/trade/presell/bidding/detail/delisting/index.vue

@@ -0,0 +1,115 @@
+<!-- 交易市场-预售转让-竞拍预售-详情-出价 -->
+<template>
+    <app-drawer title="出价" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" label-width="100px" :model="formData" :rules="formRules">
+            <el-form-item label="起拍价">
+                <span>{{ selectedRow.refprice }}</span>
+            </el-form-item>
+            <el-form-item prop="OrderPrice" label="认购价">
+                <el-input-number placeholder="请输入" :min="selectedRow.startprice" :precision="2"
+                    v-model="formData.OrderPrice" />
+            </el-form-item>
+            <el-form-item prop="OrderQty" label="认购量">
+                <el-input-number placeholder="请输入" :min="0" :max="selectedRow.presaleqty" :precision="0"
+                    v-model="formData.OrderQty" />
+            </el-form-item>
+            <el-form-item label="预售定金">
+                <span>{{ deposit }}</span>
+            </el-form-item>
+            <el-form-item label="可用资金">
+                <span>{{ accountStore.currentAccount.avaiableMoney?.toFixed(2) }}</span>
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button type="info" @click="onCancel(false)">取消</el-button>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed, PropType } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { handleRequestBigNumber } from '@/filters'
+import { BuyOrSell } from '@/constants/order'
+import { useOrder } from '@/business/trade'
+import { useAccountStore } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import { EPriceMode, EValidType } from '@/constants/client'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.PresaleAuctionsRsp>,
+        required: true,
+    }
+})
+
+const { formData, formSubmit, loading } = useOrder()
+const accountStore = useAccountStore()
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const formRef = shallowRef<FormInstance>()
+
+// 预售定金
+const deposit = computed(() => {
+    const { refprice, presaledepositalgorithm, presaledepositvalue } = props.selectedRow
+    const qty = formData.OrderQty ?? 0
+
+    switch (presaledepositalgorithm) {
+        case 1:
+            return (presaledepositvalue * refprice * qty).toFixed(2)
+        case 2:
+            return (presaledepositvalue * qty).toFixed(2)
+        default:
+            return '0.0'
+    }
+})
+
+const formRules: FormRules = {
+    OrderPrice: [{
+        required: true,
+        message: '请输入认购价',
+    }],
+    OrderQty: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (value) {
+                const maxbuyqty = props.selectedRow.presaleqty
+                if (value <= maxbuyqty) {
+                    callback()
+                } else {
+                    callback(new Error('认购量不能大于' + maxbuyqty))
+                }
+            } else {
+                callback(new Error('请输入认购量'))
+            }
+        }
+    }],
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            const { applyid, goodsid, marketid } = props.selectedRow
+            formData.GoodsID = goodsid
+            formData.MarketID = marketid
+            formData.BuyOrSell = BuyOrSell.Buy
+            formData.RelatedID = handleRequestBigNumber(applyid)
+            formData.PriceMode = EPriceMode.PRICEMODE_LIMIT
+            formData.TimevalidType = EValidType.VALIDTYPE_YZ
+            /// 代码提交
+            formSubmit().then(() => {
+                ElMessage.success('提交成功')
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+</script>

+ 88 - 0
src/packages/pc/views/market/trade/presell/bidding/detail/index.vue

@@ -0,0 +1,88 @@
+<!-- 交易市场-预售转让-预售中签-详情 -->
+<template>
+    <app-drawer title="商品详情" v-model:show="show" :width="600" :refresh="refresh">
+        <AppTableDetails :title="selectedRow.goodscode + ' ' + selectedRow.goodsname" :label-width="100" :data="selectedRow"
+            :cell-props="detailProps" :column="2">
+            <!-- 预售定金 -->
+            <template #earnest>
+                {{ earnest }}
+            </template>
+            <!-- 转让定金 -->
+            <template #transferdepositratio>
+                {{ parsePercent(selectedRow.transferdepositratio) }}
+            </template>
+        </AppTableDetails>
+        <div style="margin-top: 20px;">
+            <template v-for="(url, index) in detailImages" :key="index">
+                <img :src="url" alt="" />
+            </template>
+        </div>
+        <template #footer>
+            <el-button type="info" @click="onCancel(false)">取消</el-button>
+            <el-button type="primary" @click="onSubmit" v-if="selectedRow.presalestatus === 2">我要出价</el-button>
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed, PropType, defineAsyncComponent } from 'vue'
+import { getFileUrl, parsePercent } from '@/filters'
+import { useComponent } from '@/hooks/component'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTableDetails from '@pc/components/base/table-details/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['delisting', defineAsyncComponent(() => import('./delisting/index.vue'))], // 摘牌
+])
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.PresaleAuctionsRsp>,
+        required: true,
+    }
+})
+
+const detailProps = [
+    { prop: 'refprice', label: '起拍价:' },
+    { prop: 'sellname', label: '销售方:' },
+    { prop: 'starttime', label: '开始时间:' },
+    { prop: 'earnest', label: '预售定金:' },
+    { prop: 'endtime', label: '结束时间:' },
+    { prop: 'transferdepositratio', label: '转让定金:' },
+    { prop: 'presaleqty', label: '总量:' },
+]
+
+// 预售定金
+const earnest = computed(() => {
+    switch (props.selectedRow.presaledepositalgorithm) {
+        case 1:
+            return parsePercent(props.selectedRow.presaledepositvalue)
+        case 2:
+            return props.selectedRow.presaledepositvalue.toFixed(2)
+        default:
+            return '0.0'
+    }
+})
+
+// 商品图片列表
+const detailImages = computed(() => {
+    const pictureurls = props.selectedRow.pictureurls ?? ''
+    return pictureurls.split(',').map((path) => getFileUrl(path))
+})
+
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    openComponent('delisting')
+}
+</script>

+ 77 - 0
src/packages/pc/views/market/trade/presell/bidding/index.vue

@@ -0,0 +1,77 @@
+<!-- 交易市场-预售转让-竞拍预售 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading" @row-click="onRowClick" showIndex>
+        <template #headerLeft>
+            <app-filter :options="filterOptons" />
+        </template>
+        <template #attachmenturl="{ value }">
+            <el-image :src="getFileUrl(value)" style="width: 48px;height: 48px;" lazy />
+        </template>
+        <template #presalestatus="{ value }">
+            {{ getWRPresaleStatusName(value) }}
+        </template>
+        <template #footer>
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { getFileUrl } from '@/filters'
+import { useComponent } from '@/hooks/component'
+import { useRequest } from '@/hooks/request'
+import { useDataFilter } from '@/hooks/datatable'
+import { getWRPresaleStatusList, getWRPresaleStatusName } from '@/constants/order'
+import { queryPresaleAuctions } from '@/services/api/presale'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['detail', defineAsyncComponent(() => import('./detail/index.vue'))], // 详情
+])
+
+const { filterOptons, getQueryParams } = useDataFilter<Model.PresaleAuctionsReq>()
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => run(), false)
+const selectedRow = shallowRef<Model.PresaleAuctionsRsp>()
+
+const { dataList, run, loading } = useRequest(queryPresaleAuctions, {
+    params: {
+        presalemode: 4,
+        presalestatus: 2
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'attachmenturl', label: '图片' },
+    { prop: 'goodscode', label: '代码' },
+    { prop: 'goodsname', label: '名称' },
+    { prop: 'refprice', label: '价格' },
+    { prop: 'starttime', label: '开始时间' },
+    { prop: 'endtime', label: '结束时间' },
+    { prop: 'presalestatus', label: '预售状态' },
+])
+
+filterOptons.selectList = [
+    {
+        key: 'presalestatus',
+        selectedValue: 2,
+        options: getWRPresaleStatusList(),
+        locked: true,
+    }
+]
+
+filterOptons.buttonList = [
+    { lable: '查询', className: 'el-button--info', onClick: () => onSearch() }
+]
+
+const onSearch = (clear = false) => {
+    getQueryParams((qs) => run(qs), clear)
+}
+
+const onRowClick = (row: Model.PresaleAuctionsRsp) => {
+    selectedRow.value = row
+    openComponent('detail')
+}
+</script>