<template>
    <div class="data-fill-list-box">
        <el-collapse v-model="ActiveKey"  @change="CollapseChange">
            <template v-for="(item,index) in listDatas" :key="item?.pkeyId">
                <el-collapse-item :name="`item-${index}-${item?.pkeyId}`" :disabled="item['isBussShow'] === 2" :id="`item-${index}-${item?.pkeyId}`">
                    <template #title>
                        <div class="hc-collapse-item-header">
                            <div class="text-lg truncate item-title">{{item.nodeName}}</div>
                            <div class="hc-extra-text-box">
                                <HcTooltip keys="wbs_del_table" v-if="item['isCopeTab'] === 2">
                                    <el-button type="danger" plain :disabled="item['isBussShow'] === 2" @click.stop="delClick(item,index)">删除本表</el-button>
                                </HcTooltip>
                                <HcTooltip keys="wbs_copy_table">
                                    <el-button type="primary" plain :disabled="item['isBussShow'] === 2" @click.stop="copyClick(item,index)">复制本表</el-button>
                                </HcTooltip>
                                <HcTooltip keys="wbs_hide_table">
                                    <el-button type="primary" plain @click.stop="hideClick(item,index)">
                                        <template v-if="item['isBussShow'] === 1">隐藏本表</template>
                                        <template v-else>显示本表</template>
                                    </el-button>
                                </HcTooltip>
                                <HcTooltip keys="wbs_preview_table" v-if="isStatus != 3">
                                    <el-button type="info" plain disabled v-if="item['isBussShow'] === 2 || item['isTabPdf'] === 1">预览</el-button>
                                    <el-button type="primary" plain @click.stop="previewClick(item,index)" v-else>预览</el-button>
                                </HcTooltip>
                                <HcTooltip keys="wbs_upload_table">
                                    <el-button :type="item['tabFileType'] === 2?'success':'primary'" plain :disabled="item['isBussShow'] === 2" @click.stop="uploadClick(item,index)">
                                        <template v-if="item['tabFileType'] === 2">已上传</template>
                                        <template v-else>上传</template>
                                    </el-button>
                                </HcTooltip>
                            </div>
                        </div>
                    </template>
                    <div class="data-fill-list-item-content">
                        <div class="data-fill-table-form-box">
                            <div class="hc-excel-table-form-view" :id="`table-form-${item?.pkeyId}`"/>
                            <div class="hc-no-table-form" v-if="item?.isTableForm === false">
                                <div class="table-form-no">
                                    <img :src="notableform" alt=""/>
                                    <div class="desc">暂无表单数据</div>
                                </div>
                            </div>
                        </div>
                        <div class="data-fill-table-tip-box">
                            <div class="text-orange tip-title">
                                <HcIcon name="error" fill ui="text-2xl"/>
                                <span class="ml-1">提示</span>
                            </div>
                            <div class="text-gray-400 tip-item">1、灰色框代表可通过系统识别计算，公式自动引用，可通过公式计算少量数据，(表头数据及简单)，也可只填写白色框数据</div>
                            <div class="text-gray-400 tip-item">2、系统支持键盘中，shift + tab键向上一个填报框切换，tab向下一个填报框切换。暂不支持上下按键切换输入框</div>
                            <div class="table-tip-foot">
                                <div class="tip-left-btn">
                                    <HcTooltip keys="wbs_import_table">
                                        <div class="text-gray-400 dow-text">
                                            <HcIcon name="publish" ui="text-lg"/>
                                            <span class="ml-1">导入列表数据</span>
                                        </div>
                                    </HcTooltip>
                                    <HcTooltip keys="wbs_download_table">
                                        <div class="text-main dow-text">
                                            <HcIcon name="file_download" ui="text-lg"/>
                                            <span class="ml-1">下载导入模板</span>
                                        </div>
                                    </HcTooltip>
                                </div>
                                <div class="tip-right-btn">
                                    <HcTooltip keys="wbs_save_table">
                                        <el-button type="primary" hc-btn :disabled="item?.isTableForm === false" :loading="tableFormSaveLoading" @click="tableFormSaveClick(item,index)">
                                            <HcIcon name="save"/>
                                            <span>保存</span>
                                        </el-button>
                                    </HcTooltip>
                                </div>
                            </div>
                        </div>
                    </div>
                </el-collapse-item>
            </template>
        </el-collapse>
    </div>

    <!--右键菜单-->
    <HcContextMenu ref="contextMenuRef" :datas="tableFormMenu" @item-click="handleMenuSelect"/>

    <!--上传文件-->
    <HcDialog :show="uploadModal" title="上传文件" widths="38rem" :footer="false" @close="uploadModal = false">
        <HcUpload :fileList="fileListData" :datas="uploadData" @change='uploadChange'/>
    </HcDialog>

    <!--插入设计值/频率-->
    <HcDialog :show="IDVFModal" title="插入设计值/频率" widths="600px" saveText="确认插入" @close="IDVFModal = false" @save="IDVFModalSaveClick">
        <el-alert title="填写完设计值和频率，系统自动计算实测值" type="warning" :closable="false"/>
        <el-form ref="formIDVFRef" :model="formIDVFModel" label-width="auto" size="large">
            <div class="form-item-div text-center mb-3">
                <el-radio-group size="large" v-model="formIDVFModel.type">
                    <el-radio :label="1">公路工程</el-radio>
                    <el-radio :label="2" class="ml-4">水利水电</el-radio>
                </el-radio-group>
            </div>
            <el-form-item label="设计值">
                <!-- onkeyup="value = value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g,'$1')" -->
                <el-input v-model="formIDVFModel.design" placeholder="如果设计值存在两个，则使用 '*'，或者 '/' 连接，例如45*78，12/23"/>
            </el-form-item>
            <el-form-item label="频率" v-if="formIDVFModel.type === 1">
                <!--  onkeyup="value = value.replace(/^(0+)|[^\d]+/g,'')" -->
                <el-input v-model="formIDVFModel.size" placeholder="如果频率存在两个，则使用 '*'，或者 '/' 连接例如2*4，5/7"/>
            </el-form-item>
            <el-form-item label="容量" v-if="formIDVFModel.type === 2">
                <!--   onkeyup="value = value.replace(/^(0+)|[^\d]+/g,'')" -->
                <el-input v-model="formIDVFModel.capacity" placeholder="如果容量存在两个，则使用 '*'，或者 '/' 连接例如2*4，5/7"/>
            </el-form-item>
            <el-form-item label="合格点数">
                <el-input v-model="formIDVFModel.fail" placeholder="请填写合格点数（不填写则默认全部合格）" onkeyup="value = value.replace(/^(0+)|[^\d]+/g,'')"/>
            </el-form-item>
            <el-form-item label="偏差范围">
                <el-input v-model="formIDVFModel.dev" placeholder="请填写偏差范围" />
            </el-form-item>
        </el-form>
    </HcDialog>

    <!--插入特殊字符-->
    <HcDialog :show="specialModal" title="插入特殊字符" widths="600px" saveText="确认插入" @close="specialModal = false" @save="specialNodeClick">
        <el-form ref="specialFormRef" :model="specialFormModel" :rules="specialFormRules" label-width="0px" size="large" class="mb-6">
            <el-form-item prop="val" class="special-form-item">
                <el-input v-model="specialFormModel.val" ref="specialRef" id="specialId" placeholder="请选择特殊字符代码" clearable @blur="specialInputBlur"/>
            </el-form-item>
        </el-form>
        <el-row :gutter="20" style="margin: -10px;">
            <el-col :span="3" style="padding: 10px;" v-for="item in specialCharacters">
                <div class="special-box" @click="specialClick">
                    <span class="font-EUDC" :title="`字符代码(C):${item !== 'K̅'?item.slice(2,7):'K̅'}`" v-html="item"/>
                </div>
            </el-col>
        </el-row>
    </HcDialog>

    <!--关联试验数据-->
    <HcDialog :show="CTDModal" title="关联试验数据"  widths="84%"  saveText="确认关联" @close="CTDModal = false" @save="CTDModal = false">
       <div class="adding-form-dialog-box">
            <div class="dialog-tree-box">
                 <el-scrollbar>
                      <ElTree class="hc-tree-node tree-line"
                        :class="ui"
                        ref="ElTreeRef"
                        :props="ElTreeProps"
                        :load="ElTreeLoadNode"
                        lazy
                        highlight-current
                        accordion
                        node-key="primaryKeyId"
                        :default-expanded-keys="defaultExpandedCids"
                        @node-click="CTDElTreeClick"
                        :indent="0">
                      </ElTree>
                 </el-scrollbar>
            </div>
            <div class="dialog-table-box">
                <div class="dialog-search">
                     <div class="w-64 ml-2">
                            <HcDatePicker :dates="CTDbetweenTime" clearable @change="CTDbetweenTimeUpdate"/>
                    </div>
                     <div class="ml-2">
                            <el-button type="primary" @click="CTDsearchClick">
                                <HcIcon name="search-2"/>
                                <span>搜索</span>
                            </el-button>
                    </div>
                </div>
                <div class="dialog-table">
                        <HcTable ref="dialogTableRef" :loading="CTDdialogTableLoading" :column="CTDdialogTableColumn" :datas="CTDdialogTableData" isCheck @selection-change="CTDdialogTableSelection">
                             <template #name="{row}">
                                <span class="text-link" @click="CTDtableRowName(row)">{{row?.name}}</span>
                            </template>
                        </HcTable>
                </div>
                <div class="dialog-pages">
                        <HcPages :pages="CTDsearchFormPage" @change="CTDsearchFormPageChange"/>
                </div>
            </div>
       </div>
                

    </HcDialog>
    <!-- 选择要插入的数据 -->
      <HcDialog :show="insertDataShow" title="选择需要插入的数据"  widths="84%"  saveText="保存" @close="insertDataShow = false" @save="insertDataShow = false">
          <div>
               <div class="flex-1" style="padding-left:20px">
                    <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange" size="default" :round="false"/>
                      <el-select v-model="testReportId" placeholder="试验记录表" clearable class="ml-2 w-80">
                                <el-option v-for="item in testReportData" :key="item.value" :label="item['label']" :value="item['value']"/>
                      </el-select>
                </div>
                <!-- <div class="copy-node-many-table">
                    <el-scrollbar v-loading="insertDataTableLoading" >
                        <el-table :data="insertDataTable" border stripe>
                            <el-table-column prop="fullName" label="数据名称"/>
                            <el-table-column prop="action" label="操作" width="120" align="center">
                                <template #default="{row}">
                                      <el-checkbox v-model="row.isCheck"  size="large"  @change="insertDataTableCheck(row)"/>
                                </template>
                            </el-table-column>
                        </el-table>
                    </el-scrollbar>
                </div> -->
                <div class="dialog-table-box">
                     <div class="dialog-table">
                        <HcTable :column="insertDataTableColumn" :datas="insertDataTable" :loading="insertDataTableLoading">
                            <template #tempLow="{row}">{{row['tempLow']}} ~ {{row['tempHigh']}}</template>
                            <template #action="{row}">
                                     <el-checkbox v-model="row.isCheck"  size="large"  @change="insertDataTableCheck(row)"/>
                               
                            </template>
                        </HcTable>
                     </div>
                     <div class="dialog-pages">
                        <HcPages :pages="insertDataPage" @change="insertDataPageChange"/>
                    </div>
                </div>
          </div>
      </HcDialog>
    <!-- 复制本表 -->
     <HcDialog :show="CopyModal" title="复制本表" widths="1200px" saveText="确认复制" @close="CopyModal = false" @save="CopyModal = false">
        <el-alert title="复跨节点复制: 把当前表格已形成的数据复制到其他工程部位的相同表格里面" type="warning" :closable="false"/>
        <el-alert title="本节点复制:在当前节点内复制本表及数据" type="warning" :closable="false"/>
        <div class="radio-group-box">
            <el-radio-group v-model="CopyModalType">
                            <el-radio label="1">跨节点复制</el-radio>
                            <el-radio label="2" class="ml-4">本节点复制</el-radio>
            </el-radio-group>
        </div>
        <div class="copy-node-many-box" v-if="CopyModalType=== '1'">
                <div class="copy-node-many-tree">
                    <el-scrollbar>
                      <WbsTree 
                      :projectId="projectId" 
                      :contractId="contractId" 
                      @nodeTap="wbsElTreeClick" 
                      @nodeLoading="ElTreeNodeLoading"
                     
                      />
                    </el-scrollbar>
                </div>
                <div class="copy-node-many-table">
                    <el-scrollbar v-loading="ListItemLoading" >
                        <el-table :data="copyModalTable" border stripe>
                            <el-table-column prop="fullName" label="表格名称"/>
                            <el-table-column prop="action" label="操作" width="120" align="center">
                                <template #default="{row}">
                                      <el-checkbox v-model="row.isCheck"  size="large"  @change="copyModalTableCheck(row)"/>
                                </template>
                            </el-table-column>
                        </el-table>
                    </el-scrollbar>
                </div>
            </div>
    </HcDialog>
        <!--关联试验文件-->
    <HcDialog :show="fileModal" title="关联试验文件"  widths="84%"  saveText="确认关联" @close="fileModal = false" @save="fileModal = false">
        <div class="radio-box">
                <el-radio-group v-model="radio">
                    <el-radio :label="3">Option A</el-radio>
                    <el-radio :label="6">Option B</el-radio>
                    <el-radio :label="9">Option C</el-radio>
                </el-radio-group>
        </div>
       <div class="adding-form-dialog-box">
            <div class="dialog-tree-box">
                 <el-scrollbar>
                     <ElTree class="hc-tree-node">
                     </ElTree>
                 </el-scrollbar>
            </div>
            <div class="dialog-table-box">
                <div class="dialog-search">
                     <div class="w-64 ml-2">
                            <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate"/>
                    </div>
                     <div class="ml-2">
                            <el-button type="primary" @click="searchClick">
                                <HcIcon name="search-2"/>
                                <span>搜索</span>
                            </el-button>
                    </div>
                </div>
                <div class="dialog-table">
                        <HcTable ref="dialogTableRef" :loading="dialogTableLoading" :column="dialogTableColumn" :datas="dialogTableData" isCheck @selection-change="dialogTableSelection">
                             <template #name="{row}">
                                <span class="text-link" @click="tableRowName(row)">{{row?.name}}</span>
                            </template>
                        </HcTable>
                </div>
                <div class="dialog-pages">
                        <HcPages :pages="searchFormPage" @change="searchFormPageChange"/>
                </div>
            </div>
       </div>
                

    </HcDialog>
