Bläddra i källkod

企业风管8期

li.shaoyi 3 år sedan
förälder
incheckning
9f789bc3b4
100 ändrade filer med 3745 tillägg och 419 borttagningar
  1. 129 0
      public/proto/mtp.proto
  2. 4 0
      src/@next/components/base/tab-component/index.less
  3. 38 0
      src/@next/components/base/tab-component/index.vue
  4. 2 2
      src/@next/components/base/tabbar/index.less
  5. 11 10
      src/@next/components/layout/footer-main/index.vue
  6. 10 7
      src/@next/components/layout/footer/index.vue
  7. 35 0
      src/@next/constants/enum/businessType.ts
  8. 41 0
      src/@next/constants/enum/hedgedItemStatus.ts
  9. 39 0
      src/@next/constants/enum/hedgedType.ts
  10. 33 0
      src/@next/constants/enum/index.ts
  11. 99 39
      src/@next/hooks/common/index.ts
  12. 1 1
      src/@next/hooks/common/interface.ts
  13. 4 3
      src/assets/styles/mixin.less
  14. 2 2
      src/common/components/filter/interface.ts
  15. 0 12
      src/common/constants/EnumKey.ts
  16. 9 0
      src/common/constants/enumCommon.ts
  17. 7 0
      src/common/constants/enumsList.ts
  18. 2 2
      src/common/methods/table/index.ts
  19. 2 2
      src/common/setup/table/clolumn.ts
  20. 1 1
      src/common/setup/table/interface.ts
  21. 81 65
      src/layout/components/bottom.vue
  22. 10 8
      src/layout/components/container.vue
  23. 7 10
      src/services/bus/allEnum.ts
  24. 7 1
      src/services/bus/rules.ts
  25. 17 1
      src/services/funcode/index.ts
  26. 122 0
      src/services/go/ermcp/hedgedItem/index.ts
  27. 414 0
      src/services/go/ermcp/hedgedItem/interface.ts
  28. 13 1
      src/services/go/ermcp/report/index.ts
  29. 51 1
      src/services/go/ermcp/report/interface.ts
  30. 44 0
      src/services/proto/hedgedItem/index.ts
  31. 128 0
      src/services/proto/hedgedItem/interface.ts
  32. 1 1
      src/views/account/login.vue
  33. 75 0
      src/views/business/plan/list/finish/index.vue
  34. 7 3
      src/views/business/search/plan/index.vue
  35. 2 1
      src/views/business/search/spot/index.vue
  36. 54 0
      src/views/hedgeditem/exposure/components/futures/index.vue
  37. 54 0
      src/views/hedgeditem/exposure/components/plan/index.vue
  38. 54 0
      src/views/hedgeditem/exposure/components/position/index.vue
  39. 54 0
      src/views/hedgeditem/exposure/components/spot/index.vue
  40. 49 0
      src/views/hedgeditem/exposure/list/index.vue
  41. 46 0
      src/views/hedgeditem/futures/components/filter/index.vue
  42. 2 0
      src/views/hedgeditem/futures/finish/index.vue
  43. 134 0
      src/views/hedgeditem/futures/in/components/bind/form.ts
  44. 111 0
      src/views/hedgeditem/futures/in/components/bind/index.vue
  45. 75 0
      src/views/hedgeditem/futures/in/index.vue
  46. 49 0
      src/views/hedgeditem/futures/out/index.vue
  47. 132 0
      src/views/hedgeditem/spot/contract/components/bind/form.ts
  48. 142 0
      src/views/hedgeditem/spot/contract/components/bind/index.vue
  49. 32 0
      src/views/hedgeditem/spot/contract/components/filter/index.vue
  50. 88 0
      src/views/hedgeditem/spot/contract/index.vue
  51. 38 0
      src/views/hedgeditem/spot/plan/components/bind/form.ts
  52. 113 0
      src/views/hedgeditem/spot/plan/components/bind/index.vue
  53. 2 0
      src/views/hedgeditem/spot/plan/index.vue
  54. 71 0
      src/views/hedgeditem/trade/components/add/form.ts
  55. 95 0
      src/views/hedgeditem/trade/components/add/index.vue
  56. 98 0
      src/views/hedgeditem/trade/components/ending/index.vue
  57. 78 0
      src/views/hedgeditem/trade/components/filter/index.vue
  58. 54 0
      src/views/hedgeditem/trade/components/futures/index.vue
  59. 61 0
      src/views/hedgeditem/trade/components/plan/index.vue
  60. 54 0
      src/views/hedgeditem/trade/components/position/index.vue
  61. 54 0
      src/views/hedgeditem/trade/components/spot/index.vue
  62. 54 0
      src/views/hedgeditem/trade/finish/index.vue
  63. 71 0
      src/views/hedgeditem/trade/running/index.vue
  64. 76 32
      src/views/information/spot-contract/components/add/index.vue
  65. 58 56
      src/views/information/spot-contract/components/detail/index.vue
  66. 2 2
      src/views/information/spot-contract/components/setup.ts
  67. 5 3
      src/views/market/market-spot/components/post_buying/interface.ts
  68. 5 3
      src/views/market/market-spot/components/post_buying/setup.ts
  69. 0 1
      src/views/market/market-spot/setup.ts
  70. 11 7
      src/views/order/commodity_contract/components/commodity_contract_bargain/index.vue
  71. 8 5
      src/views/order/commodity_contract/components/commodity_contract_commission/index.vue
  72. 7 5
      src/views/order/commodity_contract/components/commodity_contract_make_deal/index.vue
  73. 7 5
      src/views/order/commodity_contract/components/commodity_contract_settlement/index.vue
  74. 10 6
      src/views/order/commodity_contract/components/commodity_contract_summary/index.vue
  75. 8 5
      src/views/order/financing_manager/components/financing_manager_apply_order/index.vue
  76. 4 4
      src/views/order/financing_manager/components/financing_manager_contract/index.vue
  77. 4 4
      src/views/order/funding_information/components/funding_information_funding_log/index.vue
  78. 4 4
      src/views/order/futures_information/components/futures_information_entrust/index.vue
  79. 7 5
      src/views/order/futures_information/components/futures_information_position/index.vue
  80. 7 5
      src/views/order/futures_information/components/futures_information_success/index.vue
  81. 9 5
      src/views/order/performance_information/components/performance_information_buy_performance/index.vue
  82. 10 6
      src/views/order/performance_information/components/performance_information_sell_performance/index.vue
  83. 3 3
      src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_bargain/index.vue
  84. 8 5
      src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_deal/index.vue
  85. 3 3
      src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_designated_deal/index.vue
  86. 7 4
      src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_order_summary/index.vue
  87. 3 3
      src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_pending_order/index.vue
  88. 5 3
      src/views/order/spot_warran/components/spot_warrant_bargain/index.vue
  89. 8 5
      src/views/order/spot_warran/components/spot_warrant_deal/index.vue
  90. 6 4
      src/views/order/spot_warran/components/spot_warrant_designated_deal/index.vue
  91. 7 4
      src/views/order/spot_warran/components/spot_warrant_in_and_out_warehouse/index.vue
  92. 7 5
      src/views/order/spot_warran/components/spot_warrant_inventory_summary/index.vue
  93. 9 5
      src/views/order/spot_warran/components/spot_warrant_pending_order/index.vue
  94. 8 5
      src/views/order/spot_warran/components/spot_warrant_spot_details/index.vue
  95. 7 5
      src/views/order/spot_warran/components/spot_warrant_spot_summary/index.vue
  96. 10 6
      src/views/order/swap_the_order/components/swap_commodity_contract_bargain/index.vue
  97. 8 5
      src/views/order/swap_the_order/components/swap_commodity_contract_commission/index.vue
  98. 7 5
      src/views/order/swap_the_order/components/swap_commodity_contract_make_deal/index.vue
  99. 21 8
      src/views/order/swap_the_order/components/swap_commodity_contract_summary/index.vue
  100. 9 5
      src/views/report/components/filter/index.vue

+ 129 - 0
public/proto/mtp.proto

@@ -2204,4 +2204,133 @@ message WRTradeDealedNtf {
 		optional double PerformanceAmount = 18; // double 履约金额
 		optional uint64 PerformancePlanID = 19; // uint64 履约计划ID
 		optional int64 PerformanceTemplateID = 20; // int64 履约计划模板ID
+}
+
+// 新增套期项目请求
+message HedgedItemAddReq {
+	optional MessageHead Header = 1;
+		optional string HedgedItemNum = 2; // 被套期项目编号
+		optional string HedgedItemName = 3; // 项目名称
+		optional uint32 HedgedType = 4; // 套期类型-1:采购计划项目
+		optional string PlanStartDate = 5; // 计划开始日期
+		optional string PlanEndDate = 6; // 计划结束日期
+		optional uint64 TradeUserID = 7; // 交易用户ID
+		optional uint64 AreaUserID = 8; // 企业ID
+		optional uint32 ApplySrc = 9; // 申请来源
+		optional uint64 ApplyID = 10; // 申请人
+		optional string Remark = 11; // 备注
+		optional uint64 SpotContractID = 12; // 现货合同ID
+		optional uint64 Qty = 13; // 数量
+		optional string ClientTicket = 14; // 客户端流水号
+}
+
+// 新增套期项目响应
+message HedgedItemAddRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 HedgedItemID = 4; // 被套期项目ID
+		optional string ClientTicket = 5; // 客户端流水号
+}
+
+// 套期项目操作请求
+message HedgedItemOperateReq {
+	optional MessageHead Header = 1;
+		optional uint64 HedgedItemID = 2; // 被套期项目ID
+		optional uint32 OperateType = 3; // 操作类型-1:审核通过2:审核拒绝
+		optional uint64 AuditID = 4; // 审核人
+		optional uint32 AuditSrc = 5; // 审核来源
+		optional string AuditRemark = 6; // 审核备注
+		optional string ClientTicket = 7; // 客户端流水号
+}
+
+// 套期项目操作响应
+message HedgedItemOperateRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional string ClientTicket = 4; // 客户端流水号
+}
+
+// 套期项目结束请求
+message HedgedItemEndReq {
+	optional MessageHead Header = 1;
+		optional uint64 HedgedItemID = 2; // 被套期项目信息
+		optional string ClientTicket = 3; // 客户端流水号
+}
+
+// 套期项目结束响应
+message HedgedItemEndRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional string ClientTicket = 4; // 客户端流水号
+}
+
+// 被套期项目信息
+message HedgedItemInfo {
+	optional uint64 HedgedItemID = 1; // 被套期项目ID
+	optional uint64 RelatedQty = 2; // 关联数量
+}
+
+// 合同关联项目请求
+message ContractRelatedHedgedItemReq {
+	optional MessageHead Header = 1;
+		optional uint64 SpotContractID = 2; // 现货合同ID
+		repeated HedgedItemInfo HedgedItemInfos = 3; // 被套期项目信息
+		optional string ClientTicket = 4; // 客户端流水号
+}
+
+// 合同关联项目响应
+message ContractRelatedHedgedItemRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional string ClientTicket = 4; // 客户端流水号
+}
+
+// 关联套保计划信息
+message RelatedHedgePlanInfo {
+	optional uint64 HedgePlanID = 1; // 被套期项目ID
+	optional uint64 OriAvgPrice = 2; // 期初市场价
+}
+
+// 项目关联计划请求
+message HedgedItemRelatedPlanReq {
+	optional MessageHead Header = 1;
+		optional uint64 HedgedItemID = 2; // 被套期项目信息
+		repeated RelatedHedgePlanInfo RelatedHedgePlanInfos = 3; // 关联套保计划信息
+		optional string ClientTicket = 4; // 客户端流水号
+}
+
+// 项目关联计划响应
+message HedgedItemRelatedPlanRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional string ClientTicket = 4; // 客户端流水号
+}
+
+// 内部成交单关联请求
+message InnerTradeLinkReq {
+	optional MessageHead Header = 1;
+		optional uint64 TradeId = 2; // 内部成交单号
+		optional uint32 HedgeFlag = 3; // 投机套保标志
+		optional uint64 SpotContractID = 4; // 现货合同ID
+		optional uint32 SaleUserID = 5; // 业务员ID
+		optional uint32 BizSubjectID = 6; // 归属业务部门ID
+		optional double RelatedLot = 7; // 关联手数
+		optional uint32 RelatedMode = 8; // 关联模式
+		optional uint32 CreatorSrc = 9; // 创建来源
+		optional uint64 CreatorID = 10; // 创建人
+		optional string ClientTicket = 11; // 客户端流水号
+}
+
+// 内部成交单关联响应
+message InnerTradeLinkRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 TradeId = 4; // 内部成交单号
+		optional string ClientTicket = 5; // 客户端流水号
 }

+ 4 - 0
src/@next/components/base/tab-component/index.less

@@ -0,0 +1,4 @@
+.mtp-tab-component {
+    display       : flex;
+    flex-direction: column;
+}

+ 38 - 0
src/@next/components/base/tab-component/index.vue

@@ -0,0 +1,38 @@
+<template>
+    <div class="mtp-tab-component">
+        <component :is="currentTabComponent.component" :name="currentTabComponent.code" v-bind="options"
+            v-if="currentTabComponent" />
+        <mtp-tabbar class="mtp-tabbar--bottom" :data-source="dynamicComponents" label="title" @change="componentChange">
+            <slot name="tabbar"></slot>
+        </mtp-tabbar>
+    </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue'
+import { useDynamicComponent } from '@/@next/hooks/common'
+import MtpTabbar from '@/@next/components/base/tabbar/index.vue'
+
+export default defineComponent({
+    components: {
+        MtpTabbar
+    },
+    props: {
+        code: String,
+        options: Object,
+    },
+    setup(props) {
+        const { dynamicComponents, currentTabComponent, componentChange } = useDynamicComponent(props.code);
+
+        return {
+            dynamicComponents,
+            currentTabComponent,
+            componentChange,
+        }
+    }
+})
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 2 - 2
src/@next/components/base/tabbar/index.less

@@ -15,6 +15,8 @@
             justify-content: center;
             align-items    : center;
             cursor         : pointer;
+            min-width      : 120px;
+            padding        : 0 12px;
         }
     }
 
