1
QYF-GitLab1
2024-07-24 caeb2c4b5fa88f6fe8799b67c790d8ad8b4d98e8
src/pages/academicSchools/index.vue
@@ -4,30 +4,229 @@
  >
    <headNav :idIndex="'6'" text="学术流派" />
    <!-- 高级搜索 -->
    <view style="margin-top: 0.1rem">
    <view
      style="
        padding-left: 0.6rem;
        margin-top: 0.1rem;
        display: flex;
        position: relative;
      "
    >
      <advancedSearch
        @onSearch="onSearch"
        @onSubmit="onSubmit"
        :from="From"
        placehold="请输入关键字"
        :isAvancedTrue="false"
        :keyword="searchKey"
        :advancedSearchBack="advancedSearchBack"
      />
    </view>
    <!-- 热门搜索 -->
    <view class="flex flex-center hotSearch">
      热门搜索:
      <ul class="flex" style="margin-right: 10rpx">
        <li
          @click="onSearch({ text: item }, index)"
          :class="{ cursor: true, active: hotAciveIndex === index }"
          v-for="(item, index) in hotKeyList"
          :key="item"
      <view
        @click="isAvancedClick"
        style="
          color: #244a7b;
          cursor: pointer;
          font-size: 0.12rem;
          margin-left: 0.35rem;
          line-height: 0.58rem;
        "
        >高级搜索 {{ isAdvancedSearch ? "∧" : "∨" }}</view
      >
      <!-- 热门搜索 -->
      <view class="flex flex-center hotSearch" style="margin-left: 2rem">
        热门搜索:
        <ul class="flex" style="margin-right: 10rpx">
          <li
            @click="onSearch({ text: item }, index)"
            :class="{ cursor: true, active: hotAciveIndex === index }"
            v-for="(item, index) in hotKeyList"
            :key="item.name"
          >
            {{ item.name }}
          </li>
        </ul>
      </view>
      <view v-if="isAdvancedSearch" class="searchDialog">
        <h3 style="margin-bottom: 0.2rem">高级搜索</h3>
        <el-form
          label-width="100px"
          :model="formData"
          ref="searchForm"
          size="mini"
        >
          {{ item }}
        </li>
      </ul>
          <el-row>
            <el-col :span="8">
              <el-form-item label="姓名/别名:">
                <el-input v-model="formData.name"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="活动地:">
                <div class="selectActivelyBox" @click="selectActively">
                  <p v-if="formData.actively.length == 0">请选择活动地</p>
                  <el-tag
                    style="margin-right: 5px"
                    v-for="item in formData.actively"
                    :key="item.index"
                    size="small"
                    type="info"
                    >{{ item.name }}</el-tag
                  >
                </div>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="作品:">
                <el-input v-model="formData.works"></el-input>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row>
            <el-col :span="8">
              <el-form-item label="人物标签:">
                <el-select
                  multiple
                  style="width: 100%"
                  v-model="formData.personTags"
                  placeholder="请选择人物标签"
                >
                  <el-option
                    v-for="item in personTag"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                  ></el-option>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="社会身份:">
                <el-select
                  multiple
                  style="width: 100%"
                  v-model="formData.socialIdentity"
                  placeholder="请选择社会身份"
                >
                  <el-option
                    v-for="item in socialDistinction"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id"
                  ></el-option>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="时期:">
                <el-select
                  multiple
                  style="width: 100%"
                  v-model="formData.period"
                  placeholder="请选择时期"
                >
                  <el-option
                    v-for="item in dynastyData"
                    :key="item.dynastyId"
                    :label="item.name"
                    :value="item.dynastyId"
                  ></el-option>
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          <div style="text-align: right">
            <el-button
              size="mini"
              style="background-color: #244a7b; color: #fff"
              @click="searchFun"
              >搜索</el-button
            >
            <el-button size="mini" @click="resetForm">重置</el-button>
          </div>
        </el-form>
        <div class="fromTable">
          <el-table
            :data="tableData"
            class="lightBo"
            style="width: 100%"
            empty-text="暂无搜索信息"
            size="small"
            :border="true"
          >
            <el-table-column
              prop="id"
              label="序号"
              width="70"
            ></el-table-column>
            <el-table-column prop="personName" width="120" label="姓名">
              <template slot-scope="scope">
                <a
                  style="cursor: pointer; color: #027edc"
                  @click="gotoDetail(scope.row.id)"
                  >{{ scope.row.personName }}</a
                >
              </template>
            </el-table-column>
            <el-table-column prop="personAlias" label="别名"></el-table-column>
            <el-table-column prop="palce" label="活动地"></el-table-column>
            <el-table-column
              prop="birthYear"
              label="医学分科"
              width="120"
            ></el-table-column>
            <el-table-column prop="deathYear" label="作品"></el-table-column>
            <el-table-column
              prop="nativePlace"
              width="120"
              label="人物标签"
            ></el-table-column>
            <el-table-column
              prop="socialDistinction"
              label="社会身份"
              width="120"
            ></el-table-column>
            <el-table-column
              prop="official"
              width="120"
              label="时期"
            ></el-table-column>
          </el-table>
          <div style="text-align: right;padding-top: 20px;">
            <el-button style="width: 120px;background-color: #244a7b; color: #fff"
              >确认</el-button
            >
          </div>
        </div>
      </view>
      <div v-if="showPerson" class="personDialog">
        <i
          class="el-icon-circle-close closeBtn"
          @click="
            () => {
              showPerson = false;
            }
          "
        ></i>
        <el-table :data="personList" style="width: 100%">
          <el-table-column prop="name" label="姓名">
            <template slot-scope="scope">
              <span
                style="color: #409eff; cursor: pointer"
                @click="
                  () => {
                    currentId = scope.row.id;
                    getData();
                  }
                "
                >{{ scope.row.name }}</span
              >
            </template>
          </el-table-column>
          <el-table-column prop="age" label="时代"> </el-table-column>
          <el-table-column prop="nativePlace" label="籍贯"> </el-table-column>
          <el-table-column prop="alias" label="别名"> </el-table-column>
          <el-table-column prop="division" label="医学分科"> </el-table-column>
        </el-table>
      </div>
    </view>
    <!-- 关系表地图 -->
    <div
      id="relation"