</template>

<script setup>
import {ref,watch,nextTick} from "vue";
import {getStoreData, setStoreData} from '~src/utils/storage'
import notableform from '~src/assets/view/notableform.svg';
import HTableForm from "~src/plugins/HTableForm"
import WbsTree from "../components/WbsTree.vue"
import wbsApi from "~api/data-fill/wbs"
import HcUpload from "./HcUpload.vue"
import {utilsText, isType, formValidate, deepClone, getObjValue} from "vue-utils-plus"
import {useAppStore} from "~src/store";
import samplingApi from "~api/tentative/material/sampling"

//初始
const props = defineProps({
    datas: {
        type: Array,
        default: () => ([])
    },
    classify: {
        type: [String,Number],
        default: ''
    },
    status: {
        type: [String,Number],
        default: ''
    },
    primaryKeyId: {
        type: [String,Number],
        default: ''
    },
    contractId: {
        type: [String,Number],
        default: ''
    },
    projectInfo: {
        type: Object,
        default: () => ({})
    },
    authBtnTabKey: {
        type: [String,Number],
        default: ''
    },
    drawType:{
        type:Boolean,
        default:false
    }
})
const {isString, getObjNullValue, getArrValue} = isType()
const {setPosInsert, setPosRange} = utilsText()
const listDatas = ref(props.datas)
const classify = ref(props.classify)
const isStatus = ref(props.status)
const isPrimaryKeyId = ref(props.primaryKeyId)
const contractId = ref(props.contractId)
const projectInfo = ref(props.projectInfo)
const useAppState = useAppStore()
const authBtnTabKey = ref(props.authBtnTabKey)
const drawType = ref(props.drawType)
//全局变量
const projectId = ref(useAppState.getProjectId);