@@ -25,7 +27,6 @@
 
         .tabs {
             &-item {
-                min-width    : 120px;
                 height       : 32px;
                 line-height  : 32px;
                 font-size    : 14px;
@@ -49,7 +50,6 @@
         .tabs {
             &-item {
                 position    : relative;
-                min-width   : 120px;
                 height      : 26px;
                 line-height : 26px;
                 font-size   : 14px;

+ 11 - 10
src/@next/components/layout/footer-main/index.vue

@@ -1,7 +1,8 @@
 <template>
   <div class="mtp-footer-main">
-    <component :is="currentComponent.component" :parent-component="currentComponent" v-if="currentComponent"></component>
-    <mtp-tabbar class="mtp-tabbar--bottom" :data-source="components" label="title" @change="componentChange">
+    <component :is="currentTabComponent.component" :parent-component="currentTabComponent" v-if="currentTabComponent">
+    </component>
+    <mtp-tabbar class="mtp-tabbar--bottom" :data-source="dynamicComponents" label="title" @change="componentChange">
       <!-- 议价单 -->
       <div class="goods-apply" v-if="showBargainRadio">
         <a-radio-group class="conditionCommonRadioGroup" v-model:value="bargainValue">
@@ -32,22 +33,22 @@ export default defineComponent({
     MtpTabbar,
   },
   setup(props) {
-    const { components, currentComponent, componentChange } = useDynamicComponent(props.parentComponent.code);
+    const { dynamicComponents, currentTabComponent, componentChange } = useDynamicComponent(props.parentComponent.code);
     const bargainValue = ref<ApplyType>(ApplyType.my);
 
     const showBargainRadio = computed(() => {
-      if (currentComponent.value) {
-        return ['bottom_swap_commodity_contract_bargain', 'bottom_commodity_contract_bargain'].includes(currentComponent.value.code)
+      if (currentTabComponent.value) {
+        return ['bottom_swap_commodity_contract_bargain', 'bottom_commodity_contract_bargain'].includes(currentTabComponent.value.code)
       }
       return false;
     })
 
     // 组件重载
     function componentReload() {
-      const tmpComponent = currentComponent.value;
-      currentComponent.value = undefined;
+      const tmpComponent = currentTabComponent.value;
+      currentTabComponent.value = undefined;
       nextTick(() => {
-        currentComponent.value = tmpComponent;
+        currentTabComponent.value = tmpComponent;
       })
     }
 
@@ -66,8 +67,8 @@ export default defineComponent({
     })
 
     return {
-      components,
-      currentComponent,
+      dynamicComponents,
+      currentTabComponent,
       componentChange,
       changeBargain,
       ApplyType,

+ 10 - 7
src/@next/components/layout/footer/index.vue

@@ -4,15 +4,18 @@
       <CapitalInfo />
     </div>
     <div class="mtp-footer__right">
-      <mtp-tabbar class="mtp-tabbar--top" :data-source="components" label="title" @change="componentChange">
+      <mtp-tabbar class="mtp-tabbar--top" :data-source="dynamicComponents" label="title" @change="componentChange">
         <a-button class="operBtn" @click="getTradeAccountList">刷新</a-button>
         <!-- 资金信息 -->
-        <a-select class="select" style="width: 200px" placeholder="请选择账户" @change="tradeAccountChange" v-model:value="selectedAccountId">
-          <a-select-option v-for="item in tradeAccountList" :value="item.accountid" :key="item.accountid">{{item.accountid}}/{{ item.accountname }}</a-select-option>
+        <a-select class="select" style="width: 200px" placeholder="请选择账户" @change="tradeAccountChange"
+          v-model:value="selectedAccountId">
+          <a-select-option v-for="item in tradeAccountList" :value="item.accountid" :key="item.accountid">
+            {{ item.accountid }}/{{ item.accountname }}</a-select-option>
         </a-select>
         <div class="iconfont icon icon-shouqi" @click="isShow = !isShow"></div>
       </mtp-tabbar>
-      <component class="container" :is="currentComponent.component" :parent-component="currentComponent" v-if="currentComponent"></component>
+      <component class="container" :is="currentTabComponent.component" :parent-component="currentTabComponent"
+        v-if="currentTabComponent"></component>
     </div>
   </div>
 </template>
@@ -33,7 +36,7 @@ export default defineComponent({
     CapitalInfo
   },
   setup() {
-    const { components, currentComponent, componentChange } = useDynamicComponent();
+    const { dynamicComponents, currentTabComponent, componentChange } = useDynamicComponent('bottom');
     const { tradeAccountList, getTradeAccountList, tradeAccountChange } = useTradeAccount();
     const selectedAccount = getSelectedAccount();
     const selectedAccountId = ref(selectedAccount.accountid || undefined);
@@ -64,8 +67,8 @@ export default defineComponent({
       selectedAccountId,
       tradeAccountChange,
       isCapitalLeft,
-      components,
-      currentComponent,
+      dynamicComponents,
+      currentTabComponent,
       componentChange
     }
   }

+ 35 - 0
src/@next/constants/enum/businessType.ts

@@ -0,0 +1,35 @@
+import { getEnumTypeList, getEnumTypeName } from './index'
+
+/**
+ * 关联交易类型
+ */
+export enum BusinessType {
+    HedgedItem = 13, // 被套期项目
+}
+
+/**
+ * 获取类型列表
+ * @returns 
+ */
+export function getBusinessTypeList() {
+    return getEnumTypeList('BusinessType');
+}
+
+/**
+ * 获取枚举名称
+ * @param value 
+ * @returns 
+ */
+export function getBusinessTypeName(value: number) {
+    return getEnumTypeName(getBusinessTypeList(), value);
+}
+
+/**
+ * 判断类型是否相同
+ * @param key 
+ * @param value 
+ * @returns 
+ */
+export function isEqualBusinessType(key: keyof typeof BusinessType, value: number) {
+    return BusinessType[key] === value;
+}

+ 41 - 0
src/@next/constants/enum/hedgedItemStatus.ts

@@ -0,0 +1,41 @@
+import { getEnumTypeList, getEnumTypeName } from './index'
+
+/**
+ * 套期状态
+ */
+export enum HedgedItemStatus {
+    Uncommitted = 0, // 未提交
+    Review = 1, // 待审核
+    Runing = 2, // 执行中
+    Finish = 3, // 正常完结
+    Refuse = 4, // 审核拒绝
+    Unusually = 5, // 异常完结
+    Cancel = 6, // 已撤回
+}
+
+/**
+ * 获取类型列表
+ * @returns 
+ */
+export function getHedgedItemStatusList() {
+    return getEnumTypeList('hedgeditemstatus');
+}
+
+/**
+ * 获取枚举名称
+ * @param value 
+ * @returns 
+ */
+export function getHedgedItemStatusName(value: number) {
+    return getEnumTypeName(getHedgedItemStatusList(), value);
+}
+
+/**
+ * 判断类型是否相同
+ * @param key 
+ * @param value 
+ * @returns 
+ */
+export function isEqualToHedgedItemStatus(key: keyof typeof HedgedItemStatus, value: number) {
+    return HedgedItemStatus[key] === value;
+}

+ 39 - 0
src/@next/constants/enum/hedgedType.ts

@@ -0,0 +1,39 @@
+import { getEnumTypeList, getEnumTypeName } from './index'
+
+/**
+ * 套期类型
+ */
+export enum HedgedType {
+    Buy = 1, // 采购计划
+    Sell = 2, // 销售计划
+    Spot = 3, // 现货贸易
+    Inventory = 4, // 库存现货
+    Pricing = 5, // 定价采购合同
+}
+
+/**
+ * 获取类型列表
+ * @returns 
+ */
+export function getHedgedTypeList() {
+    return getEnumTypeList('hedgedType');
+}
+
+/**
+ * 获取枚举名称
+ * @param value 
+ * @returns 
+ */
+export function getHedgedTypeName(value: number) {
+    return getEnumTypeName(getHedgedTypeList(), value);
+}
+
+/**
+ * 判断类型是否相同
+ * @param key 
+ * @param value 
+ * @returns 
+ */
+export function isEqualToHedgedType(key: keyof typeof HedgedType, value: number) {
+    return HedgedType[key] === value;
+}

+ 33 - 0
src/@next/constants/enum/index.ts

@@ -0,0 +1,33 @@
+import { sessionStorageUtil } from '@/utils/storage';
+import { AllEnums } from "@/services/go/commonService/interface";
+
+/**
+ * 获取所有枚举
+ * @returns 
+ */
+export function getAllEnum(): AllEnums[] {
+    return sessionStorageUtil.getItem('allEnums') ?? [];
+}
+
+/**
+ * 根据枚举code获取枚举列表
+ * @param code 
+ * @returns 
+ */
+export function getEnumTypeList(code: string) {
+    return getAllEnum().filter((e) => e.enumdiccode.toLowerCase() === code.toLowerCase() && e.enumitemstatus === 1);
+}
+
+/**
+ * 根据枚举值获取枚举名称
+ * @param enums 
+ * @param value 
+ * @returns 
+ */
+export function getEnumTypeName(enums: AllEnums[], value: number) {
+    const item = enums.find((e) => e.enumitemname === value);
+    if (item) {
+        return item.enumdicname;
+    }
+    return value;
+}

+ 99 - 39
src/@next/hooks/common/index.ts

@@ -1,7 +1,9 @@
-import { defineAsyncComponent, shallowRef, computed } from 'vue'
-import { OperationTabMenu } from '@/services/go/commonService/interface'
+import { defineAsyncComponent, shallowRef, Ref } from 'vue'
+import { OperationTabMenu, OperationTabMenuAuth } from '@/services/go/commonService/interface'
 import { initData } from '@/common/methods'
+import { useRoute } from 'vue-router'
 import { DynamicComponent } from './interface'
+import { BtnListType } from '@/common/components/btnList/interface';
 import { getClassName } from '@/common/setup/table/button'
 import APP from '@/services'
 
@@ -9,46 +11,89 @@ import APP from '@/services'
  * 路由菜单
  */
 export function useMenu() {
-    const menus = computed<OperationTabMenu[]>(() => APP.getRef('menus').value);
-
-    // 通过code获取对应的子菜单
-    const getChildrenMenus = (items: OperationTabMenu[], name: string) => {
-        let result: OperationTabMenu[] = [];
-        for (let i = 0; i < items.length; i++) {
-            const { code, children } = items[i];
-            if (code === name) return children ?? result;
-            if (children) {
-                result = getChildrenMenus(children, name)
-                if (result.length) return result;
-            }
+    const route = useRoute();
+    const menus: Ref<OperationTabMenu[]> = APP.getRef('menus');
+
+    const auth = (() => {
+        const result: BtnListType[] = [];
+        if (route.meta.auth) {
+            const routeAuth = route.meta.auth as OperationTabMenuAuth[];
+            routeAuth.forEach((e) => {
+                const { label, code } = e;
+                result.push({
+                    lable: label,
+                    code: code,
+                    className: getClassName(code),
+                })
+            })
         }
         return result;
+    })()
+
+    /**
+     * 过滤操作权限
+     * @param filtered 过滤的数据项
+     * @param reverse 是否反向过滤
+     * @returns 
+     */
+    const authFilter = (filtered: string[] = [], reverse = false) => {
+        if (filtered.length) {
+            if (reverse) {
+                // 返回除指定的权限代码
+                return auth.filter((e) => !filtered.includes(e.code));
+            } else {
+                // 返回指定的权限代码
+                return auth.filter((e) => filtered.includes(e.code));
+            }
+        }
+        return auth;
+    }
+
+    /**
+     * 通过code获取对应的子菜单
+     * @param menucode 
+     * @returns 
+     */
+    const getChildrenMenu = (menucode?: string) => {
+        const filter = (items: OperationTabMenu[], name?: string): OperationTabMenu | undefined => {
+            if (name) {
+                for (let i = 0; i < items.length; i++) {
+                    const { code, children } = items[i];
+                    if (code === name) return items[i];
+                    if (children) {
+                        const res = filter(children, name);
+                        if (res) return res;
+                    }
+                }
+            }
+            return undefined;
+        }
+        return filter(menus.value, menucode ?? route.name?.toString());
     }
 
     return {
+        route,
         menus,
-        getChildrenMenus
+        auth,
+        getChildrenMenu,
+        authFilter
     }
 }
 
 /**
  * 底部动态组件
  */
-export function useDynamicComponent(code?: string) {
-    const { menus, getChildrenMenus } = useMenu();
-    const components = shallowRef<DynamicComponent[]>([]);
-    const currentComponent = shallowRef<DynamicComponent>(); // 当前选中的组件
-
-    // 切换组件
-    const componentChange = (selected: DynamicComponent) => {
-        currentComponent.value = selected;
-    }
+export function useDynamicComponent(menucode?: string) {
+    const { getChildrenMenu } = useMenu();
+    const dynamicComponents: DynamicComponent[] = [];
+    const currentAuth: BtnListType[] = []; // 当前操作权限
+    const currentTabComponent = shallowRef<DynamicComponent>(); // 当前选中的子组件
 
     // 处理动态组件
-    const parseComponent = (treeMenu: OperationTabMenu[]) => {
+    const parseComponent = (items: OperationTabMenu[]) => {
         let result: DynamicComponent[] = [];
 
-        treeMenu.forEach((menu) => {
+        items.forEach((menu) => {
             const { title, code, component, children, auth } = menu;
             if (component) {
                 let asyncComponent;
@@ -64,7 +109,7 @@ export function useDynamicComponent(code?: string) {
                 const dynamicComponent: DynamicComponent = {
                     title: title,
                     code: code,
-                    buttons: auth?.map((e) => ({
+                    auth: auth?.map((e) => ({
                         lable: e.label,
                         code: e.code,
                         className: getClassName(e.code)
@@ -83,24 +128,39 @@ export function useDynamicComponent(code?: string) {
         return result;
     }
 
-    initData(() => {
-        const bottom = menus.value.find((e) => e.code === 'bottom');
-        const bottomMenus = bottom?.children;
-
-        if (bottomMenus) {
-            const children = code ? getChildrenMenus(bottomMenus, code) : bottomMenus;
-            const result = parseComponent(children);
+    // 切换组件
+    const componentChange = (component: DynamicComponent) => {
+        currentTabComponent.value = component;
+    }
 
-            if (result.length) {
-                components.value = result;
-                currentComponent.value = result[0];
+    initData(() => {
+        const childrenMenu = getChildrenMenu(menucode);
+        if (childrenMenu) {
+            const { auth, children } = childrenMenu;
+            if (auth) {
+                auth.forEach((e) => {
+                    const { label, code } = e;
+                    currentAuth.push({
+                        lable: label,
+                        code: code,
+                        className: getClassName(code),
+                    })
+                })
+            }
+            if (children) {
+                const components = parseComponent(children);
+                dynamicComponents.push(...components);
+                if (components.length) {
+                    currentTabComponent.value = components[0];
+                }
             }
         }
     })
 
     return {
-        components,
-        currentComponent,
+        dynamicComponents,
+        currentAuth,
+        currentTabComponent,
         componentChange,
     }
 }

+ 1 - 1
src/@next/hooks/common/interface.ts

@@ -8,6 +8,6 @@ export interface DynamicComponent {
     title: string,
     code: string,
     component: Component,
-    buttons: BtnListType[],
+    auth: BtnListType[],
     children?: DynamicComponent[]
 }

+ 4 - 3
src/assets/styles/mixin.less

@@ -187,7 +187,8 @@
     .rounded-corners(@rounded);
 }
 
-.ant-input {
+.ant-input,
+.ant-input-number-input {
     &::placeholder {
         color: @m-grey10;
     }
@@ -994,9 +995,9 @@
     .ant-select-selector {
         height    : 30px;
         padding   : 0 8px;
-        background: @m-grey21 !important;
+        background: @m-grey21  !important;
         border    : 0;
-        color     : @m-white1 !important;
+        color     : @m-white1  !important;
 
         .ant-select-selection-placeholder {
             color: @m-grey10;

+ 2 - 2
src/common/components/filter/interface.ts

@@ -12,7 +12,7 @@ export interface FilterColumn<T = unknown> {
  */
 export interface FilterSelect<T = unknown> {
     key: keyof T,
-    alias?: string, // key的别名,查询字段名可能和key不一样
+    alias?: string, // key 的别名,如果过滤的 key 不存在 column 中,就需要用到把过滤的结果映射到 column 中的任意一个 key 上
     selectedValue: string | number,
     options: {
         label: string,
@@ -26,7 +26,7 @@ export interface FilterSelect<T = unknown> {
  */
 export interface FilterInput<T = unknown> {
     keys: (keyof T)[],
-    alias?: string, // key的别名,查询字段名可能和key不一样
+    alias?: string, // key 的别名,如果过滤的 key 不存在 column 中,就需要用到把过滤的结果映射到 column 中的任意一个 key 上
     value: string,
     placeholder: string
 }

+ 0 - 12
src/common/constants/EnumKey.ts

@@ -1,12 +0,0 @@
-/**
- * 获取枚举的key
- */
-export interface EnumKey {
-    certificatetype: string; // 证件类型
-    loginstatus: string; // 登录状态
-    goodsunit: string; // 单位
-    warehouseinfoType: string; // 仓库类型
-    paycurrency: string; // 币种
-    spotContractType: string; // 套保计划类型
-    operateType: string;  //资金操作类型
-}

+ 9 - 0
src/common/constants/enumCommon.ts

@@ -157,3 +157,12 @@ export enum ApplyType {
     my = 1, // 我的申请
     counterpart, // 对方申请
 }
+
+// 套期类型
+export enum HedgedType {
+    Buy = 1, // 采购计划
+    Sell = 2, // 销售计划
+    Spot = 3, // 现货贸易
+    Inventory = 4, // 库存存货
+    Pricing = 5, // 定价采购合同
+}

+ 7 - 0
src/common/constants/enumsList.ts

@@ -43,4 +43,11 @@ export function getPayCurrencyTypeEnumList(): AllEnums[] {
  */
 export function getSpotContractTypeEnumList(): AllEnums[] {
     return getItemEnumList('spotContractType')
+}
+
+/**
+ *获取套保计划类型枚举列表
+ */
+export function getBusinessTypeEnumList(): AllEnums[] {
+    return getItemEnumList('BusinessType')
 }

+ 2 - 2
src/common/methods/table/index.ts

@@ -1,11 +1,11 @@
 import APP from '@/services';
 import { Column, TableDefineRsp } from '@/services/go/commonService/interface';
-import { ColumnType, TableKey } from './interface';
+import { ColumnType } from './interface';
 
 /**
  * 获取动态表头
  */
-export function getTableHead(tableKey: keyof TableKey): Column[] {
+export function getTableHead(tableKey: string): Column[] {
     const result = APP.get('tableHead').find((e: TableDefineRsp) => e.tablekey === tableKey);
     return result ? result.columns : [];
 }

+ 2 - 2
src/common/setup/table/clolumn.ts

@@ -17,14 +17,14 @@ export function getTableColumns() {
     // 缓存 注册表头回调
     let cacheColumnCB: Function = (): void => { };
     // 缓存 动态表头 key
-    let cacheTableKey: keyof TableKey = 'table_pcweb_userinfo';
+    let cacheTableKey = 'table_pcweb_userinfo';
 
     /**
      * 注册表头
      * @param tableName 动态表头数据key
      * @param cb 回调函数,处理添加不同表格过滤,排序等功能-----------------------------待优化确认是否保留
      */
-    function registerColumn(tableName: keyof TableKey, cb?: Function) {
+    function registerColumn(tableName: string, cb?: Function) {
         cacheTableKey = tableName;
         cacheColumnCB = cb ? cb : () => { };
         const list = getTableHead(tableName);

+ 1 - 1
src/common/setup/table/interface.ts

@@ -23,7 +23,7 @@ export interface BtnParam {
 
 export interface ComposeTableParam {
     queryFn: Function,  // 查询表格数据
-    tableName?: keyof TableKey, // 表头key
+    tableName?: string, // 表头key
     tableFilterCB?: Function, // 表格过滤字段回调函数
 }
 

+ 81 - 65
src/layout/components/bottom.vue

@@ -3,17 +3,20 @@
   <section :class="['layout-bottom', isShowBottom ? 'layout-bottom-all' : 'layout-bottom-hidden']">
     <CapitalInfo class="capital-info-container" v-if="isCapitalLeft"></CapitalInfo>
     <main :class="[isCapitalLeft ? 'main-some' : 'main-all']">
-      <firstMenu :list="components" :value="'title'" @selectMenu="componentChange">
+      <firstMenu :list="dynamicComponents" :value="'title'" @selectMenu="componentChange">
         <div class="right-menu-content">
           <a-button class="operBtn" @click="getTradeAccountList">刷新</a-button>
           <!-- 资金信息 -->
-          <a-select class="capitalSelect" style="width: 180px" placeholder="请选择账户" @change="tradeAccountChange" v-model:value="selectedAccountId">
-            <a-select-option v-for="item in tradeAccountList" :value="item.accountid" :key="item.accountid">{{item.accountid}}</a-select-option>
+          <a-select class="capitalSelect" style="width: 180px" placeholder="请选择账户" @change="tradeAccountChange"
+            v-model:value="selectedAccountId">
+            <a-select-option v-for="item in tradeAccountList" :value="item.accountid" :key="item.accountid">
+              {{ item.accountid }}</a-select-option>
           </a-select>
           <div class="conditionIcon icon iconfont icon-shouqi" @click="handleShowBottom"></div>
         </div>
       </firstMenu>
-      <component class="layout-bottom__container" :is="currentComponent.component" :code="currentComponent.code" v-if="currentComponent"></component>
+      <component class="layout-bottom__container" :is="currentTabComponent.component" :code="currentTabComponent.code"
+        v-if="currentTabComponent"></component>
     </main>
   </section>
 </template>
@@ -46,7 +49,7 @@ export default defineComponent({
     // [enumOrderComponents.commodity_contract]: defineAsyncComponent(() => import('@/views/order/commodity_contract/index.vue')),
   },
   setup() {
-    const { components, currentComponent, componentChange } = useDynamicComponent();
+    const { dynamicComponents, currentTabComponent, componentChange } = useDynamicComponent('bottom');
     const { tradeAccountList, getTradeAccountList, tradeAccountChange } = useTradeAccount();
     const selectedAccount = getSelectedAccount();
     const selectedAccountId = ref(selectedAccount.accountid || undefined);
@@ -86,8 +89,8 @@ export default defineComponent({
       selectedAccountId,
       tradeAccountChange,
       isCapitalLeft,
-      components,
-      currentComponent,
+      dynamicComponents,
+      currentTabComponent,
       componentChange
     };
   },
@@ -95,73 +98,86 @@ export default defineComponent({
 </script>
 <style lang="less">
 .right-menu-content {
-    display: flex;
-    align-items: center;
-    .capitalSelect {
-        margin-top: 2px;
-        margin-right: 10px;
-        .ant-select-selector {
-            background-color: @m-grey6;
-            border: none;
-            height: 30px;
-        }
-        .ant-select-arrow {
-            top: 15px;
-        }
-        .ant-select-selection-placeholder {
-            color: @m-grey10;
-        }
+  display: flex;
+  align-items: center;
+
+  .capitalSelect {
+    margin-top: 2px;
+    margin-right: 10px;
+
+    .ant-select-selector {
+      background-color: @m-grey6;
+      border: none;
+      height: 30px;
+    }
+
+    .ant-select-arrow {
+      top: 15px;
+    }
+
+    .ant-select-selection-placeholder {
+      color: @m-grey10;
     }
+  }
 }
+
 .layout-bottom-all {
-    height: 280px;
+  height: 280px;
 }
+
 .layout-bottom-hidden {
-    height: 36px;
-    .conditionIcon {
-        transform: rotate(180deg);
-    }
+  height: 36px;
+
+  .conditionIcon {
+    transform: rotate(180deg);
+  }
 }
+
 .layout-bottom {
-    display: flex;
-    width: 100%;
-    transition: height 300ms;
+  display: flex;
+  width: 100%;
+  transition: height 300ms;
+  overflow: hidden;
+
+  .operBtn {
+    margin-right: 8px;
+  }
+
+  .capital-info-container {
+    border-right: 1px solid @m-black2;
+  }
+
+  main {
+    flex: 1;
+    .flex;
+    flex-direction: column;
+    background: @m-black36;
+    position: relative;
     overflow: hidden;
-    .operBtn {
-        margin-right: 8px;
-    }
-    .capital-info-container {
-        border-right: 1px solid @m-black2;
-    }
-    main {
-        flex: 1;
-        .flex;
-        flex-direction: column;
-        background: @m-black36;
-        position: relative;
-        overflow: hidden;
-        .conditionIcon {
-            display: inline-flex;
-            justify-content: center;
-            align-items: center;
-            height: initial;
-            font-size: 16px;
-            color: @m-grey1;
-            width: 16px;
-            cursor: pointer;
-            margin-right: 10px;
-            &:hover {
-                color: @m-grey1-hover;
-            }
-        }
-    }
 
-    &__container {
-        flex: 1;
-        overflow-y: auto;
-        display: flex;
-        flex-direction: column;
-        border-bottom: 2px solid transparent;
+    .conditionIcon {
+      display: inline-flex;
+      justify-content: center;
+      align-items: center;
+      height: initial;
+      font-size: 16px;
+      color: @m-grey1;
+      width: 16px;
+      cursor: pointer;
+      margin-right: 10px;
+
+      &:hover {
+        color: @m-grey1-hover;
+      }
     }
+  }
+
+  &__container {
+    flex: 1;
+    overflow-y: auto;
+    display: flex;
+    flex-direction: column;
+    border-bottom: 2px solid transparent;
+  }
 }
 </style>

+ 10 - 8
src/layout/components/container.vue

@@ -2,7 +2,8 @@
 <template>
   <!-- 四级路由布局页,关联父级 main.vue -->
   <router-view :key="$route.fullPath"></router-view>
-  <mtp-tabbar class="mtp-tabbar--bottom" :data-source="tabList" :selectedIndex="tabIndex" label="title" @change="tabChange" />
+  <mtp-tabbar class="mtp-tabbar--bottom" :data-source="tabList" :selectedIndex="tabIndex" label="title"
+    @change="tabChange" />
 </template>
 
 <script lang="ts">
@@ -18,7 +19,7 @@ export default defineComponent({
     MtpTabbar,
   },
   setup() {
-    const { menus, getChildrenMenus } = useMenu();
+    const { getChildrenMenu } = useMenu();
 
     const route = useRoute();
     const router = useRouter();
@@ -36,16 +37,17 @@ export default defineComponent({
         const i = Number(parentTabIndex.value[0]);
         const code = parentTabList.value[i].code;
 
-        const tmpList = getChildrenMenus(menus.value, code);
-        if (tmpList.length) {
-          tabList.value = tmpList;
-          const index = tmpList.findIndex((e) => e.code === route.name);
+        const childrenMenu = getChildrenMenu(code);
+        if (childrenMenu?.children.length) {
+          const { children } = childrenMenu;
+          tabList.value = children;
+          const index = children.findIndex((e) => e.code === route.name);
 
           if (index > -1) {
             tabIndex.value = index;
-            router.push({ name: tmpList[index].code });
+            router.push({ name: children[index].code });
           } else {
-            router.push({ name: tmpList[0].code });
+            router.push({ name: children[0].code });
           }
         }
       }

+ 7 - 10
src/services/bus/allEnum.ts

@@ -1,15 +1,12 @@
-import { EnumKey } from '@/common/constants/EnumKey';
 import { AllEnums } from '@/services/go/commonService/interface';
-import { localStorageUtil } from '@/utils/storage';
-
-
+import { sessionStorageUtil } from '@/utils/storage';
 
 /**
  * 是否有所有枚举数据
  * @returns 
  */
 export function isAllEnum(): boolean {
-    return localStorageUtil.getItem('allEnums') ? true : false;
+    return sessionStorageUtil.getItem('allEnums') ? true : false;
 }
 
 /**
@@ -17,7 +14,7 @@ export function isAllEnum(): boolean {
  * @returns 
  */
 export function getAllEnum(): AllEnums[] {
-    return isAllEnum() ? localStorageUtil.getItem('allEnums') : []
+    return isAllEnum() ? sessionStorageUtil.getItem('allEnums') : []
 }
 
 /**
@@ -25,7 +22,7 @@ export function getAllEnum(): AllEnums[] {
  * @param value 
  */
 export function setAllEnum(value: AllEnums[]) {
-    localStorageUtil.setItem('allEnums', value);
+    sessionStorageUtil.setItem('allEnums', value);
 }
 
 
@@ -33,8 +30,8 @@ export function setAllEnum(value: AllEnums[]) {
  * 获取具体某个枚举列表
  * @param enumdiccode: string; //所属枚举代码
  */
-export function getItemEnumList(enumdiccode: keyof EnumKey): AllEnums[] {
-    return getAllEnum().filter(e => (e.enumdiccode === enumdiccode) && e.enumitemstatus === 1)
+export function getItemEnumList(enumdiccode: string): AllEnums[] {
+    return getAllEnum().filter(e => (e.enumdiccode.toLowerCase() === enumdiccode.toLowerCase()) && e.enumitemstatus === 1)
 }
 
 /**
@@ -43,7 +40,7 @@ export function getItemEnumList(enumdiccode: keyof EnumKey): AllEnums[] {
  * @param enumdicid 所属枚举ID
  * @returns 
  */
-export function getItemEnumName(enumdiccode: keyof EnumKey, enumdicid: number): string {
+export function getItemEnumName(enumdiccode: string, enumdicid: number): string {
     const temp = getItemEnumList(enumdiccode).find(e => e.enumitemname === enumdicid)
     return temp ? temp.enumdicname : '--'
 }

+ 7 - 1
src/services/bus/rules.ts

@@ -5,4 +5,10 @@ export function getRules(): WrMarketTradeConfig[] {
     return APP.get('rules')
 }
 
-export { };
+/**
+ * 根据市场ID查询交易参数配置
+ */
+export function getRulesByMarketid(marketid: number) {
+    const rules = getRules();
+    return rules.find((e) => e.marketid === marketid);
+}

+ 17 - 1
src/services/funcode/index.ts

@@ -244,4 +244,20 @@ export const funCode: Code = {
     // 期货交易
     ChannelOrderReq: 196639, // 交易委托请求 0 3 31
     ChannelOrderRsp: 196640, // 交易委托应答 0 3 32
-};
+
+    // 套期交易
+    HedgedItemAddReq: 1179673, // 新增套期项目请求
+    HedgedItemAddRsp: 1179674, // 新增套期项目响应
+    HedgedItemOperateReq: 1179671, // 套期项目操作请求
+    HedgedItemOperateRsp: 1179672, // 套期项目操作响应
+    HedgedItemEndReq: 1179683, // 套期项目结束请求
+    HedgedItemEndRsp: 1179684, // 套期项目结束响应
+    HedgedItemInfo: 1179675, // 被套期项目信息
+    ContractRelatedHedgedItemReq: 1179677, // 合同关联项目请求
+    ContractRelatedHedgedItemRsp: 1179678, // 合同关联项目响应
+    RelatedHedgePlanInfo: 1179676, // 关联套保计划信息
+    HedgedItemRelatedPlanReq: 1179681, // 项目关联计划请求
+    HedgedItemRelatedPlanRsp: 1179682, // 项目关联计划响应
+    InnerTradeLinkReq: 1179660, // 内部成交单关联请求
+    InnerTradeLinkRsp: 1179661, // 内部成交单关联响应
+}

+ 122 - 0
src/services/go/ermcp/hedgedItem/index.ts

@@ -0,0 +1,122 @@
+import { getUserId } from "@/services/bus/user";
+import { commonSearch_go } from '@/services/go/index';
+import {
+    Ermcp2HedgedItemReq,
+    Ermcp2HedgedItemRsp,
+    ERMCPJRLinkPosReq,
+    ERMCPJRLinkPosRsp,
+    ERMCP2HedgedItemspotReq,
+    ERMCP2HedgedItemspotRsp,
+    ERMCP2HedgedItemSpotDetailReq,
+    ERMCP2HedgedItemSpotDetailRsp,
+    ERMCPPatradeLinkDetailReq,
+    ERMCPPatradeLinkDetailRsp,
+    InternalUncorrelatedTradeDetailReq,
+    InternalUncorrelatedTradeDetailRsp,
+    InternalEnableTradeDetailReq,
+    InternalEnableTradeDetailRsp,
+    UnLinkSpotContractReq,
+    UnLinkSpotContractRsp,
+    Ermcp8EnableHedgeditemReq,
+    Ermcp8EnableHedgeditemRsp
+} from './interface'
+
+/**
+ * 查询被套期项目信息
+ * @param req 
+ * @returns 
+ */
+export function queryErmcp2HedgedItem(req: Ermcp2HedgedItemReq): Promise<Ermcp2HedgedItemRsp[]> {
+    req.userid = getUserId();
+    return commonSearch_go('/Ermcp8/QueryErmcp2HedgedItem', req).catch((err) => {
+        throw new Error(`查询被套期项目信息: ${err}`);
+    })
+}
+
+/**
+ * 期货持仓明细查询
+ * @param req 
+ * @returns 
+ */
+export function queryERMCPJRLinkPos(req: ERMCPJRLinkPosReq): Promise<ERMCPJRLinkPosRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryERMCPJRLinkPos', req).catch((err) => {
+        throw new Error(`期货持仓明细查询: ${err}`);
+    })
+}
+
+/**
+ * 套期计划明细查询
+ * @param req 
+ * @returns 
+ */
+export function queryERMCP2HedgedItemspot(req: ERMCP2HedgedItemspotReq): Promise<ERMCP2HedgedItemspotRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryERMCP2HedgedItemspot', req).catch((err) => {
+        throw new Error(`套期计划明细查询: ${err}`);
+    })
+}
+
+/**
+ * 现货成交明细查询
+ * @param req 
+ * @returns 
+ */
+export function queryERMCP2HedgedItemSpotDetail(req: ERMCP2HedgedItemSpotDetailReq): Promise<ERMCP2HedgedItemSpotDetailRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryERMCP2HedgedItemSpotDetail', req).catch((err) => {
+        throw new Error(`现货成交明细查询: ${err}`);
+    })
+}
+
+/**
+ * 期货成交单明细查询
+ * @param req 
+ * @returns 
+ */
+export function queryERMCPPatradeLinkDetail(req: ERMCPPatradeLinkDetailReq): Promise<ERMCPPatradeLinkDetailRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryERMCPPatradeLinkDetail', req).catch((err) => {
+        throw new Error(`期货成交单明细查询: ${err}`);
+    })
+}
+
+/**
+ * 内部未关联成交单查询
+ * @param req 
+ * @returns 
+ */
+export function queryInternalUncorrelatedTradeDetail(req: InternalUncorrelatedTradeDetailReq): Promise<InternalUncorrelatedTradeDetailRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryInternalUncorrelatedTradeDetail', req).catch((err) => {
+        throw new Error(`内部未关联成交单查询: ${err}`);
+    })
+}
+
+/**
+ * 内部成交单可关联项目查询
+ * @param req 
+ * @returns 
+ */
+export function queryInternalEnableTradeDetail(req: InternalEnableTradeDetailReq): Promise<InternalEnableTradeDetailRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryInternalEnableTradeDetail', req).catch((err) => {
+        throw new Error(`内部未关联成交单查询: ${err}`);
+    })
+}
+
+/**
+ * 未关联合同查询
+ * @param req 
+ * @returns 
+ */
+export function queryUnLinkSpotContract(req: UnLinkSpotContractReq): Promise<UnLinkSpotContractRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryUnLinkSpotContract', req).catch((err) => {
+        throw new Error(`未关联合同查询: ${err}`);
+    })
+}
+
+/**
+ * 可关联项目查询
+ * @param req 
+ * @returns 
+ */
+export function queryErmcp8EnableHedgeditem(req: Ermcp8EnableHedgeditemReq): Promise<Ermcp8EnableHedgeditemRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryErmcp8EnableHedgeditem', req).catch((err) => {
+        throw new Error(`可关联项目查询: ${err}`);
+    })
+}

+ 414 - 0
src/services/go/ermcp/hedgedItem/interface.ts

@@ -0,0 +1,414 @@
+/**
+ * 查询被套期项目信息请求
+ */
+export interface Ermcp2HedgedItemReq {
+    userid: string; // 用户ID
+    hedgedtype: number; // 套期类型 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
+    hedgeditemstatus: number; // 项目状态 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
+}
+
+/**
+ * 查询被套期项目信息响应
+ */
+export interface Ermcp2HedgedItemRsp {
+    accountname: string; // 套期主体
+    applyid: number; // 申请人
+    applysrc: number; // 申请来源 - 1:管理端 2:终端
+    areauserid: number; // 企业ID
+    auditid: number; // 审核人
+    auditremark: string; // 审核备注
+    auditsrc: number; // 审核来源 - 1:管理端 2:终端
+    audittime: string; // 审核时间
+    audittradedate: string; // 审核交易日(yyyyMMdd)
+    createtime: string; // 申请时间
+    curprice: number; // 当前市场价
+    curstock: number; // 期末库存量 = 采购总量 - 销售总量
+    deliverygoodsid: number; // 现货品种ID
+    enddate: string; // 完成日期
+    endtradedate: string; // 完成交易日
+    enumdicname: string; // 单位
+    exeamount: number; // 执行市价总额
+    exeavgprice: number; // 执行市场均价= 执行市价总额 / 执行现货量
+    execontractamount: number; // 执行定价总额
+    exeqty: number; // 执行现货量
+    exerestamount: number; // 执行剩余市价总额【现货贸易】
+    futurefloatpl: number; // 期货浮动损益
+    futurehedgepl: number; // 期货实际损益
+    futurehedgeplchange: number; // 期货实际损益变动
+    futurepl: number; // 期货套期损益
+    futureplchange: number; // 期货套期损益变动
+    hedgeamount: number; // 套期市价总额
+    hedgecontractamount: number; // 套期定价总额 【定价采购合同】【现货贸易】
+    hedgeditemid: string; // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx)
+    hedgeditemname: string; // 项目名称
+    hedgeditemnum: string; // 项目编号
+    hedgeditemstatus: number; // 项目状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
+    hedgedtype: number; // 套期类型 - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
+    hedgeqty: number; // 套期现货量
+    hedgerate: number; // 套保比率
+    hedgerestamount: number; // 套期剩余市价总额【现货贸易】
+    hedgesumpl: number; // 套期汇总损益 = 期货汇总损益 + 现货汇总损益
+    middlegoodslist: HedgedItemMiddleGoodsList[]; // 套期商品列表
+    oriavgprice: number; // 期初市场均价 = 套期市价总额 / 套期现货量
+    orifuturehedgepl: number;  // 期初期货实际损益
+    orifuturepl: number; // 期初期货套期损益
+    orispothedgepl: number; // 期初现货实际损益
+    orispotpl: number; // 期初现货套期损益
+    planenddate: string; // 计划结束日期
+    planstartdate: string; // 计划开始日期
+    remark: string; // 备注
+    spotbookamount: number; // 现货账面总额
+    spotfloatpl: number; // 现货浮动损益 =(当前市场价 - 期初市场价)*未执行现货量 * 方向(销售计划 为 -1, 其它为1)
+    spothedgepl: number; // 现货套期损益 =(执行市场均价-期初市场均价)*执行现货量 * 方向(销售计划 为 -1, 其它为1)
+    spothedgeplchange: number; // 现货实际损益变动
+    spotpl: number; // 现货套期损益 = 现货实际损益 + 现货浮动损益
+    spotplchange: number; // 现货套期损益变动
+    spottradepl: number; // 现货贸易损益【现货贸易】= 执行合同定价总额 - 套期合同定价总额
+    sumobspl: number; // 汇总绝对损益【现货贸易】=现货贸易损益+增值税损益+期货套期损益
+    tradeuserid: number; // 交易用户ID
+    unexeqty: number; // 未执行现货量 = 套期现货量 - 执行现货量
+    updatetime: string; // 更新时间
+    vatpl: number; // 增值税损益【现货贸易】= 现货贸易损益 * (增值税率 /(1+增值税率))
+    vatrate: number; // 增值税
+    wrstandardid: number; // 现货商品ID
+    wrstandardname: string; // 商品名称
+}
+
+/**
+ * 套期商品列表
+ */
+export interface HedgedItemMiddleGoodsList {
+    futurehedgeqty: number; // 期货持仓套期量
+    hedgeditemid: number; // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx)
+    hiexpsoure: number; // 期现敞口量 = 未执行套期量 + 期货持仓套期量
+    middlegoodscode: string; // 套保商品代码
+    middlegoodsid: number; // 套保品种ID
+    middlegoodsname: string; // 套保商品名称
+    unexehedgeqty: number; // 未执行套期量 = 未执行现货量折算系数 (1/(1+增值税)) * 套期比例(项目上)
+}
+
+/**
+ * 期货持仓明细查询请求
+ */
+export interface ERMCPJRLinkPosReq {
+    hedgeditemid: number; // 套期项目ID
+}
+
+/**
+ * 期货持仓明细查询响应
+ */
+export interface ERMCPJRLinkPosRsp {
+    areauserid: number; // 所属企业
+    averageprice: number; // 持仓均价 (TotalBuyHoldAmount - TotalSellHoldAmount) / NetQty
+    closepl: number; // 总平仓盈亏
+    executeprice: number; // 执行价 - 1:期货单 为 0
+    futurehedgeqty: number; // 期货套期量
+    goodsid: number; // 期货合约
+    middlegoodscode: string; // 套保商品代码
+    middlegoodsname: string; // 套保商品名称
+    netqty: number; // 净头寸
+    optioncode: string; // 期权代码
+    ordertype: number; // 单据类型 - 1:期货单 2:看涨期权单 3:看跌期权单
+    reckonpl: number; // 总盈亏(平仓盈亏 + 结算盈亏 - 手续费)
+    spotcontractid: string; // 现货ID [套期项目ID - 金瑞:合同\虚拟合同ID
+    todayfutureclosepl: number; // 今日平仓盈亏
+    totalbuyamount: number; // 买金额 [期货]
+    totalbuyholdamount: number; // 买持仓总金额[期货]
+    totalbuyqty: number; // 买数量
+    totalcharge: number; // 手续费
+    totalpremium: number; // 权利金 [期权]
+    totalsellamount: number; // 卖金额 [期货]
+    totalsellholdamount: number; // 卖持仓总金额[期货]
+    totalsellqty: number; // 卖数量
+    updatetime: string; // 更新时间
+}
+
+/**
+ * 套期计划明细查询请求
+ */
+export interface ERMCP2HedgedItemspotReq {
+    hedgeditemid: number; // 套期项目ID
+}
+
+/**
+ * 套期计划明细查询响应
+ */
+export interface ERMCP2HedgedItemspotRsp {
+    areauserid: number; // 企业ID
+    createtime: string; // 创建时间
+    customeruserid: number; // 对手方 【3:采购合同 4:销售合同】
+    deliverygoodsid: number; // 现货品种ID
+    enumdicname: string; // 单位
+    hedgeditemid: string; // 被套期项目ID
+    hedgeditemspotid: string; // 现货明细ID(625+Unix秒时间戳(10位)+xxxxxx)
+    hedgedtype: number; // 套期类型[计划类型] - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
+    hedgeplanno: string; // 计划编号
+    oriavgprice: number; // 期初市场价[当初市场价]
+    relatedamount: number; // 市价总额 = 关联数量 * 期初市场价
+    relatedhedgeplanid: number; // 关联计划ID 【1:采购计划 2:销售计划】
+    relatedqty: number; // 关联数量[数量]
+    relatedspotcontractid: number; // 关联合同ID 【3:采购合同 4:销售合同】
+    relatedtype: number; // 关联类型 - 1:套期关联 2:执行关联
+    spotgoodsbrandid: number; // 现货品牌ID - 存“DGFactoryItem”表"DGFactoryItemID" = 2
+    spotpricedamount: number; // 定价总额
+    spotpricedavgprice: number; // 现货均价 = 定价总额 / 关联数量
+    spottype: number; // 现货类型 - 1:采购计划 2:销售计划 3:采购合同 4:销售合同 5:库存存货
+    tradeuserid: number; // 交易用户ID
+    wrstandardid: number; // 现货商品ID
+    wrstandardname: string; // 现货商品
+}
+
+/**
+ * 现货成交明细查询请求
+ */
+export interface ERMCP2HedgedItemSpotDetailReq {
+    hedgeditemid: number; // 套期项目ID
+}
+
+/**
+ * 现货成交明细查询响应
+ */
+export interface ERMCP2HedgedItemSpotDetailRsp {
+    accountName: string; // 对手方
+    areauserid: number; // 企业ID
+    brandname: string; // 品牌
+    contractno: string; // 合同编号
+    createtime: string; // 创建时间
+    customeruserid: number; // 对手方 【3:采购合同 4:销售合同】
+    deliverygoodsid: number; // 现货品种ID
+    enumdicname: string; // 单位
+    hedgeditemid: string; // 被套期项目ID
+    hedgeditemspotid: string; // 现货明细ID(625+Unix秒时间戳(10位)+xxxxxx)
+    hedgedtype: number; // 套期类型[计划类型] - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
+    oriavgprice: number; // 期初市场价[当初市场价]
+    relatedamount: number; // 市价总额 = 关联数量 * 期初市场价
+    relatedhedgeplanid: number; // 关联计划ID 【1:采购计划 2:销售计划】
+    relatedqty: number; // 关联数量[数量]
+    relatedspotcontractid: number; // 关联合同ID 【3:采购合同 4:销售合同】
+    relatedtype: number; // 关联类型 - 1:套期关联 2:执行关联
+    spotgoodsbrandid: number; // 现货品牌ID - 存“DGFactoryItem”表"DGFactoryItemID" = 2
+    spotpricedamount: number; // 定价总额[金额]
+    spotpricedavgprice: number; // 现货均价 = 定价总额 / 关联数量
+    spottype: number; // 现货类型[合同类型] - 1:采购计划 2:销售计划 3:采购合同 4:销售合同 5:库存存货
+    tradeuserid: number; // 交易用户ID
+    wrstandardid: number; // 现货商品ID
+    wrstandardname: string; // 现货商品
+}
+
+/**
+ * 期货成交单明细查询请求
+ */
+export interface ERMCPPatradeLinkDetailReq {
+    hedgeditemid: number; // 套期项目ID
+}
+
+/**
+ * 期货成交单明细查询响应
+ */
+export interface ERMCPPatradeLinkDetailRsp {
+    agreeunit: number; // 合约乘数
+    amount: number; // 金额 = RelatedLot * TradePrice * AgreeUnit
+    areauserid: number; // 所属机构
+    bizsubjectid: number; // 归属业务部门ID - SubjectID
+    buyorsell: number; // 方向 - 0:买 1:卖
+    convertratio: number; // 品种系数
+    createtime: string; // 创建时间
+    creatorid: number; // 创建人ID
+    creatorsrc: number; // 创建人来源 - 1:管理端 2:终端 3:交易
+    goodsgroupid: number; // 对冲品种ID[期货合约商品组ID]
+    goodsid: number; // 商品ID
+    hedgeditemid: number; // 现货ID[套期项目ID] [13 - 被套期项目ID] [4,10,11 - 现货合同ID] [9 - 套保计划ID]
+    hedgeflag: number; // 投机套保标志 - 0:无 1:投机 2:套保 3:套利 4:套期保值(平安\合同) 5:单边(平安) 6:移仓(平安) 7:错单处理(平安) 8:跨期套利(平安) 9:套期保值(计划) 10:套利(合同) 11:换月(合同) 12:交割(金瑞) 13:被套期项目
+    linkdetailid: string; // 期货明细ID(614+Unix秒时间戳(10位)+xxxxxx)
+    linkstatus: number; // 关联状态 - 1:成功 2:失败 3:解绑
+    middlegoodsid: number; // 套保品种ID
+    name: string; // 账户名/子账户
+    optioncode: string; // [期货合约]期权代码 [期权]
+    ordertype: number; // 单据类型[套期工具] - 1:期货单 2:看涨期权单 3:看跌期权单
+    relatedlot: number; // [数量]关联手数
+    relatedmode: number; // 关联方式 - 1:自动关联 2:手动关联 3:解绑关联
+    relatedqty: number; // 关联数量 = RelatedLot * AgreeUnit * ConvertRatio
+    retcode: number; // 返回码
+    saleuserid: number; // 业务员ID
+    tradedate: string; // 关联交易日(yyyyMMdd)
+    tradeid: string; // 内部成交单ID
+    tradelot: number; // 成交手数
+    tradeprice: number; // [价格]成交价格
+    tradetime: string; // 日期时间
+    tradetradedate: string; // 成交交易日(yyyyMMdd)
+}
+
+/**
+ * 内部未关联成交单查询请求
+ */
+export interface InternalUncorrelatedTradeDetailReq {
+    userid: number; // 套期项目ID
+    begindate?: string; // 起始日期(格式yyyymmdd)
+    enddate?: string; // 终止日期(格式yyyymmdd)
+    goodscode?: string; // 合约代码
+    goodsname?: string; // 合约名称
+    tradeid?: number; // 成交单号
+    buyorsell?: number; // 方向 - 0:买 1:卖
+    accountname?: string; // 套期主体
+}
+
+/**
+ * 内部未关联成交单查询响应
+ */
+export interface InternalUncorrelatedTradeDetailRsp {
+    accountid: number; // 账号ID
+    accountname: string; // 套期主体
+    agreeunit: number; // 合约乘数
+    areauserid: number; // 所属机构
+    bizsubjectid: number; // 归属业务部门ID - SubjectID
+    buyorsell: number; // 方向 - 0:买 1:卖
+    convertratio: number; // 品种系数
+    createtime: string; // 创建时间
+    creatorid: number; // 创建人ID
+    creatorsrc: number; // 创建人来源 - 1:管理端 2:终端 3:交易
+    enableqty: number; // 项目可关联手数 = 成交手数 - 关联数量
+    goodscode: string; // 合约代码
+    goodsgroupid: number; // 对冲品种ID[期货合约商品组ID]
+    goodsid: number; // 商品ID
+    goodsname: string; // 合约名称
+    hedgeditemid: number; // 现货ID[套期项目ID] [13 - 被套期项目ID] [4,10,11 - 现货合同ID] [9 - 套保计划ID]
+    hedgeflag: number; // 投机套保标志 - 0:无 1:投机 2:套保 3:套利 4:套期保值(平安\合同) 5:单边(平安) 6:移仓(平安) 7:错单处理(平安) 8:跨期套利(平安) 9:套期保值(计划) 10:套利(合同) 11:换月(合同) 12:交割(金瑞) 13:被套期项目
+    linkdetailid: string; // 期货明细ID(614+Unix秒时间戳(10位)+xxxxxx)
+    linkstatus: number; // 关联状态 - 1:成功 2:失败 3:解绑
+    middlegoodsid: number; // 套保品种ID
+    relatedlot: number; // [数量]关联手数
+    relatedmode: number; // 关联方式 - 1:自动关联 2:手动关联 3:解绑关联
+    relatedqty: number; // [套期商品数量]关联数量 = RelatedLot * AgreeUnit * ConvertRatio
+    retcode: number; // 返回码
+    saleuserid: number; // 业务员ID
+    tradedate: string; // 关联交易日(yyyyMMdd)
+    tradeid: string; // 成交单号
+    tradelot: number; // 成交手数
+    tradeprice: number; // 成交价
+    tradetime: string; // 成交时间
+    tradetradedate: string; // 成交交易日(yyyyMMdd)
+    userid: number; // 用户编号
+    channelbuildtype: number; // 委托单据类型 0:无 1:建仓 2:平仓
+}
+
+/**
+ * 内部成交单可关联项目查询请求
+ */
+export interface InternalEnableTradeDetailReq {
+    areauserid: number; // 企业ID
+    goodsid: number; // 期货合约ID
+}
+
+/**
+ * 内部成交单可关联项目查询响应
+ */
+export interface InternalEnableTradeDetailRsp {
+    areauserid: number; // 企业ID
+    deliverygoodscode: string; // 现货品种代码
+    deliverygoodsid: number; // 现货品种ID(SEQ_DELIVERYGOODS)
+    deliverygoodsname: string; // 现货品种名称
+    futurehedgeqty: number; // [已关联数量]期货持仓套期量
+    goodsid: number; // 期货合约ID
+    hedgeditemnum: string; // 项目编号
+    unexehedgeqty: number; // 未执行套期量 = 未执行现货量折算系数 (1/(1+增值税)) * 套期比例(项目上)
+    unexespotqty: number; // 未执行现货量
+    wrstandardcode: string; // 现货品类代码
+    wrstandardid: number; // 现货品类ID(SEQ_WRSTANDARD)
+    wrstandardname: string; // 现货品类名称
+    relatedlot?: number; // 本次关联手数
+    relatedqty?: number; // 本次关联数量
+}
+
+/**
+ * 未关联合同查询请求
+ */
+export interface UnLinkSpotContractReq {
+    userid: number; // 企业ID
+    pricetype?: number; // 定价类型 - 1:一口价 2:点价 3:暂定价
+    contractno?: string; // 合同编号, 模拟查询
+    customername?: string; // 对手方, 模拟查询
+    contracttype: number; // 项合同类型 - 1:采购 -1:销售
+}
+
+/**
+ * 未关联合同查询响应
+ */
+export interface UnLinkSpotContractRsp {
+    accountname: string; // 套期主体
+    amount: number; // 金额 [1:一口价、3:暂定价]
+    attachment: string; // 附件
+    auditremark: string; // 审核意见
+    audittime: string; // 审核时间
+    avgprice: number; // 定价均价 = 已定价金额 / 已定价量
+    brandname: string; // 品牌名称
+    buyuserid: number; // 采购方ID
+    buyusername: string; // 采购方名称
+    contracctstatus: number; // 合同状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
+    contractmargin: number; // 合同保证金
+    contractno: string; // [合同编号]现货合同编号
+    contracttype: number; // [合同类型]现货合同类型 - 1:采购 -1:销售
+    convertfactor: number; // 标仓系数
+    createtime: string; // 创建时间
+    customername: string; // 对手方
+    customeruserid: number; // 客户ID
+    deliveryenddate: string; // 交收期(结束)
+    deliverygoodscode: string; // 现货品种代码
+    deliverygoodsid: number; // 现货品种ID
+    deliverygoodsname: string; // 现货品种名称
+    deliverystartdate: string; // 交收期(开始)
+    enddate: string; // 点价结束日期 [2:点价 3:暂定价]
+    enumdicname: string; // 单位名称
+    goodscode: string; // 点价合约代码
+    goodsid: number; // 点价合约ID - 0:为现货,其它为期货商品合约ID [2:点价 3:暂定价]
+    goodsname: string; // 点价商品名称
+    isrelated: number; // 是否已关联计划项目 - 0:否 1:是
+    isrelated2: number; // 是否已关联现货项目 - 0:否 1:是
+    margin: number; // 当前保证金
+    modelname: string; // 型号名称
+    price: number; // 价格\暂定价 [1:一口价、3:暂定价]
+    pricedamount: number; // 已定价金额 = (点价价格+升贴水) * 数量
+    pricedqty: number; // 已定价量
+    pricemove: number; // 升贴水 [2:点价 3:暂定价]
+    pricetype: number; // 定价类型 - 1:一口价 2:点价 3:暂定价
+    producttype: number; // 产品类型 - 1:标准仓单 2:等标 3:非标
+    qty: number; // [合同数量]数量
+    remark: string; // 备注
+    selluserid: number; // 销售方ID
+    sellusername: string; // 销售方名称
+    spotamount: number; // 合同现货金额 [不含升贴水]
+    spotavgprice: number; // 现货均价 = 合同现货金额 / 已定价量
+    spotcontractid: string; // 现货合同ID(602+Unix秒时间戳(10位)+xxxxxx)
+    spotgoodsbrandid: number; // 现货品牌ID
+    spotgoodsdesc: string; // 商品型号
+    spotgoodsmodelid: number; // 现货型号ID
+    startdate: string; // 点价开始日期 [2:点价 3:暂定价]
+    tradeuserid: number; // 交易用户ID
+    unpricedqty: number; // 未定价量 = 合同数量 - 已定价量
+    updatetime: string; // 更新时间
+    userid: number; // 机构ID
+    wrstandardcode: string; // 现货商品代码
+    wrstandardid: number; // 现货商品ID
+    wrstandardname: string; // [现货商品]现货商品名称
+}
+
+/**
+ * 可关联项目查询请求
+ */
+export interface Ermcp8EnableHedgeditemReq {
+    userid: number; // 用户ID
+    spottype: number; // 现货类型 - 1:采购计划 2:销售计划 3:采购合同 4:销售合同 5:库存存货
+}
+
+/**
+ * 可关联项目查询响应
+ */
+export interface Ermcp8EnableHedgeditemRsp {
+    accountname: string; // 套期主体
+    hedgeditemid: number; // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx)
+    hedgeditemname: string; // 项目名称
+    hedgeditemnum: string; // 项目编号
+    hedgedtype: number; // 套期类型 - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
+    planenddate: string; // 计划结束日期
+    planstartdate: string; // 计划开始日期
+    relatedqty?: number; // 关联数量
+}

+ 13 - 1
src/services/go/ermcp/report/index.ts

@@ -16,7 +16,9 @@ import {
     QryAreaExpourseContractDetailReq,
     QryAreaExpourseFutuDetailReq, QryAreaExpourseHedgeplanDetailReq, QryAreaExpourseParamChLogDetailReq,
     QryAreaSumPLReq,
-    QryTaFutureDataReportReq
+    QryTaFutureDataReportReq,
+    Ermcp8HedgeditemReportReq,
+    Ermcp8HedgeditemReportRsp
 } from "@/services/go/ermcp/report/interface";
 
 /**
@@ -152,3 +154,13 @@ export function qryAreaExpourseParamChLogDetail(req: QryAreaExpourseParamChLogDe
     });
 }
 
+/**
+ * 套期项目报表查询
+ * @param req 
+ * @returns 
+ */
+export function queryErmcp8HedgeditemReport(req: Ermcp8HedgeditemReportReq): Promise<Ermcp8HedgeditemReportRsp[]> {
+    return commonSearch_go('/Ermcp8/QueryErmcp8HedgeditemReport', req).catch((err) => {
+        throw new Error(`套期项目报表查询: ${err}`);
+    });
+}

+ 51 - 1
src/services/go/ermcp/report/interface.ts

@@ -537,5 +537,55 @@ export interface Ermcp3ExposureParamChLog {
     tradedate: string;//交易日(yyyyMMdd)
 }
 
+/**
+ * 套期项目报表查询请求
+ */
+export interface Ermcp8HedgeditemReportReq {
+    userid: number; // 用户ID
+    cycletype: number; // 周期类型 - 0:日 1:月 2:季 3:年 4:周 5:全报表【原值】
+    cycletime: string; // 周期时间 日(YYYYMMDD) 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYMMDD周内任意一天) 全(0)【原值】
+    hedgedtype?: number; // 套期类型 - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
+    hedgeditemstatus?: number; // 项目状态 - 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
+    hedgeditemnum?: string; // 项目编号,模糊查询
+    wrstandardid?: number; // 现货商品ID
+}
 
-
+/**
+ * 套期项目报表查询响应
+ */
+export interface Ermcp8HedgeditemReportRsp {
+    areauserid: number; // 企业ID
+    curprice: number; // [当日现货市场价]当前市场价
+    cycletime: string; // 周期时间 日(YYYYMMDD) 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYMMDD周内任意一天) 全(0)【原值】
+    cycletype: number; // 周期类型 - 0:日 1:月 2:季 3:年 4:周 5:全报表【原值】
+    enumdicname: string; // 单位
+    exeamount: number; // [执行现货金额]执行市价总额
+    exeavgprice: number; // [执行价]执行市场均价= 执行市价总额 / 执行现货量
+    exeqty: number; // [执行数量]执行现货量
+    futurehedgepl: number; // 期货实际损益
+    futurehedgeplchange: number; // 期货实际变动 = 期货实际损益 - 期初期货实际损益
+    futurepl: number; // 期货套期损益
+    futureplchange: number; // 期货套期变动 = 期货套期损益 - 期初期货套期损益
+    hedgeamount: number; // [套期现货金额]套期市价总额
+    hedgeditemnum: string; // 项目编号,模糊查询
+    hedgeditemstatus: number; // 项目状态 - 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
+    hedgedtype: number; // 套期类型 - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
+    hedgeqty: number; // [套期数量]套期现货量
+    oriavgprice: number; // [期初价]期初市场均价 = 套期市价总额 / 套期现货量
+    orifuturehedgepl: number; // 期初期货实际损益
+    orifuturepl: number; // 期初期货套期损益
+    orispothedgepl: number; // 期初现货实际损益
+    orispotpl: number; // 期初现货套期损益
+    planenddate: string; // 计划结束日期
+    planstartdate: string; // 计划开始日期
+    spothedgepl: number; // 现货实际损益 =(执行市场均价-期初市场均价)*执行现货量 * 方向(销售计划 为 -1, 其它为1)
+    spothedgeplchange: number; // 现货实际变动 = 现货实际损益 - 期初现货实际损益
+    spotpl: number; // 现货套期损益 = 现货实际损益 + 现货浮动损益
+    spotplchange: number; // 现货套期变动 = 现货套期损益 - 期初现货套期损益
+    tradeuserid: number; // 交易用户ID
+    unexeqty: number; // 未执行现货量 = 套期现货量 - 执行现货量
+    userid: number; // 用户ID
+    wrstandardcode: string; // 现货品类代码
+    wrstandardid: number; // 现货商品ID
+    wrstandardname: string; // [现货商品]现货品类名称
+}

+ 44 - 0
src/services/proto/hedgedItem/index.ts

@@ -0,0 +1,44 @@
+import { protoMiddleware } from "@/services/socket/protobuf/buildReq"
+import { HedgedItemAddReq, HedgedItemAddRsp, HedgedItemOperateReq, HedgedItemOperateRsp, HedgedItemEndReq, HedgedItemEndRsp, ContractRelatedHedgedItemReq, ContractRelatedHedgedItemRsp, HedgedItemRelatedPlanReq, HedgedItemRelatedPlanRsp, InnerTradeLinkReq, InnerTradeLinkRsp } from './interface'
+
+/**
+ * 新增套期项目请求
+ */
+export const hedgedItemAdd = (param: HedgedItemAddReq): Promise<HedgedItemAddRsp> => {
+    return protoMiddleware(param, 'HedgedItemAddReq', 'HedgedItemAddRsp', 2)
+}
+
+/**
+ * 套期项目操作请求
+ */
+export const hedgedItemOperate = (param: HedgedItemOperateReq): Promise<HedgedItemOperateRsp> => {
+    return protoMiddleware(param, 'HedgedItemOperateReq', 'HedgedItemOperateRsp', 2)
+}
+
+/**
+ * 套期项目结束请求
+ */
+export const hedgedItemEnd = (param: HedgedItemEndReq): Promise<HedgedItemEndRsp> => {
+    return protoMiddleware(param, 'HedgedItemEndReq', 'HedgedItemEndRsp', 2)
+}
+
+/**
+ * 合同关联项目请求
+ */
+export const contractRelatedHedgedItem = (param: ContractRelatedHedgedItemReq): Promise<ContractRelatedHedgedItemRsp> => {
+    return protoMiddleware(param, 'ContractRelatedHedgedItemReq', 'ContractRelatedHedgedItemRsp', 2)
+}
+
+/**
+ * 项目关联计划请求
+ */
+export const hedgedItemRelatedPlan = (param: HedgedItemRelatedPlanReq): Promise<HedgedItemRelatedPlanRsp> => {
+    return protoMiddleware(param, 'HedgedItemRelatedPlanReq', 'HedgedItemRelatedPlanRsp', 2)
+}
+
+/**
+ * 内部成交单关联请求
+ */
+export const innerTradeLink = (param: InnerTradeLinkReq): Promise<InnerTradeLinkRsp> => {
+    return protoMiddleware(param, 'InnerTradeLinkReq', 'InnerTradeLinkRsp', 2)
+}

+ 128 - 0
src/services/proto/hedgedItem/interface.ts

@@ -0,0 +1,128 @@
+/**
+ * 新增套期项目请求
+ */
+export interface HedgedItemAddReq {
+    HedgedItemNum: string; // 被套期项目编号
+    HedgedItemName: string; // 项目名称
+    HedgedType?: number; // 套期类型-1:采购计划项目
+    PlanStartDate: string; // 计划开始日期
+    PlanEndDate: string; // 计划结束日期
+    TradeUserID?: number; // 交易用户ID
+    AreaUserID: number; // 企业ID
+    ApplySrc: number; // 申请来源
+    ApplyID: number; // 申请人
+    Remark?: string; // 备注
+    SpotContractID: number; // 现货合同ID
+    Qty: number; // 数量
+    ClientTicket: string; // 客户端流水号
+}
+
+/**
+ * 新增套期项目响应
+ */
+export interface HedgedItemAddRsp {
+    RetCode: number; // 返回码
+    RetDesc: string; // 描述信息
+    HedgedItemID: number; // 被套期项目ID
+    ClientTicket: string;  // 客户端流水号
+}
+
+/**
+ * 套期项目操作请求
+ */
+export interface HedgedItemOperateReq {
+    HedgedItemID: number; // 被套期项目ID
+    OperateType: number; // 操作类型-1:审核通过2:审核拒绝
+    AuditID: number; // 审核人
+    AuditSrc: number; // 审核来源
+    AuditRemark: string; // 审核备注
+    ClientTicket: string; // 客户端流水号
+}
+
+/**
+ * 套期项目操作响应
+ */
+export interface HedgedItemOperateRsp {
+    RetCode: number; // 返回码
+    RetDesc: string; // 描述信息
+    ClientTicket: string; // 客户端流水号
+}
+
+/**
+ * 套期项目结束请求
+ */
+export interface HedgedItemEndReq {
+    HedgedItemID: number; // 被套期项目信息
+    ClientTicket: string; // 客户端流水号
+}
+
+/**
+ * 套期项目结束响应
+ */
+export interface HedgedItemEndRsp {
+    RetCode: number; // 返回码
+    RetDesc: string; // 描述信息
+    ClientTicket: string; // 客户端流水号
+}
+
+// 被套期项目信息
+export interface HedgedItemInfo {
+    HedgedItemID: number; // 被套期项目ID
+    RelatedQty: number; // 关联数量
+}
+
+// 合同关联项目请求
+export interface ContractRelatedHedgedItemReq {
+    SpotContractID: number; // 现货合同ID
+    HedgedItemInfos: HedgedItemInfo; // 被套期项目信息
+    ClientTicket: string; // 客户端流水号
+}
+
+// 合同关联项目响应
+export interface ContractRelatedHedgedItemRsp {
+    RetCode: number; // 返回码
+    RetDesc: string; // 描述信息
+    ClientTicket: string; // 客户端流水号
+}
+
+// 关联套保计划信息
+export interface RelatedHedgePlanInfo {
+    HedgePlanID: number; // 被套期项目ID
+    OriAvgPrice: number; // 期初市场价
+}
+
+// 项目关联计划请求
+export interface HedgedItemRelatedPlanReq {
+    HedgedItemID: number; // 被套期项目信息
+    RelatedHedgePlanInfos: RelatedHedgePlanInfo; // 关联套保计划信息
+    ClientTicket: string; // 客户端流水号
+}
+
+// 项目关联计划响应
+export interface HedgedItemRelatedPlanRsp {
+    RetCode: number; // 返回码
+    RetDesc: string; // 描述信息
+    ClientTicket: string; // 客户端流水号
+}
+
+// 内部成交单关联请求
+export interface InnerTradeLinkReq {
+    TradeId: number; // 内部成交单号
+    HedgeFlag: number; // 投机套保标志
+    SpotContractID: number; // 现货合同ID
+    SaleUserID: number; // 业务员ID
+    BizSubjectID: number; // 归属业务部门ID
+    RelatedLot: number; // 关联手数
+    RelatedMode: number; // 关联模式
+    CreatorSrc: number; // 创建来源
+    CreatorID: number; // 创建人
+    ClientTicket: string; // 客户端流水号
+}
+
+// 内部成交单关联响应
+export interface InnerTradeLinkRsp {
+    RetCode: number; // 返回码
+    RetDesc: string; // 描述信息
+    TradeId: number; // 内部成交单号
+    ClientTicket: string; // 客户端流水号
+}

+ 1 - 1
src/views/account/login.vue

@@ -167,7 +167,7 @@ export default defineComponent({
     }
 
     function loginAction() {
-      if (!/^[\da-z]+$/i.test(form.account)) {
+      if (!/^[\u4E00-\u9FA5\da-z]+$/i.test(form.account)) {
         message.error('请输入正确的账号');
         return
       }

+ 75 - 0
src/views/business/plan/list/finish/index.vue

@@ -0,0 +1,75 @@
+<template>
+    <!-- 计划: 已完成-->
+    <mtp-table-scroll>
+        <template #header>
+            <Filter @search="updateColumn"></Filter>
+        </template>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+                :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :rowKey="(record, index) => index"
+                :data-source="tableList">
+                <!-- 额外的展开行 -->
+                <template #expandedRowRender="{ record }">
+                    <mtp-table-button class="btn-list-sticky" :buttons="buttons" :record="record"
+                        @click="openComponent" />
+                </template>
+                <template #contracttype="{ text }">
+                    <a>{{ getPlanContractType(text) }}</a>
+                </template>
+                <template #hedgeplanstatus="{ text }">
+                    <a>{{ getPlanStatusName(text) }}</a>
+                </template>
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+    <!-- 右键 -->
+    <contextMenu :contextMenu="contextMenu" @cancel="closeContext" :list="buttons"> </contextMenu>
+    <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" @cancel="closeComponent"> </component>
+</template>
+
+<script lang="ts">
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+import { queryTableList, MtpTableButton, contextMenu, defineAsyncComponent, defineComponent, handleComposeTable, ComposeTableParam } from '@/common/export/commonTable';
+import { Filter } from '../../components';
+import { getPlanContractType, getPlanStatusName } from '@/views/business/plan/setup';
+import { Ermcp3HedgePlan } from '@/services/go/ermcp/plan/interface';
+import { QueryHedgePlan } from '@/services/go/ermcp/plan';
+import { EnumRouterName } from '@/common/constants/enumRouterName';
+import { getTableButton } from '@/common/setup/table/button';
+
+export default defineComponent({
+    name: EnumRouterName.plan_running,
+    components: {
+        MtpTableScroll,
+        contextMenu,
+        MtpTableButton,
+        Filter,
+        detail: defineAsyncComponent(() => import('../../components/detail/index.vue')),
+    },
+    setup() {
+        // 权限按钮
+        const buttons = getTableButton();
+        // 表格列表数据
+        const { loading, tableList, queryTable } = queryTableList<Ermcp3HedgePlan>();
+
+        // 获取列表数据
+        const queryTableAction = () => queryTable(QueryHedgePlan, '3');
+
+        // 表格通用逻辑
+        const param: ComposeTableParam = {
+            queryFn: queryTableAction,
+            tableName: 'table_pcweb_hedging_plan',
+        };
+
+        return {
+            ...handleComposeTable<Ermcp3HedgePlan>(param),
+            loading,
+            tableList,
+            getPlanStatusName,
+            getPlanContractType,
+            queryTable,
+            buttons,
+        };
+    },
+});
+</script>

+ 7 - 3
src/views/business/search/plan/index.vue

@@ -5,9 +5,10 @@
       <filterCustomTable @search="updateColumn"></filterCustomTable>
     </template>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record,index)=>index" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :data-source="tableList" :scroll="scroll">
-        <template #index="{ index }">
-          <span>{{ index + 1 }}</span>
+      <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :data-source="tableList" :scroll="scroll">
+        <template #expandedRowRender="{ record }">
+          <mtp-table-button class="btn-list-sticky" :buttons="auth" :record="record" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -23,6 +24,7 @@ import { formatTime, formatValue } from '@/common/methods';
 import { useColumn } from './setup';
 import { Ermcp3HedgePlan } from '@/services/go/ermcp/plan/interface';
 import { QueryHedgePlan } from '@/services/go/ermcp/plan';
+import { useMenu } from '@/@next/hooks/common'
 import moment from 'moment';
 
 export default defineComponent({
@@ -33,6 +35,7 @@ export default defineComponent({
     MtpTableButton,
   },
   setup() {
+    const { auth } = useMenu();
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<Ermcp3HedgePlan>();
 
@@ -59,6 +62,7 @@ export default defineComponent({
       ...useColumn(),
       loading,
       tableList,
+      auth,
       queryTable,
       formatTime,
       formatValue,

+ 2 - 1
src/views/business/search/spot/index.vue

@@ -5,7 +5,8 @@
       <filterCustomTable @search="updateColumn"></filterCustomTable>
     </template>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record,index)=>index" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :data-source="tableList" :scroll="scroll">
+      <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :data-source="tableList" :scroll="scroll">
         <template #expandedRowRender="{ record }">
           <mtp-table-button class="btn-list-sticky" :buttons="buttons" :record="record" @click="openComponent" />
         </template>

+ 54 - 0
src/views/hedgeditem/exposure/components/futures/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-期货变动明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll"></a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { } from '@/services/go/ermcp/hedgedItem/interface'
+import { } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<unknown>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<unknown>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            // const { hedgeditemnum } = props.selectedRow;
+            // if (hedgeditemnum) {
+            //     queryTable(queryErmcp2HedgedItem, { spotcontractid: hedgeditemnum });
+            // }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<unknown>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_exposure_futures_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 54 - 0
src/views/hedgeditem/exposure/components/plan/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-计划变动明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll"></a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { } from '@/services/go/ermcp/hedgedItem/interface'
+import { } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<unknown>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<unknown>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            // const { hedgeditemnum } = props.selectedRow;
+            // if (hedgeditemnum) {
+            //     queryTable(queryErmcp2HedgedItem, { spotcontractid: hedgeditemnum });
+            // }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<unknown>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_exposure_plan_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 54 - 0
src/views/hedgeditem/exposure/components/position/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-期货持仓明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll"></a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { } from '@/services/go/ermcp/hedgedItem/interface'
+import { } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<unknown>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<unknown>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            // const { hedgeditemnum } = props.selectedRow;
+            // if (hedgeditemnum) {
+            //     queryTable(queryErmcp2HedgedItem, { spotcontractid: hedgeditemnum });
+            // }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<unknown>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_exposure_position_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 54 - 0
src/views/hedgeditem/exposure/components/spot/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-现货变动明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll"></a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { } from '@/services/go/ermcp/hedgedItem/interface'
+import { } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<unknown>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<unknown>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            // const { hedgeditemnum } = props.selectedRow;
+            // if (hedgeditemnum) {
+            //     queryTable(queryErmcp2HedgedItem, { spotcontractid: hedgeditemnum });
+            // }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<unknown>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_exposure_spot_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 49 - 0
src/views/hedgeditem/exposure/list/index.vue

@@ -0,0 +1,49 @@
+<template>
+    <!-- 套期交易-敞口监控 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :expandedRowKeys="expandedRowKeys"
+                :customRow="Rowclick" :rowKey="(record, index) => index" :data-source="tableList" :scroll="scroll">
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+    <mtp-tab-component :options="{ selectedRow }" />
+    <component :is="componentId" v-if="componentId" v-bind="{ selectedRow }" @cancel="closeComponent"></component>
+</template>
+
+<script lang="ts">
+import { queryTableList, MtpTableButton, defineComponent, handleComposeTable } from '@/common/export/commonTable'
+import { Ermcp2HedgedItemRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryErmcp2HedgedItem } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue'
+import MtpTabComponent from '@/@next/components/base/tab-component/index.vue'
+
+export default defineComponent({
+    components: {
+        MtpTabComponent,
+        MtpTableButton,
+        MtpTableScroll,
+    },
+    setup() {
+        const { loading, tableList, queryTable } = queryTableList<Ermcp2HedgedItemRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => queryTable(queryErmcp2HedgedItem, { hedgeditemstatus: 3 }).then((res) => {
+            if (res.length) {
+                composeTable.selectedRow.value = res[0];
+            }
+        })
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<Ermcp2HedgedItemRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_exposure',
+        })
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 46 - 0
src/views/hedgeditem/futures/components/filter/index.vue

@@ -0,0 +1,46 @@
+<template>
+    <div class="filterTable">
+        <FilterOption :selectList="selectList" :inputList="inputList" :buttonList="buttonList" />
+        <slot></slot>
+    </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import { InternalUncorrelatedTradeDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { useFilter } from '@/common/components/filter/setup'
+import FilterOption from '@/common/components/filter/index.vue'
+
+export default defineComponent({
+    name: 'filter-custom-table',
+    components: {
+        FilterOption
+    },
+    setup(props, context) {
+        const { selectList, inputList, buttonList, search } = useFilter<InternalUncorrelatedTradeDetailRsp>(context);
+
+        selectList.value = [
+            {
+                key: 'buyorsell',
+                selectedValue: -1,
+                options: [
+                    { label: '全部方向', value: -1 },
+                ],
+                onChange: search
+            },
+        ]
+
+        inputList.value = [
+            { keys: ['accountname'], value: '', placeholder: '模糊搜索期货子账号' },
+            { keys: ['goodsid', 'goodscode'], value: '', placeholder: '模糊搜索期货合约' },
+            { keys: ['tradeid'], value: '', placeholder: '模糊搜索成交单号' },
+        ]
+
+        return {
+            selectList,
+            inputList,
+            buttonList,
+        }
+    },
+})
+</script>

+ 2 - 0
src/views/hedgeditem/futures/finish/index.vue

@@ -0,0 +1,2 @@
+<template>
+</template>

+ 134 - 0
src/views/hedgeditem/futures/in/components/bind/form.ts

@@ -0,0 +1,134 @@
+import { ref, computed } from 'vue'
+import { v4 } from 'uuid'
+import { message } from 'ant-design-vue'
+import { geLoginID_number } from '@/services/bus/login'
+import { queryTableList, handleComposeTable } from '@/common/export/commonTable'
+import { InternalEnableTradeDetailReq, InternalEnableTradeDetailRsp, InternalUncorrelatedTradeDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryErmcp8EnableHedgeditem } from '@/services/go/ermcp/hedgedItem'
+import { InnerTradeLinkRsp } from '@/services/proto/hedgedItem/interface'
+import { innerTradeLink } from '@/services/proto/hedgedItem'
+import { getAreaUserId } from '@/services/bus/user'
+
+export function useForm(selectedRow: InternalUncorrelatedTradeDetailRsp) {
+    const { hedgeditemid, goodsid, enableqty } = selectedRow;
+    const { tableList, queryTable } = queryTableList<InternalEnableTradeDetailRsp>(true, 2); // 表格列表数据
+    const loading = ref<boolean>(false);
+    const selectedRowKeys = ref<number[]>([]); // 表格选中的 rowKey 数据 :rowKey="(record,index)=>index"
+
+    // 计算当前关联数量
+    const currentQty = computed(() => {
+        return tableList.value.reduce((pre, cur, index) => {
+            if (selectedRowKeys.value.includes(index)) {
+                pre += cur?.relatedqty ?? 0;
+            }
+            return pre;
+        }, 0);
+    })
+
+    // 自定义表格选择项
+    const rowSelection = computed(() => ({
+        columnTitle: '选择',
+        selectedRowKeys: selectedRowKeys.value,
+        onChange: (keys: number[]) => {
+            selectedRowKeys.value = keys;
+        },
+        onSelect: (record: InternalEnableTradeDetailRsp, selected: boolean) => {
+            if (!selected) {
+                // 未选中的取消关联量
+                record.relatedlot = undefined;
+            }
+        },
+    }))
+
+    // 表格通用逻辑
+    const composeTable = handleComposeTable<InternalEnableTradeDetailRsp>({
+        tableName: 'table_pcweb_hedgeditem_futures_in_relation',
+        queryFn: () => {
+            const param: InternalEnableTradeDetailReq = {
+                areauserid: getAreaUserId(),
+                goodsid: goodsid,
+            }
+            queryTable(queryErmcp8EnableHedgeditem, param);
+        },
+    })
+
+    // 表格列
+    const columns = computed(() => {
+        const result = composeTable.columns.value;
+        result.push(...[
+            {
+                title: '本次关联手数',
+                align: 'center',
+                key: 'relatedlot',
+                slots: {
+                    customRender: 'relatedlot'
+                }
+            },
+            {
+                title: '本次关联数量',
+                align: 'center',
+                key: 'relatedqty',
+                slots: {
+                    customRender: 'relatedqty'
+                }
+            }
+        ])
+        return result;
+    })
+
+    // 表单提交
+    const formSubmit = (callback?: () => void) => {
+        const keys = selectedRowKeys.value;
+        const seledtedRows = tableList.value.filter((e, index) => keys.includes(index));
+
+        if (seledtedRows.length) {
+            if (seledtedRows.every((e) => e.relatedlot && e.relatedlot > 0)) {
+                if (currentQty.value > enableqty) {
+                    message.error('关联数量不能大于可关联手数');
+                } else {
+                    loading.value = true;
+                    const result: Promise<InnerTradeLinkRsp>[] = [];
+
+                    seledtedRows.forEach((e) => {
+                        result.push(innerTradeLink({
+                            TradeId: 0, // 内部成交单号
+                            HedgeFlag: 0, // 投机套保标志
+                            SpotContractID: hedgeditemid, // 现货合同ID
+                            SaleUserID: 0, // 业务员ID
+                            BizSubjectID: 0, // 归属业务部门ID
+                            RelatedLot: 0, // 关联手数
+                            RelatedMode: 0, // 关联模式
+                            CreatorSrc: 2, // 创建来源
+                            CreatorID: geLoginID_number()!, // 创建人
+                            ClientTicket: v4() // 客户端流水号
+                        }))
+                    })
+
+                    Promise.all(result).then(() => {
+                        message.error('关联成功');
+                        callback && callback();
+                    }).catch((err) => {
+                        message.error('关联失败:' + err);
+                    }).finally(() => {
+                        loading.value = false;
+                    })
+                }
+
+            } else {
+                message.error('请输入关联手数');
+            }
+        } else {
+            message.error('请选择关联订单');
+        }
+    }
+
+    return {
+        loading,
+        tableList,
+        selectedRowKeys,
+        rowSelection,
+        currentQty,
+        columns,
+        formSubmit,
+    }
+}

+ 111 - 0
src/views/hedgeditem/futures/in/components/bind/index.vue

@@ -0,0 +1,111 @@
+<template>
+    <!-- 套期交易-期货成交关联-关联 -->
+    <a-modal class="commonModal custom-detail" title="期现单据关联" v-model:visible="visible" centered @cancel="cancel(false)"
+        width="890px">
+        <a-form class="inlineForm">
+            <fieldset class="formFieldSet">
+                <legend>成交单信息</legend>
+                <a-row :gutter="24">
+                    <a-col :span="12">
+                        <a-form-item label="套期主体">
+                            <span class="white">{{ selectedRow.accountname + '/' + selectedRow.accountid }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="合约">
+                            <span class="white">{{ selectedRow.goodscode + '/' + selectedRow.goodsname }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="订单类型">
+                            <span class="white">{{ getChannelBuildName(selectedRow.channelbuildtype) }} {{
+                                    getBuyOrSellName(selectedRow.buyorsell)
+                            }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="成交价">
+                            <span class="white">{{ formatValue(selectedRow.tradeprice) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="成交数量">
+                            <span class="white">{{ formatValue(selectedRow.relatedqty) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="成交时间">
+                            <span class="white">{{ formatValue(selectedRow.tradetime) }}</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+            </fieldset>
+            <fieldset class="formFieldSet">
+                <legend>关联信息</legend>
+                <a-row :gutter="24">
+                    <a-col :span="12">
+                        <a-form-item label="当前关联数量">
+                            <span class="white">{{ currentQty }}</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+                <div class="tableDatas">
+                    <a-table class="dialogTable" :columns="columns" :data-source="tableList" :pagination="false"
+                        :loading="loading" :rowKey="(record, index) => index" :row-selection="rowSelection">
+                        <template #relatedlot="{ record, index }">
+                            <a-input-number class="dialogInput" size="small"
+                                :disabled="!selectedRowKeys.includes(index)" :precision="0" v-model:value="record.qty"
+                                style="width:100px" />
+                        </template>
+                        <template #relatedqty="{ text }">
+                            <span>{{ text ?? 0 }}</span>
+                        </template>
+                    </a-table>
+                </div>
+            </fieldset>
+        </a-form>
+        <template #footer>
+            <a-button key="submit" class="cancelBtn" @click="cancel(false)">取消</a-button>
+            <a-button key="submit" type="primary" :loading="loading" @click="formSubmit(() => cancel(true))">确定
+            </a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from 'vue'
+import { _closeModal } from '@/common/setup/modal/modal'
+import { formatValue } from '@/common/methods'
+import { getChannelBuildName, getBuyOrSellName } from '@/common/constants/enumsName'
+import { InternalUncorrelatedTradeDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { useForm } from './form'
+
+export default defineComponent({
+    emits: ['cancel'],
+    props: {
+        selectedRow: {
+            type: Object as PropType<InternalUncorrelatedTradeDetailRsp>,
+            required: true
+        },
+    },
+    setup(props, context) {
+        const { visible, cancel } = _closeModal(context);
+        const { loading, tableList, columns, currentQty, selectedRowKeys, rowSelection, formSubmit } = useForm(props.selectedRow);
+
+        return {
+            visible,
+            loading,
+            tableList,
+            columns,
+            cancel,
+            formatValue,
+            currentQty,
+            selectedRowKeys,
+            rowSelection,
+            formSubmit,
+            getBuyOrSellName,
+            getChannelBuildName,
+        }
+    }
+})
+</script>

+ 75 - 0
src/views/hedgeditem/futures/in/index.vue

@@ -0,0 +1,75 @@
+<template>
+    <!-- 套期交易-期货成交关联-内部未关联成交单查询 -->
+    <mtp-table-scroll>
+        <template #header>
+            <Filter @search="updateColumn"></Filter>
+        </template>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :loading="loading"
+                :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll">
+                <template #expandedRowRender="{ record }">
+                    <mtp-table-button class="btn-list-sticky" :buttons="auth" :record="record" @click="openComponent" />
+                </template>
+                <!-- 套期主体 -->
+                <template #accountname="{ record }">
+                    <span>{{ record.accountname }}/{{ record.accountid }}</span>
+                </template>
+                <!-- 买卖方向 -->
+                <template #buyorsell="{ text }">
+                    <span>{{ getBuyOrSellName(text) }}</span>
+                </template>
+                <!-- 合约代码 -->
+                <template #goodscode="{ record }">
+                    <span>{{ record.goodscode }}/{{ record.goodsname }}</span>
+                </template>
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+    <component :is="componentId" v-if="componentId" v-bind="{ selectedRow }" @cancel="closeComponent"></component>
+</template>
+
+<script lang="ts">
+import { queryTableList, MtpTableButton, defineComponent, defineAsyncComponent, handleComposeTable } from '@/common/export/commonTable'
+import { InternalUncorrelatedTradeDetailReq, InternalUncorrelatedTradeDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryInternalUncorrelatedTradeDetail } from '@/services/go/ermcp/hedgedItem'
+import { getBuyOrSellName } from '@/common/constants/enumsName'
+import { useMenu } from '@/@next/hooks/common'
+import { getUserId } from '@/services/bus/user';
+import MtpTableScroll from '@/common/components/tableScroll/index.vue'
+import Filter from '../components/filter/index.vue'
+
+export default defineComponent({
+    components: {
+        MtpTableButton,
+        MtpTableScroll,
+        Filter,
+        bind: defineAsyncComponent(() => import('./components/bind/index.vue')), // 关联
+    },
+    setup() {
+        const { auth } = useMenu();
+        const { loading, tableList, queryTable } = queryTableList<InternalUncorrelatedTradeDetailRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            const param: InternalUncorrelatedTradeDetailReq = {
+                userid: getUserId()
+            }
+            queryTable(queryInternalUncorrelatedTradeDetail, param);
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<InternalUncorrelatedTradeDetailRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_futures_in',
+        })
+
+        return {
+            ...composeTable,
+            auth,
+            loading,
+            tableList,
+            getBuyOrSellName,
+        }
+    }
+})
+</script>

+ 49 - 0
src/views/hedgeditem/futures/out/index.vue

@@ -0,0 +1,49 @@
+<template>
+    <!-- 套期交易-期货成交关联-外部未成交单 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :expandedRowKeys="expandedRowKeys"
+                :customRow="Rowclick" :rowKey="(record, index) => index" :data-source="tableList" :scroll="scroll">
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+    <mtp-tab-component :options="{ selectedRow }" />
+    <component :is="componentId" v-if="componentId" v-bind="{ selectedRow }" @cancel="closeComponent"></component>
+</template>
+
+<script lang="ts">
+import { queryTableList, MtpTableButton, defineComponent, handleComposeTable } from '@/common/export/commonTable'
+import { Ermcp2HedgedItemRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryErmcp2HedgedItem } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue'
+import MtpTabComponent from '@/@next/components/base/tab-component/index.vue'
+
+export default defineComponent({
+    components: {
+        MtpTabComponent,
+        MtpTableButton,
+        MtpTableScroll,
+    },
+    setup() {
+        const { loading, tableList, queryTable } = queryTableList<Ermcp2HedgedItemRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => queryTable(queryErmcp2HedgedItem, { hedgeditemstatus: 3 }).then((res) => {
+            if (res.length) {
+                composeTable.selectedRow.value = res[0];
+            }
+        })
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<Ermcp2HedgedItemRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_exposure',
+        })
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 132 - 0
src/views/hedgeditem/spot/contract/components/bind/form.ts

@@ -0,0 +1,132 @@
+import { ref, computed } from 'vue'
+import { v4 } from 'uuid'
+import Long from 'long'
+import { message } from 'ant-design-vue'
+import { queryTableList, handleComposeTable } from '@/common/export/commonTable'
+import { Ermcp8EnableHedgeditemReq, Ermcp8EnableHedgeditemRsp, UnLinkSpotContractRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryErmcp8EnableHedgeditem } from '@/services/go/ermcp/hedgedItem'
+import { ContractRelatedHedgedItemRsp } from '@/services/proto/hedgedItem/interface'
+import { contractRelatedHedgedItem } from '@/services/proto/hedgedItem'
+import { getUserId } from '@/services/bus/user'
+
+export function useForm(selectedRow: UnLinkSpotContractRsp) {
+    const { contractno, qty, contracttype } = selectedRow;
+    const { tableList, queryTable } = queryTableList<Ermcp8EnableHedgeditemRsp>(true, 2); // 表格列表数据
+    const loading = ref<boolean>(false);
+    const selectedRowKeys = ref<number[]>([]); // 表格选中的 rowKey 数据 :rowKey="(record,index)=>index"
+
+    // 计算当前关联数量
+    const currentQty = computed(() => {
+        return tableList.value.reduce((pre, cur, index) => {
+            if (selectedRowKeys.value.includes(index)) {
+                pre += cur?.relatedqty ?? 0;
+            }
+            return pre;
+        }, 0);
+    })
+
+    // 自定义表格选择项
+    const rowSelection = computed(() => ({
+        columnTitle: '选择',
+        selectedRowKeys: selectedRowKeys.value,
+        onChange: (keys: number[]) => {
+            selectedRowKeys.value = keys;
+        },
+        onSelect: (record: Ermcp8EnableHedgeditemRsp, selected: boolean) => {
+            if (!selected) {
+                // 未选中的取消关联量
+                record.relatedqty = undefined;
+            }
+        },
+    }))
+
+    // 表格通用逻辑
+    const composeTable = handleComposeTable<Ermcp8EnableHedgeditemRsp>({
+        tableName: 'table_pcweb_hedgeditem_spot_contract_relation',
+        queryFn: () => {
+            const param: Ermcp8EnableHedgeditemReq = {
+                userid: getUserId(),
+                spottype: 0,
+            }
+            switch (contracttype) {
+                // 采购合同
+                case 1: {
+                    param.spottype = 3;
+                    break;
+                }
+                // 销售合同
+                case -1: {
+                    param.spottype = 4;
+                    break;
+                }
+            }
+            queryTable(queryErmcp8EnableHedgeditem, param);
+        },
+    })
+
+    // 表格列
+    const columns = computed(() => {
+        const result = composeTable.columns.value;
+        result.push({
+            title: '关联量',
+            align: 'center',
+            key: 'relatedqty',
+            slots: {
+                customRender: 'relatedqty'
+            }
+        })
+        return result;
+    })
+
+    // 表单提交
+    const formSubmit = (callback?: () => void) => {
+        const keys = selectedRowKeys.value;
+        const seledtedRows = tableList.value.filter((e, index) => keys.includes(index));
+
+        if (seledtedRows.length) {
+            if (seledtedRows.every((e) => e.relatedqty && e.relatedqty > 0)) {
+                if (currentQty.value > qty) {
+                    message.error('关联数量不能大于合同数量');
+                } else {
+                    loading.value = true;
+                    const result: Promise<ContractRelatedHedgedItemRsp>[] = [];
+
+                    seledtedRows.forEach((e) => {
+                        result.push(contractRelatedHedgedItem({
+                            SpotContractID: Long.fromString(contractno),
+                            HedgedItemInfos: {
+                                HedgedItemID: e.hedgeditemid,
+                                RelatedQty: e.relatedqty!
+                            },
+                            ClientTicket: v4(),
+                        }))
+                    })
+
+                    Promise.all(result).then(() => {
+                        message.error('关联成功');
+                        callback && callback();
+                    }).catch((err) => {
+                        message.error('关联失败:' + err);
+                    }).finally(() => {
+                        loading.value = false;
+                    })
+                }
+
+            } else {
+                message.error('请输入关联数量');
+            }
+        } else {
+            message.error('请选择关联订单');
+        }
+    }
+
+    return {
+        loading,
+        tableList,
+        selectedRowKeys,
+        rowSelection,
+        currentQty,
+        columns,
+        formSubmit,
+    }
+}

+ 142 - 0
src/views/hedgeditem/spot/contract/components/bind/index.vue

@@ -0,0 +1,142 @@
+<template>
+    <!-- 套期交易-套期项目关联-合同关联项目 -->
+    <a-modal class="commonModal custom-detail" title="关联套期项目" v-model:visible="visible" centered @cancel="cancel(false)"
+        :maskClosable="false" width="890px">
+        <a-form class="inlineForm">
+            <fieldset class="formFieldSet">
+                <legend>合同信息</legend>
+                <a-row :gutter="24">
+                    <a-col :span="12">
+                        <a-form-item label="合同编号">
+                            <span class="white">{{ selectedRow.contractno }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="定价类型">
+                            <span class="white">{{ getPriceTypeName(selectedRow.pricetype) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="对手方">
+                            <span class="white">{{ formatValue(selectedRow.customername) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="点价合约">
+                            <span class="white">{{ formatValue(selectedRow.goodscode) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="现货商品">
+                            <span class="white">{{ formatValue(selectedRow.wrstandardname) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="套期主体">
+                            <span class="white">{{ formatValue(selectedRow.accountname) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="合同数量">
+                            <span class="white">{{ formatValue(selectedRow.qty) }}</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+            </fieldset>
+            <fieldset class="formFieldSet">
+                <legend>关联信息</legend>
+                <a-row :gutter="24">
+                    <a-col :span="12">
+                        <a-form-item label="当前关联数量">
+                            <span class="up-quote-color">{{ currentQty }}</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+                <div class="tableDatas">
+                    <a-table class="dialogTable" :columns="columns" :data-source="tableList" :pagination="false"
+                        :loading="loading" :rowKey="(record, index) => index" :row-selection="rowSelection">
+                        <!-- 套期类型 -->
+                        <template #hedgedtype="{ text }">
+                            <span>{{ getHedgedTypeName(text) }}</span>
+                        </template>
+                        <template #relatedqty="{ record, index }">
+                            <a-input-number class="dialogInput" size="small"
+                                :disabled="!selectedRowKeys.includes(index)" :precision="0" v-model:value="record.qty"
+                                style="width:100px" />
+                        </template>
+                    </a-table>
+                </div>
+            </fieldset>
+        </a-form>
+        <template #footer>
+            <a-button key="submit" class="cancelBtn" :loading="loading" @click="cancel(false)">取消</a-button>
+            <a-button key="submit" type="primary" :loading="loading" @click="formSubmit(() => cancel(true))">确定
+            </a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from 'vue'
+import { _closeModal } from '@/common/setup/modal/modal'
+import { formatValue } from '@/common/methods'
+import { getPriceTypeName } from '@/common/constants/enumsName'
+import { UnLinkSpotContractRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { getHedgedTypeName } from '@/@next/constants/enum/hedgedType'
+import { useForm } from './form'
+
+export default defineComponent({
+    emits: ['cancel'],
+    props: {
+        selectedRow: {
+            type: Object as PropType<UnLinkSpotContractRsp>,
+            required: true
+        },
+    },
+    setup(props, context) {
+        const { visible, cancel } = _closeModal(context);
+        const { loading, tableList, columns, currentQty, selectedRowKeys, rowSelection, formSubmit } = useForm(props.selectedRow);
+
+        return {
+            visible,
+            loading,
+            tableList,
+            columns,
+            selectedRowKeys,
+            cancel,
+            formatValue,
+            currentQty,
+            getHedgedTypeName,
+            formSubmit,
+            rowSelection,
+            getPriceTypeName,
+        }
+    }
+})
+</script>
+
+<style lang="less">
+.custom-detail {
+    .ant-modal-body {
+        padding-top: 0;
+        padding-left: 0;
+        padding-right: 0;
+    }
+
+    .tableDatas {
+        margin-top: 26px;
+        padding: 0;
+        overflow: hidden;
+
+        .dialogTable {
+            width: 100%;
+            overflow: overlay;
+        }
+    }
+
+    .ant-form.inlineForm {
+        margin-top: 20px;
+        padding: 0 24px;
+    }
+}
+</style>

+ 32 - 0
src/views/hedgeditem/spot/contract/components/filter/index.vue

@@ -0,0 +1,32 @@
+<template>
+    <div class="filterTable">
+        <FilterOption :inputList="inputList" :buttonList="buttonList" />
+        <slot></slot>
+    </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import { UnLinkSpotContractRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { useFilter } from '@/common/components/filter/setup';
+import FilterOption from '@/common/components/filter/index.vue';
+
+export default defineComponent({
+    name: 'purchase_pending-filter-table',
+    components: {
+        FilterOption
+    },
+    setup(props, context) {
+        const { inputList, buttonList } = useFilter<UnLinkSpotContractRsp>(context);
+
+        inputList.value = [
+            { keys: ['customername'], value: '', placeholder: '模糊搜索对手方' },
+        ]
+
+        return {
+            inputList,
+            buttonList,
+        }
+    },
+})
+</script>

+ 88 - 0
src/views/hedgeditem/spot/contract/index.vue

@@ -0,0 +1,88 @@
+<template>
+    <!-- 套期交易:未关联采购合同-未关联销售合同 -->
+    <mtp-table-scroll>
+        <template #header>
+            <Filter @search="updateColumn"></Filter>
+        </template>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :expandedRowKeys="expandedRowKeys"
+                :customRow="Rowclick" :rowKey="(record, index) => index" :data-source="tableList" :scroll="scroll">
+                <template #expandedRowRender="{ record }">
+                    <mtp-table-button class="btn-list-sticky" :buttons="auth" :record="record" @click="openComponent" />
+                </template>
+                <!-- 合同类型 -->
+                <template #contracttype="{ text }">
+                    <span>{{ getContractTypeName(text) }}</span>
+                </template>
+                <!-- 定价类型 -->
+                <template #pricetype="{ text }">
+                    <span>{{ getPriceTypeName(text) }}</span>
+                </template>
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+    <!-- 右键 -->
+    <contextMenu :contextMenu="contextMenu" @cancel="closeContext" :list="auth"> </contextMenu>
+    <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" @cancel="closeComponent"></component>
+</template>
+
+<script lang="ts">
+import { queryTableList, contextMenu, defineComponent, MtpTableButton, defineAsyncComponent, handleComposeTable } from '@/common/export/commonTable'
+import { UnLinkSpotContractReq, UnLinkSpotContractRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryUnLinkSpotContract } from '@/services/go/ermcp/hedgedItem'
+import { useMenu } from '@/@next/hooks/common'
+import { getPriceTypeName, getContractTypeName } from '@/common/constants/enumsName';
+import { getUserId } from '@/services/bus/user'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue'
+import Filter from './components/filter/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+        Filter,
+        MtpTableButton,
+        contextMenu,
+        detail: defineAsyncComponent(() => import('@/views/information/spot-contract/components/detail/index.vue')), // 详情
+        bind: defineAsyncComponent(() => import('./components/bind/index.vue')), // 关联项目
+    },
+    setup() {
+        const { route, auth } = useMenu();
+        const { loading, tableList, queryTable } = queryTableList<UnLinkSpotContractRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            const param: UnLinkSpotContractReq = {
+                userid: getUserId(),
+                contracttype: 0
+            }
+            switch (route.name) {
+                // 采购合同
+                case 'hedgeditem_spot_purchase': {
+                    param.contracttype = 1;
+                    break;
+                }
+                // 销售合同
+                case 'hedgeditem_spot_sell': {
+                    param.contracttype = -1;
+                    break;
+                }
+            }
+            queryTable(queryUnLinkSpotContract, param);
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<UnLinkSpotContractRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_spot_contract',
+        })
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+            auth,
+            getContractTypeName,
+            getPriceTypeName,
+        }
+    }
+})
+</script>

+ 38 - 0
src/views/hedgeditem/spot/plan/components/bind/form.ts

@@ -0,0 +1,38 @@
+import { reactive, ref } from 'vue'
+import { v4 } from 'uuid'
+import { HedgedItemRelatedPlanReq } from '@/services/proto/hedgedItem/interface'
+import { hedgedItemRelatedPlan } from '@/services/proto/hedgedItem'
+import { validateAction } from '@/common/setup/form'
+import { requestResultLoadingAndInfo } from '@/common/methods/request/resultInfo'
+
+export function useForm() {
+    const loading = ref<boolean>(false);
+    const formElement = ref<HTMLElement>();
+
+    const formData = reactive<HedgedItemRelatedPlanReq>({
+        HedgedItemID: 0, // 现货合同ID
+        RelatedHedgePlanInfos: {
+            HedgePlanID: 0,
+            OriAvgPrice: 0,
+        }, // 被套期项目信息
+        ClientTicket: v4(), // 客户端流水号
+    })
+
+    // 表单提交
+    const formSubmit = (callback?: () => void) => {
+        validateAction(formElement, formData).then((param) => {
+            requestResultLoadingAndInfo(hedgedItemRelatedPlan, param, loading, ['关联成功', '关联失败:']).then(() => {
+                callback && callback();
+            }).catch(() => {
+                loading.value = false;
+            })
+        })
+    }
+
+    return {
+        loading,
+        formElement,
+        formData,
+        formSubmit,
+    }
+}

+ 113 - 0
src/views/hedgeditem/spot/plan/components/bind/index.vue

@@ -0,0 +1,113 @@
+<template>
+    <!-- 套期交易-套期项目关联-计划关联项目 -->
+    <a-modal class="commonModal custom-detail" title="关联套期项目" v-model:visible="visible" centered @cancel="cancel(false)"
+        width="890px">
+        <a-form class="inlineForm" ref="formElement" :model="formData">
+            <fieldset class="formFieldSet">
+                <legend>合同信息</legend>
+                <a-row :gutter="24">
+                    <a-col :span="12">
+                        <a-form-item label="计划名称">
+                            <span class="white">{{ selectedRow.hedgeplanno }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="商品">
+                            <span class="white">{{ selectedRow.wrstandardname }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="类型">
+                            <span class="white">{{ getPlanContractType(selectedRow.contracttype) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="结算币种">
+                            <span class="white">{{ formatValue(selectedRow.currencyname) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="计划量">
+                            <span class="white">{{ formatValue(selectedRow.planqty) }}</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+            </fieldset>
+            <fieldset class="formFieldSet">
+                <legend>关联信息</legend>
+                <a-row :gutter="24">
+                    <a-col :span="12">
+                        <a-form-item label="当前关联数量">
+                            <span class="white">{{ formatValue(selectedRow.planqty) }}</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+                <div class="tableDatas">
+                    <a-table class="dialogTable" :columns="columns" :data-source="tableList">
+                    </a-table>
+                </div>
+            </fieldset>
+        </a-form>
+        <template #footer>
+            <a-button key="submit" class="cancelBtn" @click="cancel(false)">取消</a-button>
+            <a-button key="submit" type="primary" :loading="loading" @click="formSubmit(() => cancel(true))">确定
+            </a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from 'vue'
+import { _closeModal } from '@/common/setup/modal/modal'
+import { formatValue } from '@/common/methods'
+import { getChannelBuildName, getBuyOrSellName } from '@/common/constants/enumsName'
+import { InternalEnableTradeDetailReq, InternalEnableTradeDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { Ermcp3HedgePlan } from '@/services/go/ermcp/plan/interface'
+import { queryTableList, handleComposeTable } from '@/common/export/commonTable'
+import { queryInternalEnableTradeDetail } from '@/services/go/ermcp/hedgedItem'
+import { getAreaUserId } from "@/services/bus/user"
+import { getPlanContractType } from '@/views/business/plan/setup'
+import { useForm } from './form'
+
+export default defineComponent({
+    emits: ['cancel'],
+    props: {
+        selectedRow: {
+            type: Object as PropType<Ermcp3HedgePlan>,
+            required: true
+        },
+    },
+    setup(props, context) {
+        const { visible, cancel } = _closeModal(context);
+        const { formElement, loading, formData, formSubmit } = useForm();
+        const { tableList, queryTable } = queryTableList<InternalEnableTradeDetailRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            const param: InternalEnableTradeDetailReq = {
+                areauserid: getAreaUserId(),
+                goodsid: props.selectedRow.deliverygoodsid,
+            }
+            queryTable(queryInternalEnableTradeDetail, param);
+        }
+
+        // 表格通用逻辑
+        const { columns } = handleComposeTable<InternalEnableTradeDetailRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_spot_plan_relation',
+        })
+
+        return {
+            visible,
+            loading,
+            tableList,
+            columns,
+            cancel,
+            formatValue,
+            formElement,
+            formData,
+            getPlanContractType,
+            formSubmit,
+        }
+    }
+})
+</script>

+ 2 - 0
src/views/hedgeditem/spot/plan/index.vue

@@ -0,0 +1,2 @@
+<template>
+</template>

+ 71 - 0
src/views/hedgeditem/trade/components/add/form.ts

@@ -0,0 +1,71 @@
+import { reactive, ref } from 'vue'
+import { v4 } from 'uuid'
+import { Moment } from 'moment'
+import { validateAction } from '@/common/setup/form'
+import { requestResultLoadingAndInfo } from '@/common/methods/request/resultInfo'
+import { geLoginID_number } from '@/services/bus/login'
+import { getAreaUserId } from '@/services/bus/user'
+import { HedgedItemAddReq } from '@/services/proto/hedgedItem/interface'
+import { hedgedItemAdd } from '@/services/proto/hedgedItem'
+
+export function useForm() {
+    const loading = ref<boolean>(false);
+    const formElement = ref<HTMLElement>();
+
+    const formData = reactive<HedgedItemAddReq>({
+        HedgedItemNum: '', // 被套期项目编号
+        HedgedItemName: '', // 项目名称
+        HedgedType: undefined, // 套期类型-1:采购计划项目
+        PlanStartDate: '', // 计划开始日期
+        PlanEndDate: '', // 计划结束日期
+        TradeUserID: undefined, // 交易用户ID
+        AreaUserID: getAreaUserId(), // 企业ID
+        ApplySrc: 2, // 申请来源
+        ApplyID: geLoginID_number()!, // 申请人
+        SpotContractID: 0, // 现货合同ID
+        Qty: 0, // 数量
+        ClientTicket: v4() // 客户端流水号
+    })
+
+    const rules = {
+        HedgedItemNum: [{ required: true, trigger: 'blur', message: '请输入项目编号' }],
+        HedgedItemName: [{ required: true, trigger: 'blur', message: '请输入项目名称' }],
+        PlanStartDate: [{ required: true, message: '请选择开始时间' }],
+        PlanEndDate: [{ required: true, message: '请选择结束时间' }],
+        HedgedType: [{ required: true, type: 'number', message: '请选择套期类型' }],
+        TradeUserID: [{ required: true, type: 'number', message: '请选择交易主体' }],
+    }
+
+    // 禁选开始日期
+    const disabledStartDate = (startValue: Moment) => {
+        if (!startValue || !formData.PlanEndDate) return false;
+        return startValue.valueOf() > new Date(formData.PlanEndDate).getTime();
+    }
+
+    // 禁选结束日期
+    const disabledEndDate = (endValue: Moment) => {
+        if (!endValue || !formData.PlanStartDate) return false;
+        return new Date(formData.PlanStartDate).getTime() >= endValue.valueOf();
+    }
+
+    // 表单提交
+    const formSubmit = (callback?: () => void) => {
+        validateAction(formElement, formData).then((param) => {
+            requestResultLoadingAndInfo(hedgedItemAdd, param, loading, ['新增套期项目成功', '新增套期项目失败:']).then(() => {
+                callback && callback();
+            }).catch(() => {
+                loading.value = false;
+            })
+        })
+    }
+
+    return {
+        loading,
+        rules,
+        formElement,
+        formData,
+        disabledStartDate,
+        disabledEndDate,
+        formSubmit,
+    }
+}

+ 95 - 0
src/views/hedgeditem/trade/components/add/index.vue

@@ -0,0 +1,95 @@
+<template>
+    <!-- 套期交易-执行中-新增 -->
+    <a-modal class="commonModal add-spot-contract" title="新增套期项目" v-model:visible="visible" centered
+        :maskClosable="false" @cancel="cancel(false)" width="890px">
+        <a-form class="inlineForm" ref="formElement" :model="formData" :rules="rules">
+            <a-row :gutter="24">
+                <a-col :span="12">
+                    <a-form-item label="项目编号" name="HedgedItemNum">
+                        <a-input class="dialogInput" style="width: 200px" placeholder="请输入项目编号"
+                            v-model:value="formData.HedgedItemNum" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="项目名称" name="HedgedItemName">
+                        <a-input class="dialogInput" style="width: 200px" placeholder="请输入项目名称"
+                            v-model:value="formData.HedgedItemName" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="计划开始" name="PlanStartDate">
+                        <a-date-picker class="commonDatePicker" style="width: 200px" placeholder="请选择开始时间"
+                            value-format="YYYY-MM-DD" :disabled-date="disabledStartDate"
+                            v-model:value="formData.PlanStartDate" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="计划结束" name="PlanEndDate">
+                        <a-date-picker class="commonDatePicker" style="width: 200px" placeholder="请选择结束时间"
+                            value-format="YYYY-MM-DD" :disabled-date="disabledEndDate"
+                            v-model:value="formData.PlanEndDate" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="套期类型" name="HedgedType">
+                        <a-select class="inlineFormSelect" style="width: 200px" placeholder="请选择套期类型"
+                            v-model:value="formData.HedgedType">
+                            <a-select-option v-for="item in getHedgedTypeList()" :key="item.enumdicid"
+                                :value="item.enumitemname">
+                                {{ item.enumdicname }}
+                            </a-select-option>
+                        </a-select>
+                    </a-form-item>
+                </a-col>
+                <a-col :span="12">
+                    <a-form-item label="套期主体" name="TradeUserID">
+                        <a-select class="inlineFormSelect" style="width: 200px" placeholder="请选择套期主体"
+                            v-model:value="formData.TradeUserID">
+                            <a-select-option v-for="item in traderList" :key="item.roleid" :value="item.roleid">
+                                {{ item.rolename }}
+                            </a-select-option>
+                        </a-select>
+                    </a-form-item>
+                </a-col>
+            </a-row>
+        </a-form>
+        <template #footer>
+            <a-button key="submit" class="cancelBtn" :loading="loading" @click="cancel(false)">取消</a-button>
+            <a-button key="submit" type="primary" :loading="loading" @click="formSubmit(() => cancel(true))">确认
+            </a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue'
+import { _closeModal } from '@/common/setup/modal/modal'
+import { getHedgedTypeList } from '@/@next/constants/enum/hedgedType'
+import { handlerManagerList } from '@/common/setup/user'
+import { useForm } from './form'
+
+export default defineComponent({
+    emits: ['cancel', 'update'],
+    setup(props, context) {
+        const { visible, cancel } = _closeModal(context);
+        const { formElement, loading, formData, rules, disabledStartDate, disabledEndDate, formSubmit } = useForm();
+
+        const { tableList: traderList, queryTable } = handlerManagerList(loading, 2, true);
+        queryTable();
+
+        return {
+            visible,
+            loading,
+            formElement,
+            getHedgedTypeList,
+            formData,
+            rules,
+            traderList,
+            disabledStartDate,
+            disabledEndDate,
+            cancel,
+            formSubmit,
+        }
+    }
+})
+</script>

+ 98 - 0
src/views/hedgeditem/trade/components/ending/index.vue

@@ -0,0 +1,98 @@
+<template>
+    <!-- 套期交易-完结项目 -->
+    <a-modal class="commonModal custom-detail" title="套期项目正常完结" v-model:visible="visible" centered @cancel="cancel"
+        width="890px">
+        <a-form class="inlineForm">
+            <fieldset class="formFieldSet">
+                <legend>套期项目</legend>
+                <a-row :gutter="24">
+                    <a-col :span="12">
+                        <a-form-item label="项目编号">
+                            <span class="white">{{ formatValue(selectedRow.hedgeditemnum) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="项目名称">
+                            <span class="white">{{ formatValue(selectedRow.hedgeditemname) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="计划开始">
+                            <span class="white">{{ formatValue(selectedRow.planstartdate) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="计划结束">
+                            <span class="white">{{ formatValue(selectedRow.planenddate) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="套期类型">
+                            <span class="white">{{ getHedgedTypeName(selectedRow.hedgedtype) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="套期主体">
+                            <span class="white">{{ formatValue(selectedRow.accountname) }}</span>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-item label="现货市价" v-if="false">
+                            <span class="white">0</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+            </fieldset>
+        </a-form>
+        <template #footer>
+            <a-button key="submit" class="cancelBtn" @click="cancel(false)">取消</a-button>
+            <a-button key="submit" type="primary" :loading="loading" @click="submit">确认完结</a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent, ref, PropType } from 'vue'
+import { v4 } from 'uuid'
+import Long from 'long'
+import { _closeModal } from '@/common/setup/modal/modal'
+import { formatValue } from '@/common/methods'
+import { requestResultLoadingAndInfo } from '@/common/methods/request/resultInfo'
+import { Ermcp2HedgedItemRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { getHedgedTypeName } from '@/@next/constants/enum/hedgedType'
+import { hedgedItemEnd } from '@/services/proto/hedgedItem'
+import { HedgedItemEndReq } from '@/services/proto/hedgedItem/interface'
+
+export default defineComponent({
+    emits: ['cancel'],
+    props: {
+        selectedRow: {
+            type: Object as PropType<Ermcp2HedgedItemRsp>,
+            default: () => ({})
+        },
+    },
+    setup(props, context) {
+        const { visible, cancel } = _closeModal(context);
+        const loading = ref<boolean>(false);
+
+        const submit = () => {
+            const param: HedgedItemEndReq = {
+                HedgedItemID: Long.fromString(props.selectedRow.hedgeditemid),
+                ClientTicket: v4()
+            }
+            requestResultLoadingAndInfo(hedgedItemEnd, param, loading, ['套期项目完结成功', '套期项目完结失败:']).then(() => {
+                cancel(true);
+            })
+        }
+
+        return {
+            visible,
+            loading,
+            cancel,
+            formatValue,
+            getHedgedTypeName,
+            submit,
+        }
+    }
+})
+</script>

+ 78 - 0
src/views/hedgeditem/trade/components/filter/index.vue

@@ -0,0 +1,78 @@
+<template>
+    <div class="filterTable">
+        <FilterOption :selectList="selectList" :inputList="inputList" :buttonList="buttonList" />
+        <slot></slot>
+    </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, ref } from 'vue';
+import { getHedgedTypeList } from '@/@next/constants/enum/hedgedType'
+import { Ermcp2HedgedItemRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { useFilter } from '@/common/components/filter/setup'
+import { handlerManagerList } from '@/common/setup/user'
+import { initData } from '@/common/methods'
+import FilterOption from '@/common/components/filter/index.vue'
+
+export default defineComponent({
+    name: 'filter-custom-table',
+    components: {
+        FilterOption
+    },
+    setup(props, context) {
+        const loading = ref<boolean>(false);
+        const { selectList, inputList, buttonList, search } = useFilter<Ermcp2HedgedItemRsp>(context);
+        const { queryTable } = handlerManagerList(loading, 2, true);
+
+        selectList.value = [
+            {
+                key: 'hedgedtype',
+                selectedValue: 0,
+                options: [
+                    { label: '全部套期类型', value: 0 },
+                ],
+                onChange: search
+            },
+            {
+                key: 'tradeuserid',
+                alias: 'accountname',
+                selectedValue: 0,
+                options: [
+                    { label: '全部套期主体', value: 0 },
+                ],
+                onChange: search
+            },
+        ]
+
+        inputList.value = [
+            { keys: ['wrstandardname'], value: '', placeholder: '模糊搜索商品' },
+            { keys: ['hedgeditemnum'], value: '', placeholder: '模糊搜索项目编号' },
+        ]
+
+        initData(() => {
+            const hedgedTypeList = getHedgedTypeList();
+            hedgedTypeList.forEach((e) => {
+                selectList.value[0].options.push({
+                    label: e.enumdicname,
+                    value: e.enumitemname,
+                })
+            })
+
+            queryTable().then((res) => {
+                res.forEach((e) => {
+                    selectList.value[1].options.push({
+                        label: e.rolename,
+                        value: e.roleid,
+                    })
+                })
+            })
+        })
+
+        return {
+            selectList,
+            inputList,
+            buttonList,
+        }
+    },
+})
+</script>

+ 54 - 0
src/views/hedgeditem/trade/components/futures/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-期货成交明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll"></a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { Ermcp2HedgedItemRsp, ERMCPPatradeLinkDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryERMCPPatradeLinkDetail } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<Ermcp2HedgedItemRsp>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<ERMCPPatradeLinkDetailRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            const { hedgeditemid } = props.selectedRow;
+            if (hedgeditemid) {
+                queryTable(queryERMCPPatradeLinkDetail, { spotcontractid: hedgeditemid });
+            }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<ERMCPPatradeLinkDetailRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_trade_futures_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 61 - 0
src/views/hedgeditem/trade/components/plan/index.vue

@@ -0,0 +1,61 @@
+<template>
+    <!-- 套期交易-期货计划明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll">
+                <!-- 计划类型 -->
+                <template #hedgedtype="{ text }">
+                    <span>{{ getHedgedTypeName(text) }}</span>
+                </template>
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { Ermcp2HedgedItemRsp, ERMCP2HedgedItemspotRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryERMCP2HedgedItemspot } from '@/services/go/ermcp/hedgedItem'
+import { getHedgedTypeName } from '@/@next/constants/enum/hedgedType'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<Ermcp2HedgedItemRsp>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<ERMCP2HedgedItemspotRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            const { hedgeditemid } = props.selectedRow;
+            if (hedgeditemid) {
+                queryTable(queryERMCP2HedgedItemspot, { hedgeditemid });
+            }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<ERMCP2HedgedItemspotRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_trade_plan_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+            getHedgedTypeName,
+        }
+    }
+})
+</script>

+ 54 - 0
src/views/hedgeditem/trade/components/position/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-期货持仓明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll"></a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { ERMCPJRLinkPosRsp, Ermcp2HedgedItemRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryERMCPJRLinkPos } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<Ermcp2HedgedItemRsp>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<ERMCPJRLinkPosRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            const { hedgeditemid } = props.selectedRow;
+            if (hedgeditemid) {
+                queryTable(queryERMCPJRLinkPos, { hedgeditemid });
+            }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<Ermcp2HedgedItemRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_trade_position_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 54 - 0
src/views/hedgeditem/trade/components/spot/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-现货成交明细 -->
+    <mtp-table-scroll>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll"></a-table>
+        </template>
+    </mtp-table-scroll>
+</template>
+
+<script lang="ts">
+import { PropType, watch } from 'vue'
+import { queryTableList, defineComponent, handleComposeTable } from '@/common/export/commonTable';
+import { Ermcp2HedgedItemRsp, ERMCP2HedgedItemSpotDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryERMCP2HedgedItemSpotDetail } from '@/services/go/ermcp/hedgedItem'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTableScroll,
+    },
+    props: {
+        name: String,
+        selectedRow: {
+            type: Object as PropType<Ermcp2HedgedItemRsp>,
+            default: () => ({})
+        },
+    },
+    setup(props) {
+        const { loading, tableList, queryTable } = queryTableList<ERMCP2HedgedItemSpotDetailRsp>(true, 2); // 表格列表数据
+
+        const queryFn = () => {
+            const { hedgeditemid } = props.selectedRow;
+            if (hedgeditemid) {
+                queryTable(queryERMCP2HedgedItemSpotDetail, { hedgeditemid });
+            }
+        }
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<ERMCP2HedgedItemSpotDetailRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_trade_spot_details',
+        })
+
+        watch(() => props.selectedRow, () => queryFn);
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+        }
+    }
+})
+</script>

+ 54 - 0
src/views/hedgeditem/trade/finish/index.vue

@@ -0,0 +1,54 @@
+<template>
+    <!-- 套期交易-已完成 -->
+    <mtp-table-scroll>
+        <template #header>
+            <Filter @search="updateColumn" />
+        </template>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :loading="loading"
+                :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll">
+                <template #expandedRowRender="{ record }">
+                    <mtp-table-button class="btn-list-sticky" :buttons="auth" :record="record" @click="openComponent" />
+                </template>
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+    <mtp-tab-component :options="{ selectedRow }" />
+</template>
+
+<script lang="ts">
+import { queryTableList, MtpTableButton, defineComponent, handleComposeTable, ComposeTableParam } from '@/common/export/commonTable';
+import { Ermcp2HedgedItemRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryErmcp2HedgedItem } from '@/services/go/ermcp/hedgedItem'
+import { useMenu } from '@/@next/hooks/common'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue';
+import MtpTabComponent from '@/@next/components/base/tab-component/index.vue'
+import Filter from '../components/filter/index.vue';
+
+export default defineComponent({
+    components: {
+        MtpTabComponent,
+        MtpTableButton,
+        MtpTableScroll,
+        Filter
+    },
+    setup() {
+        const { auth } = useMenu();
+        const { loading, tableList, queryTable } = queryTableList<Ermcp2HedgedItemRsp>(true, 2); // 表格列表数据
+
+        // 表格通用逻辑
+        const param: ComposeTableParam = {
+            queryFn: () => queryTable(queryErmcp2HedgedItem, { hedgeditemstatus: 3 }),
+            tableName: 'table_pcweb_hedgeditem_trade_finish',
+        }
+
+        return {
+            ...handleComposeTable(param),
+            loading,
+            tableList,
+            auth,
+        }
+    }
+})
+</script>

+ 71 - 0
src/views/hedgeditem/trade/running/index.vue

@@ -0,0 +1,71 @@
+<template>
+    <!-- 套期交易-执行中 -->
+    <mtp-table-scroll>
+        <template #header>
+            <Filter @search="updateColumn">
+                <mtp-table-button class="btn-list-sticky" :buttons="headerButtons" @click="openComponent" />
+            </Filter>
+        </template>
+        <template #default="{ scroll }">
+            <a-table :columns="columns" class="srcollYTable" :pagination="false" :loading="loading"
+                :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :rowKey="(record, index) => index"
+                :data-source="tableList" :scroll="scroll">
+                <template #expandedRowRender="{ record }">
+                    <mtp-table-button class="btn-list-sticky" :buttons="tableButtons" :record="record"
+                        @click="openComponent" />
+                </template>
+            </a-table>
+        </template>
+    </mtp-table-scroll>
+    <mtp-tab-component :options="{ selectedRow }" />
+    <component :is="componentId" v-if="componentId" v-bind="{ selectedRow }" @cancel="closeComponent"></component>
+</template>
+
+<script lang="ts">
+import { queryTableList, MtpTableButton, defineAsyncComponent, defineComponent, handleComposeTable } from '@/common/export/commonTable'
+import { Ermcp2HedgedItemRsp } from '@/services/go/ermcp/hedgedItem/interface'
+import { queryErmcp2HedgedItem } from '@/services/go/ermcp/hedgedItem'
+import { useMenu } from '@/@next/hooks/common'
+import MtpTableScroll from '@/common/components/tableScroll/index.vue'
+import MtpTabComponent from '@/@next/components/base/tab-component/index.vue'
+import Filter from '../components/filter/index.vue'
+
+export default defineComponent({
+    components: {
+        MtpTabComponent,
+        MtpTableButton,
+        MtpTableScroll,
+        Filter,
+        add: defineAsyncComponent(() => import('../components/add/index.vue')), // 新增
+        trade: defineAsyncComponent(() => import('@/views/market/futures/compoments/futures-trade/index.vue')), // 期货交易
+        ending: defineAsyncComponent(() => import('../components/ending/index.vue')), // 完结项目
+    },
+    setup() {
+        const { authFilter } = useMenu();
+        const { loading, tableList, queryTable } = queryTableList<Ermcp2HedgedItemRsp>(true, 2); // 表格列表数据
+
+        const headerButtons = authFilter(['add']);
+        const tableButtons = authFilter(['add'], true);
+
+        const queryFn = () => queryTable(queryErmcp2HedgedItem, { hedgeditemstatus: 3 }).then((res) => {
+            if (res.length) {
+                composeTable.selectedRow.value = res[0];
+            }
+        })
+
+        // 表格通用逻辑
+        const composeTable = handleComposeTable<Ermcp2HedgedItemRsp>({
+            queryFn,
+            tableName: 'table_pcweb_hedgeditem_trade_finish',
+        })
+
+        return {
+            ...composeTable,
+            loading,
+            tableList,
+            headerButtons,
+            tableButtons
+        }
+    }
+})
+</script>

+ 76 - 32
src/views/information/spot-contract/components/add/index.vue

@@ -1,6 +1,7 @@
 <template>
   <!-- 新增合同 -->
-  <a-modal class="commonModal add-spot-contract" :title="formState.ContractType === 1 ? '新增现货合同' : '新增销售合同'" v-model:visible="visible" centered :maskClosable="false" @cancel="closeAction" width="890px">
+  <a-modal class="commonModal add-spot-contract" :title="formState.ContractType === 1 ? '新增现货合同' : '新增销售合同'"
+    v-model:visible="visible" centered :maskClosable="false" @cancel="closeAction" width="890px">
     <template #footer>
       <a-button key="submit" class="cancelBtn" :loading="loading" :disabled="loading" @click="submit(1)">保存草稿</a-button>
       <a-button key="submit" type="primary" :loading="loading" :disabled="loading" @click="submit(2)">提交审核</a-button>
@@ -11,7 +12,8 @@
         <a-row :gutter="24">
           <a-col :span="12">
             <a-form-item label="合同编号" name="ContractNo">
-              <a-input class="dialogInput" style="width: 200px" v-model:value="formState.ContractNo" placeholder="请输入合同编号" />
+              <a-input class="dialogInput" style="width: 200px" v-model:value="formState.ContractNo"
+                placeholder="请输入合同编号" />
             </a-form-item>
           </a-col>
           <a-col :span="12">
@@ -28,7 +30,9 @@
           </a-col>
           <a-col :span="12">
             <a-form-item label="业务类型" name="BizType">
-              <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.BizType" placeholder="请选择业务类型">
+              <a-select class="inlineFormSelect" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.BizType"
+                placeholder="请选择业务类型">
                 <a-select-option v-for="item in businessType" :key="item.key" :value="item.key">
                   {{ item.value }}
                 </a-select-option>
@@ -38,7 +42,9 @@
           <template v-if="isSell">
             <a-col :span="12">
               <a-form-item label="采购方" name="BuyUserID">
-                <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.BuyUserID" placeholder="请选择客户">
+                <a-select class="inlineFormSelect" style="width: 200px"
+                  :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.BuyUserID"
+                  placeholder="请选择客户">
                   <!-- 客户资料列表 正常 -->
                   <a-select-option :value="item.userid" v-for="item in customList" :key="item.userid">
                     {{ item.customername }}
@@ -60,7 +66,8 @@
             </a-col>
             <a-col :span="12">
               <a-form-item label="销售方" name="SellUserID">
-                <a-select class="inlineFormSelect" v-model:value="formState.SellUserID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择客户">
+                <a-select class="inlineFormSelect" v-model:value="formState.SellUserID" style="width: 200px"
+                  :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择客户">
                   <!-- 客户资料列表 正常 -->
                   <a-select-option :value="item.userid" v-for="item in customList" :key="item.userid">
                     {{ item.customername }}
@@ -76,7 +83,8 @@
           </a-col>
           <a-col :span="12">
             <a-form-item label="交易主体" name="SubjectID">
-              <a-select class="inlineFormSelect" style="width: 200px" v-model:value="formState.SubjectID" placeholder="请选择主体">
+              <a-select class="inlineFormSelect" style="width: 200px" v-model:value="formState.SubjectID"
+                placeholder="请选择主体">
                 <a-select-option :value="item.subjectid" v-for="item in subjectList" :key="item.subjectid">
                   {{ item.subjectname }}
                 </a-select-option>
@@ -90,8 +98,11 @@
         <a-row :gutter="24">
           <a-col :span="12">
             <a-form-item label="现货品种" name="DeliveryGoodsID">
-              <a-select class="inlineFormSelect" style="width: 200px" @change="deliveryGoodsChange" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.DeliveryGoodsID" placeholder="请选择现货品种">
-                <a-select-option v-for="item in deliveryGoodsList" :key="item.deliverygoodsid" :value="item.deliverygoodsid">
+              <a-select class="inlineFormSelect" style="width: 200px" @change="deliveryGoodsChange"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.DeliveryGoodsID"
+                placeholder="请选择现货品种">
+                <a-select-option v-for="item in deliveryGoodsList" :key="item.deliverygoodsid"
+                  :value="item.deliverygoodsid">
                   {{ item.deliverygoodsname }}
                 </a-select-option>
               </a-select>
@@ -99,7 +110,9 @@
           </a-col>
           <a-col :span="12">
             <a-form-item label="商品" name="WrStandardID">
-              <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" @change="wrStandardChange" v-model:value="formState.WrStandardID" placeholder="请选择商品">
+              <a-select class="inlineFormSelect" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" @change="wrStandardChange"
+                v-model:value="formState.WrStandardID" placeholder="请选择商品">
                 <a-select-option v-for="item in wrstandardList" :key="item.wrstandardid" :value="item.wrstandardid">
                   {{ item.wrstandardname }}
                 </a-select-option>
@@ -108,7 +121,9 @@
           </a-col>
           <a-col :span="12">
             <a-form-item label="品牌" name="SpotGoodsBrandID">
-              <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.SpotGoodsBrandID" placeholder="请选择品牌">
+              <a-select class="inlineFormSelect" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.SpotGoodsBrandID"
+                placeholder="请选择品牌">
                 <a-select-option v-for="item in barandList" :key="item.brandid" :value="item.brandid">
                   {{ item.brandname }}
                 </a-select-option>
@@ -117,7 +132,8 @@
           </a-col>
           <a-col :span="12">
             <a-form-item label="商品规格">
-              <a-input class="dialogInput" style="width: 200px" v-model:value="formState.SpotGoodsDesc" placeholder="请输入商品规格" />
+              <a-input class="dialogInput" style="width: 200px" v-model:value="formState.SpotGoodsDesc"
+                placeholder="请输入商品规格" />
             </a-form-item>
           </a-col>
         </a-row>
@@ -127,7 +143,8 @@
         <a-row :gutter="24">
           <a-col :span="12">
             <a-form-item label="结算币种" name="CurrencyID">
-              <a-select class="inlineFormSelect" v-model:value="formState.CurrencyID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择结算币种">
+              <a-select class="inlineFormSelect" v-model:value="formState.CurrencyID" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择结算币种">
                 <a-select-option v-for="item in payCurrency" :key="item.enumitemname" :value="item.enumitemname">
                   {{ item.enumdicname }}
                 </a-select-option>
@@ -136,17 +153,21 @@
           </a-col>
           <a-col :span="12">
             <a-form-item label="数量" name="Qty">
-              <a-input class="dialogInput suffixGrey" v-model:value="formState.Qty" style="width: 200px" @change="getAmout" placeholder="请输入数量" :suffix="numberUnit" />
+              <a-input class="dialogInput suffixGrey" v-model:value="formState.Qty" style="width: 200px"
+                @change="getAmout" placeholder="请输入数量" :suffix="numberUnit" />
             </a-form-item>
           </a-col>
           <a-col :span="12">
             <a-form-item label="交收期">
-              <a-range-picker v-model:value="deliveryDate" class="commonPicker" style="width: 200px" :disabled-date="disabledDate" :show-time="{ hideDisabledOptions: true }" format="YYYY-MM-DD" />
+              <a-range-picker v-model:value="deliveryDate" class="commonPicker" style="width: 200px"
+                :disabled-date="disabledDate" :show-time="{ hideDisabledOptions: true }" format="YYYY-MM-DD" />
             </a-form-item>
           </a-col>
           <a-col :span="12">
             <a-form-item label="定价类型" name="PriceType">
-              <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.PriceType" placeholder="请选择定价类型">
+              <a-select class="inlineFormSelect" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.PriceType"
+                placeholder="请选择定价类型">
                 <a-select-option v-for="item in priceType" :key="item.key" :value="item.key">
                   {{ item.value }}
                 </a-select-option>
@@ -157,7 +178,8 @@
           <template v-if="formState.PriceType === 2 || formState.PriceType === 3">
             <a-col :span="12">
               <a-form-item label="点价类型">
-                <a-select class="inlineFormSelect" v-model:value="pricingType" style="width: 200px" placeholder="请选择点价类型" @change="pricingTypeChange">
+                <a-select class="inlineFormSelect" v-model:value="pricingType" style="width: 200px"
+                  placeholder="请选择点价类型" @change="pricingTypeChange">
                   <a-select-option :value="0">现货</a-select-option>
                   <a-select-option :value="1">期货</a-select-option>
                 </a-select>
@@ -165,7 +187,8 @@
             </a-col>
             <a-col :span="12" v-if="pricingType === 1">
               <a-form-item label="点价合约" name="GoodsID">
-                <a-select class="inlineFormSelect" v-model:value="formState.GoodsID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择点价合约">
+                <a-select class="inlineFormSelect" v-model:value="formState.GoodsID" style="width: 200px"
+                  :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择点价合约">
                   <a-select-option v-for="item in goodsList" :key="item.goodsid" :value="item.goodsid">
                     {{ item.goodsname }}
                   </a-select-option>
@@ -174,22 +197,26 @@
             </a-col>
             <a-col :span="12" v-if="formState.PriceType === 3">
               <a-form-item label="暂定价" name="Price">
-                <a-input class="dialogInput suffixGrey" style="width: 200px" v-model:value="formState.Price" :suffix="payCurrencyUnit" placeholder="请输入暂定价" />
+                <a-input class="dialogInput suffixGrey" style="width: 200px" v-model:value="formState.Price"
+                  :suffix="payCurrencyUnit" placeholder="请输入暂定价" />
               </a-form-item>
             </a-col>
             <a-col :span="12">
               <a-form-item label="升贴水" name="PriceMove">
-                <a-input-number class="dialogInput suffixGrey" v-model:value="formState.PriceMove" placeholder="请输入升贴水" :suffix="`${payCurrencyUnit}/${numberUnit}`" style="width: 200px" />
+                <a-input-number class="dialogInput suffixGrey" v-model:value="formState.PriceMove" placeholder="请输入升贴水"
+                  :suffix="`${payCurrencyUnit}/${numberUnit}`" style="width: 200px" />
               </a-form-item>
             </a-col>
             <a-col :span="12">
               <a-form-item label="点价期">
-                <a-range-picker v-model:value="priceDate" class="commonPicker" :disabled-date="disabledDate" style="width: 200px" :show-time="{ hideDisabledOptions: true }" format="YYYY-MM-DD" />
+                <a-range-picker v-model:value="priceDate" class="commonPicker" :disabled-date="disabledDate"
+                  style="width: 200px" :show-time="{ hideDisabledOptions: true }" format="YYYY-MM-DD" />
               </a-form-item>
             </a-col>
             <a-col :span="24">
               <a-form-item label="点价说明" name="PointDesc">
-                <a-input class="dialogInput" style="width: 608px" v-model:value="formState.PointDesc" placeholder="请输入点价说明" />
+                <a-input class="dialogInput" style="width: 608px" v-model:value="formState.PointDesc"
+                  placeholder="请输入点价说明" />
               </a-form-item>
             </a-col>
           </template>
@@ -197,12 +224,20 @@
           <template v-if="formState.PriceType === 1">
             <a-col :span="12">
               <a-form-item label="价格" name="Price">
-                <a-input class="dialogInput suffixGrey" v-model:value="formState.Price" @change="getAmout" placeholder="请输入价格" :suffix="`${payCurrencyUnit}/${numberUnit}`" style="width: 200px" />
+                <a-input class="dialogInput suffixGrey" v-model:value="formState.Price" @change="getAmout"
+                  placeholder="请输入价格" :suffix="`${payCurrencyUnit}/${numberUnit}`" style="width: 200px" />
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="升贴水" name="PriceMove">
+                <a-input-number class="dialogInput suffixGrey" v-model:value="formState.PriceMove" placeholder="请输入升贴水"
+                  :suffix="`${payCurrencyUnit}/${numberUnit}`" style="width: 200px" @change="getAmout" />
               </a-form-item>
             </a-col>
             <a-col :span="12">
               <a-form-item label="金额" class="relative" name="Amount">
-                <a-input class="dialogInput suffixGrey" v-model:value="formState.Amount" readonly placeholder="输入数量和价格后自动算" :suffix="payCurrencyUnit" style="width: 200px" />
+                <a-input class="dialogInput suffixGrey" v-model:value="formState.Amount" readonly
+                  placeholder="输入数量和价格后自动算" :suffix="payCurrencyUnit" style="width: 200px" />
               </a-form-item>
             </a-col>
           </template>
@@ -213,13 +248,17 @@
         <a-row :gutter="24">
           <a-col :span="12">
             <a-form-item label="初始保证金" name="ContractMargin">
-              <a-input class="dialogInput suffixGrey" placeholder="请输入保证金" v-model:value="formState.ContractMargin" style="width: 200px" :suffix="payCurrencyUnit" />
+              <a-input class="dialogInput suffixGrey" placeholder="请输入保证金" v-model:value="formState.ContractMargin"
+                style="width: 200px" :suffix="payCurrencyUnit" />
             </a-form-item>
           </a-col>
           <a-col :span="12">
             <a-form-item label="业务员" name="SaleUserID">
-              <a-select class="inlineFormSelect" v-model:value="formState.SaleUserID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择业务员">
-                <a-select-option v-for="item in businesserList" :key="item.userid" :value="item.userid"> {{ item.accountname }}-{{ item.logincode }} </a-select-option>
+              <a-select class="inlineFormSelect" v-model:value="formState.SaleUserID" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择业务员">
+                <a-select-option v-for="item in businesserList" :key="item.userid" :value="item.userid"> {{
+                    item.accountname
+                }}-{{ item.logincode }} </a-select-option>
               </a-select>
             </a-form-item>
           </a-col>
@@ -227,14 +266,19 @@
         <a-row :gutter="24">
           <a-col :span="12">
             <a-form-item label="跟单员" name="MerUserID">
-              <a-select class="inlineFormSelect" v-model:value="formState.MerUserID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择跟单员">
-                <a-select-option v-for="item in merchandiserList" :key="item.userid" :value="item.userid"> {{ item.accountname }}-{{ item.logincode }} </a-select-option>
+              <a-select class="inlineFormSelect" v-model:value="formState.MerUserID" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择跟单员">
+                <a-select-option v-for="item in merchandiserList" :key="item.userid" :value="item.userid"> {{
+                    item.accountname
+                }}-{{ item.logincode }} </a-select-option>
               </a-select>
             </a-form-item>
           </a-col>
           <a-col :span="12">
             <a-form-item label="交易用户" name="TradeUserID">
-              <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.TradeUserID" placeholder="请选择交易用户">
+              <a-select class="inlineFormSelect" style="width: 200px"
+                :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.TradeUserID"
+                placeholder="请选择交易用户">
                 <a-select-option v-for="item in traderList" :key="item.roleid" :value="item.roleid">
                   {{ item.rolename }}
                 </a-select-option>
@@ -417,8 +461,8 @@ export default defineComponent({
 
 <style lang="less">
 .add-spot-contract {
-    .ant-upload-list-item-name {
-        padding: 0 20px;
-    }
+  .ant-upload-list-item-name {
+    padding: 0 20px;
+  }
 }
 </style>

+ 58 - 56
src/views/information/spot-contract/components/detail/index.vue

@@ -1,6 +1,7 @@
 <template>
   <!-- 现货合同详情-->
-  <a-modal class="add-custom custom-detail" title="现货合同详情" v-model:visible="visible" centered :maskClosable="false" @cancel="cancel" width="890px">
+  <a-modal class="add-custom custom-detail" title="现货合同详情" v-model:visible="visible" centered :maskClosable="false"
+    @cancel="cancel" width="890px">
     <template #footer>
       <a-button key="submit" type="primary" :loading="loading" @click="cancel">关闭</a-button>
     </template>
@@ -69,8 +70,8 @@
         <template #applyname="{ record }">
           <span>{{ formatValue(record.applyname) }}</span>
         </template>
-        <template #warehousename="{record}">
-          {{record.warehousecode}}
+        <template #warehousename="{ record }">
+          {{ record.warehousecode }}
         </template>
 
         <!-- 款项记录 款项类型为退款  则金额使用deductamount-->
@@ -218,68 +219,69 @@ export default defineComponent({
 
 <style lang="less">
 .custom-detail {
-    .ant-modal-content {
-        .ant-modal-body {
-            padding-top: 0;
-            padding-left: 0;
-            padding-right: 0;
+  .ant-modal-content {
+    .ant-modal-body {
+      padding-top: 0;
+      padding-left: 0;
+      padding-right: 0;
 
-            .ant-tabs {
-                background: @m-black11;
-                width: 100%;
-                padding: 0 24px;
+      .ant-tabs {
+        background: @m-black11;
+        width: 100%;
+        padding: 0 24px;
+
+        .ant-tabs-bar {
+          margin-bottom: 0;
+          border-bottom: 0;
+        }
 
-                .ant-tabs-bar {
-                    margin-bottom: 0;
-                    border-bottom: 0;
-                }
-                .anticon {
-                    color: @m-grey2;
-                }
-                .ant-tabs-nav-container {
-                    .ant-tabs-nav-wrap {
-                        .ant-tabs-nav {
-                            .ant-tabs-tab {
-                                width: 70px;
-                                margin-right: 43px;
-                                text-align: center;
-                                font-size: 16px;
-                                color: @m-grey2;
-                                padding: 0;
-                                line-height: 45px;
-                            }
+        .anticon {
+          color: @m-grey2;
+        }
+
+        .ant-tabs-nav-container {
+          .ant-tabs-nav-wrap {
+            .ant-tabs-nav {
+              .ant-tabs-tab {
+                width: 70px;
+                margin-right: 43px;
+                text-align: center;
+                font-size: 16px;
+                color: @m-grey2;
+                padding: 0;
+                line-height: 45px;
+              }
 
-                            .ant-tabs-tab-active.ant-tabs-tab {
-                                color: @m-blue0;
-                            }
+              .ant-tabs-tab-active.ant-tabs-tab {
+                color: @m-blue0;
+              }
 
-                            .ant-tabs-ink-bar {
-                                width: 70px !important;
-                                background: @m-blue0;
-                                .rounded-corners(1px);
-                            }
-                        }
-                    }
-                }
+              .ant-tabs-ink-bar {
+                width: 70px !important;
+                background: @m-blue0;
+                .rounded-corners(1px);
+              }
             }
+          }
         }
+      }
     }
+  }
 
-    .tableDatas {
-        margin-top: 26px;
-        padding: 0 24px;
-        overflow: hidden;
+  .tableDatas {
+    margin-top: 26px;
+    padding: 0 24px;
+    overflow: hidden;
 
-        .dialogTable {
-            width: 100%;
-            overflow: overlay;
-        }
+    .dialogTable {
+      width: 100%;
+      overflow: overlay;
     }
+  }
 
-    .ant-form.inlineForm {
-        margin-top: 20px;
-        padding: 0 24px;
-    }
+  .ant-form.inlineForm {
+    margin-top: 20px;
+    padding: 0 24px;
+  }
 }
-</style
->;
+</style>

+ 2 - 2
src/views/information/spot-contract/components/setup.ts

@@ -356,8 +356,8 @@ export function handleDate() {
  */
 export function handleAmout(formState: UnwrapRef<FormState>) {
     function getAmout() {
-        const { Price, Qty } = formState
-        formState.Amount = (Price && Qty) ? Number(Price) * Number(Qty) : 0
+        const { Price, Qty, PriceMove } = formState
+        formState.Amount = (Price && Qty && PriceMove) ? (Number(Price) + Number(PriceMove)) * Number(Qty) : 0
     }
     return { getAmout }
 }

+ 5 - 3
src/views/market/market-spot/components/post_buying/interface.ts

@@ -1,5 +1,6 @@
 import { WrOrderQuote } from "@/services/go/wrtrade/interface";
 import { Moment } from "moment";
+import { BuyOrSell } from '@/common/constants/enumCommon';
 
 export interface FormParam {
     accountid: undefined | number,
@@ -8,9 +9,10 @@ export interface FormParam {
     PriceMove: number,
     DeliveryMonth: Moment,
     DelistMinQty: number,
-    permanceTempName:string;
-    permaceTempId:number;
-    marketid:number | undefined;
+    buyOrSell: BuyOrSell;
+    permanceTempName: string;
+    permaceTempId: number;
+    marketid: number | undefined;
 }
 
 

+ 5 - 3
src/views/market/market-spot/components/post_buying/setup.ts

@@ -1,9 +1,10 @@
 import { ListingMode } from '@/common/constants/enumCommon';
+import { BuyOrSell } from "@/common/constants/enumCommon";
 import { EnumRouterName } from "@/common/constants/enumRouterName";
 import { validateCommon } from "@/common/setup/validate";
 import { useVerifyBeginDelistingNum, useVerifyListingBasis, useVerifyListingNum } from '@/hooks/form/verify';
 import { getAccountTypeList, getCanUseMoney } from "@/services/bus/account";
-import { getRules } from '@/services/bus/rules';
+import { getRulesByMarketid } from '@/services/bus/rules';
 import { AccountListItem } from "@/services/dataCenter/interafce/account";
 import { WrOrderQuote } from "@/services/go/wrtrade/interface";
 import { getListingMode } from '@/views/market/market-spot/setup';
@@ -21,6 +22,7 @@ function initFormData(): FormParam {
         PriceMove: 0,
         DelistMinQty: 0,
         DeliveryMonth: moment(),
+        buyOrSell: BuyOrSell.buy,
         permanceTempName: '',
         permaceTempId: 0,
         marketid: undefined,
@@ -56,8 +58,8 @@ export function handleNumAndPrice(enumName: EnumRouterName, selectedRow: WrOrder
     // 获取选中的资金账号
     const getSelectedAccount = () => accountList.find((e) => e.accountid === formState.accountid);
     // 交易规则
-    const rules = getRules()
-    const { buymarginvalue, buymarginalgorithm } = rules.length ? rules[0] : { buymarginvalue: 0, buymarginalgorithm: 1 }
+    const rules = getRulesByMarketid(formState.marketid ?? 0)
+    const { buymarginvalue, buymarginalgorithm } = rules ?? { buymarginvalue: 0, buymarginalgorithm: 1 }
     //保证金模式 1: 比率 2: 固定
     const marginMethod = () => buymarginalgorithm === 1
     // 挂牌最大数量

+ 0 - 1
src/views/market/market-spot/setup.ts

@@ -68,7 +68,6 @@ export function handleFtDeliveryGoods() {
     if (FtDeliveryGoods.value.length === 0) {
         initData(() => {
             queryFtDeliveryGoods().then(res => {
-                console.log('dddddddddd', res)
                 const result: TreeDataItem[] = []
                 res.forEach(el => {
                     const { deliverygoodsid, deliverygoodsname, wdlst } = el

+ 11 - 7
src/views/order/commodity_contract/components/commodity_contract_bargain/index.vue

@@ -2,15 +2,18 @@
   <!-- 商品订单 - 议价单 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="handleBtnList(record, buttons)" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="handleBtnList(record, auth)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <template #applytime="{ text }">
           <span>{{ formatTime(text) }}</span>
         </template>
-        <template #transferamount="{ record , text}">
+        <template #transferamount="{ record, text }">
           <div>
             <!-- 审核拒绝 -->
             <a-tooltip placement="bottom" v-if="record.applystatus === 4" overlayClassName="toolTipTableColumn">
@@ -32,7 +35,8 @@
       </a-table>
     </template>
   </mtp-table-scroll>
-  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="tableList" @cancel="closeComponent"></component>
+  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="tableList"
+    @cancel="closeComponent"></component>
 </template>
 
 <script lang="ts">
@@ -73,7 +77,7 @@ export default defineComponent({
     refuse: defineAsyncComponent(() => import('./components/commodity_contract_bargain_refuse_order/index.vue')), // 拒绝
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 类型 1-我的申请 2-对方申请
     const margainType = ref<ApplyType>(ApplyType.my);
     // 表格列表数据
@@ -125,7 +129,7 @@ export default defineComponent({
       columns,
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       handleBtnList,

+ 8 - 5
src/views/order/commodity_contract/components/commodity_contract_commission/index.vue

@@ -2,10 +2,13 @@
   <!-- 商品订单 - 委托 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="filterBtnList(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="filterBtnList(auth, record)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <!-- 类型 -->
         <template #buildtype="{ record }">
@@ -52,7 +55,7 @@ export default defineComponent({
     cancel: defineAsyncComponent(() => import('./components/cancel/index.vue')), // 撤单
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryTradeOrderDetailRsp>();
 
@@ -81,7 +84,7 @@ export default defineComponent({
       ...handleComposeOrderTable<WrPerformancePlan>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       getBuyOrSellTypeName,

+ 7 - 5
src/views/order/commodity_contract/components/commodity_contract_make_deal/index.vue

@@ -2,10 +2,12 @@
   <!-- 商品订单 - 成交 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
         <!-- 类型 -->
         <template #buyorsell="{ text }">
@@ -49,7 +51,7 @@ export default defineComponent({
     BtnList,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryTradeDetailRsp>();
 
@@ -68,7 +70,7 @@ export default defineComponent({
       ...handleComposeOrderTable<QueryTradeDetailRsp>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       getBuildTypeName,

+ 7 - 5
src/views/order/commodity_contract/components/commodity_contract_settlement/index.vue

@@ -2,10 +2,12 @@
   <!-- 商品订单 - 交收 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
         <template #createtime="{ record }">
           <span>{{ formatTime(record.createtime) }}</span>
@@ -184,7 +186,7 @@ export default defineComponent({
     BtnList,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrDeliveryDetail>(true);
 
@@ -204,7 +206,7 @@ export default defineComponent({
       ...useColumns(),
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       getBuildTypeName,

+ 10 - 6
src/views/order/commodity_contract/components/commodity_contract_summary/index.vue

@@ -2,10 +2,13 @@
   <!-- 商品订单 - 合约汇总 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="tabColumns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="tabColumns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="handleBtnList(record,buttons)" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="handleBtnList(record, auth)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <template #createtime="{ record }">
           <a>{{ formatTime(record.createtime) }}</a>
@@ -32,7 +35,8 @@
       </a-table>
     </template>
   </mtp-table-scroll>
-  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="tableList" @cancel="closeComponent"></component>
+  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="tableList"
+    @cancel="closeComponent"></component>
 </template>
 
 <script lang="ts">
@@ -183,7 +187,7 @@ export default defineComponent({
     order_closed: defineAsyncComponent(() => import('./components/commodity_contract_summary_order_closed/index.vue')), // 平仓
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryTradePositionRsp>();
     const { subscribeAction } = handleSubcriteQuote();
@@ -234,7 +238,7 @@ export default defineComponent({
       ...handleComposeOrderTable<QueryTradePositionRsp>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       getLastprice,

+ 8 - 5
src/views/order/financing_manager/components/financing_manager_apply_order/index.vue

@@ -2,10 +2,13 @@
   <!-- 融资管理-申请单 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="handleBtnList(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="handleBtnList(auth, record)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <!-- 类型 -->
         <template #financetype="{ record }">
@@ -60,7 +63,7 @@ export default defineComponent({
     cancel: defineAsyncComponent(() => import('./components/cancel/index.vue')), // 撤销
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrFinanceBuyApply>();
 
@@ -116,7 +119,7 @@ export default defineComponent({
       ...handleComposeOrderTable<WrFinanceBuyApply>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       getFinanceTypeName,

+ 4 - 4
src/views/order/financing_manager/components/financing_manager_contract/index.vue

@@ -4,8 +4,8 @@
         <template #default="{ scroll }">
             <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
                 <!-- 额外的展开行 -->
-                <template v-if="buttons.length" #expandedRowRender="{ record }">
-                    <BtnList :btnList="handleBtnList(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+                <template v-if="auth.length" #expandedRowRender="{ record }">
+                    <BtnList :btnList="handleBtnList(auth, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
                 </template>
                 <!-- 类型 -->
                 <template #financetype="{ record }">
@@ -55,7 +55,7 @@ export default defineComponent({
         pay_arrears: defineAsyncComponent(() => import('./components/pay/index.vue')), // 支付欠款
     },
     setup(props) {
-        const { buttons } = props.parentComponent;
+        const { auth } = props.parentComponent;
         // 表格列表数据
         const { loading, tableList, queryTable } = queryTableList<WrScfContract>();
 
@@ -87,7 +87,7 @@ export default defineComponent({
             ...handleComposeOrderTable<WrScfContract>(param),
             loading,
             tableList,
-            buttons,
+            auth,
             formatTime,
             expandIcon,
             getContractName,

+ 4 - 4
src/views/order/funding_information/components/funding_information_funding_log/index.vue

@@ -4,8 +4,8 @@
     <template #default="{ scroll }">
       <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record,index)=>index" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
         <template #createtime="{ record }">
           <a>{{ formatTime(record.createtime) }}</a>
@@ -45,7 +45,7 @@ export default defineComponent({
     BtnList,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrPerformancePlan>();
     // 获取列表数据
@@ -78,7 +78,7 @@ export default defineComponent({
       tableList,
       formatTime,
       expandIcon,
-      buttons
+      auth
     }
   }
 })

+ 4 - 4
src/views/order/futures_information/components/futures_information_entrust/index.vue

@@ -4,8 +4,8 @@
     <template #default="{ scroll }">
       <a-table :columns="getColumns()" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="handleBtnList(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="handleBtnList(auth, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -40,7 +40,7 @@ export default defineComponent({
     cancel,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryErmcpOrderDetailsRsp>();
 
@@ -64,7 +64,7 @@ export default defineComponent({
       loading,
       expandIcon,
       tableList,
-      buttons,
+      auth,
     }
   }
 })

+ 7 - 5
src/views/order/futures_information/components/futures_information_position/index.vue

@@ -2,10 +2,12 @@
   <!-- 期货订单-持仓 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="getColumns()" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tradePositionList">
+      <a-table :columns="getColumns()" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tradePositionList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList class="btn-list-sticky" :btnList="buttons" :record="record" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList class="btn-list-sticky" :btnList="auth" :record="record" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -37,7 +39,7 @@ export default defineComponent({
     close: defineAsyncComponent(() => import('@/views/market/futures/compoments/futures-trade/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     const { loading, tradePositionList } = useTradeAccount();
 
     // 表格通用逻辑
@@ -51,7 +53,7 @@ export default defineComponent({
       loading,
       expandIcon,
       tradePositionList,
-      buttons,
+      auth,
     };
   },
 });

+ 7 - 5
src/views/order/futures_information/components/futures_information_success/index.vue

@@ -2,10 +2,12 @@
   <!-- 期货订单-成交 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="getColumns()" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record,index)=>index" :data-source="tableList">
+      <a-table :columns="getColumns()" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -37,7 +39,7 @@ export default defineComponent({
     BtnList,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryErmcpTradeDetailsRsp>();
 
@@ -52,7 +54,7 @@ export default defineComponent({
       loading,
       expandIcon,
       tableList,
-      buttons,
+      auth,
     }
   }
 })

+ 9 - 5
src/views/order/performance_information/components/performance_information_buy_performance/index.vue

@@ -2,10 +2,13 @@
     <!-- 履约信息-买履约 -->
     <mtp-table-scroll>
         <template #default="{ scroll }">
-            <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+            <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+                :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon"
+                :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
                 <!-- 额外的展开行 -->
                 <template #expandedRowRender="{ record }">
-                    <BtnList :btnList="handleBtn(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+                    <BtnList :btnList="handleBtn(auth, record)" :record="record" class="btn-list-sticky"
+                        @click="openComponent" />
                 </template>
                 <!-- 履约类型 -->
                 <template #performancetype="{ record }">
@@ -26,7 +29,8 @@
             </a-table>
         </template>
     </mtp-table-scroll>
-    <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :buyOrSell="BuyOrSell.buy" @cancel="closeComponent"></component>
+    <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :buyOrSell="BuyOrSell.buy"
+        @cancel="closeComponent"></component>
 </template>
 
 <script lang="ts">
@@ -60,7 +64,7 @@ export default defineComponent({
         settlement: defineAsyncComponent(() => import('../components/settlement/index.vue')), // 交收
     },
     setup(props) {
-        const { buttons } = props.parentComponent;
+        const { auth } = props.parentComponent;
         // 表格列表数据
         const { loading, tableList, queryTable } = queryTableList<WrPerformancePlan>();
 
@@ -102,7 +106,7 @@ export default defineComponent({
             ...handleComposeOrderTable<WrPerformancePlan>(param),
             loading,
             tableList,
-            buttons,
+            auth,
             getPerformanceTypeName,
             getPerformanceStatusName,
             getPaymentTypeName,

+ 10 - 6
src/views/order/performance_information/components/performance_information_sell_performance/index.vue

@@ -2,10 +2,13 @@
     <!-- 履约信息-卖履约 -->
     <mtp-table-scroll>
         <template #default="{ scroll }">
-            <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+            <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+                :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon"
+                :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
                 <!-- 额外的展开行 -->
-                <template v-if="buttons.length" #expandedRowRender="{ record }">
-                    <BtnList :btnList="handleBtn(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+                <template v-if="auth.length" #expandedRowRender="{ record }">
+                    <BtnList :btnList="handleBtn(auth, record)" :record="record" class="btn-list-sticky"
+                        @click="openComponent" />
                 </template>
                 <!-- 履约类型 -->
                 <template #performancetype="{ record }">
@@ -26,7 +29,8 @@
             </a-table>
         </template>
     </mtp-table-scroll>
-    <component :is="componentId" v-if="componentId" :buyOrSell="BuyOrSell.sell" :selectedRow="selectedRow" @cancel="closeComponent"></component>
+    <component :is="componentId" v-if="componentId" :buyOrSell="BuyOrSell.sell" :selectedRow="selectedRow"
+        @cancel="closeComponent"></component>
 </template>
 
 <script lang="ts">
@@ -60,7 +64,7 @@ export default defineComponent({
         settlement: defineAsyncComponent(() => import('../components/settlement/index.vue')), // 交收
     },
     setup(props) {
-        const { buttons } = props.parentComponent;
+        const { auth } = props.parentComponent;
         // 表格列表数据
         const { loading, tableList, queryTable } = queryTableList<WrPerformancePlan>();
 
@@ -101,7 +105,7 @@ export default defineComponent({
             ...handleComposeOrderTable<WrPerformancePlan>(param),
             loading,
             tableList,
-            buttons,
+            auth,
             getPerformanceTypeName,
             getPaymentTypeName,
             getPerformanceStatusName,

+ 3 - 3
src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_bargain/index.vue

@@ -5,7 +5,7 @@
       <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
         <!-- 挂牌有效期 -->
         <template #validtime="{ text }">
@@ -68,7 +68,7 @@ export default defineComponent({
     detail: defineAsyncComponent(() => import('./components/bargain_detail/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryWrTradeBargainApplyQsp>();
 
@@ -117,7 +117,7 @@ export default defineComponent({
       componentId,
       closeComponent,
       openComponent, // 控制异步组件
-      buttons, // 表格按钮
+      auth, // 表格按钮
       columns: getSpotWarrantBargainColumns(),
       loading,
       tableList,

+ 8 - 5
src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_deal/index.vue

@@ -2,10 +2,12 @@
   <!-- 预售仓单-成交 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" class="btn-list-sticky" :record="record" @click="openComponent" />
+          <BtnList :btnList="auth" class="btn-list-sticky" :record="record" @click="openComponent" />
         </template>
         <!-- 成交金额 -->
         <template #amount="{ record }">
@@ -18,7 +20,8 @@
       </a-table>
     </template>
   </mtp-table-scroll>
-  <component :is="componentId" v-if="componentId" :tableName="tableName" :selectedRow="selectedRow" @cancel="closeComponent"></component>
+  <component :is="componentId" v-if="componentId" :tableName="tableName" :selectedRow="selectedRow"
+    @cancel="closeComponent"></component>
 </template>
 
 <script lang="ts">
@@ -47,7 +50,7 @@ export default defineComponent({
     detail: defineAsyncComponent(() => import('./components/pre_sale_warehouse_receipt_deal_detail/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     const tableName: keyof TableKey = 'table_pcweb_spot_trade_bottom_pre_sale_make_deal';
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrSpecialMatchOrder>();
@@ -71,7 +74,7 @@ export default defineComponent({
       loading,
       tableName,
       tableList,
-      buttons,
+      auth,
       expandIcon,
       getWrOrderTypeName,
     }

+ 3 - 3
src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_designated_deal/index.vue

@@ -5,7 +5,7 @@
       <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -38,7 +38,7 @@ export default defineComponent({
     BtnList,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrSpecialMatchOrder>();
 
@@ -60,7 +60,7 @@ export default defineComponent({
       ...handleComposeOrderTable<WrSpecialMatchOrder>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       expandIcon,
     }
   }

+ 7 - 4
src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_order_summary/index.vue

@@ -2,10 +2,13 @@
   <!-- 预售仓单-订单汇总 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" class="btn-list-sticky" :record="record" @click="openComponent" v-if="record.creditenableqty > 0" />
+          <BtnList :btnList="auth" class="btn-list-sticky" :record="record" @click="openComponent"
+            v-if="record.creditenableqty > 0" />
         </template>
       </a-table>
     </template>
@@ -37,7 +40,7 @@ export default defineComponent({
     listed: defineAsyncComponent(() => import('./components/listed/index.vue')), // 挂牌
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrPosition>();
 
@@ -60,7 +63,7 @@ export default defineComponent({
       ...handleComposeOrderTable<WrPosition>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       expandIcon,
     };
   },

+ 3 - 3
src/views/order/pre_sale_warehouse_receipt/components/pre_sale_warehouse_receipt_pending_order/index.vue

@@ -5,7 +5,7 @@
       <a-table :columns="tableColumns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="filterBtnList(buttons, record)" class="btn-list-sticky" :record="record" @click="openComponent" />
+          <BtnList :btnList="filterBtnList(auth, record)" class="btn-list-sticky" :record="record" @click="openComponent" />
         </template>
         <!--  委托状态-->
         <template #wrtradeorderstatus="{ record }">
@@ -59,7 +59,7 @@ export default defineComponent({
     bargain: defineAsyncComponent(() => import('@/views/order/spot_warran/components/spot_warrant_bargain/components/detail/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrOrderDetail>();
 
@@ -103,7 +103,7 @@ export default defineComponent({
       filterBtnList,
       loading,
       tableList,
-      buttons,
+      auth,
       expandIcon,
       getOrderStatusName,
       getWrOrderTypeName,

+ 5 - 3
src/views/order/spot_warran/components/spot_warrant_bargain/index.vue

@@ -2,7 +2,9 @@
   <!-- 现货仓单 议价 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
           <BtnList :btnList="handleBtnLsit(record)" :record="record" class="btn-list-sticky" @click="openComponent" />
@@ -69,7 +71,7 @@ export default defineComponent({
     detail: defineAsyncComponent(() => import('./components/detail/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryWrTradeBargainApplyQsp>();
 
@@ -103,7 +105,7 @@ export default defineComponent({
     function handleBtnLsit(record: QueryWrTradeBargainApplyQsp) {
       // applystatus: number;//申请状态(议价状态) - 1:待确认 2:已确认 3:已拒绝 4:已撤销 5:系统撤销 6:处理失败 7:确认中
       const arr = [2, 3];
-      return arr.includes(record.applystatus) ? buttons : [];
+      return arr.includes(record.applystatus) ? auth : [];
     }
 
     const stopNotify = Bus.$on('blocsTrade', () => {

+ 8 - 5
src/views/order/spot_warran/components/spot_warrant_deal/index.vue

@@ -2,10 +2,12 @@
   <!-- 现货仓单-成交 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
         <!-- 成交金额 -->
         <template #amount="{ record }">
@@ -18,7 +20,8 @@
       </a-table>
     </template>
   </mtp-table-scroll>
-  <component :is="componentId" v-if="componentId" :tableName="tableName" :selectedRow="selectedRow" @cancel="closeComponent"></component>
+  <component :is="componentId" v-if="componentId" :tableName="tableName" :selectedRow="selectedRow"
+    @cancel="closeComponent"></component>
 </template>
 
 <script lang="ts">
@@ -47,7 +50,7 @@ export default defineComponent({
     detail: defineAsyncComponent(() => import('./components/detail/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     const tableName: keyof TableKey = 'table_pcweb_spot_trade_bottom_spot_warrant_deal';
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrSpecialMatchOrder>();
@@ -91,7 +94,7 @@ export default defineComponent({
       loading,
       tableName,
       tableList,
-      buttons,
+      auth,
       expandIcon,
       getWrOrderTypeName,
     }

+ 6 - 4
src/views/order/spot_warran/components/spot_warrant_designated_deal/index.vue

@@ -2,10 +2,12 @@
   <!-- 现货仓单-指定成交 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -36,7 +38,7 @@ export default defineComponent({
     MtpTableScroll,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrSpecialMatchOrder>();
 
@@ -58,7 +60,7 @@ export default defineComponent({
       ...handleComposeOrderTable<WrSpecialMatchOrder>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       expandIcon,
     }
   }

+ 7 - 4
src/views/order/spot_warran/components/spot_warrant_in_and_out_warehouse/index.vue

@@ -2,10 +2,13 @@
   <!-- 现货仓单-提货 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="handleBtnList(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+          <BtnList :btnList="handleBtnList(auth, record)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <!-- applytype 类型-->
         <template #applytype="{ record }">
@@ -51,7 +54,7 @@ export default defineComponent({
     cacel: defineAsyncComponent(() => import('./components/cancel/index.vue')), // 撤销
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrOutInApply>();
 
@@ -81,7 +84,7 @@ export default defineComponent({
       ...handleComposeOrderTable<WrOutInApply>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       expandIcon,
       handleBtnList,
       getPickUpStatusName,

+ 7 - 5
src/views/order/spot_warran/components/spot_warrant_inventory_summary/index.vue

@@ -2,10 +2,12 @@
   <!-- 现货仓单-库存汇总 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -37,7 +39,7 @@ export default defineComponent({
     // [ModalEnum.spot_warrant_inventory_summary_listed]: defineAsyncComponent(() => import('./components/listing/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrHoldLB>();
 
@@ -61,7 +63,7 @@ export default defineComponent({
       loading,
       tableList,
       expandIcon,
-      buttons
+      auth
     }
   }
 })

+ 9 - 5
src/views/order/spot_warran/components/spot_warrant_pending_order/index.vue

@@ -2,10 +2,13 @@
   <!-- 现货仓单 挂单 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="tableColumns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="tableColumns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <BtnList :btnList="filterBtnList(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+          <BtnList :btnList="filterBtnList(auth, record)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <!--  委托状态-->
         <template #wrtradeorderstatus="{ record }">
@@ -27,7 +30,8 @@
       </a-table>
     </template>
   </mtp-table-scroll>
-  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :isMy="false" @cancel="closeComponent"></component>
+  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :isMy="false" @cancel="closeComponent">
+  </component>
 </template>
 
 <script lang="ts">
@@ -60,7 +64,7 @@ export default defineComponent({
     bargain: defineAsyncComponent(() => import('@/views/order/spot_warran/components/spot_warrant_bargain/components/detail/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrOrderDetail>();
     // 获取列表数据
@@ -99,7 +103,7 @@ export default defineComponent({
 
     return {
       ...handleComposeOrderTable<WrOrderDetail>(param),
-      buttons,
+      auth,
       loading,
       tableList,
       getOrderStatusName,

+ 8 - 5
src/views/order/spot_warran/components/spot_warrant_spot_details/index.vue

@@ -2,10 +2,13 @@
   <!-- 现货仓单-现货明细 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" v-if="record.enableqty > 0" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent"
+            v-if="record.enableqty > 0" />
         </template>
       </a-table>
     </template>
@@ -39,7 +42,7 @@ export default defineComponent({
     pickup: defineAsyncComponent(() => import('./components/pick_up/index.vue')), // 提货
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrHoldLB>();
 
@@ -60,7 +63,7 @@ export default defineComponent({
       loading,
       tableList,
       expandIcon,
-      buttons
+      auth
     }
   }
 })

+ 7 - 5
src/views/order/spot_warran/components/spot_warrant_spot_summary/index.vue

@@ -2,10 +2,12 @@
   <!-- 现货仓单-现货汇总 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" :rowKey="(record, index) => index" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        :rowKey="(record, index) => index" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
       </a-table>
     </template>
@@ -36,7 +38,7 @@ export default defineComponent({
     MtpTableScroll,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<WrPosition>();
     // 获取列表数据
@@ -59,7 +61,7 @@ export default defineComponent({
       loading,
       tableList,
       expandIcon,
-      buttons
+      auth
     }
   }
 })

+ 10 - 6
src/views/order/swap_the_order/components/swap_commodity_contract_bargain/index.vue

@@ -2,10 +2,13 @@
   <!-- 掉期订单-议价单 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="handleBtnList(record, buttons)" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="handleBtnList(record, auth)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <template #applytime="{ text }">
           <span>{{ formatTime(text) }}</span>
@@ -32,7 +35,8 @@
       </a-table>
     </template>
   </mtp-table-scroll>
-  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="tableList" @cancel="closeComponent"></component>
+  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="tableList"
+    @cancel="closeComponent"></component>
 </template>
 
 <script lang="ts">
@@ -73,7 +77,7 @@ export default defineComponent({
     refuse: defineAsyncComponent(() => import('./components/commodity_contract_bargain_refuse_order/index.vue')),
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 类型 1-我的申请 2-对方申请
     const margainType = ref<ApplyType>(ApplyType.my);
     // 表格列表数据
@@ -125,7 +129,7 @@ export default defineComponent({
       columns,
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       handleBtnList,

+ 8 - 5
src/views/order/swap_the_order/components/swap_commodity_contract_commission/index.vue

@@ -2,10 +2,13 @@
   <!-- 掉期订单-委托 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="filterBtnList(buttons, record)" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="filterBtnList(auth, record)" :record="record" class="btn-list-sticky"
+            @click="openComponent" />
         </template>
         <!-- 类型 -->
         <template #buildtype="{ record }">
@@ -54,7 +57,7 @@ export default defineComponent({
     cancel: defineAsyncComponent(() => import('./components/cancel/index.vue')), // 撤单
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryTradeOrderDetailRsp>();
 
@@ -92,7 +95,7 @@ export default defineComponent({
       ...handleComposeOrderTable<WrPerformancePlan>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       getBuyOrSellTypeName,

+ 7 - 5
src/views/order/swap_the_order/components/swap_commodity_contract_make_deal/index.vue

@@ -2,10 +2,12 @@
   <!-- 掉期订单-成交 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="tableList">
+      <a-table :columns="columns" class="srcollYTable" :scroll="scroll" :pagination="false" :loading="loading"
+        :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false"
+        rowKey="key" :data-source="tableList">
         <!-- 额外的展开行 -->
-        <template v-if="buttons.length" #expandedRowRender="{ record }">
-          <BtnList :btnList="buttons" :record="record" class="btn-list-sticky" @click="openComponent" />
+        <template v-if="auth.length" #expandedRowRender="{ record }">
+          <BtnList :btnList="auth" :record="record" class="btn-list-sticky" @click="openComponent" />
         </template>
         <!-- 类型 -->
         <template #buyorsell="{ text }">
@@ -62,7 +64,7 @@ export default defineComponent({
     BtnList,
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     // 表格列表数据
     const { loading, tableList, queryTable } = queryTableList<QueryTradeDetailRsp>();
 
@@ -98,7 +100,7 @@ export default defineComponent({
       ...handleComposeOrderTable<QueryTradeDetailRsp>(param),
       loading,
       tableList,
-      buttons,
+      auth,
       formatTime,
       expandIcon,
       getBuildTypeName,

+ 21 - 8
src/views/order/swap_the_order/components/swap_commodity_contract_summary/index.vue

@@ -2,16 +2,24 @@
   <!-- 掉期订单-合约汇总 -->
   <mtp-table-scroll>
     <template #default="{ scroll }">
-      <a-table :columns="getTableColums()" class="srcollYTableExpendBgColor srcollYTable" :scroll="scroll" :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="positionList">
+      <a-table :columns="getTableColums()" class="srcollYTableExpendBgColor srcollYTable" :scroll="scroll"
+        :pagination="false" :loading="loading" :expandedRowKeys="expandedRowKeys" :customRow="Rowclick"
+        :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="positionList">
         <!-- 额外的展开行 -->
         <template #expandedRowRender="{ record }">
-          <a-table :columns="getDetailColums()" class="expandBottomTable" :pagination="false" :loading="detailLoading" :expandedRowKeys="expandedRowKeys" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key" :data-source="getTradeHolderDetail(record)">
+          <a-table :columns="getDetailColums()" class="expandBottomTable" :pagination="false" :loading="detailLoading"
+            :expandedRowKeys="expandedRowKeys" :expandIcon="expandIcon" :expandIconAsCell="false" rowKey="key"
+            :data-source="getTradeHolderDetail(record)">
             <template #operate="sub">
-              <BtnList :btnList="handleBtnList(record, buttons)" :record="sub.record" class="btn-list-sticky" @click="openComponent" />
+              <BtnList :btnList="handleBtnList(record, auth)" :record="sub.record" class="btn-list-sticky"
+                @click="openComponent" />
             </template>
             <!-- 持仓盈亏 -->
             <template #profitloss="{ record }">
-              <span :class="[+getDetailProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) > 0 ? 'up-quote-color' : +getDetailProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) < 0 ? 'down-quote-color' : '']">{{ getDetailProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) }}</span>
+              <span
+                :class="[+getDetailProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) > 0 ? 'up-quote-color' : +getDetailProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) < 0 ? 'down-quote-color' : '']">{{
+                    getDetailProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList))
+                }}</span>
             </template>
             <!-- 市值 -->
             <template #marketamount="{ record }">
@@ -35,7 +43,11 @@
         </template>
         <!-- 持仓盈亏 -->
         <template #profitloss="{ record }">
-          <span :class="[+useProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) > 0 ? 'up-quote-color' : +useProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) < 0 ? 'down-quote-color' : '']">{{ record.averageprice ? useProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) : '--' }}</span>
+          <span
+            :class="[+useProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) > 0 ? 'up-quote-color' : +useProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) < 0 ? 'down-quote-color' : '']">{{
+                record.averageprice ? useProfitloss(record, findGoodsCode(record.goodsid, record.goodscode, swapList)) :
+                  '--'
+            }}</span>
         </template>
         <template #buyorsell="{ record }">
           <span>{{ getBuyOrSellName(record.buyorsell) }}</span>
@@ -46,7 +58,8 @@
       </a-table>
     </template>
   </mtp-table-scroll>
-  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="positionList" :swapList="swapList" @cancel="clsoeAction"></component>
+  <component :is="componentId" v-if="componentId" :selectedRow="selectedRow" :tableList="positionList"
+    :swapList="swapList" @cancel="clsoeAction"></component>
 </template>
 
 <script lang="ts">
@@ -85,7 +98,7 @@ export default defineComponent({
     order_closed: defineAsyncComponent(() => import('./components/swap_commodity_contract_summary_order_closed/index.vue')), // 平仓
   },
   setup(props) {
-    const { buttons } = props.parentComponent;
+    const { auth } = props.parentComponent;
     const { positionList, swapList, getHoldsList, getSwapList, getTradeHolderDetail, useProfitloss } = useHazardRates();
     // 表格列表数据
     const { loading } = queryTableList<QueryTradePositionRsp>();
@@ -145,7 +158,7 @@ export default defineComponent({
       columns, registerColumn, updateColumn,  // 表头
       expandedRowKeys, selectedRow, Rowclick, // 表格折腾面板数据与单击、双击事件
       componentId, closeComponent, openComponent,  // 控制异步组件
-      buttons, // 表格按钮
+      auth, // 表格按钮
       loading,
       positionList,
       formatTime,

+ 9 - 5
src/views/report/components/filter/index.vue

@@ -2,16 +2,20 @@
   <!-- 报表通用过滤 -->
   <FilterOption>
     <template #before>
-      <a-select label-in-value class="conditionSelect" style="width: 120px" v-model:value="selectedReportType" @change="reportTypeChange" placeholder="请选择报表类型">
+      <a-select label-in-value class="conditionSelect" style="width: 120px" v-model:value="selectedReportType"
+        @change="reportTypeChange" placeholder="请选择报表类型">
         <a-select-option v-for="item in reportType" :key="item.value">
           {{ item.lable }}
         </a-select-option>
       </a-select>
       <a-space direction="vertical">
-        <a-month-picker v-model:value="time" :allowClear="false" @change="timeChange" class="commonDatePicker" v-if="isMonth()" />
-        <a-date-picker v-model:value="time" :allowClear="false" v-else @change="timeChange" class="commonDatePicker" :format="dateFormat" />
+        <a-month-picker v-model:value="time" :allowClear="false" @change="timeChange" class="commonDatePicker"
+          v-if="isMonth()" />
+        <a-date-picker v-model:value="time" :allowClear="false" v-else @change="timeChange" class="commonDatePicker"
+          :format="dateFormat" />
       </a-space>
-      <a-select label-in-value v-if="showUser" class="conditionSelect ml10" style="width: 120px" v-model:value="selectedUser" @change="userChange" placeholder="请选择交易用户">
+      <a-select label-in-value v-if="showUser" class="conditionSelect ml10" style="width: 120px"
+        v-model:value="selectedUser" @change="userChange" placeholder="请选择交易用户">
         <a-select-option v-for="item in userList" :key="item.value">
           {{ item.lable }}
         </a-select-option>
@@ -37,7 +41,7 @@ export default defineComponent({
   props: {
     showUser: {
       type: Boolean,
-      default: true,
+      default: false,
     },
   },
   setup(props, context) {

Vissa filer visades inte eftersom för många filer har ändrats