Handy_Cao 1 年之前
父節點
當前提交
078ddd9627

+ 4 - 2
src/packages/mobile/views/order/delivery/components/offline/list/Index.vue

@@ -60,6 +60,7 @@ import { useComponent } from '@/hooks/component'
 import { useRequest } from '@/hooks/request'
 import { queryMineTradeGoodsDeliveryOfflines } from '@/services/api/transfer'
 import { offlineDeliveryApplyCancelOrder } from '@/services/api/trade'
+import { i18n } from '@/stores'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const componentMap = new Map<string, unknown>([
@@ -70,6 +71,7 @@ const dataList = shallowRef<Model.MineTradeGoodsDeliveryOfflinesRsp[]>([])
 const selectedRow = shallowRef<Model.MineTradeGoodsDeliveryOfflinesRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
+const { t } = i18n.global
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -97,7 +99,7 @@ const showComponent = (componentName: string, row: Model.MineTradeGoodsDeliveryO
 
 const onCancel = (row: Model.MineTradeGoodsDeliveryOfflinesRsp) => {
     dialog({
-        message: '确认要撤销吗?',
+        message: t('order.listingorder.tips1'),
         showCancelButton: true,
     }).then(() => {
         fullloading((hideLoading) => {
@@ -110,7 +112,7 @@ const onCancel = (row: Model.MineTradeGoodsDeliveryOfflinesRsp) => {
                     DeliveryOrderID: handleRequestBigNumber(row.deliveryorderid)
                 }
             }).then(() => {
-                hideLoading('撤销成功', 'success')
+                hideLoading(t('order.listingorder.tips2'), 'success')
                 pullRefreshRef.value?.refresh()
             }).catch((err) => {
                 hideLoading(err, 'fail')

+ 2 - 2
src/packages/mobile/views/order/list/components/transfertrade/list/Index.vue

@@ -28,7 +28,7 @@
                         </li>
                         <li>
                             <span>{{ $t('order.transfertrade.closepl') }}</span>
-                            <span>{{ handleNumberValue(item.closepl) }}</span>
+                            <span>{{ formatDecimal(item.closepl) }}</span>
                         </li>
                         <li>
                             <span>{{ $t('order.transfertrade.tradedate') }}</span>
@@ -49,7 +49,7 @@
 <script lang="ts" setup>
 import { shallowRef, defineAsyncComponent } from 'vue'
 import { Button } from 'vant'
-import { formatDate, handleNumberValue } from '@/filters'
+import { formatDate, formatDecimal } from '@/filters'
 import { useComponent } from '@/hooks/component'
 import { useRequest } from '@/hooks/request'
 import { queryMineTradeTradeDetails } from '@/services/api/transfer'

+ 1 - 1
src/packages/mobile/views/transfer/listing/Index.vue

@@ -3,7 +3,7 @@
     <app-modal direction="right-top" height="100%" width="100%" v-model:show="showModal" :refresh="refresh">
         <app-view class="g-form">
             <template #header>
-                <app-navbar title="$t('operation.listing')" @back="closed" />
+                <app-navbar :title="$t('operation.listing')" @back="closed" />
             </template>
             <component :is="Price" v-bind="{ goodsCode }" />
             <component :is="Forex" v-bind="{ goodsCode, showMore: false }" @price-click="onPriceClick" />

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

@@ -1,7 +1,7 @@
 <!-- 商品订单-委托-撤销 -->
 <template>
     <app-drawer :title="t('common.tips')" v-model:show="show" :loading="loading" :refresh="refresh" :style="styles">
-        <div class="g-text-message">确认要撤销吗?</div>
+        <div class="g-text-message">{{ t('order.listingorder.tips1') }}</div>
         <template #footer>
             <el-button type="info" @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
             <el-button type="primary" @click="onCancelSumit()">{{ t('operation.submit') }}</el-button>

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

@@ -44,8 +44,8 @@ import { queryTradeOrderDetail } from '@/services/api/order'
 import { formatDate } from '@/filters'
 import { useComponent } from '@/hooks/component'
 import eventBus from '@/services/bus'
-import AppTable from '@pc/components/base/table/index.vue'
 import { i18n } from '@/stores'
+import AppTable from '@pc/components/base/table/index.vue'
 
 const componentMap = new Map<string, unknown>([
     ['cancel', defineAsyncComponent(() => import('./cancel/index.vue'))], // 撤单

+ 49 - 26
src/packages/pc/views/footer/pricing/order/cancel/index.vue

@@ -1,55 +1,78 @@
 <!-- 挂牌点价-挂单-撤销 -->
 <template>
-    <app-drawer :title="t('common.tips')" v-model:show="show" :loading="loading" :refresh="refresh">
-        <div class="g-text-message">确认要撤销吗?</div>
+    <app-drawer :title="t('common.tips')" v-model:show="show" :loading="loading" :refresh="refresh" :style="styles">
+        <div class="g-text-message">{{ t('order.listingorder.tips1') }}</div>
         <template #footer>
             <el-button type="info" @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
-            <el-button type="primary" @click="onCancelSumit()">{{ t('operation.cancel') }}</el-button>
+            <el-button type="primary" @click="onCancelSumit()">{{ t('operation.submit') }}</el-button>
         </template>
     </app-drawer>
 </template>
 
 <script lang="ts" setup>
-import { ref, PropType } from 'vue'
-import { ElMessage } from 'element-plus'
-import { useCancelOrder } from '@/business/trade'
+import { ref, PropType, onMounted } from 'vue'
+import { ElMessage, ElLoading } from 'element-plus'
 import { handleRequestBigNumber } from '@/filters'
-import { i18n, useSettingStore } from '@/stores'
+import { useCancelOrder } from '@/business/trade'
+import { useSettingStore, i18n } from '@/stores'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const props = defineProps({
-    selectedRow: {
-        type: Object as PropType<Model.TradeOrderDetailRsp>,
+    selectedRows: {
+        type: Object as PropType<Model.TradeOrderDetailRsp[]>,
         required: true
     }
 })
 
 const settingStore = useSettingStore()
+const showOrderCancelDialog = settingStore.getSettingValue('showOrderCancelDialog')
+const styles = {
+    opacity: showOrderCancelDialog ? 1 : 0
+}
 
-const { cancelSubmit, formData, loading } = useCancelOrder()
-const { t } = i18n.global
+const { cancelSubmit, formData } = useCancelOrder()
+const loading = ref(false)
 const show = ref(true)
 const refresh = ref(false)
+const { t } = i18n.global
 
 const onCancel = (isRefresh = false) => {
     show.value = false
     refresh.value = isRefresh
 }
 
-const onCancelSumit = () => {
-    /// 市场ID
-    formData.Header = { MarketID: props.selectedRow.marketid, GoodsID: props.selectedRow.goodsid }
-    formData.OldOrderId = handleRequestBigNumber(props.selectedRow.orderid)
-    /// 提交
-    cancelSubmit().then(() => {
-        if (settingStore.getSettingValue('showOrderSuccessMessage')) {
-            ElMessage.success(t('common.submitsuccess'))
-        }
-        onCancel(true)
-    }).catch((err) => {
-        if (settingStore.getSettingValue('showOrderSuccessMessage')) {
-            ElMessage.error(t('common.submitfailure') + err)
-        }
-    })
+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 = handleRequestBigNumber(orderid)
+        /// 提交
+        await cancelSubmit().catch((err) => {
+            errMessage.push(err)
+        })
+    }
+    loading.value = false
+    if (errMessage.length) {
+        ElMessage.error('部分撤单失败:' + errMessage[0])
+    } else {
+        ElMessage.success('撤单成功')
+    }
+    onCancel(true)
 }
+
+onMounted(() => {
+    // 不显示确认框
+    if (!showOrderCancelDialog) {
+        const loading = ElLoading.service({
+            lock: true,
+            background: 'rgba(0, 0, 0, .25)',
+        })
+        onCancelSumit().finally(() => {
+            loading.close()
+        })
+    }
+})
 </script>

+ 123 - 0
src/packages/pc/views/footer/pricing/order/clear/index.vue

@@ -0,0 +1,123 @@
+<!-- 挂牌点价-委托-快撤 -->
+<template>
+    <app-drawer :title="t('order.goodsorder.clear.title')" v-model:show="show" :width="420" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--vertical" label-width="100px" :model="formModel" :rules="formRules"
+            @submit.prevent>
+            <el-form-item prop="goodsId" :label="t('order.goodsorder.clear.goodsId')">
+                <el-select effect="dark" :placeholder="t('common.choice')" v-model="formModel.goodsId">
+                    <template v-for="(item, index) in goodsList" :key="index">
+                        <el-option :label="item.goodsname" :value="item.goodsid" />
+                    </template>
+                </el-select>
+            </el-form-item>
+            <el-form-item :label="t('order.goodsorder.clear.buyOrSell')">
+                <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="(formModel.buyOrSell === BuyOrSell.Buy ? '≤' : '≥')+t('order.goodsorder.clear.price')">
+                <el-input-number :placeholder="t('common.pleaseenter')" v-model="formModel.price" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button type="info" @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
+            <el-button type="primary" @click="onCancelSumit()">{{ t('operation.submit') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { onMounted, ref, reactive, PropType, computed } from 'vue'
+import { FormInstance, FormRules, ElMessage } from 'element-plus'
+import { handleRequestBigNumber } from '@/filters'
+import { BuyOrSell, getBuyOrSellList } from '@/constants/order'
+import { useCancelOrder } from '@/business/trade'
+import { i18n } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const { t } = i18n.global
+
+const props = defineProps({
+    dataList: {
+        type: Object as PropType<Model.TradeOrderDetailRsp[]>,
+        required: true
+    }
+})
+
+const { cancelSubmit, formData } = useCancelOrder()
+const formRef = ref<FormInstance>()
+const loading = ref(false)
+const show = ref(true)
+const refresh = ref(false)
+
+const formModel = reactive<{ goodsId?: number; buyOrSell: BuyOrSell; price?: number; }>({
+    buyOrSell: BuyOrSell.Buy
+})
+
+// 去重商品列表
+const goodsList = computed(() => props.dataList.filter((e, i, arr) => arr.findIndex((n) => n.goodsid === e.goodsid) === i))
+
+const formRules: FormRules = {
+    goodsId: [{
+        required: true,
+        message: '请选择委托商品'
+    }],
+    price: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (value) {
+                callback()
+            } else {
+                callback(new Error('请输入撤销价格'))
+            }
+        }
+    }]
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onCancelSumit = () => {
+    formRef.value?.validate(async (valid) => {
+        if (valid) {
+            loading.value = true
+            const errMessage: string[] = []
+            const selectedRows = props.dataList.filter((e) => {
+                if (formModel.price) {
+                    const flag = e.goodsid === formModel.goodsId && e.buyorsell === formModel.buyOrSell
+                    switch (formModel.buyOrSell) {
+                        case BuyOrSell.Buy:
+                            return flag && e.orderprice <= formModel.price
+                        case BuyOrSell.Sell:
+                            return flag && 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 = handleRequestBigNumber(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)
+        }
+    })
+}
+
+onMounted(() => formModel.goodsId = goodsList.value[0]?.goodsid)
+</script>

+ 62 - 25
src/packages/pc/views/footer/pricing/order/index.vue

@@ -1,7 +1,14 @@
 <!-- 挂牌点价-委托 -->
 <template>
-    <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading" :row-key="rowKey"
-        :expand-row-keys="expandKeys" @row-click="rowClick">
+    <app-table ref="tableRef" :data="dataList" selection-type="multiple" v-model:columns="tableColumns" :loading="loading" :row-key="rowKey"
+        :expand-row-keys="expandKeys" @selection-change="onTableSelect" @row-dblclick="onDBClickCancel" >
+        <template #headerRight>
+            <div class="buttonbar">
+                <el-button type="primary" size="small" :disabled="selectedRows.length === 0"
+                    @click="openComponent('cancel')">{{ t('operation.cancel2') }}</el-button>
+                <el-button type="primary" size="small" @click="openComponent('clear')">{{ t('operation.cancel1') }}</el-button>
+            </div>
+        </template>
         <!-- 商品代码/名称 -->
         <template #wrtradetype="{ row }">
             {{ row.goodscode }}/{{ row.goodsname }}
@@ -22,59 +29,89 @@
         <template #ordertime="{ value }">
             {{ formatDate(value) }}
         </template>
-        <!-- 展开行 -->
-        <template #expand="{ row }">
-            <div class="buttonbar">
-                <el-button type="danger" v-if="[3, 7].includes(row.orderstatus)" size="small"
-                    @click="showComponent('cancel', row)">{{ t('operation.cancel1') }}</el-button>
-            </div>
+        <template #append v-if="showLoadMore">
+            <el-button size="small" plain @click="loadMore">{{ t('common.loadMore' )}}</el-button>
         </template>
         <template #footer>
-            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+            <component ref="componentRef" v-bind="{ dataList, selectedRows }" :is="componentMap.get(componentId)"
                 @closed="closeComponent" v-if="componentId" />
         </template>
     </app-table>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, defineAsyncComponent } from 'vue'
+import { shallowRef, defineAsyncComponent, ref, onUnmounted } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
+import { useLocalPagination } from '@/hooks/pagination'
 import { queryTradeOrderDetail } from '@/services/api/order'
 import { useComponent } from '@/hooks/component'
 import { getWRTradeOrderStatusName, getBuyOrSellName } from '@/constants/order'
-import { useComposeTable } from '@pc/components/base/table'
 import { useTableColumnsStore, i18n } from '@/stores'
 import AppTable from '@pc/components/base/table/index.vue'
-
-const { t } = i18n.global
+import eventBus from '@/services/bus'
 
 const componentMap = new Map<string, unknown>([
-    ['cancel', defineAsyncComponent(() => import('./cancel/index.vue'))],
+    ['cancel', defineAsyncComponent(() => import('./cancel/index.vue'))], // 撤单
+    ['clear', defineAsyncComponent(() => import('./clear/index.vue'))], // 快撤
 ])
 
-const { getTableColumns } = useTableColumnsStore()
-const tableColumns = shallowRef<Model.TableColumn[]>([])
+const { tableList, showLoadMore, initTableData, loadMore } = useLocalPagination<Model.TradeOrderDetailRsp>()
+const tableRef = ref()
+const selectedRows = ref<Model.TradeOrderDetailRsp[]>([])
+const { t } = i18n.global
 
-const { loading, dataList, run } = useRequest(queryTradeOrderDetail, {
+const { loading, dataList, run, runAsync } = useRequest(queryTradeOrderDetail, {
     params: {
-        tradeMode: '10'
+        tradeMode: '10',
+        orderStatus: '3,7,12',
     },
+    onSuccess: (res) => initTableData(res.data)
 })
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     run()
 })
 
-const { rowKey, expandKeys, rowClick } = useComposeTable<Model.TradeOrderDetailRsp>({ rowKey: 'orderid' })
-const selectedRow = shallowRef<Model.TradeOrderDetailRsp>()
+const { getTableColumns } = useTableColumnsStore()
+getTableColumns('swap-order').then((res) => {
+    tableColumns.value = res
+})
 
-const showComponent = (componentName: string, row: Model.TradeOrderDetailRsp) => {
-    selectedRow.value = row
-    openComponent(componentName)
+const tableColumns = shallowRef<Model.TableColumn[]>([])
+
+/// 双击单据撤销
+const onDBClickCancel = (row: Model.TradeOrderDetailRsp) => {
+    selectedRows.value = [row]
+    tableRef.value?.elTable.toggleRowSelection(row, true) // 双击选中该行
+    openComponent('cancel')
 }
 
-getTableColumns('swap-order').then((res) => {
-    tableColumns.value = res
+// 勾选表格行
+const onTableSelect = (rows: Model.TradeOrderDetailRsp[]) => {
+    selectedRows.value = rows
+}
+
+// 接收成交通知
+const posChangedNtf = eventBus.$on('OrderDealedNtf', () => {
+    run()
 })
+
+// 接收委托回应通知
+const orderRspNotify = eventBus.$on('OrderRsp', () => {
+    const [firstItem] = tableList.value
+    runAsync({
+        incOrderID: firstItem?.orderid
+    }).then((res) => {
+        dataList.value.unshift(...res.data)
+        tableList.value.unshift(...res.data)
+    })
+})
+
+
+onUnmounted(() => {
+    posChangedNtf.cancel()
+    orderRspNotify.cancel()
+})
+
 </script>

+ 1 - 1
src/packages/pc/views/footer/swap/order/cancel/index.vue

@@ -1,7 +1,7 @@
 <!-- 掉期市场-挂单-撤销 -->
 <template>
     <app-drawer :title="t('common.tips')" v-model:show="show" :loading="loading" :refresh="refresh">
-        <div class="g-text-message">确认要撤销吗?</div>
+        <div class="g-text-message">{{ t('order.listingorder.tips1') }}</div>
         <template #footer>
             <el-button type="info" @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
             <el-button type="primary" @click="onCancelSumit()">{{ t('operation.submit') }}</el-button>

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

@@ -1,4 +1,4 @@
-<!-- 交易市场 - 掉期市场 -->
+<!-- 交易市场 - 挂牌点价 -->
 <template>
     <app-table :data="tableList" v-model:columns="tableColumns" @row-click="onRowClick" showIndex>
         <!-- 当前价 -->