//监听
watch(() => [
    props.datas,
    props.classify,
    props.primaryKeyId,
    props.contractId,
    props.projectInfo,
], ([datas, classifyVal, primaryKeyId, cid, pInfo]) => {
    listDatas.value = datas
    classify.value = classifyVal
    isPrimaryKeyId.value = primaryKeyId
    contractId.value = cid
    projectInfo.value = pInfo
    setFormDataNum(datas)
})

//监听
watch(() => [
    props.status
], ([val]) => {
    //1 未填报，2待上报，3已上报
    isStatus.value = val
})

//渲染完成
nextTick(() => {
    setFormDataNum(props.datas)
})

//获取表单初始数据
const getFormDataInit = (item, pkeyId) => {
    return {
        projectId: item?.projectId,
        contractId: item?.contractId,
        classify: classify.value,
        pkeyId: pkeyId ? pkeyId + '' : '',
        nodeId: isPrimaryKeyId.value
    }
}

//设置表单对象的数量
const formData = ref([])
const setFormDataNum = (datas) => {
    ActiveKey.value = []
    let newArr = [];
    for (let i = 0; i < datas.length; i++) {
        newArr.push({
            ...getFormDataInit(datas[i], datas[i].pkeyId),
            isCollapseLoad: false,
        })
    }
    formData.value = newArr
    setTableFormMenu(projectInfo.value)
}

