Forráskód Böngészése

fix: 客户管理详情页Tab

hanxiaohui 4 hónapja
szülő
commit
0da02a0367

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
src/assets/iconfont/iconfont.js


+ 131 - 2
src/views/customer-manage/customer-detail/components/CooperativeProject/index.vue

@@ -1,3 +1,132 @@
 <template>
-  <div>合作项目</div>
-</template>
+  <div class="wrapper-cont">
+    <bs-tab-bar :tab-list="tabList" v-model:active-key="activeKey" mode="button"/>
+
+    <bs-table v-bind="tableOptions"> </bs-table>
+  </div>
+</template>
+
+<script setup lang="jsx">
+  import { useBsTable, BsTable, BsContentsWrapper, BsTabBar } from '/@/components/BsUi/index.js';
+  import { h, onMounted, ref } from 'vue';
+  import { message } from 'ant-design-vue';
+  import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+
+  const handleEdit = (row) => {};
+
+  const tabList = ref([
+    { label: '全部', key: 'all', count: '10' },
+    { label: '跟进中', key: 'tab2', count: '10' },
+    { label: '全部已中标', key: 'tab3', count: '10' },
+    { label: '交付中', key: 'tab4', count: '10' },
+    { label: '质保中', key: 'tab5', count: '10' },
+    { label: '已关闭', key: 'tab6', count: '10' },
+    { label: '未中标', key: 'tab7', count: '10' },
+    { label: '无效信息', key: 'tab8', count: '10' },
+  ]);
+
+  const activeKey = ref('all');
+
+  const {
+    tableOptions,
+    setTablePropsValue: setValue,
+    getTablePropsValue: getValue,
+  } = useBsTable({
+    tableOptions: {
+      toolbarTopConfig: {
+        enable: false,
+      },
+      gridOptions: {
+        loading: false,
+        columns: [
+          {
+            title: '基本信息',
+            field: 'name',
+            width: '150px',
+          },
+          {
+            title: '项目ID',
+            field: 'name1',
+            width: '150px',
+          },
+          {
+            title: '项目状态',
+            field: 'name2',
+            width: '150px',
+          },
+          {
+            title: '甲方概算金额(元)',
+            field: 'name3',
+            width: '150px',
+          },
+          {
+            title: '合同金额(元)',
+            field: 'name4',
+            width: '150px',
+          },
+          {
+            title: '补充协议金额(元)',
+            field: 'name5',
+            width: '150px',
+          },
+          {
+            title: '合同总金额(元)',
+            field: 'name6',
+            width: '150px',
+          },
+          {
+            title: '项目类型',
+            field: 'name6',
+            width: '150px',
+          },
+          {
+            title: '产品类型',
+            field: 'name6',
+            width: '150px',
+          },
+          {
+            title: '项目来源',
+            field: 'name6',
+            width: '150px',
+          },
+          {
+            title: '参与服务商电话',
+            field: 'name6',
+            width: '150px',
+          },
+          {
+            title: '归属营销人员',
+            field: 'name6',
+            width: '150px',
+          },
+          {
+            title: '归属营销部门',
+            field: 'name6',
+            width: '150px',
+          },
+        ],
+        data: [], // 模拟数据源
+      },
+      searchConfig: {
+        enable: false,
+      },
+      pagerConfig: {
+        enable: false,
+      },
+      toolbarConfig: {
+        enable: false,
+        displayToolbar: DISPLAY_STATE.HIDDEN,
+        leftButtons: [],
+      },
+    },
+  });
+</script>
+
+<style scoped lang="scss">
+  .wrapper-cont {
+    width: 100%;
+    :deep(.vxe-grid--table-container) {
+      padding: 10px 0 0 0;
+    }
+  }
+</style>

