<template>
    <view :style="page_style">
        <view :style="page_img_style">
            <scroll-view :scroll-y="true" class="ht" @scroll="on_scroll_event" @scrolltolower="on_scroll_lower_event" @scrolltoupper="on_scroll_upper_event" lower-threshold="60" scroll-with-animation="true">
                <!-- 头部小程序兼容 -->
                <view class="pr header">
                    <componentDiyHeader :propKey="header_data.id" :propValue="header_data.com_data" :propScrollTop="head_scroll_top" @onImmersionModelCallBack="immersion_model_call_back" @onLocationBack="choice_location_back"></componentDiyHeader>
                </view>
                <view :style="content_padding">
                    <view class="content flex-col" :style="'padding-top:calc(' + (temp_is_header_top ? temp_header_top + temp_sticky_top + 'px)' : '0px)')">
                        <view v-for="item in tabs_data" :key="item.key">
                            <template v-if="item.is_enable == '1'">
                                <componentDiyTabs v-if="item.key == 'tabs'" :propIndex="is_immersive_style_and_general_safe_distance_value ? item.index : -1" :propContentPadding="content_padding" :propValue="item.com_data" :propTop="get_tabs_data_prop_top" :propStickyTop="get_tabs_data_prop_sticky_top" :propIsImmersionModel="is_immersion_model && is_the_safe_distance_enabled && item.com_data.content.tabs_top_up == '1'" :propNavIsTop="is_header_top" :propTabsIsTop="true" @onComputerHeight="tabs_height_event" @onTabsTap="tabs_click_event"></componentDiyTabs>
                                <componentDiyTabsCarousel v-else-if="item.key == 'tabs-carousel'" :propIndex="is_immersive_style_and_general_safe_distance_value ? item.index : -1" :propContentPadding="content_padding" :propValue="item.com_data" :propTop="get_tabs_data_prop_top" :propStickyTop="get_tabs_data_prop_sticky_top" :propIsImmersionModel="is_immersion_model && is_the_safe_distance_enabled" :propScrollTop="scroll_top" :propTabsIsTop="true" @onComputerHeight="tabs_height_event" @onTabsTap="tabs_click_event" @onVideoPlay="video_play"></componentDiyTabsCarousel>
                            </template>
                        </view>
                        <template v-if="is_tabs_type">
                            <template v-if="diy_data.length > 0">
                                <view v-for="(item, index) in diy_data" :key="index" :style="'margin-top:' + (['float-window'].includes(item.key) ? '0rpx;z-index:1' : -(item.com_data.style.common_style.floating_up * 2 || 0) + 'rpx;z-index:' + (!isEmpty(item.com_data.style.common_style.module_z_index) ? item.com_data.style.common_style.module_z_index : 0))">
                                    <!-- 基础组件 -->
                                    <template v-if="item.is_enable == '1'">
                                        <componentDiySearch v-if="item.key == 'search'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiySearch>
                                        <componentDiyCarousel v-else-if="item.key == 'carousel'" :propOuterContainerPadding="outer_container_padding" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data" @onVideoPlay="video_play"></componentDiyCarousel>
                                        <componentDiyNavGroup v-else-if="item.key == 'nav-group'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyNavGroup>
                                        <componentDiyUserInfo v-else-if="item.key == 'user-info'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyUserInfo>
                                        <componentDiyNotice v-else-if="item.key == 'notice'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyNotice>
                                        <componentDiyVideo v-else-if="item.key == 'video'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyVideo>
                                        <componentDiyArticleList v-else-if="item.key == 'article-list'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyArticleList>
                                        <componentDiyArticleTabs v-else-if="item.key == 'article-tabs'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data" :propTop="get_diy_prop_top(item.com_data)" :propScrollTop="scroll_top" :propCustomNavHeight="get_diy_custom_nav_height(item.com_data)" :propIsTabsUseSafeDistance="getPropIsTabsUseSafeDistance"></componentDiyArticleTabs>
                                        <componentDataTabs v-else-if="item.key == 'data-tabs'" :ref="'diy_goods_buy' + index" :propIndex="get_prop_index(item)" :propDiyIndex="index" :propKey="item.id + index" :propValue="item.com_data" :propTop="get_diy_prop_top(item.com_data)" :propScrollTop="scroll_top" :propCustomNavHeight="get_diy_custom_nav_height(item.com_data)" :propIsTabsUseSafeDistance="getPropIsTabsUseSafeDistance" @goods_buy_event="goods_buy_event"></componentDataTabs>
                                        <componentDiyGoodsTabs v-else-if="item.key == 'goods-tabs'" :ref="'diy_goods_buy' + index" :propIndex="get_prop_index(item)" :propDiyIndex="index" :propKey="item.id + index" :propValue="item.com_data" :propTop="get_diy_prop_top(item.com_data)" :propScrollTop="scroll_top" :propCustomNavHeight="get_diy_custom_nav_height(item.com_data)" :propIsTabsUseSafeDistance="getPropIsTabsUseSafeDistance" @goods_buy_event="goods_buy_event"></componentDiyGoodsTabs>
                                        <componentDiyGoodsList v-else-if="item.key == 'goods-list'" :ref="'diy_goods_buy' + index" :propIndex="get_prop_index(item)" :propDiyIndex="index" :propKey="item.id + index" :propValue="item.com_data" @goods_buy_event="goods_buy_event"></componentDiyGoodsList>
                                        <componentDiyDataMagic v-else-if="item.key == 'data-magic'" :propOuterContainerPadding="outer_container_padding" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyDataMagic>
                                        <componentDiyCustom v-else-if="item.key == 'custom'" :propOuterContainerPadding="outer_container_padding" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyCustom>
                                        <componentDiyImgMagic v-else-if="item.key == 'img-magic'" :propOuterContainerPadding="outer_container_padding" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyImgMagic>
                                        <componentDiyHotZone v-else-if="item.key == 'hot-zone'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyHotZone>
                                        <componentDiySeckill v-else-if="item.key == 'seckill'" :propOuterContainerPadding="outer_container_padding" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiySeckill>
                                        <!-- 插件 -->
                                        <componentDiyCoupon v-else-if="item.key == 'coupon'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyCoupon>
                                        <!-- 工具组件 -->
                                        <componentDiyFloatWindow v-else-if="item.key == 'float-window'" :propKey="item.id + index" :propValue="item.com_data"></componentDiyFloatWindow>
                                        <componentDiyTitle v-else-if="item.key == 'title'" :propKey="item.id + index" :propIndex="get_prop_index(item)" :propValue="item.com_data"></componentDiyTitle>
                                        <componentDiyAuxiliaryLine v-else-if="item.key == 'row-line'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyAuxiliaryLine>
                                        <componentDiyRichText v-else-if="item.key == 'rich-text'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyRichText>
                                        <componentDiyAuxiliaryBlank v-else-if="item.key == 'auxiliary-blank'" :propIndex="get_prop_index(item)" :propKey="item.id + index" :propValue="item.com_data"></componentDiyAuxiliaryBlank>
                                    </template>
                                </view>
                            </template>

                            <!-- diy底部卡槽 -->
                            <slot name="diy-bottom-content"></slot>
                            <slot name="diy-bottom-common"></slot>
                        </template>
                        <template v-else>
                            <!-- 商品九宫格列表 -->
                            <view v-if="goods_list.length > 0" class="padding-horizontal-main padding-top-main oh">
                                <component-goods-list :propData="{ style_type: goods_show_type_value, goods_list: goods_list, random: random_value }" :propLabel="plugins_label_data" :propCurrencySymbol="currency_symbol"></component-goods-list>
                            </view>
                            <view v-else class="pr">
                                <!-- 提示信息 -->
                                <component-no-data :propStatus="goods_list_loding_status" :propMsg="goods_list_loding_msg" propLoadingLogoTop="30%"></component-no-data>
                            </view>

                            <!-- diy底部卡槽 -->
                            <template v-if="goods_bottom_line_status">
                                <slot name="diy-bottom-content"></slot>
                            </template>
                            <slot name="diy-bottom-common"></slot>
                        </template>

                        <view class="z-i-deep">
                            <!-- 商品购买 -->
                            <component-goods-buy ref="goods_buy" v-on:CartSuccessEvent="goods_cart_back_event"></component-goods-buy>
                            <!-- 视频播放 -->
                            <uni-popup ref="popup" type="center" border-radius="20rpx" :mask-click="false">
                                <view class="flex-col align-c jc-c gap-10">
                                    <video :src="video_src" id="carousel_video" :autoplay="true" :controls="true" show-fullscreen-btn class="radius-md" :style="{ width: popup_width, height: popup_height }"></video>
                                    <iconfont name="icon-qiandao-tancguanbi" size="56rpx" color="#ccc" propContainerDisplay="flex" @tap="video_close"></iconfont>
                                </view>
                            </uni-popup>
                        </view>
                    </view>
                </view>
                <!-- 当前diy页面底部菜单（非公共底部菜单） -->
                <block v-if="is_show_footer">
                    <componentDiyFooter :propKey="footer_data.id" :propValue="footer_data.com_data" @onFooterHeight="footer_height_value_event"></componentDiyFooter>
                    <view v-if="footer_height_value > 0" :style="'height:' + footer_height_value + 'rpx;'"></view>
                </block>

                <!-- 底部卡槽 -->
                <slot name="bottom"></slot>
            </scroll-view>
        </view>
    </view>