//展开事件
const ActiveKey = ref([])
const formKeyIds = ref('')
const CollapseChange = async (name) => {
    ActiveKey.value = name
    console.log(name,'name');
    let names=[]
    if(name.length>0){
         names = name[0] ? name[name.length-1].split('-') : name[0]
    }
   
    console.log(names,'names');
    if (names.length > 0) {
        getOffsetTop(name);
        const index = names[1]
        const item = listDatas.value[index]
        formKeyIds.value = item.pkeyId ? item.pkeyId + '' : ''
        if (!item.isTableFormRender) {
            //获取已填写的数据
            await getBussDataInfo(item,item.pkeyId, index)
            //渲染表单
            await getExcelHtml(item,index)
        }
    } else {
        getOffsetTop()
        formKeyIds.value = ''
    }
}

//获取模板标签数据
const formRegExpJson = ref({})
const getExcelHtml = async (item,index) => {
    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
    if (pkeyIds) {
        const {error, code, data} = await wbsApi.getExcelHtml({pkeyId: pkeyIds}, false)
        const resData = isString(data) ? data || '' : ''
        if (!error && code === 200 && resData) {
            item.isTableForm = true
            //渲染表单
            HTableForm.createForm({
                template: resData,
                tableForm: formData.value[index],
                appId: `#table-form-${pkeyIds}`,
                onRight: (event, KeyName) => {
                    onRightClick(event, KeyName, index)
                },
                //表单正则效验
                onBlur: (event, key, reg, val, msg, leng) => {
                    setTableFormBlurReg(pkeyIds, event, key, reg, val, msg, item, index, leng)
                }
            })
            item.isTableFormRender = true
            item.isRenderTableForm = true
        } else {
            item.isTableForm = false
            item.isRenderTableForm = true
            window?.$message?.warning('暂无表单')
        }
    } else {
        item.isTableForm = false
        item.isRenderTableForm = false
        window?.$message?.warning('pkeyId为空')
    }
}

//正则效验
const setTableFormBlurReg = (pkeyId, event, key, reg, val, msg, item, index, leng) => {
    const dom = document.getElementById(key)?.parentElement ?? ''
    if (dom) {
        if (val && reg) {
            let regx = new RegExp(reg);
            let state = regx.test(val);
            if (state) {
                delete formRegExpJson.value[pkeyId]
                dom.style = ''
            } else {
                formRegExpJson.value[pkeyId] = {key, reg, val, msg, state, nodeName: item.nodeName, itemId: `item-${index}-${item?.pkeyId}`}
                dom.style = '--el-input-border-color: #fe0000; box-shadow: 0 0 0 2px #fe0000 inset;'
                window?.$message?.warning(msg)
            }
        } else {
            delete formRegExpJson.value[pkeyId]
            dom.style = ''
        }
        /*let efficacyRegState = true, efficacyLengState = true;
        //正则效验
        if (val && reg) {
            let regx = new RegExp(reg);
            let state = regx.test(val);
            console.log('reg:', reg)
            console.log('val:', val)
            console.log('state:', state)
            if (!state) {
                efficacyRegState = true
            } else {
                efficacyRegState = false
                window?.$message?.warning(msg)
            }
        } else {
            efficacyRegState = true
        }
        //校验字符长度
        if (val && leng) {
            const num = val.toString().length;
            if (num > leng) {
                efficacyLengState = false
                window?.$message?.warning('长度不能超过' + leng)
            } else {
                efficacyLengState = true
            }
        } else {
            efficacyLengState = true
        }
        //处理效验结果
        if (efficacyRegState && efficacyLengState) {
            delete formRegExpJson.value[pkeyId]
            dom.style = ''
        } else {
            formRegExpJson.value[pkeyId] = {key, reg, val, msg, leng, state: efficacyRegState, lengState: efficacyLengState, nodeName: item.nodeName, itemId: `item-${index}-${item?.pkeyId}`}
            dom.style = '--el-input-border-color: #fe0000; box-shadow: 0 0 0 2px #fe0000 inset;'
        }*/
    }
}

//获取已填写的数据
const getBussDataInfo = async (item, pkeyId, index) => {
    const pkeyIds = pkeyId ? pkeyId + '' : ''
    if (pkeyIds) {
        const {error, code, data} = await wbsApi.getBussDataInfo({
            pkeyId: pkeyIds
        }, false)
        const resData = getObjNullValue(data)
        if (!error && code === 200 && resData) {
            HTableForm.setPickerKey(resData)
            const InitObj = getFormDataInit(item, pkeyId) //有数据，关联数据
            formData.value[index] = {...resData, ...InitObj, isCollapseLoad: true}
        } else {
            formData.value[index] = {...getFormDataInit(item, pkeyId), isCollapseLoad: true}
        }
    } else {
        window?.$message?.warning('pkeyId为空')
    }
}

//单个保存
const tableFormSaveLoading = ref(false)
const tableFormSaveClick = async (item,index) => {
    if (isStatus.value !== '3') {
        const res = await saveExcelBussData(item,index)
        if (res) {
            await getBussPdfInfo(item)
            renewData()
        }
    } else {
        window?.$message?.warning('已上报的资料，不允许保存。')
    }
}