+ 161 - 0
src/views/customer-manage/customer-detail/components/CustomerDecisionChain/compoents/LinkList/TableInfo.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="table-wrapper">
+    <bs-table v-bind="tableOptions"> </bs-table>
+  </div>
+</template>
+
+<script setup lang="jsx">
+import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
+import { h, onMounted, ref } from 'vue';
+import { message } from 'ant-design-vue';
+import { BorderOuterOutlined, SearchOutlined, PlusSquareOutlined } from '@ant-design/icons-vue';
+import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+
+const handleEdit = (row) => {};
+
+const {
+  tableOptions,
+  setTablePropsValue: setValue,
+  getTablePropsValue: getValue,
+  fetchTableData,
+} = useBsTable({
+  tableOptions: {
+    gridOptions: {
+      loading: false,
+      headerAlign: "center",
+      columns: [
+        {
+          title: "姓名",
+          field: "name",
+          width: '150px'
+        },
+        {
+          title: "性别",
+          field: "name1",
+          width: '150px'
+        },
+        {
+          title: "年龄",
+          field: "name2",
+          width: '150px'
+        },
+        {
+          title: "联系电话",
+          field: "name3",
+          width: '150px'
+        },
+        {
+          title: "部门",
+          field: "name4",
+          width: '150px'
+        },
+        {
+          title: "职务",
+          field: "name5",
+          width: '150px'
+        },
+        {
+          title: "工作",
+          field: "name6",
+          width: '150px'
+        },
+        {
+          title: "职务权重",
+          field: "name7",
+          width: '150px'
+        },
+        {
+          title: "邮箱",
+          field: "name8",
+          width: '150px'
+        },
+        {
+          title: "上级",
+          field: "name9",
+          width: '150px'
+        },
+        {
+          title: "下级",
+          field: "name10",
+          width: '150px'
+        },
+        {
+          title: "爱好",
+          field: "name11",
+          width: '150px'
+        },
+        {
+          title: "家庭情况",
+          field: "name12",
+          width: '150px'
+        },
+        {
+          title: "家庭地址",
+          field: "name13",
+          width: '150px'
+        },
+        {
+          title: "备注",
+          field: "name14",
+          width: '150px'
+        },
+        {
+          // fixed: 'right',
+          cellRender: {
+            name: 'CellOption',
+            extraProps: {
+              buttons: [
+                {
+                  title: '编辑',
+                  code: 'edit',
+                  display: ({ row }) => {
+                    return DISPLAY_STATE.VISIBLE;
+                  },
+                  disabled({ row }) {
+                    return false;
+                  },
+                  onClick({ row }) {},
+                  extraProps: {},
+                },
+                {
+                  title: '删除',
+                  code: 'delete',
+                  display: ({ row }) => {
+                    return DISPLAY_STATE.VISIBLE;
+                  },
+                  disabled({ row }) {
+                    return false;
+                  },
+                  onClick({ row }) {},
+                  extraProps: {},
+                },
+              ],
+            },
+          },
+        },
+      ],
+      data: [], // 模拟数据源
+    },
+    searchConfig: {
+      enable: false,
+    },
+    pagerConfig: {
+      enable: false,
+    },
+    toolbarConfig: {
+      enable: false,
+      displayToolbar: DISPLAY_STATE.HIDDEN,
+      leftButtons: [],
+    },
+  },
+});
+</script>
+
+<style scoped lang="scss">
+.table-wrapper {
+  width: 100%;
+  :deep(.vxe-grid--table-container) {
+    padding: 0;
+  }
+}
+</style>

+ 29 - 0
src/views/customer-manage/customer-detail/components/CustomerDecisionChain/compoents/LinkList/index.vue

@@ -0,0 +1,29 @@
+<template>
+  <bs-catalog title="关联列表">
+
+    <template #headerRight>
+      <a-button type="primary">
+        <template #icon>
+          <PlusSquareOutlined />
+        </template>
+        <span>添加成员</span>
+      </a-button>
+    </template>
+
+    <template #content>
+      <table-info></table-info>
+    </template>
+  </bs-catalog>
+</template>
+
+<script setup>
+  import { BsCatalog } from '/@/components/BsUi/index.js';
+  import TableInfo from './TableInfo.vue';
+</script>
+
+<style scoped lang="scss">
+  .org-struct-chart {
+    width: 100%;
+    height: 100%;
+  }
+</style>

+ 283 - 0
src/views/customer-manage/customer-detail/components/CustomerDecisionChain/compoents/OrgStructChart/index.vue