@@ -43,10 +242,25 @@
          text-align: center;
          font-size: 0.2rem;
          color: #666;
          z-index: 99;
        "
      >
        暂无相关数据
      </div>
      <div
        v-if="loading"
        v-loading="loading"
        style="
          position: absolute;
          top: 30%;
          left: 0;
          right: 0;
          text-align: center;
          font-size: 0.2rem;
          color: #666;
          z-index: 99;
        "
      ></div>
    </div>
    <div id="customDialog" class="customDialog">
      <div class="title">
@@ -62,6 +276,102 @@
      </div>
      <div class="btn" @click="spaceTimeArr(detailData.id)">查看更多>>></div>
    </div>
    <div id="schoolDialog" class="customDialog">
      <div class="title">
        <span>{{ detailData.name }}</span>
        <span @click="closeDom">关闭</span>
      </div>
      <div class="content">
        <p>姓名:{{ detailData.name }}</p>
        <p>别名:{{ detailData.alias }}</p>
        <p>籍贯:{{ detailData.nativePlace }}</p>
        <p>医学分科: {{ detailData.medicalBranch }}</p>
        <p>小传:{{ detailData.biography }}</p>
      </div>
      <div class="btn" @click="spaceTimeArr(detailData.id)">查看更多>>></div>
    </div>
    <el-drawer
      title="地址列表"
      :visible.sync="drawer"
      direction="rtl"
      :before-close="handleClose"
      class="customDrawer"
    >
      <div class="drawerContent">
        <div class="drawerTips">選中的地址:</div>
        <div class="drawerTable">
          <div class="tableTabs">
            <div class="inputItem">
              <el-input
                placeholder="請輸入地名搜索"
                v-model="tableKey"
                class="input-with-select"
                @keyup.enter="searchAddress"
              >
                <el-button
                  @click="searchAddress"
                  type="primary"
                  slot="append"
                  icon="el-icon-search"
                ></el-button>
              </el-input>
            </div>
            <div class="selectItem">
              <el-select v-model="dynastyId" placeholder="請選擇時期">
                <el-option
                  v-for="item in dynastyData"
                  :key="item.dynastyId + '0'"
                  :label="item.name"
                  :value="item.dynastyId"
                ></el-option>
              </el-select>
            </div>
          </div>
          <el-table
            ref="multipleTable"
            :data="gridData"
            style="width: 100%"
            height="530"
            @selection-change="handleSelectionChange"
            row-key="index"
          >
            <el-table-column type="selection" width="55"> </el-table-column>
            <el-table-column prop="currentName" label="地名"> </el-table-column>
            <el-table-column width="250" label="年代區間">
              <template slot-scope="scope">{{
                scope.row.start + "-" + scope.row.end
              }}</template>
            </el-table-column>
            <el-table-column
              prop="dynastyName"
              label="時期"
              width="250"
              show-overflow-tooltip
            >
            </el-table-column>
          </el-table>
        </div>
        <div class="drawerPage">
          <el-pagination
            class="paging flex"
            background
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[10, 20, 60, 100]"
            :page-size="pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="total"
          >
          </el-pagination>
        </div>
        <div class="drawerBtn">
          <el-button @click="setCurrent">全選當前頁</el-button>
          <el-button @click="setCurrent('cancle')">取消全選</el-button>
          <el-button @click="drawer = false" type="primary">確定</el-button>
        </div>
      </div>
    </el-drawer>
  </view>