//保存表单数据
const saveExcelBussData = async (item, index, showTip = true) => {
    const isRegExp = !!getObjNullValue(formRegExpJson.value)
    if (!isRegExp) {
        tableFormSaveLoading.value = true
        const InitObj = getFormDataInit(item, item.pkeyId)
        const {error, code} = await wbsApi.saveExcelBussData({
            ...formData.value[index],
            ...InitObj
        })
        //处理数据
        tableFormSaveLoading.value = false
        if (!error && code === 200) {
            if(showTip) window?.$message?.success('保存成功')
            return true
        } else {
            return false
        }
    } else {
        window?.$message?.warning('请先修改完红色输入框的数据')
        return false
    }
}

//预览PDF
const getBussPdfInfo = async (item, showTip = true) => {
    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
    if (pkeyIds) {
        const {error, code, data} = await wbsApi.getBussPdfInfo({
            pkeyId: pkeyIds
        },false)
        if (!error && code === 200) {
            if (data) {
                window.open(data, '_blank')
            } else if(showTip) {
                window?.$message?.warning('PDF错误')
            }
        } else {
            if(showTip) {
                window?.$message?.warning(data.msg || '获取PDF失败')
            }
        }
    } else {
        window?.$message?.warning('pkeyId为空')
    }
}

//删除本表
const delClick = async (item) => {
    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
    if (pkeyIds) {
        if (isStatus.value !== '3') {
            const {error, code} = await wbsApi.removeBussTabInfo({
                pkeyid: pkeyIds,
                classify: classify.value,
            })
            if (!error && code === 200) {
                window?.$message?.success('操作成功')
                renewData()
            }
        } else {
            window?.$message?.warning('已上报的资料，不允许删除')
        }
    } else {
        window?.$message?.warning('pkeyId为空')
    }
}
//复制本表弹窗
const CopyModal = ref(false);
const CopyModalType=ref('1');
const treeLoading = ref(false);
const copyModalTable=ref([])
const insertDataShow = ref(false);
//类型tab数据和相关处理
const tabTypeKey = ref('1')
const tabTypeTab = ref([
    {key:'1',  name: '试验记录表'},
    {key:'2', name: '试验报告单'},
]);
const tabTypeChange = ({key}) => {
    tabTypeKey.value = key
    // listItemBaseData.value.tableType = key
    // getSearchNodeTables()
}
const insertDataTableLoading=ref(false)
const insertDataTableColumn = ref(
      [{key:'key1', name: '数据名称'}],
)
const insertDataTable=ref([])
const insertDataTableCheck=()=>{
    console.log('insertDataTableCheck');
}
//分页
const insertDataPage = ref({current: 1, size: 20, total: 0})
const insertDataPageChange = ({current, size}) => {
    insertDataPage.value.current = current
    insertDataPage.value.size = size
    // getDialogTableData()
}

const testReportId=ref('1');
const testReportData=ref(
    [
        {id:'1',value:'1',label:'记录表1柔柔弱弱柔柔弱弱柔柔弱弱柔柔弱弱rrr'}
    ]
)
//树相关变量
// const primaryKeyId = ref('')
const nodeItemInfo = ref({})
const nodeDataInfo = ref({})
//树加载完成
const ElTreeNodeLoading = () => {
    treeLoading.value = false
}

//获取数据列表
const ListItemLoading = ref(false);
const checked1=ref(true)
const searchNodeAllTable = async () => {
    copyModalTable.value = []
    const info = nodeDataInfo.value;
    ListItemLoading.value = true
    const {error, code, data} = await wbsApi.searchNodeAllTable({
        projectId: projectId.value,
        contractId: contractId.value,
        primaryKeyId: info['primaryKeyId'],
        type: authBtnTabKey.value
    })
    //处理数据
    ListItemLoading.value = false
    if (!error && code === 200) {
        copyModalTable.value = getArrValue(data);
        copyModalTable.value.forEach((item)=>{
            item.isCheck=false
        })
    } else {
        copyModalTable.value = []
    }
}
const getTableDataAll = () => {
    searchNodeAllTable()
}

//树被点击
const wbsElTreeClick = ({node, data, keys}) => {
    nodeItemInfo.value = node
    nodeDataInfo.value = data
    getTableDataAll();
}
//复制本表
const copyClick = async (item,index) => {
    // CopyModal.value=true;
    // const copyModalTable=ref([])

    if (item.pkeyId) {
        if (isStatus.value !== '3') {
            if (!item.isRenderTableForm) {
                await copeBussTab(item.pkeyId + '')
            } else if (!item.isTableForm) {
                window?.$message?.warning('暂无表单数据')
            } else if (item.isRenderTableForm) {
                const res = await saveExcelBussData(item,index,false)
                if (res) {
                    await copeBussTab(item.pkeyId + '')
                } else {
                    window?.$message?.warning('复制本表操作失败')
                }
            } else {
                window?.$message?.warning(`数据异常了, isRenderTableForm: ${item.isRenderTableForm}, isTableForm: ${item.isTableForm}, pkeyIds：${item.pkeyId}`)
            }
        } else {
            window?.$message?.warning('已上报的资料，不允许复制')
        }
    } else {
        window?.$message?.warning('pkeyId为空')
    }
}

//勾选复制本表
const copyModalTableCheck = async (item) => {
   console.log('复制本表',item);
}
const copeBussTab = async (pkeyIds) => {
    const {error, code} = await wbsApi.copeBussTab({
        pkeyId: pkeyIds
    })
    if (!error && code === 200) {
        window?.$message?.success('操作成功')
        renewData()
    }
}


//隐藏本表
const hideClick = async (item) => {
    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
    if (pkeyIds) {
        if (isStatus.value !== '3') {
            const isBussShow = item['isBussShow'] === 2 ? 1 : 2 //状态(1显示 2隐藏)
            const {error, code} = await wbsApi.showBussTab({
                pkeyId: pkeyIds,
                status: isBussShow
            })
            if (!error && code === 200) {
                window?.$message?.success('操作成功')
                renewData()
            }
        } else {
            window?.$message?.warning('已上报的资料，不允许隐藏')
        }
    } else {
        window?.$message?.warning('pkeyId为空')
    }
}