@@ -0,0 +1,283 @@
+<template>
+  <div ref="containerRef" class="org-chart-container" />
+</template>
+
+<script>
+import { ref, onMounted, onBeforeUnmount } from 'vue'
+import { Graph, Node, Point } from '@antv/x6'
+
+export default {
+  name: 'OrgChart',
+  setup() {
+    const containerRef = ref(null)
+    let graph = null
+
+    // 注册节点和边的类型
+    const registerChartElements = () => {
+      Graph.registerNode(
+          'org-node',
+          {
+            width: 180,
+            height: 60,
+            markup: [
+              {
+                tagName: 'rect',
+                selector: 'body',
+              },
+              {
+                tagName: 'image',
+                selector: 'avatar',
+              },
+              {
+                tagName: 'text',
+                selector: 'rank',
+              },
+              {
+                tagName: 'text',
+                selector: 'name',
+              },
+            ],
+            attrs: {
+              body: {
+                refWidth: '100%',
+                refHeight: '100%',
+                fill: '#5F95FF',
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                rx: 10,
+                ry: 10,
+                pointerEvents: 'visiblePainted',
+              },
+              avatar: {
+                width: 48,
+                height: 48,
+                refX: 8,
+                refY: 6,
+              },
+              rank: {
+                refX: 0.9,
+                refY: 0.2,
+                fill: '#fff',
+                fontFamily: 'Courier New',
+                fontSize: 14,
+                textAnchor: 'end',
+                textDecoration: 'underline',
+              },
+              name: {
+                refX: 0.9,
+                refY: 0.6,
+                fill: '#fff',
+                fontFamily: 'Courier New',
+                fontSize: 14,
+                fontWeight: '800',
+                textAnchor: 'end',
+              },
+            },
+          },
+          true
+      )
+
+      Graph.registerEdge(
+          'org-edge',
+          {
+            zIndex: -1,
+            attrs: {
+              line: {
+                fill: 'none',
+                strokeLinejoin: 'round',
+                strokeWidth: 2,
+                stroke: '#A2B1C3',
+                sourceMarker: null,
+                targetMarker: null,
+              },
+            },
+          },
+          true
+      )
+    }
+
+    // 创建节点
+    const createNode = (x, y, rank, name, image) => {
+      return graph.addNode({
+        x,
+        y,
+        shape: 'org-node',
+        attrs: {
+          avatar: {
+            opacity: 0.7,
+            // 'xlink:href': image,
+          },
+          rank: {
+            text: rank,
+            wordSpacing: '-5px',
+            letterSpacing: 0,
+          },
+          name: {
+            text: name,
+            fontSize: 13,
+            fontFamily: 'Arial',
+            letterSpacing: 0,
+          },
+        },
+        // 禁用节点拖动
+        movable: false,
+      })
+    }
+
+    // 创建连线
+    const createLink = (source, target, vertices) => {
+      return graph.addEdge({
+        vertices,
+        source: {
+          cell: source,
+        },
+        target: {
+          cell: target,
+        },
+        shape: 'org-edge',
+        // 禁用连线拖动
+        connector: {
+          name: 'normal',
+          args: {
+            style: {
+              pointerEvents: 'none',
+            },
+          },
+        },
+        // 禁用连线调整
+        router: {
+          name: 'manhattan',
+          args: {
+            padding: 10,
+          },
+        },
+        attrs: {
+          line: {
+            // 禁止选中连线
+            pointerEvents: 'none',
+          },
+        },
+      })
+    }
+
+    // 初始化图表
+    const initChart = () => {
+      if (!containerRef.value) return
+
+      // 创建图表实例
+      graph = new Graph({
+        container: containerRef.value,
+        connecting: {
+          anchor: 'orth',
+        },
+        // 禁用鼠标滚轮缩放
+        mousewheel: {
+          enabled: true,
+        },
+        // 禁用平移
+        panning: true,
+        // 禁用框选
+        selecting: {
+          enabled: false,
+        },
+        interacting: {
+          nodeMovable: false,
+          edgeMovable: false,
+        },
+      })
+
+      // 图表数据
+      const male =
+          'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*kUy8SrEDp6YAAAAAAAAAAAAAARQnAQ'
+      const female =
+          'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*f6hhT75YjkIAAAAAAAAAAAAAARQnAQ'
+
+      // 创建节点
+      const bart = createNode(300, 70, 'CEO', 'Bart Simpson', male)
+      const homer = createNode(90, 200, 'VP Marketing', 'Homer Simpson', male)
+      const marge = createNode(300, 200, 'VP Sales', 'Marge Simpson', female)
+      const lisa = createNode(500, 200, 'VP Production', 'Lisa Simpson', female)
+      const maggie = createNode(400, 350, 'Manager', 'Maggie Simpson', female)
+      const lenny = createNode(190, 350, 'Manager', 'Lenny Leonard', male)
+      const carl = createNode(190, 500, 'Manager', 'Carl Carlson', male)
+
+      // 创建连线
+      createLink(bart, marge, [
+        {
+          x: 385,
+          y: 180,
+        },
+      ])
+      createLink(bart, homer, [
+        {
+          x: 385,
+          y: 180,
+        },
+        {
+          x: 175,
+          y: 180,
+        },
+      ])
+      createLink(bart, lisa, [
+        {
+          x: 385,
+          y: 180,
+        },
+        {
+          x: 585,
+          y: 180,
+        },
+      ])
+      createLink(homer, lenny, [
+        {
+          x: 175,
+          y: 380,
+        },
+      ])
+      createLink(homer, carl, [
+        {
+          x: 175,
+          y: 530,
+        },
+      ])
+      createLink(marge, maggie, [
+        {
+          x: 385,
+          y: 380,
+        },
+      ])
+
+      // 调整视图以适应所有节点
+      graph.zoomToFit({ padding: 20, maxScale: 1 })
+    }
+
+    // 组件挂载后初始化图表
+    onMounted(() => {
+      registerChartElements()
+      initChart()
+    })
+
+    // 组件卸载前清理图表
+    onBeforeUnmount(() => {
+      if (graph) {
+        graph.dispose()
+        graph = null
+      }
+    })
+
+    return {
+      containerRef,
+    }
+  },
+}
+</script>
+
+<style scoped>
+.org-chart-container {
+  width: 100%;
+  height: 600px;
+  border: 1px solid #e5e7eb;
+  border-radius: 6px;
+  overflow: hidden;
+}
+</style>

