const flowPacket = { template: `
{{lang.buy_package}}
{{lang.limit_time_flow}} {{lang.unlimited_traffic}}

{{currencyPrefix}}{{getDisplayPrice(item) | filterMoney}}

{{item.name}}

{{lang.flow_packet_list}}
{{lang.flow_packet_list}}
`, mixins: [mixin], components: { pagination }, filters: { filterMoney (money) { if (isNaN(money)) { return '0.00'; } else { const temp = `${money}`.split('.'); return parseInt(temp[0]).toLocaleString() + '.' + (temp[1] || '00'); } }, formateTime (time) { if (time && time !== 0) { return formateDate(time * 1000); } else { return "--"; } }, }, data () { return { hasFlow: true, packageLoading: false, submitLoading: false, packageList: [], curPackageId: '', currencyPrefix: JSON.parse(localStorage.getItem("common_set_before")).currency_prefix, filterType: 0, // 1: 不限时, 0: 限时 sliderValue: 10, // 滑动条的值 showSlider: false, // 是否显示滑动条 sliderMin: 0, sliderMax: 100, flowPacketList: [], flowPacketLoading: false, flowParams: { page: 1, limit: 20, pageSizes: [20, 50, 100], total: 0 }, showFlowListDialog: false, // 控制流量包列表弹窗 }; }, props: { id: { type: Number | String, required: true, }, showPackage: { type: Boolean }, module: { type: String, default: 'mf_cloud_mysql' }, lineType: { type: String, default: 'bw' }, displayMode: { type: String, default: 'inline' // inline | dialog (401使用dialog) } }, mounted () { this.hasFlow = this.addons_js_arr.includes('FlowPacket'); if (this.hasFlow) { this.getPackageList(); this.getFlowPacketList(); } }, computed: { showFlowPacketList() { const hiddenModules = ['mf_dcim', 'remf_dcim']; return !hiddenModules.includes(this.module); }, // 处理滑动条空值问题 sliderValueComputed: { get () { return this.sliderValue === '' || this.sliderValue === null ? this.sliderMin : this.sliderValue; }, set (val) { this.sliderValue = val; } }, // 根据 filterType 筛选流量包 filteredPackageList () { return this.packageList.filter(item => item.long_term_valid === this.filterType); }, // 获取当前选中的流量包 currentPackage () { return this.packageList.find(item => item.id === this.curPackageId); }, // 滑动条标记 sliderMarks () { return { [this.sliderMin]: this.sliderMin + 'GB', [this.sliderMax]: this.sliderMax + 'GB' }; }, // 是否有限时流量包 hasLimitTime () { return this.packageList.some(item => item.long_term_valid === 0); }, // 是否有不限时流量包 hasUnlimitedTime () { return this.packageList.some(item => item.long_term_valid === 1); }, // 动态容器组件 listWrapper () { return this.displayMode === 'dialog' ? 'el-dialog' : 'div'; }, // 动态容器属性 listWrapperProps () { if (this.displayMode === 'dialog') { return { width: "1200px", visible: this.showFlowListDialog, 'custom-class': 'flow-list-dialog' }; } return { class: 'flow-packet-list' }; }, // 动态容器事件 listWrapperEvents () { if (this.displayMode === 'dialog') { return { 'update:visible': (val) => { this.showFlowListDialog = val; } }; } return {}; }, }, watch: { // 监听筛选类型变化,自动选中第一个 filteredPackageList (newList) { if (newList.length > 0) { this.curPackageId = newList[0].id; this.choosePackage(newList[0]); } } }, methods: { async getPackageList () { try { this.packageLoading = true; const res = await getFlowPacket({ id: this.id, page: 1, limit: 9999, }); this.packageList = res.data.data.list; if (this.packageList.length === 0) { this.$emit('cancledialog', false); return; } // 根据数据设置默认 filterType 和选中流量包 const limitTimeList = this.packageList.filter(item => item.long_term_valid === 0); const unlimitedTimeList = this.packageList.filter(item => item.long_term_valid === 1); // 优先选限时,只有不限时时才选不限时 if (limitTimeList.length > 0) { this.filterType = 0; this.curPackageId = limitTimeList[0].id; this.choosePackage(limitTimeList[0]); } else if (unlimitedTimeList.length > 0) { this.filterType = 1; this.curPackageId = unlimitedTimeList[0].id; this.choosePackage(unlimitedTimeList[0]); } this.packageLoading = false; } catch (error) { this.packageLoading = false; } }, choosePackage (item) { this.curPackageId = item.id; // 如果 billing_mode = 1,显示滑动条 if (item.billing_mode === 1) { this.showSlider = true; this.sliderMin = item.min_capacity; this.sliderMax = item.max_capacity; this.sliderValue = item.min_capacity; } else { this.showSlider = false; } }, async handlerPackage () { try { this.submitLoading = true; const params = { id: this.id, flow_packet_id: this.curPackageId, }; // 如果是范围流量包,传递滑动条的值 if (this.currentPackage && this.currentPackage.billing_mode === 1) { params.selected_capacity = this.sliderValue; } const res = await buyFlowPacket(params); this.$emit('sendpackid', res.data.data.id); this.submitLoading = false; } catch (error) { this.submitLoading = false; this.$message.error(error.data.msg); } }, cancleDialog () { this.$emit('cancledialog', false); }, // 获取流量包列表 async getFlowPacketList () { // mf_dcim 和 remf_dcim 不请求流量包列表 if (!this.showFlowPacketList) return; try { this.flowPacketLoading = true; const res = await getFlowPacketByModule(this.module, { id: this.id, ...this.flowParams }); this.flowPacketList = res.data.data.list || []; this.flowParams.total = res.data.data.count || 0; this.flowPacketLoading = false; } catch (error) { this.flowPacketLoading = false; this.$message.error(error.data.msg); } }, // 分页变化 handleFlowPageChange (page) { this.flowParams.page = page; this.getFlowPacketList(); }, handleFlowPageSizeChange (e) { this.flowParams.limit = e; this.getFlowPacketList(); }, // 计算显示价格 getDisplayPrice (item) { let price; if (item.billing_mode === 0) { price = item.price; } else { if (item.id === this.curPackageId) { price = this.sliderValue * item.price; } else { price = item.min_capacity * item.price; } } return Math.round(price * 100) / 100; }, // 切换筛选类型时移除焦点 onFilterTypeChange () { document.activeElement?.blur(); }, // 打开流量包列表弹窗 openFlowListDialog () { this.showFlowListDialog = true; this.getFlowPacketList(); } }, };