|
|
@@ -1,90 +1,71 @@
|
|
|
-import { ref, computed } from 'vue'
|
|
|
-import { v4 } from 'uuid'
|
|
|
+import { ref, reactive, computed } from 'vue'
|
|
|
import Long from 'long'
|
|
|
-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 { validateAction } from '@/common/setup/form'
|
|
|
+import { requestResultLoadingAndInfo } from '@/common/methods/request/resultInfo'
|
|
|
+import { InternalEnableTradeDetailReq, InternalEnableTradeDetailRsp } from '@/services/go/ermcp/hedgedItem/interface'
|
|
|
import { queryInternalEnableTradeDetail } from '@/services/go/ermcp/hedgedItem'
|
|
|
-import { InnerTradeLinkRsp } from '@/services/proto/hedgedItem/interface'
|
|
|
-import { innerTradeLink } from '@/services/proto/hedgedItem'
|
|
|
+import { ManageAmendOrderReq } from '@/services/proto/hedgedItem/interface'
|
|
|
+import { manageAmendOrder } from '@/services/proto/hedgedItem'
|
|
|
import { getAreaUserId } from '@/services/bus/user'
|
|
|
+import { getGoodsQuoteList } from '@/services/bus/goods'
|
|
|
+import { getTableColumns } from "@/common/export/table"
|
|
|
+import { geLoginID_number } from '@/services/bus/login'
|
|
|
+import { useTradeAccount } from '@/hooks/account'
|
|
|
|
|
|
-export function useForm(selectedRow: InternalUncorrelatedTradeDetailRsp) {
|
|
|
- const { tradeid, goodsid, tradelot } = selectedRow;
|
|
|
- const { tableList, queryTable } = queryTableList<InternalEnableTradeDetailRsp>(true, 2); // 表格列表数据
|
|
|
+export function useForm() {
|
|
|
+ const { futuresAccountList: accountList } = useTradeAccount();
|
|
|
const loading = ref<boolean>(false);
|
|
|
+ const formElement = ref<HTMLElement>();
|
|
|
+ const tableList = ref<InternalEnableTradeDetailRsp[]>([]);
|
|
|
+ const goodsList = ref(getGoodsQuoteList()); // 合约列表
|
|
|
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?.relatedlot ?? 0;
|
|
|
- }
|
|
|
- return pre;
|
|
|
- }, 0);
|
|
|
+ const formData = reactive<ManageAmendOrderReq>({
|
|
|
+ AccountID: undefined, // 内部期货子账户
|
|
|
+ BuyOrSell: undefined, // 方向-0:买
|
|
|
+ GoodsID: undefined, // 商品ID
|
|
|
+ ChannelBuildType: undefined, // 下单类型(开平标志-0:无
|
|
|
+ CloseType: 0, // 平仓类型(平仓标志-0:平仓
|
|
|
+ TradePrice: undefined, // 成交价格
|
|
|
+ TradeQty: undefined, // 成交数量
|
|
|
+ CreatorSrc: 2, // 创建人来源-1:管理端
|
|
|
+ CreatorID: geLoginID_number()!, // 创建人ID
|
|
|
+ HedgeFlag: 0, // 4:套期保值5:单边6:移仓
|
|
|
+ SpotContractID: 0, // RelatedTradeType=4:套期保值时
|
|
|
})
|
|
|
|
|
|
+ const rules = {
|
|
|
+ GoodsID: [{ required: true, type: 'number', message: '请选择期货合约' }],
|
|
|
+ BuyOrSell: [{ required: true, type: 'number', message: '请选择方向' }],
|
|
|
+ AccountID: [{ required: true, type: 'number', message: '请选择账户' }],
|
|
|
+ ChannelBuildType: [{ required: true, type: 'number', message: '请选择下单类型' }],
|
|
|
+ TradePrice: [{ required: true, trigger: 'blur', type: 'number', message: '请输入价格' }],
|
|
|
+ TradeQty: [{ required: true, trigger: 'blur', type: 'number', message: '请输入数量' }]
|
|
|
+ }
|
|
|
+
|
|
|
// 自定义表格选择项
|
|
|
const rowSelection = computed(() => ({
|
|
|
columnTitle: '选择',
|
|
|
+ type: 'radio',
|
|
|
selectedRowKeys: selectedRowKeys.value,
|
|
|
onChange: (keys: number[]) => {
|
|
|
selectedRowKeys.value = keys;
|
|
|
},
|
|
|
- onSelect: (record: InternalEnableTradeDetailRsp, selected: boolean) => {
|
|
|
- if (!selected) {
|
|
|
- // 未选中的取消关联量
|
|
|
- record.relatedlot = undefined;
|
|
|
- }
|
|
|
- },
|
|
|
}))
|
|
|
|
|
|
- // 计算本次关联数量
|
|
|
- const calcRelatedqty = (record: InternalEnableTradeDetailRsp) => {
|
|
|
- const { relatedlot, agreeunit, convertratio } = record;
|
|
|
- if (relatedlot) {
|
|
|
- return relatedlot * agreeunit * convertratio;
|
|
|
- }
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- // 表格通用逻辑
|
|
|
- const composeTable = handleComposeTable<InternalEnableTradeDetailRsp>({
|
|
|
- tableName: 'table_pcweb_hedgeditem_futures_in_relation',
|
|
|
- queryFn: () => {
|
|
|
+ // 选择期货合约
|
|
|
+ const changeGoods = () => {
|
|
|
+ tableList.value = [];
|
|
|
+ if (formData.GoodsID) {
|
|
|
const param: InternalEnableTradeDetailReq = {
|
|
|
areauserid: getAreaUserId(),
|
|
|
- goodsid: goodsid,
|
|
|
+ goodsid: formData.GoodsID,
|
|
|
}
|
|
|
- queryTable(queryInternalEnableTradeDetail, 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;
|
|
|
- })
|
|
|
+ queryInternalEnableTradeDetail(param).then((res) => {
|
|
|
+ tableList.value = res;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// 表单提交
|
|
|
const formSubmit = (callback?: () => void) => {
|
|
|
@@ -92,52 +73,37 @@ export function useForm(selectedRow: InternalUncorrelatedTradeDetailRsp) {
|
|
|
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 > tradelot) {
|
|
|
- message.error('关联数量不能大于成交手数');
|
|
|
- } else {
|
|
|
- loading.value = true;
|
|
|
- const result: Promise<InnerTradeLinkRsp>[] = [];
|
|
|
-
|
|
|
- seledtedRows.forEach((e) => {
|
|
|
- result.push(innerTradeLink({
|
|
|
- TradeId: Long.fromString(tradeid), // 内部成交单号
|
|
|
- HedgeFlag: 13, // 投机套保标志
|
|
|
- SpotContractID: Long.fromString(e.hedgeditemid), // 现货合同ID
|
|
|
- RelatedLot: e.relatedlot!, // 关联手数
|
|
|
- RelatedMode: 2, // 关联模式
|
|
|
- CreatorSrc: 2, // 创建来源
|
|
|
- CreatorID: geLoginID_number()!, // 创建人
|
|
|
- ClientTicket: v4() // 客户端流水号
|
|
|
- }))
|
|
|
- })
|
|
|
-
|
|
|
- Promise.all(result).then(() => {
|
|
|
- message.success('关联成功');
|
|
|
- callback && callback();
|
|
|
- }).catch((err) => {
|
|
|
- message.error('关联失败:' + err);
|
|
|
- }).finally(() => {
|
|
|
- loading.value = false;
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
- message.error('请输入关联手数');
|
|
|
- }
|
|
|
+ formData.HedgeFlag = 13;
|
|
|
+ formData.SpotContractID = Long.fromString(seledtedRows[0].hedgeditemid);
|
|
|
} else {
|
|
|
- message.error('请选择关联订单');
|
|
|
+ formData.HedgeFlag = 0;
|
|
|
+ formData.SpotContractID = 0;
|
|
|
}
|
|
|
+
|
|
|
+ validateAction(formElement, formData).then((param) => {
|
|
|
+ requestResultLoadingAndInfo(manageAmendOrder, param, loading, ['补单关联成功', '补单关联失败:']).then(() => {
|
|
|
+ callback && callback();
|
|
|
+ }).catch(() => {
|
|
|
+ loading.value = false;
|
|
|
+ })
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
+ const { columns, registerColumn } = getTableColumns();
|
|
|
+ registerColumn('table_pcweb_hedgeditem_futures_in_relation');
|
|
|
+
|
|
|
return {
|
|
|
+ formElement,
|
|
|
+ formData,
|
|
|
loading,
|
|
|
+ rules,
|
|
|
+ goodsList,
|
|
|
+ accountList,
|
|
|
tableList,
|
|
|
selectedRowKeys,
|
|
|
rowSelection,
|
|
|
- currentQty,
|
|
|
columns,
|
|
|
- calcRelatedqty,
|
|
|
+ changeGoods,
|
|
|
formSubmit,
|
|
|
}
|
|
|
}
|