</template>
@@ -69,12 +379,18 @@
import {
  getPersonData,
  getHotSearch,
  getPDataStatistics,
  academicSearch,
  getPersonTag,
  getSocialDistinction,
  getDynastyAll,
  getPlaceInfo,
} from "@/api/index.js";
import * as echarts from "echarts";
export default {
  data() {
    return {
      // 高級搜索表格
      tableData: [],
      loading: true,
      hotAciveIndex: "",
      currentId: 21682,
@@ -82,201 +398,203 @@
      nodes: [],
      // echarts两者的关系
      relationships: [],
      // 高级搜索
      From: {
        from: [
          {
            type: "input",
            label: "姓名",
            name: "name",
            value: "",
          },
          {
            type: "input",
            label: "别名",
            name: "alias",
            value: "",
          },
          {
            type: "input",
            label: "籍贯",
            name: "location",
            value: "",
          },
          {
            type: "select",
            label: "职业",
            name: "sdId",
            value: "",
            options: [
              {
                label: "未指明",
                value: "UNKNOWN",
              },
            ],
          },
          {
            type: "input",
            label: "官职",
            name: "office",
            value: "",
          },
          {
            type: "select",
            label: "性别",
            value: "",
            name: "genderTypeEO",
            options: [
              {
                label: "未指明",
                value: "UNKNOWN",
              },
              {
                label: "男",
                value: "MALE",
              },
              {
                label: "女",
                value: "WOMAN",
              },
            ],
          },
          {
            type: "input",
            label: "时期",
            name: "period",
            value: "",
          },
          {
            type: "input",
            label: "机构",
            name: "inst",
            value: "",
          },
          {
            type: "number",
            label: "页码",
            name: "page",
            value: "",
          },
          {
            type: "number",
            label: "页大小",
            name: "pageSize",
            value: "",
          },
        ],
      },
      // 下面的朝代1
      dynastyColor: 1,
      // 朝代
      dynasty: [
        {
          name: "夏朝",
          coord: "2070BC",
          id: 1,
        },
        {
          name: "商朝",
          id: 2,
          coord: "1600BC",
        },
        {
          name: "西周",
          id: 3,
          coord: "1600BC",
        },
        {
          name: "春秋战国",
          id: 4,
          coord: "770BC",
        },
        {
          name: "秦朝",
          id: 5,
          coord: "221BC",
        },
        {
          name: "汉朝",
          id: 6,
          coord: "202BC",
        },
        {
          name: "三国两晋南北朝",
          id: 7,
          coord: "184",
        },
        {
          name: "隋朝",
          id: 8,
          coord: "581",
        },
        {
          name: "唐朝",
          id: 9,
          coord: "618",
        },
        {
          name: "五代十国",
          id: 10,
          coord: "907",
        },
        {
          name: "辽夏金",
          id: 11,
          coord: "907",
        },
        {
          name: "宋朝",
          id: 12,
          coord: "960",
        },
        {
          name: "元朝",
          id: 13,
          coord: "1271",
        },
        {
          name: "明朝",
          id: 14,
          coord: "1368",
        },
        {
          name: "清朝",
          id: 15,
          coord: "1636",
        },
      ],
      // 热门搜索
      hotKeyList: [],
      searchKey: "",
      // 分类
      categories: [],
      // 人物信息
      infoOfPersons: [],
      // 学术流派
      infoOfSchools: [],
      categories: [
        {
          name: "亲属关系",
        },
        {
          name: "师承关系",
        },
        {
          name: "文献作品",
        },
        {
          name: "社会关系",
        },
        {
          name: "活动地",
        },
        {
          name: "学术流派",
        },
      ],
      // 当前人物信息
      ownInfo: null,
      detailData: {
        name: "",
      },
      isAdvancedSearch: false,
      formData: {
        name: "",
        actively: [],
        works: "",
        personTags: "",
        socialIdentity: "",
        period: "",
      },
      showPerson: false,
      personList: [],
      personPageInfo: {
        totalCount: 0,
        page: 1,
        limit: 10,
      },
      personTag: [],
      socialDistinction: [],
      dynastyData: [],
      // 抽屉
      gridData: [],
      page: 1,
      currentPage: 1,
      pageSize: 10,
      total: 0,
      drawer: false,
      dynastyId: "",
      tableKey: "",
      multipleTableSelection: [],
      // echarts
      infoOfPersons: [],
      infoOfSchools: [],
      nodeDatas: [],
      links: [],
    };
  },
  mounted() {
    this.getData();
    // this.echartsArr();
    this.hotSearch();
    // 获取人物标签、社会身份
    this.getOptionInfo();
    // 獲取地址列表
    this.getAddressList();
    // 监听窗口大小变化
    window.addEventListener("resize", this.relation);
    this.innt();
  },
  onLoad(options) {
    this.searchKey = options.keyword;
  },
  methods: {
    // 搜索地址
    searchAddress() {
      this.gridData = [];
      this.getAddressList();
    },
    //  分页
    handleSizeChange(val) {
      this.pageSize = val;
      this.getAddressList();
    },
    handleCurrentChange(val) {
      this.page = val;
      this.getAddressList();
    },
    // 表格选择
    handleSelectionChange(val) {
      const data = val.map((item) => {
        return {
          ...item,
          name: item.currentName,
          id: item.dynastyId,
        };
      });
      this.formData.actively = data;
      this.multipleTableSelection = this.formData.actively;
    },
    // 全選
    setCurrent(str) {
      if (str == "cancle") {
        this.$refs.multipleTable.clearSelection();
        return false;
      }
      if (this.gridData.length) {
        this.$refs.multipleTable.clearSelection();
        this.gridData.forEach((row) => {
          this.$refs.multipleTable.toggleRowSelection(row);
        });
        const data = this.gridData.map((item) => {
          return {
            ...item,
            name: item.currentName,
            id: item.dynastyId,
          };
        });
        this.formData.actively = data;
        this.multipleTableSelection = this.formData.actively;
      }
    },
    // 獲取地址列表
    getAddressList() {
      const data = {
        page: this.page,
        pageSize: this.pageSize,
      };
      if (this.dynastyId != "") {
        data["dynastyId"] = this.dynastyId;
      }
      if (this.tableKey != "") {
        data["keyword"] = this.tableKey;
      }
      getPlaceInfo(data).then((res) => {
        if (res?.success && res?.npage) {
          this.total = res.npage.totalCount;
        }
        if (res?.success && res?.list.length) {
          this.gridData = res?.list?.map((item, i) => {
            return {
              ...item,
              index: i,
            };
          });
          setTimeout(() => {
            this.multipleTableSelection.forEach((row) => {
              this.$refs.multipleTable.toggleRowSelection(row);
            });
            this.formData.actively = this.multipleTableSelection;
          }, 2000);
        } else {
          this.gridData = [];
        }
      });
    },
    getOptionInfo() {
      getDynastyAll().then((res) => {
        this.dynastyData = res.list;
      });
      getPersonTag().then((res) => {
        this.personTag = res.list;
      });
      getSocialDistinction().then((res) => {
        this.socialDistinction = res.list;
      });
    },
    resetForm(formName) {
      this.formData = {
        name: "",
        actively: [],
        works: "",
        personTags: "",
        socialIdentity: "",
        period: "",
      };
    },
    searchFun() {
      console.log(this.formData);
    },
    selectActively() {
      this.drawer = true;
    },
    handleClose(done) {
      done();
    },
    // 获取人物关系
    getPersonInfo(arr, str, newArr, order, type, parent) {
      for (let i = 0; i < arr.length; i++) {
@@ -288,12 +606,15 @@
          const obj = {
            personId: ele.personId,
            parentId: parent.id,
            id2: personInfo.id,
            relationTypeName: ele.relationTypeName,
            parentName: parent?.NAME[0]?.content1 ?? parent.parentName,
            name2: personInfo?.NAME[0]?.content1,
            name: personInfo?.NAME[0]?.content1,
            category: type,
            symbolSize: 15,
          };
          if (order > 80) {
            order = 80;
          }
          if (str == "literatureList") {
            obj.relationTypeName = ele.literatureName;
          }
@@ -308,7 +629,7 @@
          }
          newArr.push(obj);
          if (ele["kinList"] && ele["kinList"]?.length) {
            order++;
            order += 15;
            this.getPersonInfo(
              ele["kinList"],
              "kinList",
@@ -319,7 +640,7 @@
            );
          }
          if (ele["teacherStudentList"] && ele["teacherStudentList"]?.length) {
            order++;
            order += 15;
            this.getPersonInfo(
              ele["teacherStudentList"],
              "teacherStudentList",
@@ -334,7 +655,7 @@
              ele["literatureList"],
              "literatureList"
            );
            order++;
            order += 15;
            this.getPersonInfo(
              data,
              "literatureList",
@@ -347,7 +668,7 @@
          if (ele["socialList"] && ele["socialList"]?.length) {
            const data = this.changeLiterature(ele["socialList"], "socialList");
            order++;
            order += 15;
            this.getPersonInfo(
              data,
              "socialList",
@@ -359,12 +680,12 @@
          }
          if (ele["placeList"] && ele["placeList"]?.length) {
            const data = this.changeLiterature(ele["placeList"], "placeList");
            order++;
            order += 15;
            this.getPersonInfo(data, "placeList", newArr, order, 4, personInfo);
          }
          if (ele["schoolList"] && ele["schoolList"]?.length) {
            const data = this.changeLiterature(ele["schoolList"], "schoolList");
            order++;
            order += 15;
            this.getPersonInfo(
              data,
              "schoolList",
@@ -385,16 +706,16 @@
        if (!ele.personId && ele.personList?.length) {
          ele.literatureList = [];
          ele.personId = this.ownInfo.id;
          if (ele[str] && ele[str]?.length) {
            for (let j = 0; j < ele.personList.length; j++) {
              const item = ele.personList[j];
          if (ele["personList"] && ele["personList"]?.length) {
            for (let j = 0; j < ele["personList"].length; j++) {
              const item = ele["personList"][j];
              const data = item[str]?.map((e) => {
                return {
                  ...e,
                  personId: item.personId,
                };
              });
              if (data?.length) {
              if (ele[str] && data?.length) {
                ele[str].push(...data);
              }
            }
@@ -403,7 +724,6 @@
      }
      return arr;
    },
    //数组去重
    deduplicateArray(arr, idKey) {
      // 使用一个辅助对象来跟踪已经见过的ID
@@ -428,161 +748,369 @@
    getData() {
      this.loading = true;
      getPersonData(this.currentId).then((res) => {
        this.nodes = [];
        this.relationships = [];
        let kinData = [];
        let teacher = [];
        let literature = [];
        let social = [];
        let place = [];
        let school = [];
        if (res && res.success && res.object) {
          // console.log(res.object);
          this.infoOfPersons = res.object?.infoOfPersons;
          this.infoOfSchools = res.object?.infoOfSchools;
          if (res.object?.personChain) {
            this.ownInfo = this.infoOfPersons.find(
              (item) => item.id == res.object?.personChain.personId
            );
            const obj = res.object?.personChain;
            if (obj.kinList?.length) {
              let newArr = [];
              this.categories.push({ name: "亲属关系" });
              this.getPersonInfo(
                obj.kinList,
                "kinList",
                newArr,
                1,
                0,
                this.ownInfo
              );
              kinData = [...newArr];
            }
            if (obj.teacherStudentList?.length) {
              this.categories.push({ name: "师承关系" });
              let newArr = [];
              this.getPersonInfo(
                obj.teacherStudentList,
                "teacherStudentList",
                newArr,
                1,
                1,
                this.ownInfo
              );
              teacher = [...newArr];
            }
            if (obj.literatureList?.length) {
              this.categories.push({ name: "文献作品" });
              let newArr = [];
              const data = this.changeLiterature(
                obj.literatureList,
                "literatureList"
              );
              this.getPersonInfo(
                data,
                "literatureList",
                newArr,
                1,
                2,
                this.ownInfo
              );
              literature = [...newArr];
              // console.log(literature, "literature");
            }
            if (obj.socialList?.length) {
              let newArr = [];
              this.categories.push({ name: "社会关系" });
              const data = this.changeLiterature(obj.socialList, "socialList");
              this.getPersonInfo(
                data,
                "socialList",
                newArr,
                1,
                3,
                this.ownInfo
              );
              social = [...newArr];
            }
            if (obj.placeList?.length) {
              this.categories.push({ name: "活动地" });
              let newArr = [];
              const data = this.changeLiterature(obj.placeList, "placeList");
              this.getPersonInfo(data, "placeList", newArr, 1, 4, this.ownInfo);
              place = [...newArr];
            }
            if (obj.schoolList?.length) {
              this.categories.push({ name: "学术流派" });
              let newArr = [];
              const data = this.changeLiterature(obj.schoolList, "schoolList");
              this.getPersonInfo(
                data,
                "schoolList",
                newArr,
                1,
                5,
                this.ownInfo
              );
              school = [...newArr];
            }
          }
          const personData = [
            ...kinData,
            ...teacher,
            ...literature,
            ...social,
            ...place,
            ...school,
          ];
          // const k = personData.filter((item) => item.category == 0);
          // const t = personData.filter((item) => item.category == 1);
          // const l = personData.filter((item) => item.category == 2);
          // const o = personData.filter((item) => item.category == 3);
          // const p = personData.filter((item) => item.category == 4);
          // const s = personData.filter((item) => item.category == 5);
          // const nodesList = [...k, ...t, ...l, ...o, ...p, ...s];
          // console.log(nodesList);
          personData.forEach((item) => {
            let exists1 = this.nodes.some(
              (node) =>
                node.id === item.parentId && node.name === item.parentName
            );
            let exists2 = this.nodes.some(
              (node) => node.id === item.parentId && node.name === item.name2
            );
            // 证明不存在
            if (item.name1 && exists1 !== true) {
              this.nodes.push({
                name: item.parentName,
                id: item.parentId,
                ...item,
              });
            }
            if (item.name2 && exists2 !== true) {
              this.nodes.push({
                name: item.name2,
                id: item.id2,
                ...item,
              });
            }
            let obj = {
              source: item.parentName,
              target: item.name2,
              relation: item.relationTypeName || "", // 如果存在 relationName 字段则使用,否则为空字符串
            };
            this.relationships.push(obj);
          });
        if (res && res.object) {
          this.infoOfPersons = res?.object?.infoOfPersons;
          this.infoOfSchools = res?.object?.infoOfSchools;
          this.nodeDatas = [];
          this.links = [];
          this.handleData([res.object.personChain], null);
          this.loading = false;
          this.relation();
        } else {
          this.loading = false;
          this.nodeDatas = [];
          this.links = [];
        }
        this.loading = false;
        this.relation();
        // this.nodes = [];
        // this.relationships = [];
        // let kinData = [];
        // let teacher = [];
        // let literature = [];
        // let social = [];
        // let place = [];
        // let school = [];
        // if (res && res.success && res.object) {
        //   this.infoOfPersons = res.object?.infoOfPersons;
        //   this.infoOfSchools = res.object?.infoOfSchools;
        //   if (res.object?.personChain) {
        //     this.ownInfo = this.infoOfPersons.find(
        //       (item) => item.id == res.object?.personChain.personId
        //     );
        //     const obj = res.object?.personChain;
        //     if (obj.kinList?.length) {
        //       let newArr = [];
        //       this.categories.push({ name: "亲属关系" });
        //       this.getPersonInfo(
        //         obj.kinList,
        //         "kinList",
        //         newArr,
        //         1,
        //         0,
        //         this.ownInfo
        //       );
        //       kinData = [...newArr];
        //     }
        //     if (obj.teacherStudentList?.length) {
        //       this.categories.push({ name: "师承关系" });
        //       let newArr = [];
        //       this.getPersonInfo(
        //         obj.teacherStudentList,
        //         "teacherStudentList",
        //         newArr,
        //         1,
        //         1,
        //         this.ownInfo
        //       );
        //       teacher = [...newArr];
        //     }
        //     if (obj.literatureList?.length) {
        //       this.categories.push({ name: "文献作品" });
        //       let newArr = [];
        //       const data = this.changeLiterature(
        //         obj.literatureList,
        //         "literatureList"
        //       );
        //       this.getPersonInfo(
        //         data,
        //         "literatureList",
        //         newArr,
        //         1,
        //         2,
        //         this.ownInfo
        //       );
        //       literature = [...newArr];
        //       // console.log(literature, "literature");
        //     }
        //     if (obj.socialList?.length) {
        //       let newArr = [];
        //       this.categories.push({ name: "社会关系" });
        //       const data = this.changeLiterature(obj.socialList, "socialList");
        //       this.getPersonInfo(
        //         data,
        //         "socialList",
        //         newArr,
        //         1,
        //         3,
        //         this.ownInfo
        //       );
        //       social = [...newArr];
        //     }
        //     if (obj.placeList?.length) {
        //       this.categories.push({ name: "活动地" });
        //       let newArr = [];
        //       const data = this.changeLiterature(obj.placeList, "placeList");
        //       console.log(data, "place");
        //       this.getPersonInfo(data, "placeList", newArr, 1, 4, this.ownInfo);
        //       place = [...newArr];
        //     }
        //     if (obj.schoolList?.length) {
        //       this.categories.push({ name: "学术流派" });
        //       let newArr = [];
        //       const data = this.changeLiterature(obj.schoolList, "schoolList");
        //       this.getPersonInfo(
        //         data,
        //         "schoolList",
        //         newArr,
        //         1,
        //         5,
        //         this.ownInfo
        //       );
        //       school = [...newArr];
        //     }
        //   }
        //   const personData = [
        //     ...kinData,
        //     ...teacher,
        //     ...literature,
        //     ...social,
        //     ...place,
        //     ...school
        //   ];
        //   personData.forEach((item) => {
        //     this.nodes.push({
        //       name: item.name,
        //       id: item.personId,
        //       ...item
        //     });
        //     let obj = {
        //       source: item.parentName,
        //       target: item.name,
        //       relation: item.relationTypeName || "" // 如果存在 relationName 字段则使用,否则为空字符串
        //     };
        //     this.relationships.push(obj);
        //   });
        // }
      });
    },
    // 递归处理所有层级数据
    handleData(data, parent) {
      for (let i = 0; i < data.length; i++) {
        const item = data[i];
        // 处理node/link
        if (!parent) {
          // 当前人物
          item.mainId = item.personId + "_p";
          const mainPerson = this.infoOfPersons.find(
            (pItem) => pItem.id == item.personId
          );
          this.nodeDatas.push({
            id: item.mainId,
            name: mainPerson.NAME[0].content1,
            itemStyle: {
              color: "#244a7b",
            },
          });
        } else {
          switch (parent.thisType) {
            case 1:
              item.mainId = item.personId + "_p";
              if (
                this.nodeDatas.findIndex((cItem) => cItem.id == item.mainId) ==
                -1
              ) {
                const p = this.infoOfPersons.find(
                  (pItem) => pItem.id == item.personId
                );
                if (p) {
                  this.nodeDatas.push({
                    category: 0,
                    id: item.mainId,
                    name: p.NAME[0].content1,
                  });
                }
              }
              this.links.push({
                source: item.mainId,
                target: parent.mainId,
                label: {
                  show: true,
                  formatter: item.relationTypeName,
                  color: "#2C2C2C",
                  fontSize: 14,
                  backgroundColor: "rgba(255, 255, 255, 1)",
                  padding: [3, 8],
                  borderRadius: 30,
                  position: "middle", // 设置标签文本在线的中间位置上居中显示
                  distance: -10, // 将标签放置在连接线上
                },
              });
              break;
            case 2:
              item.mainId = item.literatureId + "_l";
              if (
                this.nodeDatas.findIndex((cItem) => cItem.id == item.mainId) ==
                -1
              ) {
                this.nodeDatas.push({
                  category: 2,
                  id: item.mainId,
                  name: item.literatureName,
                });
              }
              this.links.push({
                source: item.mainId,
                target: parent.mainId,
              });
              break;
            case 3:
              item.mainId = item.ancientName + "_a";
              if (
                this.nodeDatas.findIndex((cItem) => cItem.id == item.mainId) ==
                -1
              ) {
                this.nodeDatas.push({
                  category: 4,
                  id: item.mainId,
                  name: item.ancientName,
                });
              }
              this.links.push({
                source: item.mainId,
                target: parent.mainId,
              });
              break;
            case 4:
              item.mainId = item.schoolId + "_s";
              if (
                this.nodeDatas.findIndex((cItem) => cItem.id == item.mainId) ==
                -1
              ) {
                const s = this.infoOfSchools.find(
                  (sItem) => sItem.schoolId == item.schoolId
                );
                if (s) {
                  this.nodeDatas.push({
                    category: 5,
                    id: item.mainId,
                    name: s.name[0],
                  });
                }
              }
              this.links.push({
                source: item.mainId,
                target: parent.mainId,
              });
              break;
            case 5:
              item.mainId = item.personId + "_p";
              if (
                this.nodeDatas.findIndex((cItem) => cItem.id == item.mainId) ==
                -1
              ) {
                const p = this.infoOfPersons.find(
                  (pItem) => pItem.id == item.personId
                );
                if (p) {
                  this.nodeDatas.push({
                    category: 3,
                    id: item.mainId,
                    name: p.NAME[0].content1,
                  });
                }
              }
              this.links.push({
                source: item.mainId,
                target: parent.mainId,
                label: {
                  show: true,
                  formatter: item.relationTypeName,
                  color: "#2C2C2C",
                  fontSize: 14,
                  backgroundColor: "rgba(255, 255, 255, 1)",
                  padding: [3, 8],
                  borderRadius: 30,
                  position: "middle", // 设置标签文本在线的中间位置上居中显示
                  distance: -10, // 将标签放置在连接线上
                },
              });
              break;
            case 6:
              item.mainId = item.personId + "_p";
              if (
                this.nodeDatas.findIndex((cItem) => cItem.id == item.mainId) ==
                -1
              ) {
                const p = this.infoOfPersons.find(
                  (pItem) => pItem.id == item.personId
                );
                if (p) {
                  this.nodeDatas.push({
                    category: 1,
                    id: item.mainId,
                    name: p.NAME[0].content1,
                  });
                }
              }
              this.links.push({
                source: item.mainId,
                target: parent.mainId,
                label: {
                  show: true,
                  formatter: item.relationTypeName,
                  color: "#2C2C2C",
                  fontSize: 14,
                  backgroundColor: "rgba(255, 255, 255, 1)",
                  padding: [3, 8],
                  borderRadius: 30,
                  position: "middle", // 设置标签文本在线的中间位置上居中显示
                  distance: -10, // 将标签放置在连接线上
                },
              });
              break;
          }
        }
        // 亲属关系
        if (item.kinList && item.kinList.length) {
          this.handleData(item.kinList, { ...item, thisType: 1 });
        }
        // 文献作品
        if (item.literatureList && item.literatureList.length) {
          this.handleData(item.literatureList, { ...item, thisType: 2 });
        }
        // 活动地
        if (item.placeList && item.placeList.length) {
          this.handleData(item.placeList, { ...item, thisType: 3 });
        }
        // 学术流派
        if (item.schoolList && item.schoolList.length) {
          this.handleData(item.schoolList, { ...item, thisType: 4 });
        }
        // 社会关系
        if (item.socialList && item.socialList.length) {
          this.handleData(item.socialList, { ...item, thisType: 5 });
        }
        // 师承关系
        if (item.teacherStudentList && item.teacherStudentList.length) {
          this.handleData(item.teacherStudentList, { ...item, thisType: 6 });
        }
      }
    },
    // 关系图谱
    relation() {
      var chartDom = document.getElementById("relation");
      var myChart = echarts.init(chartDom);
      // 假设您有节点名称和它们之间的关系数据
      var nodes = this.deduplicateArray(this.nodes, "id");
      var relationships = this.relationships;
      this.nodeDatas = this.nodeDatas.map((item) => {
        let size = 15;
        for (let i = 0; i < this.links.length; i++) {
          const linkItem = this.links[i];
          if (linkItem.source == item.id) {
            size += 5;
          }
          if (linkItem.target == item.id) {
            size += 5;
          }
        }
        return {
          ...item,
          symbolSize: size > 80 ? 80 : size,
        };
      });
      let FontSize = 12; // 字体大小
      let BorderWidth = 2; // 边框大小
@@ -605,53 +1133,8 @@
        SymbolSize = 70;
        Distance = 22;
      }
      // 根据关系数据生成连接线
      var links = [];
      relationships.forEach((relationship, i) => {
        var sourceIndex = nodes.findIndex(
          (node) => node.name === relationship.source
        );
        var targetIndex = nodes.findIndex(
          (node) => node.name === relationship.target
        );
        if (relationship.relation) {
          if (sourceIndex !== -1 && targetIndex !== -1) {
            links.push({
              source: sourceIndex,
              target: targetIndex,
              label: {
                show: true,
                formatter: function (params) {
                  // 使用函数动态生成标签内容
                  // return relationships.find(rel => rel.source === nodes[params.data
                  //       .source] && rel.target === nodes[params.data.target])
                  //    .relation;
                  return relationship.relation;
                }, // 设置关系标签内容为"Child-Parent"
                color: "#2C2C2C",
                fontSize: FontSize - 2,
                backgroundColor: "rgba(255, 255, 255, 1)",
                padding: [3, 8],
                borderRadius: 30,
                position: "middle", // 设置标签文本在线的中间位置上居中显示
                // z: -1, // 设置标签的z轴高度,使其比连接线更高
                distance: -10, // 将标签放置在连接线上
              },
            });
          }
        }
      });
      // 根据nodes动态生成节点数据
      var nodeData = nodes;
      var option;
      option = {
        backgroundColor: {
          type: "image",
          image: "/static/image/characterRelationBg.png",
          size: "100% 100%", // 背景图片的尺寸,可以是百分比或者像素
          position: "center center", // 背景图片的位置,可以是 top, bottom, middle 或者百分比
        },
        tooltip: {},
        legend: [
          {
            left: 20,
@@ -665,20 +1148,17 @@
        series: [
          {
            type: "graph",
            legendHoverLink: true,
            legendHoverLink: false,
            layout: "force",
            symbolSize: 15,
            data: nodeData,
            links: links,
            data: this.nodeDatas,
            links: this.links,
            categories: this.categories,
            roam: true,
            label: {
              show: true,
              position: "right",
              formatter: "{b}",
            },
            labelLayout: {
              hideOverlap: true,
            },
            scaleLimit: {
              min: 0.4,
@@ -700,6 +1180,14 @@
            },
          },
        ],
        color: [
          "#5470c6",
          "#3dae7b",
          "#fac858",
          "#ee6666",
          "#ea7ccc",
          "#9a60b4",
        ],
      };
      // 设置点击事件监听
      myChart.off("click");
@@ -710,75 +1198,130 @@
      });
      myChart.setOption(option);
    },
    creatDom(params) {
      const e = params.event;
      const div = document.getElementById("customDialog");
      div.style.display = "block";
      div.style.left = e.offsetX + 50 + "px";
      div.style.top = e.offsetY - 50 + "px";
      const data = this.infoOfPersons?.find(
        (i) => i.id == params.data.personId
      );
      const obj = {
        id: params.data.id,
        name:
          data?.NAME?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        alias:
          data?.ALIAS?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        nativePlace:
          data?.NATIVE_PLACE?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        medicalBranch:
          data?.MEDICAL_BRANCH?.map((e, i) => {
            i += 1;
            return e["content" + i];
          }).join("、") ?? "",
        biography: data?.BIOGRAPHY ?? "",
      };
      this.detailData = obj;
      const id = params.data.id.split("_")[0];
      const type = params.data.id.split("_")[1];
      if (type == "p") {
        // 人
        const e = params.event;
        const div = document.getElementById("customDialog");
        div.style.display = "block";
        div.style.left = e.offsetX + 50 + "px";
        div.style.top = e.offsetY - 50 + "px";
        const data = this.infoOfPersons?.find((i) => i.id == id);
        const obj = {
          id: id,
          name:
            data?.NAME?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          alias:
            data?.ALIAS?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          nativePlace:
            data?.NATIVE_PLACE?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          medicalBranch:
            data?.MEDICAL_BRANCH?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          biography: data?.BIOGRAPHY ?? "",
        };
        this.detailData = obj;
      }
      if (type == "s") {
        // 学派
        const e = params.event;
        const div = document.getElementById("schoolDialog");
        div.style.display = "block";
        div.style.left = e.offsetX + 50 + "px";
        div.style.top = e.offsetY - 50 + "px";
        const data = this.infoOfPersons?.find((i) => i.id == id);
        const obj = {
          id: params.data.id,
          name:
            data?.NAME?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          alias:
            data?.ALIAS?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          nativePlace:
            data?.NATIVE_PLACE?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          medicalBranch:
            data?.MEDICAL_BRANCH?.map((e, i) => {
              i += 1;
              return e["content" + i];
            }).join("、") ?? "",
          biography: data?.BIOGRAPHY ?? "",
        };
        this.detailData = obj;
      }
    },
    closeDom() {
      const div = document.getElementById("customDialog");
      div.style.display = "none";
    },
    // 基础搜索
    onSearch(val, index) {
      console.log(val);
      if (index !== undefined) {
        // 热门搜索关键字,直接查询数据
        this.searchKey = "";
        this.hotAciveIndex = index;
        this.currentId = val.text.id;
        this.getData();
      } else {
        this.hotAciveIndex = "";
        // 搜索先显示人物列表
        this.personPageInfo.page = 1;
        this.searchPerson(val.text);
      }
      this.getData(val.text);
    },
    // 高级搜索
    onSubmit(val) {
      getAdvanceSearch({
        ...val,
        page: 1,
        pageSize: 100,
    // 根据关键字检索人物
    searchPerson(key) {
      academicSearch({
        keyword: key,
        page: this.personPageInfo.page,
        pageSize: this.personPageInfo.limit,
      }).then((res) => {
        console.log(res, "res");
      });
    },
    advancedSearchBack() {
      uni.navigateTo({
        url: "/pages/knowledgeBase/knowledgeBase",
      });
    },
    // 点击下面的朝代按钮
    dynastyBottomClick(item) {
      this.dynastyColor = item.id;
      this.onSearch({
        text: item.name,
        this.personList = res.list.map((item) => {
          return {
            id: item.personId,
            name: item.name,
            age:
              item.periodList && item.periodList.length
                ? item.periodList[0].content2
                : "-",
            nativePlace:
              item.nativePlaceList && item.nativePlaceList.length
                ? item.nativePlaceList[0].content1
                : "-",
            alias:
              item.aliasList && item.aliasList.length
                ? item.aliasList[0].content2
                : "-",
            division:
              item.medicalBranchList && item.medicalBranchList.length
                ? item.medicalBranchList[0].content1
                : "-",
          };
        });
        this.showPerson = true;
      });
    },
    // 关系图 点击里面的元素
@@ -807,40 +1350,135 @@
        const indexList = Object.keys(res.object);
        indexList.sort((a, b) => parseInt(b) - parseInt(a));
        this.hotKeyList = indexList.map((item) => {
          return res.object[item];
          return {
            id: item,
            name: res.object[item],
          };
        });
      });
    },
    // 高级搜索里面职业的下拉菜单
    innt() {
      getPDataStatistics().then((res) => {
        const professionIndex = this.From.from.findIndex(
          (field) => field.label === "职业"
        );
        // 如果找到了职业字段
        if (professionIndex !== -1) {
          // 将 profession.list 转换为 options 格式
          const options = res.object.occupationStatistic.details.map(
            (item) => ({
              label: item.tagName,
              value: item.tagId.toString(), // 将 id 转换为字符串,确保与 value 类型一致
            })
          );
          // 更新职业字段的 options 属性
          this.$set(this.From.from[professionIndex], "options", options);
        }
      });
    isAvancedClick() {
      this.isAdvancedSearch = !this.isAdvancedSearch;
      // this.$nextTick(() => {
      //   var box1Height = document.querySelector(".fbox").offsetHeight;
      //   // let box2Height= document.querySelector('.fbox1').style.height = box1Height + 'px';
      //   let box2Height = document.querySelector(".fbox1").offsetHeight;
      //   if (box1Height <= box2Height) {
      //     document.querySelector(".fbox1").style.height = box1Height + "px";
      //   }
      // });
    },
  },
};
</script>
<style>
#relatio {
.fromTable {
  width: 100%;
  padding: 40px 0;
  box-sizing: border-box;
}
.fromTable >>> .el-table thead th.el-table__cell {
  background-color: rgb(194 208 217) !important;
  color: #333;
  font-weight: normal;
  font-size: 14px;
}
.customDrawer >>> .el-drawer__header {
  margin-bottom: 20px;
  border-bottom: 1px solid #eee;
  padding: 20px;
  box-sizing: border-box;
}
.headerClassBg {
  background-color: rgb(95, 127, 168);
}
.drawerTips {
  margin-bottom: 20px;
  color: #666;
}
.drawerTable {
  width: 100%;
}
.drawerTable >>> .el-table thead th.el-table__cell {
  background-color: rgb(231, 236, 239) !important;
  color: #333;
  font-weight: normal;
}
.tableTabs {
  width: 100%;
  display: flex;
  margin-bottom: 20px;
}
.inputItem {
  width: 80%;
}
.drawerPage {
  display: flex;
  justify-content: flex-end;
  padding: 20px 0;
  box-sizing: border-box;
}
.drawerBtn {
  display: flex;
  justify-content: flex-end;
}
.drawerContent {
  width: 100%;
  height: 100%;
  padding: 0 20px;
  box-sizing: border-box;
}
/* 分页 */
.paging ::v-deep .btn-prev,
.paging ::v-deep .btn-next {
  border: 0;
  height: 30px;
}
.paging ::v-deep .btn-prev span,
.paging ::v-deep .btn-next span {
  font-size: 0.12rem;
  height: 0.3rem;
  line-height: 0.3rem;
  background-color: #fff;
  color: #9e9e9e;
  text-align: center;
  border: 1px solid #9e9e9e;
  padding: 0 0.1rem;
}
.paging ::v-deep .el-pager li {
  font-size: 0.1rem;
  width: 0.28rem;
  height: 0.3rem;
  line-height: 0.3rem;
  background-color: #fff;
  color: #9e9e9e;
  text-align: center;
  border: 1px solid #9e9e9e;
}
#relation {
  width: 100%;
  height: 100%;
  position: relative;
  background-image: url("../../static/image/characterRelationBg.png");
  background-size: 100% 100%;
  background-repeat: no-repeat;
  background-position: center;
}
.customDialog {
@@ -926,10 +1564,60 @@
    color: #244a7b;
    margin: 0 0.1rem;
    color: #244a7b;
    &.active{
      color: #027EDC;
    &.active {
      color: #027edc;
      font-weight: bold;
    }
  }
}
.searchDialog {
  position: absolute;
  top: 0.68rem;
  left: 0;
  right: 0;
  z-index: 999;
  padding: 0.1rem 0.4rem;
  background: #fff;
  min-height: 2rem;
}
.personDialog {
  position: absolute;
  top: 0.68rem;
  z-index: 999;
  padding: 0.1rem;
  background: #fff;
  border-radius: 6px;
  box-shadow: 0 0 10px -3px #000;
  .closeBtn {
    position: absolute;
    right: -10px;
    top: -10px;
    width: 24px;
    height: 24px;
    font-size: 24px;
    background-color: #fff;
    border-radius: 50%;
    color: #f56c6c;
    cursor: pointer;
  }
}
.selectActivelyBox {
  cursor: pointer;
  border: 1px solid #dcdfe6;
  border-radius: 4px;
  padding: 0 0.12rem;
  font-size: 12px;
  color: #c0c4cc;
}
.el-drawer__wrapper {
  top: 0.86rem;
}
::v-deep .el-drawer__open .el-drawer.rtl {
  width: 50% !important;
}
</style>