//预览
const previewClick = async (item,index) => {
    await getBussPdfInfo(item)
}

//上传变量
const uploadModal = ref(false)
const fileListData = ref([]);
const uploadData = ref({})

//上传被点击
const uploadClick = (item,index) => {
    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
    const keyName = `item-${index}-${pkeyIds}`
    if (pkeyIds) {
        if (isStatus.value !== '3' && item.isTableForm) {
            uploadModal.value = true
            uploadData.value = getFormDataInit(item,pkeyIds)
            //获取文件列表
            getBussFileList(pkeyIds)
        } else if (!item.isRenderTableForm) {
            CollapseChange(keyName)
            window?.$message?.warning('请再次点击上传')
        } else if (!item.isTableForm) {
            window?.$message?.warning('暂无表单数据')
        } else {
            window?.$message?.warning('已上报的资料，不允许上传')
        }
    } else {
        window?.$message?.warning('pkeyId为空')
    }
}

//获取文件列表
const getBussFileList = async (pkeyId) => {
    const {error, code, data} = await wbsApi.getBussFileList({
        pkeyid: pkeyId
    })
    if (!error && code === 200) {
        fileListData.value = getArrValue(data)
    } else {
        fileListData.value = []
    }
}

//上传文件
const uploadChange = async ({type}) => {
    if(type === 'success') {
        uploadModal.value = false
        renewData()
    } else if (type === 'del') {
        renewData()
    }
}

//相关变量
const tableFormItemNode = ref({})

//菜单数据
const tableFormMenu = ref([])

//设置菜单权限数据
const setTableFormMenu = (info) => {
    const infos = getObjValue(info)
    const isOpen = infos['isOpenRandomNumber'] ?? 0
    let newArr = []
    if (isOpen === 1) {
        newArr.push({label: '插入设计值/频率', key: "IDVF"})
    }
    //newArr.push({label: '插入设计值/频率', key: "IDVF"})
    newArr.push({label: '插入特殊字符', key: "special"})
    newArr.push({label: '关联试验数据', key: "CTD"}),
    newArr.push({label: '关联试文件', key: "file"})
    tableFormMenu.value = newArr
}


//鼠标右键事件
const contextMenuRef = ref(null)
const onRightClick = (event, KeyName, index) => {
    //取光标位置
    const specialDom = document.getElementById(KeyName + "")
    const startPos = specialDom?.selectionStart || 0
    const endPos = specialDom?.selectionEnd || 0
    //存储临时信息
    tableFormItemNode.value = {KeyName, index, startPos, endPos, pkeyId: formKeyIds.value}
    contextMenuRef.value?.showMenu(event) //展开菜单
}

//鼠标右键菜单被点击
const handleMenuSelect = ({key}) => {
    if (key === 'IDVF') {
        IDVFModal.value = true
    } else if (key === 'special') {
        specialModalShow()
    } else if (key === 'CTD') {
        CTDModal.value = true
    }else if(key === 'file'){
        fileModal.value=true
    }
}

//插入设计值
const IDVFModal = ref(false)
const formIDVFRef = ref(null)
const formIDVFModel = ref({type: 1, design: '', size: '', dev: '', key: '', capacity: '', fail: '', pkId: ''})


//插入特殊字符
const specialModal = ref(false)
const specialCharacters = ref([
    '&#57344;', "&#57345;", "&#57346;", "&#57347;", '&#8804;', '&#8805;', '&#8451;',
    '&#9312;', '&#9313;', '&#9314;', '&#9315;', '&#9316;', '&#9317;', '&#9318;', '&#9319;', '&#9320;', '&#9321;', '&#9322;', '&#9323;',
    '&#9324;', '&#9325;', '&#9326;', '&#9327;', '&#9328;', '&#9329;', '&#9330;', '&#9331;',
    "&#8544;", "&#8545;", "&#8546;", "&#8547;", "&#8548;", "&#8549;", "&#8550;", "&#8551;", "&#8552;", "&#8553;", "&#8554;", "&#8555;","K̅"
])

//输入框验证
const specialFormRef = ref(null)
const specialFormModel = ref({val: ''})
const specialFormRules = {
    val: {
        required: true,
        trigger: "blur",
        message: "请选择特殊字符代码"
    }
}
//显示插入特殊字符
const specialRef = ref(null)
const specialModalShow = () => {
    specialFormModel.value.val = ''
    specialModal.value = true
    nextTick(() => {
        specialRef.value?.focus();
    })
}
//失去焦点
const specialPos = ref({start: 0, end: 0})
const specialInputBlur = (e) => {
    specialPos.value = {
        start: e?.target?.selectionStart || 0,
        end: e?.target?.selectionEnd || 0
    }
}
//点击符号
const specialClick = (event) => {
    const text = event?.target?.innerText ?? ''
    const start = specialPos.value.start
    const end = specialPos.value.end
    const form = specialFormModel.value.val
    specialFormModel.value.val = setPosInsert(start, end, form, text)
    specialRef.value?.focus();
    let posVal = start + text.length;
    nextTick(() => {
        setPosRange('specialId', posVal)
    })
}

//确认插入
const specialNodeClick = async () => {
    const res = await formValidate(specialFormRef.value)
    if (res) {
        const item = tableFormItemNode.value
        const form = formData.value[item.index]
        const val = specialFormModel.value.val ?? ''
        formData.value[item.index][item.KeyName] = setPosInsert(item.startPos, item.endPos, form[item.KeyName], val)
        specialModal.value = false
        specialRef.value?.focus();
        let posVal = item.startPos + val.length;
        nextTick(() => {
            setPosRange(item.KeyName, posVal)
        })
    }
}