+ 32 - 4
src/views/customer-manage/customer-detail/components/CustomerDecisionChain/index.vue

@@ -1,7 +1,35 @@
-<script setup></script>
-
 <template>
-  <div>客户决策链</div>
+  <div class="link-company">
+    <div class="link-flow">
+      <bs-catalog title="关联公司架构">
+        <template #content>
+          <org-struct-chart />
+        </template>
+      </bs-catalog>
+    </div>
+    <div class="link-list">
+      <link-list />
+    </div>
+  </div>
 </template>
+<script setup>
+  import OrgStructChart from './compoents/OrgStructChart/index.vue';
+  import LinkList from './compoents/LinkList/index.vue';
+  import { BsCatalog } from '/@/components/BsUi/index.js';
+</script>
 
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+  .link-company {
+    width: 100%;
+    display: flex;
+    gap: 30px;
+    .link-flow {
+      border-radius: 8px;
+      flex: 1;
+    }
+    .link-list {
+      border-radius: 8px;
+      width: 800px;
+    }
+  }
+</style>

+ 1 - 4
src/views/customer-manage/customer-detail/components/FollowUp/index.vue

@@ -10,23 +10,20 @@
 </template>
 
 <script setup>
-
 import ContentLeft  from "./modules/content-left/index.vue"
 import ContentRight  from "./modules/content-right/index.vue"
-
 </script>
 
 <style lang="scss" scoped>
 .follow-up {
   width: 100%;
   display: flex;
-  height: 400px;
   gap: 20px;
   .fu-left {
     flex: 1;
   }
   .fu-right {
-    width:  580px;
+    width: 580px;
   }
 }
 </style>

+ 4 - 19
src/views/customer-manage/customer-detail/components/FollowUp/modules/content-left/index.vue

@@ -7,30 +7,13 @@
     </div>
 
     <div class="ml-bottom">
-      <a-steps
-        progress-dot
-        direction="vertical"
-        :current="1"
-        :items="[
-          {
-            title: 'Finished',
-            description: 'This is a description.',
-          },
-          {
-            title: 'In Progress',
-            description: 'This is a description.',
-          },
-          {
-            title: 'Waiting',
-            description: 'This is a description.',
-          },
-        ]"
-      ></a-steps>
+      <time-line></time-line>
     </div>
   </div>
 </template>
 <script setup>
   import SelectTab from '../select-tab.vue';