</template>

<script>
    const app = getApp();
    import { isEmpty, common_styles_computer, background_computer, padding_computer } from '@/common/js/common/common.js';
    import componentDiyHeader from '@/components/diy/header';
    import componentDiyFooter from '@/components/diy/footer';
    import componentDiyTabs from '@/components/diy/tabs';
    import componentDiySearch from '@/components/diy/search';
    import componentDiyCarousel from '@/components/diy/carousel';
    import componentDiyUserInfo from '@/components/diy/user-info';
    import componentDiyNotice from '@/components/diy/notice';
    import componentDiyVideo from '@/components/diy/video';
    import componentDiyArticleList from '@/components/diy/article-list';
    import componentDiyArticleTabs from '@/components/diy/article-tabs';
    import componentDiyHotZone from '@/components/diy/hot-zone';
    import componentDiyCoupon from '@/components/diy/coupon';
    import componentDiyFloatWindow from '@/components/diy/float-window';
    import componentDiyTitle from '@/components/diy/title';
    import componentDiyAuxiliaryLine from '@/components/diy/auxiliary-line';
    import componentDiyRichText from '@/components/diy/rich-text';
    import componentDiyAuxiliaryBlank from '@/components/diy/auxiliary-blank';
    import componentDiyNavGroup from '@/components/diy/nav-group';
    import componentDiyGoodsList from '@/components/diy/goods-list';
    import componentDiyGoodsTabs from '@/components/diy/goods-tabs';
    import componentDiyDataMagic from '@/components/diy/data-magic';
    import componentDiyCustom from '@/components/diy/custom';
    import componentDiyImgMagic from '@/components/diy/img-magic';
    import componentDiySeckill from '@/components/diy/seckill';
    import componentDiyTabsCarousel from '@/components/diy/tabs-carousel';
    import componentDataTabs from '@/components/diy/data-tabs';
    import componentGoodsList from '@/components/goods-list/goods-list';
    import componentNoData from '@/components/no-data/no-data';
    import componentBottomLine from '@/components/bottom-line/bottom-line';
    import componentGoodsBuy from '@/components/goods-buy/goods-buy';
    import componentSearch from '@/components/search/search';
    var system = app.globalData.get_system_info(null, null, true);
    var sys_width = app.globalData.window_width_handle(system.windowWidth);

    // 状态栏高度
    var bar_height = parseInt(app.globalData.get_system_info('statusBarHeight', 0));
    // #ifdef MP-TOUTIAO
    bar_height = 0;
    // #endif
    export default {
        name: 'diy',
        props: {
            propValue: {
                type: Object,
                default: () => ({}),
            },
            propDataId: {
                type: [String, Number],
                default: '',
            },
            propKey: {
                type: [String, Number],
                default: 0,
            },
        },
        components: {
            componentDiyHeader,
            componentDiyFooter,
            componentDiyTabs,
            componentDiySearch,
            componentDiyCarousel,
            componentDiyUserInfo,
            componentDiyNotice,
            componentDiyVideo,
            componentDiyArticleList,
            componentDiyArticleTabs,
            componentDiyHotZone,
            componentDiyCoupon,
            componentDiyAuxiliaryLine,
            componentDiyRichText,
            componentDiyFloatWindow,
            componentDiyTitle,
            componentDiyAuxiliaryBlank,
            componentDiyNavGroup,
            componentDiyGoodsList,
            componentDiyGoodsTabs,
            componentDiyDataMagic,
            componentDiyCustom,
            componentDiyImgMagic,
            componentDiySeckill,
            componentDiyTabsCarousel,
            componentDataTabs,
            componentGoodsList,
            componentNoData,
            componentBottomLine,
            componentGoodsBuy,
            componentSearch,
        },
        data() {
            return {
                // 基础配置
                currency_symbol: app.globalData.currency_symbol(),
                // 是否有选项卡
                is_tabs: false,
                // 是否是模块数据或者是九宫格商品分类样式数据， 默认模块数据
                is_tabs_type: true,
                // 是否开启沉浸模式
                is_immersion_model: false,

                // 5,7,0 是误差，， 10 是下边距，66是高度，bar_height是不同小程序下的导航栏距离顶部的高度
                // #ifdef MP
                sticky_top: bar_height + 5 + 10,
                // #endif
                // #ifdef H5 || MP-TOUTIAO
                sticky_top: bar_height + 7 + 10,
                // #endif
                // #ifdef APP
                sticky_top: bar_height + 0 + 10,
                // #endif
                header_top: '',
                temp_sticky_top: 0,
                temp_header_top: '0px',
                is_header_top: false,
                temp_is_header_top: false,
                scroll_top: 0,
                // 选项卡高度
                tabs_height: 0,

                header_data: {},
                footer_data: {},
                // 选项卡数据
                tabs_data: {},
                diy_data: [],
                page_style: '',
                page_img_style: '',
                is_show_footer: false,
                tabs_home_id: this.propDataId,
                // 商品列表
                goods_list: [],
                goods_total: 0,
                goods_page_total: 0,
                goods_page: 1,
                // 数据展示样式（0图文、1九方格）
                goods_show_type_value: 1,
                // 增加随机数，避免无法监听数据列表内部数据更新
                random_value: 0,
                // 标签插件
                plugins_label_data: null,
                goods_list_loding_status: 1,
                goods_list_loding_msg: '',
                goods_bottom_line_status: false,
                // 判断数据是否在加载中
                data_is_loading: 0,
                // 缓存key
                cache_key: app.globalData.data.cache_diy_data_key,
                // 底部导航高度
                footer_height_value: 0,
                // 商品ref索引
                goods_index: 0,
                // 视频播放逻辑
                video_src: '',
                popup_width: '0rpx',
                popup_height: '0rpx',
                // 顶部导航是否换行
                is_search_alone_row: false,
                data_alone_row_space: 0,
                content_padding: '',
                outer_container_padding: 0,

                // 滚动延迟器
                head_scroll_top: 0,
                scroll_throttle_timeout: null,
                // 是否开启安全距离
                is_the_safe_distance_enabled: false,
                // 是否开启置顶
                is_tabs_data_topped: false,
            };
        },
        computed: {
            get_tabs_data_prop_top() {
                // 开启了沉浸式时的处理
                if (this.is_immersion_model) {
                    // 并且开启了安全距离
                    return this.is_the_safe_distance_enabled ? this.temp_header_top : 0;
                } else {
                    return this.temp_header_top;
                }
            },
            get_tabs_data_prop_sticky_top() {
                // 开启了沉浸式时的处理
                if (this.is_immersion_model) {
                    // 并且开启了安全距离
                    return this.is_the_safe_distance_enabled ? this.temp_sticky_top : 0;
                } else {
                    return this.temp_sticky_top;
                }
            },
            get_prop_index() {
                return (item) => {
                    return this.is_the_safe_distance_enabled && this.tabs_data.length == 0 ? item.index : -1;
                }
            },
            get_diy_prop_top() {
                return (item) => {
                    // 不开启沉浸模式时的处理
                    if (!this.is_immersion_model) {
                        return this.temp_sticky_top + this.tabs_height;
                    } else {
                        // 开启沉浸模式且开启选项卡置顶时
                        if (this.is_tabs_data_topped) {
                            return this.tabs_height;
                        } else {
                            // 开启安全距离
                            let is_general_safe_distance_num = this.temp_sticky_top;
                            // #ifdef H5 || MP-TOUTIAO
                            is_general_safe_distance_num = this.is_header_top ? this.temp_sticky_top : 0
                            // #endif
                            if (this.is_the_safe_distance_enabled) {
                                return is_general_safe_distance_num;
                            } else {
                                if (item?.content?.is_general_safe_distance == '1') {
                                    return is_general_safe_distance_num;
                                } else {
                                    return 0;
                                }
                            }
                        }
                    }
                }  
            },
            get_diy_custom_nav_height() {
                return (item) => {
                    let header_height = (this.is_search_alone_row ? 66 + this.data_alone_row_space : 33);
                    // #ifdef H5 || MP-TOUTIAO
                    header_height = this.is_header_top ? header_height : 0;
                    // #endif
                    // 不开启沉浸模式时的处理
                    if (!this.is_immersion_model) {
                        return header_height;
                    } else {
                        // 开启沉浸模式且开启选项卡置顶时
                        if (this.is_tabs_data_topped) {
                            return 0;
                        } else {
                            // 开启沉浸模式时并且开启安全距离
                            if (this.is_the_safe_distance_enabled) {
                                return this.is_search_alone_row ? 66 + this.data_alone_row_space : 33;
                            } else {
                                if (item?.content?.is_general_safe_distance == '1') {
                                    return header_height;
                                } else {
                                    return 0;
                                }
                            }
                        }   
                    }
                }
            },
            getPropIsTabsUseSafeDistance() {
                let is_tabs_use_safe_distance = this.is_immersion_model;
                // #ifdef H5 || MP-TOUTIAO
                is_tabs_use_safe_distance = this.is_immersion_model && this.is_header_top;
                // #endif
                return is_tabs_use_safe_distance || !this.is_immersion_model;
            }
        },
        watch: {
            propKey(val) {
                // 如果当前存在别的diy或者商品分类tabs则不更新数据
                if ((this.tabs_id || null) == null) {
                    // 初始化
                    this.init();
                }
            },
        },
        created() {
            // 初始化配置
            this.init_config();

            // 初始化
            this.init();
        },
        methods: {
            isEmpty,
            // 初始化配置
            init_config(status) {
                if ((status || false) == true) {
                    // 是否显示底部菜单，如果当前地址已经存在系统底部菜单中则不显示当前diy页面自定义的底部菜单
                    var is_show_footer = parseInt(this.propValue.header.com_data.content.bottom_navigation_show || 0) == 1;
                    var is_tabbar = app.globalData.is_tabbar_pages();
                    this.setData({
                        is_show_footer: is_show_footer && !is_tabbar,
                    });
                    // diy页面不显示底部菜单则设置底部菜单高度为0
                    if(!this.is_show_footer) {
                        // 存储diy页面底部菜单高度
                        if(app.globalData.current_page(false) == 'pages/diy/diy') {
                            app.globalData.app_diy_tabbar_height_save(0);
                        }
                    }
                } else {
                    app.globalData.is_config(this, 'init_config');
                }
            },

            // 初始化
            init() {
                const { header = {}, diy_data = [], tabs_data = [] } = this.propValue;
                // 头部的样式
                let header_style = header.com_data.style;
                let new_diy_index = 0;
                let new_tabs_data = [];
                let new_diy_data = [];
                if (tabs_data.length > 0) {
                    tabs_data.forEach((item) => {
                        // 修改item的内容
                        item = this.get_index_content(new_diy_index, header, header_style, item);
                        new_tabs_data.push(item);
                        new_diy_index++;
                    });
                    new_diy_data = diy_data;
                } else {
                    new_tabs_data = tabs_data;
                    // 过滤数据
                    diy_data.forEach((item) => {
                        // 判断是否是商品列表
                        if (item.com_name == 'float-window') {
                            item.index = -1;
                        } else {
                            // 修改item的内容
                            item = this.get_index_content(new_diy_index, header, header_style, item);
                            new_diy_data.push(item);
                            new_diy_index++;
                        }
                    });
                }
                const { padding_right = 0, padding_left = 0 } = header_style.common_style;
                const new_is_search_alone_row = header.com_data.content.data_alone_row_value.length > 0 ? true : false;
                const new_data_alone_row_space = parseInt(header_style.data_alone_row_space || 0);
                // tabs选项卡数据过滤
                this.setData({
                    header_data: header,
                    footer_data: this.propValue.footer,
                    diy_data: new_diy_data,
                    tabs_data: new_tabs_data,
                    page_style: common_styles_computer(header_style.common_style),
                    page_img_style: background_computer(header_style.common_style),
                    // 内间距
                    content_padding: `padding: 0px ${padding_right}px 0px ${padding_left}px;` + 'box-sizing:border-box;',
                    outer_container_padding: padding_right + padding_left,
                    // 判断顶部导航是否置顶
                    is_header_top: parseInt(header_style.up_slide_display) == 1 ? true : false,
                    is_tabs_data_topped: new_tabs_data[0]?.com_data?.content?.tabs_top_up == '1' || false,
                    temp_sticky_top: this.sticky_top,
                    temp_header_top: (new_is_search_alone_row ? 66 + new_data_alone_row_space : 33),
                    header_top: (new_is_search_alone_row ? 66 + new_data_alone_row_space : 33),
                    is_immersion_model: header_style.header_background_type !== 'color_image' && header_style.immersive_style == '1',
                    // 顶部导航高度是否变化--------------------------------------------------
                    is_search_alone_row: new_is_search_alone_row,
                    data_alone_row_space: new_data_alone_row_space,
                    is_immersive_style_and_general_safe_distance_value: header_style.immersive_style == '1' && header_style.general_safe_distance_value == '1',
                    is_the_safe_distance_enabled: header_style.immersive_style == '1' && header_style.general_safe_distance_value == '1',// diy_data是否开启安全距离
                });
                // 缓存数据
                uni.setStorageSync(this.cache_key + this.tabs_home_id, diy_data);
            },
            // 顶部导航沉浸模式回调
            // immersion_model_call_back(bool) {
            //     this.setData({
            //         is_immersion_model: bool,
            //     });
            // },
            get_index_content(new_diy_index, header, header_style, item) {
                item.index = new_diy_index;
                if (new_diy_index == 0) {
                    // 判断是否开启沉浸模式和是否开启安全距离 如果为true则除了选项卡和选项卡轮播外， 第一个组件则加上安全距离样式的padding_top加上顶部导航的高度和安全距离的高度
                    if (header_style.immersive_style == '1' && header_style.general_safe_distance_value == '1') {
                        let new_data = JSON.parse(JSON.stringify(item));
                        // 顶部导航的高度
                        let header_top_height = (header.com_data.content.data_alone_row_value.length > 0 ? parseInt(header.com_data.style.data_alone_row_space || 5) : 0) + 33 + (header.com_data.content.data_alone_row_value.length > 0 ? 33 : 0);
                        new_data.com_data.style.common_style.padding_top = parseInt(new_data.com_data.style.common_style.padding_top) + header_top_height;
                        return new_data;
                    }
                    return item;
                }
                return item;
            },
            // 选项卡回调更新数据
            tabs_click_event(tabs_id, bool, params = {}) {
                let new_data = [];
                this.setData({
                    is_tabs_type: bool,
                    tabs_id: tabs_id,
                });
                let new_params = {
                    ...params,
                    id: tabs_id,
                };
                if (tabs_id) {
                    new_data = uni.getStorageSync(this.cache_key + tabs_id) || [];
                    if (new_data.length > 0) {
                        // 先使用缓存数据展示
                        this.setData({
                            diy_data: new_data,
                        });
                        // 已有本地缓存则直接取远程有效数据（默认首次取的是远程缓存数据）
                        new_params['is_cache'] = 0;
                    }
                    // diy数据
                    if (bool) {
                        uni.showLoading({
                            title: this.$t('common.loading_in_text'),
                            mask: true,
                        });
                        uni.request({
                            url: app.globalData.get_request_url('index', 'diy'),
                            method: 'POST',
                            data: new_params,
                            dataType: 'json',
                            success: (res) => {
                                uni.hideLoading();
                                // 数据处理
                                let data = res.data.data.data;
                                if (res.data.code == 0) {
                                    new_data = data?.config.diy_data || [];
                                    uni.setStorageSync(this.cache_key + tabs_id, new_data);
                                    this.setData({
                                        diy_data: new_data,
                                    });
                                    // 是否需要重新加载数据
                                    if (parseInt(data.is_result_data_cache || 0) == 1) {
                                        this.tabs_click_event(tabs_id, bool, { is_cache: 0 });
                                    }
                                } else {
                                    app.globalData.showToast(res.data.msg);
                                }
                            },
                            fail: () => {
                                uni.hideLoading();
                                app.globalData.showToast(this.$t('common.internet_error_tips'));
                            },
                        });
                    } else {
                        this.setData({
                            goods_page: 1,
                            goods_list: [],
                            goods_list_loding_status: 1,
                            goods_bottom_line_status: false,
                        });
                        this.get_goods_list(1);
                    }
                } else {
                    if (tabs_id == '') {
                        new_data = uni.getStorageSync(this.cache_key + this.tabs_home_id) || [];
                    }
                    // 先使用缓存数据展示
                    this.setData({
                        diy_data: new_data,
                    });
                }
            },
            // 选项卡高度
            tabs_height_event(height) {
                let new_tabs_height = 0;
                // 判断是否有选项卡切选项卡数组数据内的字段is_enable值是否为1
                if (this.tabs_data.length > 0) {
                    this.tabs_data.forEach((item, index) => {
                        if (item.is_enable == '1') {
                            new_tabs_height = height;
                        }
                    });
                }
                this.setData({
                    tabs_height: new_tabs_height,
                });
            },

            // 滚动加载
            on_scroll_lower_event(e) {
                if (!this.is_tabs_type) {
                    this.get_goods_list();
                }
            },
            // 滚动到顶部
            on_scroll_upper_event() {
                setTimeout(() => {
                    this.head_scroll_top = 0;
                });
            },

            // 查询商品
            get_goods_list(is_mandatory) {
                // 分页是否还有数据
                if ((is_mandatory || 0) == 0) {
                    if (this.goods_bottom_line_status == true) {
                        uni.stopPullDownRefresh();
                        return false;
                    }
                }
                // 是否加载中
                if (this.data_is_loading == 1) {
                    return false;
                }
                this.setData({
                    data_is_loading: 1,
                });

                // 获取数据
                if (this.goods_page > 1) {
                    uni.showLoading({
                        title: this.$t('common.loading_in_text'),
                    });
                }
                let new_data = {
                    category_id: this.tabs_id,
                    page: this.goods_page,
                };
                // 九宫格数据
                uni.request({
                    url: app.globalData.get_request_url('datalist', 'search'),
                    method: 'POST',
                    data: new_data,
                    dataType: 'json',
                    success: (res) => {
                        if (this.goods_page > 1) {
                            uni.hideLoading();
                        }
                        uni.stopPullDownRefresh();
                        if (res.data.code == 0) {
                            var data = res.data.data;
                            if (data.data.length > 0) {
                                if (this.goods_page <= 1) {
                                    var temp_goods_list = data.data;
                                } else {
                                    var temp_goods_list = this.goods_list || [];
                                    var temp_data = data.data;
                                    for (var i in temp_data) {
                                        temp_goods_list.push(temp_data[i]);
                                    }
                                }
                                this.setData({
                                    goods_list: temp_goods_list,
                                    random_value: Math.random(),
                                    goods_total: data.total,
                                    goods_page_total: data.page_total,
                                    goods_list_loding_status: 3,
                                    goods_list_loding_msg: '',
                                    goods_page: this.goods_page + 1,
                                    data_is_loading: 0,
                                });

                                // 是否还有数据
                                this.setData({
                                    goods_bottom_line_status: this.goods_page > 1 && this.goods_page > this.goods_page_total,
                                });
                            } else {
                                this.setData({
                                    goods_list_loding_status: 0,
                                    goods_list_loding_msg: res.data.msg,
                                    goods_total: 0,
                                    data_is_loading: 0,
                                });
                                if (this.goods_page <= 1) {
                                    this.setData({
                                        goods_list: [],
                                        goods_bottom_line_status: false,
                                    });
                                }
                            }
                        } else {
                            this.setData({
                                goods_list_loding_status: 0,
                                goods_list_loding_msg: res.data.msg,
                                data_is_loading: 0,
                            });
                            app.globalData.is_login_check(res.data, this, 'get_goods_list', is_mandatory);
                        }
                    },
                    fail: () => {
                        if (this.goods_page > 1) {
                            uni.hideLoading();
                        }
                        uni.stopPullDownRefresh();
                        this.setData({
                            goods_list_loding_status: 2,
                            goods_list_loding_msg: this.$t('common.internet_error_tips'),
                            data_is_loading: 0,
                        });
                    },
                });
            },

            // 页面滚动事件
            on_scroll_event(e) {
                const scroll_num = parseInt(e.detail.scrollTop);
                if (scroll_num <= 20) {
                    this.head_scroll_top = 0;
                } else {
                    if (scroll_num / (this.sticky_top + 33) <= 1) {
                        // 更新数据的逻辑
                        this.head_scroll_top = scroll_num;
                    } else {
                        this.head_scroll_top = this.sticky_top + 100;
                    }
                }
                // #ifdef H5 || MP-TOUTIAO
                // 判断顶部导航是否置顶
                if (!this.is_header_top && !this.is_immersion_model) {
                    if (scroll_num >= this.sticky_top + 33 + (this.is_search_alone_row ? 0 : 33 + this.data_alone_row_space)) {
                        this.temp_sticky_top = 0;
                        this.temp_header_top = 0;
                        this.temp_sticky_no_h5_top = 0;
                        this.temp_is_header_top = true;
                    } else {
                        this.temp_header_top = this.header_top;
                        this.temp_sticky_top = this.sticky_top;
                        this.temp_sticky_no_h5_top = this.sticky_top;
                        this.temp_is_header_top = false;
                    }
                }
                //#endif
                this.scroll_timer_compute(scroll_num);
            },

            scroll_timer_compute(scroll_num) {
                // 使用节流技术减少事件触发的处理次数
                if (!this.scroll_throttle_timeout) {
                    const self = this;
                    this.scroll_throttle_timeout = setTimeout(() => {
                        this.scroll_top = scroll_num;
                        // 清除定时器
                        this.scroll_throttle_timeout = null;
                    }, 20); // 可以根据实际情况调整延时时间
                }
            },

            // 底部菜单高度
            footer_height_value_event(value) {
                this.setData({
                    footer_height_value: (value*2)+20,
                });

                // 存储diy页面底部菜单高度
                if(app.globalData.current_page(false) == 'pages/diy/diy') {
                    app.globalData.app_diy_tabbar_height_save(value);
                }
            },
            // 商品数量更新回调
            goods_buy_event(index, goods = {}, params = {}, back_data = null) {
                if ((this.$refs.goods_buy || null) != null) {
                    this.goods_index = index;
                    this.$refs.goods_buy.init(goods, params, back_data);
                }
            },
            // 商品加购回调
            goods_cart_back_event(e) {
                if ((this.$refs[`diy_goods_buy${this.goods_index}`][0] || null) != null) {
                    this.$refs[`diy_goods_buy${this.goods_index}`][0].goods_cart_back_event(e);
                }
            },
            // 视频播放
            video_play(url, width, height) {
                this.setData({
                    video_src: url,
                    popup_width: width,
                    popup_height: height,
                });
                this.$refs.popup.open();
                const videoContext = uni.createVideoContext('carousel_video');
                if (!isEmpty(videoContext)) {
                    videoContext.play();
                }
            },
            // 视频关闭
            video_close() {
                const videoContext = uni.createVideoContext('carousel_video');
                if (!isEmpty(videoContext)) {
                    videoContext.pause();
                }
                this.$refs.popup.close();
            },
            // 位置回调
            choice_location_back(e) {
                // 如果存在tabs_id则表示当前有选择tab数据则仅当前模块更新，无需给上级回调位置
                if ((this.tabs_id || null) == null) {
                    this.$emit('onLocationBack', e);
                } else {
                    this.tabs_click_event(this.tabs_id, this.is_tabs_type);
                }
            },
        },
    };
</script>

<style lang="scss" scoped></style>