//关联试验数据
const CTDModal = ref(false)
//树形结构异步加载数据
const defaultExpandedCids = ref([])
const ElTreeLoadNode = async (node, resolve) => {
    let parentId = '0';
    if (node.level !== 0) {
        parentId = node?.data?.id
    }
    //获取数据
    const {error, code, data} = await samplingApi.queryLazyTree({
        wbsId: wbsTempId.value,
        tenantId: tenantId.value,
        projectId: projectId.value,
        parentId,
        wbsType: wbsType.value
    })
    //处理数据
    if (!error && code === 200) {
        let clickKey = '', defaultExpandedArr = [];
        const keys = TreeExpandKey.value || []
        const resData = getArrValue(data)
        for (let i = 0; i < resData.length; i++) {
            resData[i].hasChildren = !resData[i].hasChildren
        }
        if (keys.length > 0) {
            let lastKey = keys[keys.length-1];
            for (const item of resData) {
                //自动展开
                if (isItem(keys,item?.primaryKeyId)) {
                    defaultExpandedArr.push(item?.primaryKeyId)
                }
                //最后一个，选中点击
                if (item?.primaryKeyId === lastKey) {
                    clickKey = item?.primaryKeyId
                }
            }
        } else if (node.level === 0) {
            defaultExpandedArr.push(resData[0]?.primaryKeyId)
        }
        //自动展开
        defaultExpandedCids.value = defaultExpandedArr
        if (node.level === 0) {
            emit('nodeLoading')
        }
        resolve(resData)
        //最后一个，执行点击
        if (clickKey) {
            await nextTick(() => {
                document.getElementById(`${idPrefix.value}${clickKey}`)?.click()
            })
        }
    } else {
        if (node.level === 0) {
            emit('nodeLoading')
        }
        resolve([])
    }
}
//节点被点击
const CTDElTreeClick = async (data,node) => {
    console.log('获取节点数据');
    // let autoKeysArr = []
    // await getNodeExpandKeys(node, autoKeysArr)
    // const autoKeys = autoKeysArr.reverse()
    // emit('nodeTap', {node, data, keys: autoKeys})
}
//处理自动展开的节点KEY
const getNodeExpandKeys = async (node, newKeys) => {
    const parent = node?.parent ?? []
    const primaryKeyId = node?.data?.primaryKeyId ?? ''
    if (primaryKeyId) {
        newKeys.push(primaryKeyId)
        await getNodeExpandKeys(parent, newKeys)
    }
}
const CTDbetweenTime = ref(null)
//搜索表单
const CTDsearchFormPage = ref({
   betweenTime: null,queryTime: null,  wbsId: null, current: 1, size: 20, total: 0
})
const CTDsearchFormPageChange = ({current, size}) => {
    CTDsearchFormPage.value.current = current
    CTDsearchFormPage.value.size = size
    // getDialogTableData()
}
const CTDbetweenTimeUpdate = ({arr, query}) => {
    CTDbetweenTime.value = arr
    CTDsearchFormPage.value.queryTime = query
}//搜索
const CTDsearchClick = () => {
    CTDsearchFormPage.value.current = 1;
    // getTableData()
}
const CTDdialogTableLoading = ref (false)
const CTDdialogTableKeys = ref ([])
const CTDdialogTableColumn = ref([
    {key:'title', name: '表单名称'},
    {key:'tabType', name: '元素表类型'},
    {key:'elementTotal', name: '元素总量'},
    {key:'tabOwner', name: '所属方'},
    {key:'fillRate', name: '填报率'}
])
const CTDdialogTableData=[]

const CTDdialogTableSelection = (rows) => {
    CTDdialogTableKeys.value = rows
}
//名称被点击
const CTDtableRowName = (row) => {
    console.log('行',row);
   
 }


//关联试验文件
const fileModal = ref(false)
const radio = ref(3)
//设计值频率计算
const IDVFModalSaveClick = async () => {
    const {pkeyId, KeyName, index} = tableFormItemNode.value
    if (pkeyId) {
        const { design, size } = formIDVFModel.value
        const { error, code, data } = await wbsApi.queryFormulaRange({
            ...formIDVFModel.value,
            // dev: (!design && !size) ? '±5': '',
            key: KeyName,
            pkId: pkeyId,

        })
        //处理数据
        const res = getObjNullValue(data)
        if (!error && code === 200 && res) {
            Object.keys(data).forEach(key => {
                formData.value[index][key] = data[key]
            })
            IDVFModal.value = false
        }
    } else {
        window?.$message?.warning('pkeyId为空')
    }
}

//事件
const emit = defineEmits(['renew','offsetTop'])

//被点击
const getOffsetTop = (key = '') => {
    if (key) {
        const dom = document.getElementById(key[key.length-1])
        if(!drawType.value){
             if(dom.offsetTop>=583&&ActiveKey.value.length>1){
                 emit('offsetTop', dom.offsetTop-583)
            }else{
                emit('offsetTop', dom.offsetTop)
            }
        }else {
            if(dom.offsetTop>=424&&ActiveKey.value.length>1){
                  emit('offsetTop', dom.offsetTop-424)
            }else{
                emit('offsetTop', dom.offsetTop)
            }
        }
       
    } else {
        emit('offsetTop', 0)
    }
     ActiveKey.value =  ActiveKey.value[ActiveKey.value.length-1]
}

//通知数据更新
const renewData = () => {
    emit('renew')
    ActiveKey.value = []
}

//获取表单数据
const getFormData = () => {
    const formArr = formData.value;
    return formArr.filter((item) => {
        return (item.pkeyId??'') !== '' && item.isCollapseLoad;
    })
}

//获取表单效验数据
const getFormRegExpJson = () => {
    return deepClone(formRegExpJson.value);
}

//获取当前展开项
const getActiveKey = () => {
    return ActiveKey.value;
}

//设置当前展开项
const setActiveKey = (key) => {
    return ActiveKey.value = key;
}