+  import TimeLine from './time-line.vue'
   import { ref } from 'vue';
   const activeKey = ref('all');
 
@@ -61,6 +44,7 @@
       padding: 8px 0 0 16px;
       color: #6c6c6c;
       font-size: 14px;
+      cursor: pointer;
     }
 
     .ml-middle {
@@ -68,6 +52,7 @@
     }
 
     .ml-bottom {
+      //overflow-y: auto;
     }
   }
 </style>

+ 97 - 0
src/views/customer-manage/customer-detail/components/FollowUp/modules/content-left/time-line.vue

@@ -0,0 +1,97 @@
+<template>
+  <a-timeline>
+    <a-timeline-item v-for="i in 5">
+      <div class="step-item">
+        <div class="step-item-header">
+          <div class="sih-left">
+            <a-avatar>元</a-avatar>
+          </div>
+          <div class="sih-right">
+            <div class="sih-r-top">
+              <span>元宏宇</span>
+              <a-tag color="success">项目类</a-tag>
+              <div class="sih-project">
+                <bs-svg-icon name="icon-project" />
+                <span>大唐集团邮箱公司</span>
+              </div>
+            </div>
+            <div class="sih-r-bottom">
+              <bs-ellipsis-text text="2025-01-01 10:20:30" />
+              <bs-ellipsis-text text="来源:移动端" />
+              <bs-ellipsis-text text="地址:江西省南昌经济技术开发区下罗(江西省公路管理局物资储运总站内)" />
+            </div>
+          </div>
+        </div>
+
+        <div class="step-item-title">
+          跟进情况详细说明信息展示位置,跟进情况详细说明信息展示位置,跟进情况详细说明信息展示位置,跟进情况详细说明信息展示位置,跟进情况详细说明信息展示位置,跟进情况详细说明信息展示位置,跟进情况详细说明信息展示位置,跟进情况详细说明信息展示位置,
+        </div>
+
+        <div class="step-item-photo">
+          <div class="sip-item"></div>
+        </div>
+      </div>
+    </a-timeline-item>
+  </a-timeline>
+</template>
+
+<script setup>
+  import { BsEllipsisText, BsSvgIcon } from '/@/components/BsUi/index.js';
+  import { theme, message } from 'ant-design-vue';
+  const { useToken } = theme;
+  const { token } = useToken();
+</script>
+
+<style lang="scss" scoped>
+  .step-item {
+    width: 100%;
+    .step-item-header {
+      width: 100%;
+      display: flex;
+      align-items: center;
+      gap: 10px;
+      .sih-left {
+      }
+
+      .sih-right {
+        width: 100%;
+        .sih-r-top {
+          display: flex;
+          gap: 5px;
+          .sih-project {
+            display: flex;
+            align-items: center;
+            gap: 5px;
+          }
+        }
+
+        .sih-r-bottom {
+          color: #6c6c6c;
+          font-size: 14px;
+          display: flex;
+          gap: 20px;
+        }
+      }
+    }
+
+    .step-item-title {
+      margin-top: 13px;
+      font-size: 14px;
+      font-weight: 400;
+      color: #202224;
+    }
+
+    .step-item-photo {
+      margin-top: 6px;
+      display: flex;
+      flex-wrap: wrap;
+      gap: 20px;
+      .sip-item {
+        width: 94px;
+        height: 94px;
+        border-radius: 16px;
+        background: #f5f6f7;
+      }
+    }
+  }
+</style>

+ 174 - 0
src/views/customer-manage/customer-detail/components/InvestmentCompetitionManagement/index.vue

