huangbin 4 роки тому
батько
коміт
b9b6a56019

+ 24 - 0
src/services/bus/goods.ts

@@ -24,6 +24,30 @@ export function getQuoteDayInfoByCode(goodsCode: string): QueryQuoteDayRsp | und
     return getAllQuoteDayInfo().find(e => e.goodscode === goodsCode)
 }
 
+// 通过goodcode 获取商品最新价
+export function getQuoteDayInfoByCodeFindPrice(goodsCode: string) {
+    const goods = getGoodsByCode(goodsCode);
+    let result: number | string = '--';
+    if (goods) {
+        const n = Math.pow(10, goods.decimalplace);
+        const quoteData = getQuoteDayInfoByCode(goodsCode);
+        // 期货合约取价顺序:现价->实时结算价->昨结算价
+        if (quoteData) {
+            if (quoteData.last) {
+                result = quoteData.last / n;
+            } else if (quoteData.settle) {
+                result = quoteData.settle / n;
+            } else if (quoteData.presettle) {
+                result = quoteData.presettle / n;
+            } else {
+                result = '--'
+            }
+        }
+        result = typeof result === 'number' ? Number(result.toFixed(goods?.decimalplace)) : result;
+    }
+    return result
+}
+
 // 获取全部商品组信息
 export function getAllGoodsGroups(): Goodsgroup[] {
     return APP.get('goodsgroups')

+ 9 - 3
src/services/go/useInfo/index.ts

@@ -1,8 +1,9 @@
 import APP from '@/services';
 import { getLongTypeLoginID } from '@/services/bus/login';
+import { getUsrId } from '@/services/bus/user';
 import { commonSearch_go } from '../index';
 import * as type from './interface';
-import {Ermcp3RootUserAccount} from "./interface";
+import { Ermcp3RootUserAccount } from "./interface";
 
 /**
  * 获取登录ID
@@ -50,6 +51,7 @@ export function LoginQuery(): Promise<type.LoginQueryRsp> {
         userInfo && APP.set('userInfo', userInfo);
         username && APP.set('username', username);
         console.log('LoginQuery', res);
+        QueryRootUserAccount()
         return res
     })
 }
@@ -67,8 +69,12 @@ export function QueryUserInfo(userID: number, isDecrypt?: boolean): Promise<type
  * 查询顶级用户信息
  * /Ermcp3/QueryRootUserAccount
  */
-export function QueryRootUserAccount(userid: number): Promise<Ermcp3RootUserAccount> {
-    return commonSearch_go('/Ermcp3/QueryRootUserAccount', { userid } ).catch((err) => {
+export function QueryRootUserAccount(): Promise<Ermcp3RootUserAccount> {
+    const userid = getUsrId()
+    return commonSearch_go('/Ermcp3/QueryRootUserAccount', { userid }).then(res => {
+        console.log('查询顶级用户信息', res)
+        return res
+    }).catch((err) => {
         throw new Error(`查询顶级用户信息: ${err}`);
     });
 }

+ 3 - 18
src/views/market/spot_trade/components/buy-sell-market/index.vue

@@ -117,7 +117,7 @@ import { handleSpotBtnList } from '../../setup';
 import { v4 } from 'uuid';
 import { addSubscribeQuotation, removeSubscribeQuotation } from '@/services/socket/quota';
 import Bus from '@/utils/eventBus/index';
-import { getGoodsByCode, getQuoteDayInfoByCode } from '@/services/bus/goods';
+import { getGoodsByCode, getQuoteDayInfoByCode, getQuoteDayInfoByCodeFindPrice } from '@/services/bus/goods';
 import TimerUtils from '@/utils/timer/timerUtil';
 import { BtnList as BtnListType } from '@/common/components/btnList/interface';
 import moment, { Moment } from 'moment';
@@ -164,24 +164,9 @@ export default defineComponent({
         // 获取浮动价商品实时价格
 
         function getGoodsPrice() {
-            const goods = getGoodsByCode(props.selectedRow.goodscode);
-            let result: number | string = '--';
-            if (goods) {
-                const n = Math.pow(10, goods.decimalplace);
-                const quoteData = getQuoteDayInfoByCode(props.selectedRow.goodscode);
-                // 期货合约取价顺序:现价->实时结算价->昨结算价
-                if (quoteData) {
-                    if (quoteData.last) {
-                        result = quoteData.last / n;
-                    } else if (quoteData.settle) {
-                        result = quoteData.settle / n;
-                    } else if (quoteData.presettle) {
-                        result = quoteData.presettle / n;
-                    }
-                }
-            }
+            const result = getQuoteDayInfoByCodeFindPrice(props.selectedRow.goodscode);
             setGoodsPrice(result);
-            return typeof result === 'number' ? result.toFixed(goods?.decimalplace) : result;
+            return result;
         }
         const uuid = v4();
         if (isFloat()) {

+ 7 - 0
src/views/market/spot_trade/components/post_buying/index.vue

@@ -46,6 +46,13 @@
                                 v-model:value="formState.PriceMove" />
               </a-form-item>
             </a-col>
+            <a-col :span="24"
+                   v-if="isFloat()">
+              <a-form-item label="估算价"
+                           name="PriceMove">
+                <span>估算价估算价</span>
+              </a-form-item>
+            </a-col>
 
             <a-col :span="24">
               <a-form-item label="挂牌数量"

+ 76 - 15
src/views/order/spot_warran/components/spot_warrant_spot_details/components/listing/index.vue

@@ -29,7 +29,7 @@
               </a-form-item>
             </a-col>
             <a-col :span="12"
-                   v-if="formState.WRPriceType === 1">
+                   v-if="!isFloat()">
               <a-form-item label="挂牌价"
                            name="FixedPrice">
                 <a-input-number class="dialogInput"
@@ -40,8 +40,8 @@
               </a-form-item>
             </a-col>
             <a-col :span="12"
-                   v-if="formState.WRPriceType === 2">
-              <a-form-item label="升贴水"
+                   v-if="isFloat()">
+              <a-form-item label="基差"
                            name="PriceMove">
                 <a-input-number class="commonInput"
                                 :min="0"
@@ -92,7 +92,7 @@
             <a-col :span="12">&nbsp;</a-col>
           </a-row>
           <a-row :gutter="24"
-                 v-if="formState.WRPriceType === 2">
+                 v-if="isFloat()">
             <a-col :span="24">
               <a-form-item label="行情商品"
                            name="goodsid">
@@ -117,11 +117,39 @@
                           placeholder="请选择合约">
                   <a-select-option v-for="item in goodsList"
                                    :value="item.goodsid"
-                                   :key="item.goodsid">{{item.goodsname}}</a-select-option>
+                                   :key="item.goodsid">{{item.goodsname}}
+                  </a-select-option>
                 </a-select>
               </a-form-item>
             </a-col>
           </a-row>
+          <a-row :gutter="24">
+            <a-col :span="24"
+                   class="relative">
+              <a-form-item :label="isFloat() ? '估算金额' : '摘牌金额'">
+                <span class="white ml8">{{getMoney()}}</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="24"
+                   class="relative">
+              <a-form-item :label="getMargin() ? '履约保证金' : ''">
+                <a-row>
+                  <a-col :span="8"
+                         v-if="getMargin()">
+                    <span class="white ml8">{{getMargin()}}</span>
+                  </a-col>
+                  <a-col :span="4"
+                         class="tr">
+                    <span class="grey1">可用资金</span>
+                  </a-col>
+                  <a-col :span="12">
+                    <span class="white ml8"> {{getCanUseMoney(handleSelectedAccount())}}</span>
+                  </a-col>
+                </a-row>
+              </a-form-item>
+            </a-col>
+          </a-row>
+
           <a-row :gutter="24"
                  type="flex"
                  justify="center">
@@ -132,6 +160,8 @@
                           :disabled="loading"
                           @click="submit">卖出</a-button>
                 <a-button class="ml10 cancelBtn"
+                          :loading="loading"
+                          :disabled="loading"
                           @click="cancel">取消</a-button>
               </a-form-item>
             </a-col>
@@ -143,27 +173,29 @@
 </template>
 
 <script lang="ts">
-import { defineComponent, PropType, ref } from 'vue';
+import { defineComponent, onMounted, PropType, ref } from 'vue';
 import { enumOrderComponents } from '@/common/constants/enumOrderComponents';
 import Drawer from '@/common/components/drawer/index.vue';
 import { QueryWrPositionReq, WrHoldLB, WrPosition } from '@/services/go/wrtrade/interface';
-import { getInTaAccount, getUserId } from '@/services/bus/account';
+import { getAccountTypeList, getInTaAccount, getSelectedAccount, getUserId } from '@/services/bus/account';
 import { requestResultLoadingAndInfo } from '@/common/methods/request/resultInfo';
 import { hdWROrder } from '@/services/proto/warehousetrade';
-import { v4 as uuidv4 } from 'uuid';
+import { v4 } from 'uuid';
 import moment from 'moment';
 import { ModalEnum } from '@/common/constants/modalNameEnum';
 import { _closeModal } from '@/common/setup/modal/modal';
-import { handleGoods, handleForm } from './setup';
+import { handleGoods, handleForm, handleNumAndPrice, handlePriceRule } from './setup';
 import { validateAction } from '@/common/setup/form';
 import { ListingForm } from './interface';
-import { getMarketRunByTradeMode } from '@/services/bus/market';
+import { getMarketByTradeMode, getMarketRunByTradeMode } from '@/services/bus/market';
 import { message } from 'ant-design-vue';
 import { getGoodsGroupsByTradeMode } from '@/services/bus/goods';
 import { TradeMode } from '@/common/constants/enumCommon';
 import { WRGoodsInfo } from '@/services/proto/warehousetrade/interface';
 import { BuyOrSell } from '@/common/constants/enumCommon';
 import Bus from '@/utils/eventBus/index';
+import { addSubscribeQuotation, removeSubscribeQuotation } from '@/services/socket/quota';
+import { getCanUseMoney } from '@/services/bus/account';
 
 export default defineComponent({
     name: ModalEnum.spot_warrant_spot_details_listed,
@@ -176,18 +208,42 @@ export default defineComponent({
         },
     },
     setup(props, context) {
+        const loading = ref<boolean>(false);
+        const marketInfo = getMarketByTradeMode(TradeMode.WarehouseReceiptTrade);
+        if (marketInfo) {
+            // 获取计算规则
+            handlePriceRule(loading, marketInfo.marketid);
+        }
         const { visible, cancel } = _closeModal(context);
         const { rules, formState, formRef } = handleForm(props.selectedRow);
-        const data = props.selectedRow;
-        const loading = ref<boolean>(false);
+
         const { goodsGroup, goodsList, groupsChange, findGoodsCode } = handleGoods();
+        // 切换商品组
         function handleGoodsGroups(value: number) {
             groupsChange(value);
             formRef.value.validate();
         }
-        function handleGoodsChange() {
+        const uuid = v4();
+        // 切换商品
+        function handleGoodsChange(id: number) {
+            //行情订阅
+            removeSubscribeQuotation(uuid);
+            const goodsCode = goodsList.value.find((e) => e.goodsid === id)?.goodscode as string;
+            const arr = [{ exchangeCode: 250, goodsCode: goodsCode, subState: 0 }];
+            addSubscribeQuotation(uuid, arr);
             formRef.value.validate();
         }
+
+        onMounted(() => {
+            removeSubscribeQuotation(uuid);
+        });
+        const { getMoney, getMargin, isFloat } = handleNumAndPrice();
+        // 处理内部资金账号
+        function handleSelectedAccount() {
+            const item = getSelectedAccount();
+            const list = getAccountTypeList([2]);
+            return item.taaccounttype === 2 ? item : list[0];
+        }
         function submit() {
             const marketInfo = getMarketRunByTradeMode(17);
             if (marketInfo) {
@@ -204,7 +260,7 @@ export default defineComponent({
 
                     const param = {
                         AccountID: getInTaAccount(), // 默认内部资金账号第一个
-                        ClientSerialNo: uuidv4(), // 客户端流水号
+                        ClientSerialNo: v4(), // 客户端流水号
                         // OperateSrc: 2,
                         ClientType: 4,
                         // MarketID: marketInfo.marketid,
@@ -218,7 +274,7 @@ export default defineComponent({
                         IsSpecified: 0, // 是否指定对手 0:不指定 1:指定 uint32
                         // MatchUserIDs: 0, // 仓单贸易对手资金账号ID集合(指定对手时填写) uint32
                         OrderQty: res.OrderQty, // 委托数量(可挂部分数据量) ======
-                        DeliveryGoodsID: data.deliverygoodsid, // 交割商品商品ID
+                        DeliveryGoodsID: props.selectedRow.deliverygoodsid, // 交割商品商品ID
                         WRPriceType: res.WRPriceType, // 价格方式 1:固定价 2:浮动价
                         FixedPrice: res.FixedPrice, // 固定价格
                         PriceFactor: 1, // 价格系数(浮动价时填写)
@@ -265,6 +321,11 @@ export default defineComponent({
             goodsList,
             handleGoodsGroups,
             handleGoodsChange,
+            isFloat,
+            getMoney,
+            getMargin,
+            getCanUseMoney,
+            handleSelectedAccount,
         };
     },
 });

+ 64 - 14
src/views/order/spot_warran/components/spot_warrant_spot_details/components/listing/setup.ts

@@ -1,23 +1,27 @@
 import { TradeMode } from '@/common/constants/enumCommon';
+import { queryResultLoadingAndInfo } from '@/common/methods/request/resultInfo';
 import { validateCommon } from '@/common/setup/validate';
-import { getGoodsGroupsByTradeMode, getGoodsList } from '@/services/bus/goods';
+import { getGoodsGroupsByTradeMode, getGoodsList, getQuoteDayInfoByCodeFindPrice } from '@/services/bus/goods';
 import { Goods } from "@/services/go/ermcp/goodsInfo/interface";
-import { WrHoldLB } from "@/services/go/wrtrade/interface";
+import { queryWrMarketTradeConfig } from '@/services/go/wrtrade';
+import { WrHoldLB, WrMarketTradeConfig } from "@/services/go/wrtrade/interface";
 import { RuleObject } from 'ant-design-vue/lib/form/interface';
-import { reactive, ref, UnwrapRef } from "vue";
+import { reactive, Ref, ref, UnwrapRef } from "vue";
 import { ListingForm } from "./interface";
 
+const formState: UnwrapRef<ListingForm> = reactive({
+    WRPriceType: 1,
+    FixedPrice: 0,
+    OrderQty: 0,
+    DelistMinQty: 0,
+    PriceMove: 1,
+    goodsgroupid: undefined,
+    goodsid: undefined,
+})
+
 export function handleForm(data: WrHoldLB) {
     const formRef = ref();
-    const formState: UnwrapRef<ListingForm> = reactive({
-        WRPriceType: 1,
-        FixedPrice: 0,
-        OrderQty: 0,
-        DelistMinQty: 0,
-        PriceMove: 1,
-        goodsgroupid: undefined,
-        goodsid: undefined,
-    })
+
     const v_group = async (rule: RuleObject, value: number) => {
         if (formState.goodsgroupid) {
             return validateCommon(value, '请选择合约');
@@ -47,11 +51,10 @@ export function handleForm(data: WrHoldLB) {
     return { rules, formState, formRef }
 }
 
-
+const goodsList = ref<Goods[]>([])
 export function handleGoods() {
     const goodsGroup = getGoodsGroupsByTradeMode(TradeMode.quote99);
     const allGoods = getGoodsList()
-    const goodsList = ref<Goods[]>([])
     function groupsChange(id: number) {
         goodsList.value = allGoods.filter(e => e.goodsgroupid === id)
     }
@@ -59,4 +62,51 @@ export function handleGoods() {
         return allGoods.find(e => e.goodsid === id)?.goodscode
     }
     return { goodsGroup, goodsList, groupsChange, findGoodsCode }
+}
+
+// 获取金额计算规则
+const rules = ref<WrMarketTradeConfig[]>([])
+export function handlePriceRule(loading: Ref<boolean>, marketid: number) {
+    queryResultLoadingAndInfo(queryWrMarketTradeConfig, loading, { marketid }).then(res => {
+        rules.value = res;
+    })
+}
+
+export function handleNumAndPrice() {
+    function isFloat() {
+        return formState.WRPriceType === 2;
+    }
+    // 获取选中的资金账号
+    const hasRules = () => rules.value.length > 0
+    //  摘牌金额
+    function getMoney() {
+        let result = 0
+        if (isFloat()) {
+            if (hasRules()) {
+                const goodsCode = goodsList.value.find(e => e.goodsid === formState.goodsid)?.goodscode as string
+                const goodsPrice = getQuoteDayInfoByCodeFindPrice(goodsCode);
+                if (goodsPrice && goodsPrice !== '--') {
+                    // 浮动价挂牌金额=(基差价格+期货合约最新价)*挂牌数量
+                    result = (formState.PriceMove + (goodsPrice as number)) * formState.OrderQty
+                }
+            }
+        } else {
+            // 摘牌金额=挂牌价格*摘牌数量
+            result = formState.OrderQty * formState.FixedPrice
+        }
+        return Number(result.toFixed(2))
+    }
+    // 履约保证金
+    function getMargin() {
+        if (hasRules()) {
+            const { sellmarginvalue } = rules.value[0]
+            // 浮动价 履约保证金=估算总额*买方履约保证金比例
+            // 一口价 履约保证金=挂牌金额*买方履约保证金比例
+            return Number((getMoney() * sellmarginvalue).toFixed(2))
+        } else {
+            return 0
+        }
+
+    }
+    return { getMoney, getMargin, isFloat }
 }