//名称被点击
const tableRowName = (row) => {
    console.log(row,'row');
    //如果 evisaPdfUrl 不为空，使用evisaPdfUrl，反之使用pdfUrl
    // if (row['evisaPdfUrl']) {
    //     window.open(row['evisaPdfUrl'],'_blank')
    // } else if (row['pdfUrl']) {
    //     window.open(row['pdfUrl'],'_blank')
    // } else {
    //     window.$message?.warning('文件不存在')
    // }
}
// 暴露出去
defineExpose({
    getFormData,
    getFormRegExpJson,
    getActiveKey,
    setActiveKey
})
</script>

<style lang="scss" scoped>
.data-fill-list-box {
    position: relative;
    //margin-bottom: 25%;
    .hc-collapse-item-header {
        flex: 1;
        position: relative;
        margin-left: 46px;
        display: flex;
        align-items: center;
        .item-title {
            flex: 1;
            position: relative;
            user-select: none;
            color: #50545E;
            font-size: 16px;
            font-weight: 400;
            cursor: pointer;
        }
        .hc-extra-text-box {
            position: relative;
            padding-right: 24px;
        }
    }
    .data-fill-list-item-content {
        position: relative;
        display: flex;
        height: calc(100vh - 386px);
        .data-fill-table-form-box {
            position: relative;
            padding: 24px 20px;
            height: 100%;
            overflow: auto;
            flex: 1;
            .hc-no-table-form {
                position: relative;
                height: 100%;
                display: flex;
                justify-content: center;
                align-items: center;
                .table-form-no {
                    position: relative;
                    img {
                        width: 350px;
                    }
                    .desc {
                        text-align: center;
                        font-size: 20px;
                        color: #aaa;
                    }
                }
            }
        }
        .data-fill-table-tip-box {
            width: 240px;
            position: relative;
            border-left: 1px solid #E9E9E9;
            padding: 20px 15px 80px;
            .tip-title {
                font-size: 16px;
                margin-bottom: 10px;
                display: flex;
                align-items: center;
            }
            .tip-item {
                margin-bottom: 20px;
            }
            .table-tip-foot {
                position: absolute;
                bottom: 15px;
                right: 0;
                left: 0;
                display: flex;
                align-items: center;
                padding: 0 15px;
                .tip-left-btn {
                    flex: 1;
                    .dow-text {
                        cursor: pointer;
                        display: flex;
                        align-items: center;
                    }
                }
            }
        }
    }
}
.special-box {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    border: 1px solid #eee;
    border-radius: 3px;
    height: 52px;
    width: 52px;
    cursor: pointer;
    user-select: none;
    transition: color .3s, background-color .3s;
    &:hover {
        color: var(--el-color-primary);
        background-color: var(--el-color-primary-light-8);
    }
    .font-EUDC {
        font-size: 22px;
    }
}
.radio-group-box{
    text-align: center;
}
</style>

<style lang="scss">
.data-fill-list-box {
    .el-collapse {
        --el-collapse-header-height: 60px;
        border: 0;
        .el-collapse-item {
            margin: 0 0 16px;
            background-color: #f1f5f8;
            border: 1px solid #E9E9E9;
            border-radius: 4px;
        }
        .el-collapse-item__header {
            background-color: transparent;
            font-weight: 400;
            border-bottom: 0;
            cursor: default;
            font-size: 14px;
            .el-collapse-item__arrow {
                position: absolute;
                color: #50545E;
                cursor: pointer;
                left: 20px;
                margin: 0;
            }
        }
        .el-collapse-item.is-active .el-collapse-item__header.is-active {
            background-color: #E7EEF4;
        }
        .el-collapse-item__wrap {
            background-color: transparent;
            border-bottom: 0;
            .el-collapse-item__content {
                position: relative;
                padding-bottom: 0;
                font-size: 14px;
                color: #50545E;
                line-height: initial;
            }
        }
    }
}

//插入特殊字符弹窗的输入框
.data-fill-list-box .data-fill-table-form-box td,
.data-fill-list-box .data-fill-table-form-box td .el-input .el-input__wrapper .el-input__inner,
.el-form-item.special-form-item .el-form-item__content .el-input .el-input__wrapper .el-input__inner {
    font-family: "EUDC", 宋体, v-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
//复制本表弹窗
.copy-node-many-box {
    position: relative;
    height: 53vh;
    display: flex;
    margin-top: 24px;
    margin-bottom: -30px;
    border-top: 1px solid #efeff5;
    .copy-node-many-tree {
        position: relative;
        flex: 1;
        height: 100%;
        padding: 20px 20px 20px 0;
        border-right: 1px solid #efeff5;
    }
    .copy-node-many-table {
        position: relative;
        flex: 1;
        height: 100%;
        padding: 20px 0 20px 20px;
    }
}

//关联试验数据
.adding-form-dialog-box {
    position: relative;
    height: 100%;
    display: flex;
    .dialog-tree-box {
        position: relative;
        border-right: 1px solid #EEEEEE;
        width: 500px;
        height: 100%
    }
    .dialog-table-box {
        position: relative;
        flex: 1;
        height: 100%;
        padding: 18px;
        .dialog-search {
            position: relative;
            display: flex;
        }
        .dialog-table {
            position: relative;
            height: calc(100% - 68px);
            padding: 18px 0;
        }
        .dialog-pages {
            position: relative;
        }
    }
}
.copy-node-many-table {
    position: relative;
    flex: 1;
    height: 100%;
    padding: 20px 0 20px 20px;
}
.dialog-table-box {
        position: relative;
        flex: 1;
        height: 100%;
        padding: 18px;
        .dialog-search {
            position: relative;
            display: flex;
        }
        .dialog-table {
            position: relative;
            height: calc(100% - 68px);
            padding: 18px 0;
        }
        .dialog-pages {
            position: relative;
        }
    }
</style>