@@ -0,0 +1,174 @@
+<template>
+  <bs-table v-bind="tableOptions">
+    <template #toolbarTop>
+      <div class="tool-bar-top">
+        <bs-tab-bar :tab-list="tabList" mode="capsule" v-model:active-key="activeKey"/>
+        <a-button type="primary">
+          <template #icon>
+            <PlusSquareOutlined />
+          </template>
+          <span>添加竞争对手</span>
+        </a-button>
+      </div>
+    </template>
+  </bs-table>
+</template>
+
+<script setup lang="jsx">
+  import { useBsTable, BsTable, BsTabBar } from '/@/components/BsUi/index.js';
+  import { h, onMounted, ref } from 'vue';
+  import { message } from 'ant-design-vue';
+  import { BorderOuterOutlined, SearchOutlined, PlusSquareOutlined } from '@ant-design/icons-vue';
+  import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+
+  const activeKey = ref("tab1");
+
+  const tabList = ref([
+    {
+      label: '客户投资',
+      key: 'tab1',
+    },
+    {
+      label: '竞争对手',
+      key: 'tab2',
+    },
+    {
+      label: '历史项目报价',
+      key: 'tab3',
+    },
+  ]);
+
+  const {
+    tableOptions,
+    setTablePropsValue: setValue,
+    getTablePropsValue: getValue,
+  } = useBsTable({
+    tableOptions: {
+      toolbarTopConfig: {
+        enable: true,
+      },
+      gridOptions: {
+        loading: false,
+        columns: [
+          {
+            type: 'seq',
+            width: 80,
+          },
+          {
+            title: "竞争对手",
+            field: "name1",
+            width: 150,
+          },
+          {
+            title: "报价管理",
+            field: "name2",
+            width: 150,
+          },
+          {
+            title: "单位类型",
+            field: "name3",
+            width: 150,
+          },
+          {
+            title: "注册资本(元)",
+            field: "name4",
+            width: 150,
+          },
+          {
+            title: "注册日期",
+            field: "name5",
+            width: 150,
+          },
+          {
+            title: "员工人数",
+            field: "name6",
+            width: 150,
+          },
+          {
+            title: "资源管理",
+            field: "name7",
+            width: 150,
+          },
+          {
+            title: "优势分析",
+            field: "name8",
+            width: 150,
+          },
+          {
+            title: "劣势分析",
+            field: "name8",
+            width: 150,
+          },
+          {
+            title: "备注说明",
+            field: "name9",
+            width: 150,
+          },
+          {
+            title: "添加人",
+            field: "name10",
+            width: 150,
+          },
+          {
+            title: "添加时间",
+            field: "name11",
+            width: 150,
+          },
+          {
+            // fixed: 'right',
+            cellRender: {
+              name: 'CellOption',
+              extraProps: {
+                buttons: [
+                  {
+                    title: '编辑',
+                    code: 'edit',
+                    display: ({ row }) => {
+                      return DISPLAY_STATE.VISIBLE;
+                    },
+                    disabled({ row }) {
+                      return false;
+                    },
+                    onClick({ row }) {},
+                    extraProps: {},
+                  },
+                  {
+                    title: '删除',
+                    code: 'delete',
+                    display: ({ row }) => {
+                      return DISPLAY_STATE.VISIBLE;
+                    },
+                    disabled({ row }) {
+                      return false;
+                    },
+                    onClick({ row }) {},
+                    extraProps: {},
+                  },
+                ],
+              },
+            },
+          },
+        ],
+        data: [], // 模拟数据源
+      },
+      searchConfig: {
+        enable: false,
+      },
+      pagerConfig: {
+        enable: false,
+      },
+      toolbarConfig: {
+        enable: false,
+      },
+    },
+  });
+</script>
+
+<style scoped lang="scss">
+  .tool-bar-top {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+</style>

+ 5 - 0
src/views/customer-manage/customer-detail/index.vue

@@ -60,6 +60,10 @@
       <template #CustomerDecisionChain>
         <CustomerDecisionChain />
       </template>
+
+      <template #InvestmentCompetitionManagement>
+        <InvestmentCompetitionManagement />
+      </template>
     </page-detail-layout>
   </div>
 </template>
@@ -74,6 +78,7 @@
   import CooperativeProject from '/@/views/customer-manage/customer-detail/components/CooperativeProject/index.vue';
   import CustomerDecisionChain from '/@/views/customer-manage/customer-detail/components/CustomerDecisionChain/index.vue';
   import FollowUp from '/@/views/customer-manage/customer-detail/components/FollowUp/index.vue';
+  import InvestmentCompetitionManagement from "/@/views/customer-manage/customer-detail/components/InvestmentCompetitionManagement/index.vue"
 
   import { fetchCustomerHeaderInfo, fetchCustomerDetail } from '/@/api/customer-manage/index.js';
 

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott