Ver Fonte

fix: 项目管理商机管理、立项管理、投标管理新增

lirenjie há 4 meses atrás
pai
commit
156f4f0018
20 ficheiros alterados com 1744 adições e 22 exclusões
  1. 0 3
      src/views/market-manage/activity-manage/activity-management/index.vue
  2. 90 0
      src/views/project-manage/bid-manage/components/basic-info/index.vue
  3. 300 0
      src/views/project-manage/bid-manage/detail.vue
  4. 151 6
      src/views/project-manage/bid-manage/index.vue
  5. 121 0
      src/views/project-manage/opportunity-manage/components/basic-info/components/assistTeam/index.vue
  6. 232 0
      src/views/project-manage/opportunity-manage/components/basic-info/index.vue
  7. 12 0
      src/views/project-manage/opportunity-manage/components/competition-manage/inde.vue
  8. 12 0
      src/views/project-manage/opportunity-manage/components/data-manage/index.vue
  9. 12 0
      src/views/project-manage/opportunity-manage/components/follow-up-details/index.vue
  10. 12 0
      src/views/project-manage/opportunity-manage/components/marketing-activity-guide/index.vue
  11. 12 0
      src/views/project-manage/opportunity-manage/components/performance-manage/index.vue
  12. 12 0
      src/views/project-manage/opportunity-manage/components/project-decision-chain/index.vue
  13. 12 0
      src/views/project-manage/opportunity-manage/components/quotation-manage/index.vue
  14. 12 0
      src/views/project-manage/opportunity-manage/components/risk-manage/index.vue
  15. 12 0
      src/views/project-manage/opportunity-manage/components/service-member/index.vue
  16. 12 0
      src/views/project-manage/opportunity-manage/components/task-board/index.vue
  17. 12 0
      src/views/project-manage/opportunity-manage/components/update-history/index.vue
  18. 302 0
      src/views/project-manage/opportunity-manage/detail.vue
  19. 159 8
      src/views/project-manage/opportunity-manage/index.vue
  20. 257 5
      src/views/project-manage/project-init-manage/index.vue

+ 0 - 3
src/views/market-manage/activity-manage/activity-management/index.vue

@@ -135,8 +135,5 @@ const {
         },
     },
 });
-function fetchTableData(){
-    
-}
 </script>
 <style lang="scss" scoped></style>

+ 90 - 0
src/views/project-manage/bid-manage/components/basic-info/index.vue

@@ -0,0 +1,90 @@
+<template>
+    <div class="">
+        <bs-contents-wrapper>
+            <bs-descriptions :items="basicInfoItem" :extraProps="{ column: 4 }" title="基本信息">
+            </bs-descriptions>
+            <bs-descriptions :items="enterpriseItem" :extraProps="{ column: 4 }" title="企业信息">
+
+            </bs-descriptions>
+        </bs-contents-wrapper>
+    </div>
+</template>
+<script setup>
+import { ref, reactive } from "vue"
+import { BsDescriptions, BsContentsWrapper } from '/@/components/BsUi/index.js';
+const basicInfoItem = ref([
+    {
+        label: '客户编号',
+        value: '测试',
+        extraProps: {
+
+        },
+    },
+    {
+        label: '客户名称',
+        value: '测试',
+        extraProps: {
+
+        },
+    },
+])
+const enterpriseItem = ref([
+    {
+        label: '公司名称',
+        value: '测试',
+        extraProps: {
+
+        },
+    },
+    {
+        label: '统一社会信用代码',
+        value: '测试',
+        extraProps: {
+
+        },
+    },
+    {
+        label: '电话',
+        value: '测试',
+        extraProps: {
+
+        },
+    },
+    {
+        label: '法定代表人',
+        value: '测试',
+        extraProps: {
+
+        },
+    },
+    {
+        label: '注册资本',
+        value: '测试',
+        extraProps: {
+
+        },
+    },
+    {
+        label: '注册时间',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '注册地址',
+        value: '测试',
+        extraProps: {
+            span:2
+        },
+    },
+    {
+        label: '企业简介',
+        value: '测试',
+        extraProps: {
+            span:4
+        },
+    },
+])
+
+</script>
+<style lang="scss" scoped></style>

+ 300 - 0
src/views/project-manage/bid-manage/detail.vue

@@ -0,0 +1,300 @@
+<template>
+  <div class="page-detail">
+    <page-detail-layout :tabs="tabs" :steps-data="stepsData" v-model:tab-active-key="tabActiveKey"
+      :index-config="indexConfig" title="华东电力二期水治理项目">
+      <template #titleRight>
+        <a-tag color="green">服务商</a-tag>
+        <a-tag color="red">危险 74.9分</a-tag>
+      </template>
+      <template #toolBtn>
+        <a-button ghost type="primary" size="small">项目登记</a-button>
+        <a-button ghost type="primary" size="small">转移</a-button>
+        <a-button ghost type="primary" size="small">预进场</a-button>
+        <a-button ghost danger type="primary" size="small">释放公海</a-button>
+        <a-button type="primary" danger size="small">放弃跟踪</a-button>
+      </template>
+
+      <template #titleBottom>
+        <a-tag color="#f0f4fe" v-for="(tagItem, tagIndex) in tagList" :key="tagIndex">
+          <div class="tag-stl">
+            <img :src="tagItem.icon" alt="" />
+            <span class="title-render">{{ tagItem.title }}</span>
+          </div>
+        </a-tag>
+      </template>
+
+      <template #basicInfo>
+        <BasicInfo :data="descData" />
+      </template>
+
+      <template #marketingActivityGuide>
+        <!-- <RetentionTransformation :id="id" /> -->
+      </template>
+
+      <template #followUpDetails>
+        <!-- <ServiceMember :id="id" /> -->
+      </template>
+
+      <template #TaskBoard>
+        <!-- <ActivityInfo :id="id" /> -->
+      </template>
+
+      <template #serviceMember>
+        <!-- <ActivitySummary :id="id" /> -->
+      </template>
+
+      <template #projectDecisionChain>
+
+      </template>
+
+      <template #competitionManage>
+
+      </template>
+
+      <template #performanceManage>
+
+      </template>
+
+      <template #quotationManage>
+
+      </template>
+
+      <template #riskManage>
+
+      </template>
+
+      <template #dataManage>
+
+      </template>
+
+      <template #updateHistory>
+
+      </template>
+    </page-detail-layout>
+  </div>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue';
+import { useRoute } from 'vue-router';
+import PageDetailLayout from '/@/components/business/page-detail-layout/index.vue';
+import selectedIcon from '/@/assets/images/page-detail-layout/selectedIcon.png';
+import unSelectedIcon from '/@/assets/images/page-detail-layout/unSelectedIcon.png';
+import BasicInfo from './components/basic-info/index.vue'
+// import RetentionTransformation from './components/retention-transformation/index.vue'
+// import ServiceMember from './components/service-member/index.vue'
+// import ActivityInfo from './components/activity-info/index.vue'
+// import ActivitySummary from './components/activity-summary/index.vue'
+// import { getActivityDetail } from '/@/api/market-manage/activity-manage';
+const route = useRoute()
+const { id } = route.query
+const descData = ref(null)
+onMounted(() => {
+
+})
+const tabActiveKey = ref('0');
+
+const tabs = ref([
+  {
+    title: '基本信息',
+    key: '0',
+    slotName: 'basicInfo',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '营销活动指引',
+    key: '1',
+    slotName: 'marketingActivityGuide',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '跟进情况',
+    key: '2',
+    slotName: 'followUpDetails',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '任务看板',
+    key: '3',
+    slotName: 'TaskBoard',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '服务成员',
+    key: '4',
+    slotName: 'serviceMember',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '项目决策链',
+    key: '5',
+    slotName: 'projectDecisionChain',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '竞争管理',
+    key: '6',
+    slotName: 'competitionManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '绩效管理',
+    key: '7',
+    slotName: 'performanceManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '报价管理',
+    key: '8',
+    slotName: 'quotationManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '风险管理',
+    key: '9',
+    slotName: 'riskManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '资料管理',
+    key: '10',
+    slotName: 'dataManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '更新记录',
+    key: '11',
+    slotName: 'updateHistory',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+]);
+
+const tagList = ref([
+  {
+    title: 'XM20250011200001',
+    // icon: getImgUrl('icon-tianyancha'),
+  },
+  {
+    title: '华东电力集团',
+    // icon: getImgUrl('icon-xiansuodengji'),
+  },
+  {
+    title: '地址',
+    // icon: getImgUrl('icon-biaoqianguanli'),
+  },
+  {
+    title: '项目类',
+    // icon: getImgUrl('icon-biaoqianguanli'),
+  },
+])
+const indexConfig = ref({
+  sourceData: [
+    {
+      label: '预计合同额',
+      value: '3,433,443.89',
+    },
+    {
+      label: '招标方式',
+      value: '公开',
+    },
+    {
+      label: '预计开工日期',
+      value: '2025.09.12',
+    },
+    {
+      label: '预计完工日期',
+      value: '2025.09.12',
+    },
+    {
+      label: '联系人',
+      value: 'xxxx',
+    },
+    {
+      label: '联系电话',
+      value: 'xxxxx',
+    },
+    {
+      label: '操作人',
+      value: 'xxxx',
+    },
+  ],
+  labelKey: 'label',
+  valueKey: 'value',
+})
+const stepsData = ref([
+  {
+    title: '标段',
+    time: '2024-09-18',
+    status: 'completed',
+    number: 1,
+    lineTopNum: 9,
+  },
+  {
+    title: '商机管理',
+    time: '2024-09-20',
+    status: 'current',
+    number: 2,
+    lineTopNum: 0,
+  },
+  {
+    title: '项目立项',
+    time: '2024-10-11',
+    status: 'todo',
+    number: 3,
+    lineTopNum: 0,
+  },
+  {
+    title: '投标评审',
+    status: 'todo',
+    number: 4,
+    lineTopNum: 0,
+  },
+  {
+    title: '投标管理',
+    status: 'todo',
+    number: 5,
+    lineTopNum: 0,
+  },
+  {
+    title: '中标捷报',
+    status: 'todo',
+    number: 6,
+    lineTopNum: 0,
+  },
+  {
+    title: '合同签订',
+    status: 'todo',
+    number: 7,
+    lineTopNum: 0,
+  },
+])
+</script>
+
+<style lang="scss" scoped>
+.page-detail {
+  width: 100%;
+
+  .tag-stl {
+    display: flex;
+    gap: 5px;
+    align-items: center;
+
+    .title-render {
+      color: #999999;
+      font-size: 14px;
+    }
+  }
+}
+</style>

+ 151 - 6
src/views/project-manage/bid-manage/index.vue

@@ -1,12 +1,157 @@
 <template>
-  <div class="">
+    <div class="">
+        <bs-table v-bind="tableOptions">
 
-  </div>
+        </bs-table>
+    </div>
 </template>
 <script setup>
-import {ref,reactive} from "vue"
+import { ref, reactive } from "vue"
+import { useRouter } from "vue-router";
+import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
+import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+const router = useRouter()
+const {
+    tableOptions,
+    setTablePropsValue: setValue,
+    getTablePropsValue: getValue,
+} = useBsTable({
+    tableOptions: {
+        url: '/supports/activity/queryPage',
+        gridOptions: {
+            loading: false,
+            columns: [
+               {
+                    type: 'seq',
+                    width: 80,
+                },
+                {
+                    field: 'activityName',
+                    title: '项目名称',
+                },
+                {
+                    field: 'activityCode',
+                    title: '项目ID',
 
-</script>
-<style lang="scss" scoped>
+                },
+                {
+                    field: 'activityType',
+                    title: '项目地址',
+                    cellRender: {
+                        name: 'CellDict',
+                    },
+                },
+                {
+                    field: 'activityBudget',
+                    title: '预计合同金额(元)',
+                },
+                {
+                    field: 'activityHead',
+                    title: '项目来源',
+                },
+                {
+                    field: 'createTime',
+                    title: '项目类型',
+                },
+                {
+                    field: 'createTime',
+                    title: '产品类型',
+                },
+                {
+                    field: 'createTime',
+                    title: '预计开标时间',
+                },
+                {
+                    field: 'createTime',
+                    title: '预计投标',
+                },
+                {
+                    field: 'createTime',
+                    title: '归属营销',
+                },
+                {
+                    field: 'createTime',
+                    title: '操作人',
+                },
+                {
+                    field: 'createTime',
+                    title: '操作时间',
+                },
+                {
+                    // fixed: 'right',
+                    cellRender: {
+                        name: 'CellOption',
+                        extraProps: {
+                            buttons: [
+                                {
+                                    title: '查看详情',
+                                    code: 'view',
+                                    display: ({ row }) => {
+                                        return DISPLAY_STATE.VISIBLE;
+                                    },
+                                    disabled({ row }) {
+                                        return false;
+                                    },
+                                    onClick({ row }) {
+                                        router.push('/project-manage/bid-manage/detail?id='+row.id)
+                                     },
+                                    extraProps: {},
+                                },
+                            ],
+                        },
+                    },
+                },
+            ],
+        },
+        searchConfig: {
+            enabled: true,
+            fieldSpan: 4,
+            fields: [
+                {
+                    field: 'name',
+                    label: '项目名称',
+                    component: 'a-input',
+                    componentProps: {
+                        placeholder: '请输入项目名称',
+                    },
+                },
+                {
+                    field: 'name',
+                    label: '项目ID',
+                    component: 'a-input',
+                    componentProps: {
+                        placeholder: '请输入项目名称',
+                    },
+                },
+                {
+                    field: 'name',
+                    label: '项目地址',
+                    component: 'a-select',
+                    componentProps: {
+                        placeholder: '请选择项目地址',
+                    },
+                },
+                {
+                    field: 'name',
+                    label: '项目状态',
+                    component: 'a-select',
+                    componentProps: {
+                        placeholder: '请选择项目状态',
+                    },
+                },
+            ],
+        },
+        pagerConfig: {
+            enabled: true,
+            pageSize: 10,
+            pageNum: 1,
+            total: 0,
+            // isFixed: false
+        },
+        toolbarConfig: {
 
-</style>
+        },
+    },
+});
+</script>
+<style lang="scss" scoped></style>

+ 121 - 0
src/views/project-manage/opportunity-manage/components/basic-info/components/assistTeam/index.vue

@@ -0,0 +1,121 @@
+<template>
+    <bs-table v-bind="tableOptions">
+        <template #toolbarTop>
+            <div class="btn">
+                <div></div>
+                <a-button type="primary" size="middle">添加成员</a-button>
+            </div>
+        </template>
+    </bs-table>
+</template>
+<script setup lang="jsx">
+import { ref, reactive, onMounted } from "vue"
+import { useBsTable, BsTable } from '/@/components/BsUi/index.js';
+import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+import { useRouter } from "vue-router";
+import { Modal } from "ant-design-vue";
+const router = useRouter()
+const { inHandData } = defineProps(['inHandData'])
+onMounted(() => {
+    setValue('gridOptions.data', inHandData)
+})
+const {
+    tableOptions,
+    setTablePropsValue: setValue,
+    getTablePropsValue: getValue,
+    fetchTableData
+} = useBsTable({
+    tableOptions: {
+        gridOptions: {
+            loading: false,
+            columns: [
+                {
+                    type: 'seq',
+                    width: 80,
+                },
+                {
+                    field: 'projectName',
+                    title: '营销经理',
+                    // slots: {
+                    //   default: ({ row }) => {
+                    //     if (row.interviewStatus === 0) {
+                    //       return <span style={{ color: '#ed8a94' }}>未面试</span>
+                    //     } else if (row.interviewStatus === 1) {
+                    //       return <span style={{ color: '#dc861f' }}>面试中</span>
+                    //     } else if (row.interviewStatus === 2) {
+                    //       return <span style={{ color: '#70b603' }}>面试完毕</span>
+                    //     }
+                    //   }
+                    // }
+                },
+                {
+                    field: 'budgetAmount',
+                    title: '营销团队',
+                },
+                {
+                    field: 'address',
+                    title: '支持说明',
+                },
+                {
+                    // fixed: 'right',
+                    cellRender: {
+                        name: 'CellOption',
+                        extraProps: {
+                            buttons: [
+                                {
+                                    title: '删除',
+                                    code: 'delete',
+                                    display: ({ row }) => {
+                                        return DISPLAY_STATE.VISIBLE;
+                                    },
+                                    disabled({ row }) {
+                                        return false;
+                                    },
+                                    onClick({ row }) {
+                                        Modal.confirm({
+                                            title: '提示',
+                                            content: '要删除该营销经理吗?',
+                                            onOk: () => {
+                                                fetchTableData()
+                                            },
+                                        });
+                                    },
+                                    extraProps: {},
+                                },
+                            ],
+                        },
+                    },
+                },
+            ],
+        },
+        searchConfig: {
+            enable: false,
+            fieldSpan: 4,
+            fields: [
+
+            ],
+        },
+        pagerConfig: {
+            enable: false,
+            // pageSize: 10,
+            // pageNum: 1,
+            // total: 0,
+            // isFixed: false
+        },
+        toolbarConfig: {
+            enable: false,
+        },
+        tableSearchBeforeBiz() {
+            const searchParams = getValue('searchConfig.data');
+            setValue('searchConfig.data', { ...searchParams, bizModel: 'INTERVIEW' });
+        },
+    },
+});
+</script>
+<style lang="scss" scoped>
+.btn {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+}
+</style>

+ 232 - 0
src/views/project-manage/opportunity-manage/components/basic-info/index.vue

@@ -0,0 +1,232 @@
+<template>
+    <div class="">
+        <bs-contents-wrapper>
+            <bs-descriptions :items="bidSectionInfoItem" :extraProps="{ column: 4 }" title="标段信息">
+            </bs-descriptions>
+            <bs-descriptions :items="projectInfoItem" title="项目信息">
+
+            </bs-descriptions>
+
+            <bs-descriptions :items="assistTeamItem" title="协助团队">
+                <template #assistTeam>
+                    <assistTeam />
+                </template>
+            </bs-descriptions>
+            <bs-descriptions :items="otherInfoDescriptionItems" title="其他信息">
+
+            </bs-descriptions>
+        </bs-contents-wrapper>
+    </div>
+</template>
+<script setup>
+import { ref, reactive } from "vue"
+import { BsDescriptions, BsContentsWrapper } from '/@/components/BsUi/index.js';
+import assistTeam from './components/assistTeam/index.vue'
+const bidSectionInfoItem = ref([
+    {
+        label: '标段名称',
+        value: '测试',
+        extraProps: {
+            span: 4
+        },
+    },
+    {
+        label: '标段概算金额',
+        value: '164.00',
+        extraProps: {
+            span: 2
+        },
+    },
+    {
+        label: '预计招标日期',
+        value: '测试',
+        extraProps: {
+            span: 2
+        },
+    },
+    {
+        label: '竞争对手',
+        value: '测试',
+        extraProps: {
+            span: 4
+        },
+    },
+    {
+        label: '备注说明',
+        value: '测试测试',
+        extraProps: {
+            span: 4
+        },
+    },
+]);
+const projectInfoItem = ref([
+    {
+        label: '项目类型',
+        value: '测试',
+        extraProps: {
+            span: 1
+        },
+    },
+    {
+        label: '线索名称',
+        value: '测试',
+        extraProps: {
+            span: 2
+        },
+    },
+    {
+        label: '项目名称',
+        value: '测试',
+        extraProps: {
+            span: 3
+        },
+    },
+    {
+        label: '线索来源',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '服务商名称',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '工程属性',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '地区',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '省市区',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '项目地址',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '业主单位',
+        value: '测试',
+        extraProps: {
+            span: 2
+        },
+    },
+    {
+        label: '设计单位',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '总承包单位',
+        value: '测试',
+        extraProps: {
+            span: 2
+        },
+    },
+    {
+        label: '招标代理单位',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '是否联合体',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '联合体情况说明',
+        value: '测试',
+        extraProps: {
+            span: 2
+        },
+    },
+    {
+        label: '项目所属行业',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '业务类型',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '招标平台',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '项目总概算',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '项目资金来源',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '分厂/几期/机组',
+        value: '测试',
+        extraProps: {
+        },
+    },
+    {
+        label: '项目背景',
+        value: '测试',
+        extraProps: {
+            span: 3
+        },
+    },
+    {
+        label: '项目阶段',
+        value: '测试',
+        extraProps: {
+            span: 3
+        },
+    },
+])
+const assistTeamItem = ref([
+    {
+        label: '',
+        noLabelMark: true,
+        valueSlot: 'assistTeam',
+        extraProps: {
+            span: 4,
+            contentStyle: {
+                width: '100%'
+            },
+        },
+    },
+])
+const otherInfoDescriptionItems = ref([
+    {
+        label: '附件',
+        value: '测试',
+        extraProps: {
+        },
+    },
+])
+</script>
+<style lang="scss" scoped></style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/competition-manage/inde.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/data-manage/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/follow-up-details/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/marketing-activity-guide/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/performance-manage/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/project-decision-chain/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/quotation-manage/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/risk-manage/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/service-member/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/task-board/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 0
src/views/project-manage/opportunity-manage/components/update-history/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="">
+
+  </div>
+</template>
+<script setup>
+import {ref,reactive} from "vue"
+
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 302 - 0
src/views/project-manage/opportunity-manage/detail.vue

@@ -0,0 +1,302 @@
+<template>
+  <div class="page-detail">
+    <page-detail-layout :tabs="tabs" :steps-data="stepsData" v-model:tab-active-key="tabActiveKey"
+      :index-config="indexConfig" title="华东电力二期水治理项目">
+      <template #titleRight>
+        <!-- <img src="/@/assets/images/page-detail-layout/customer/SS_user.png" alt="" /> -->
+        <a-tag color="green">服务商</a-tag>
+        <a-tag color="blue">赢单 34%</a-tag>
+        <a-tag color="red">危险 74.9分</a-tag>
+      </template>
+      <template #toolBtn>
+        <a-button ghost type="primary" size="small">项目登记</a-button>
+        <a-button ghost type="primary" size="small">转移</a-button>
+        <a-button ghost type="primary" size="small">预进场</a-button>
+        <a-button ghost danger type="primary" size="small">释放公海</a-button>
+        <a-button type="primary" danger size="small">放弃跟踪</a-button>
+      </template>
+
+      <template #titleBottom>
+        <a-tag color="#f0f4fe" v-for="(tagItem, tagIndex) in tagList" :key="tagIndex">
+          <div class="tag-stl">
+            <img :src="tagItem.icon" alt="" />
+            <span class="title-render">{{ tagItem.title }}</span>
+          </div>
+        </a-tag>
+      </template>
+
+      <template #basicInfo>
+        <BasicInfo :data="descData" />
+      </template>
+
+      <template #marketingActivityGuide>
+        <!-- <RetentionTransformation :id="id" /> -->
+      </template>
+
+      <template #followUpDetails>
+        <!-- <ServiceMember :id="id" /> -->
+      </template>
+
+      <template #TaskBoard>
+        <!-- <ActivityInfo :id="id" /> -->
+      </template>
+
+      <template #serviceMember>
+        <!-- <ActivitySummary :id="id" /> -->
+      </template>
+
+      <template #projectDecisionChain>
+
+      </template>
+
+      <template #competitionManage>
+
+      </template>
+
+      <template #performanceManage>
+
+      </template>
+
+      <template #quotationManage>
+
+      </template>
+
+      <template #riskManage>
+
+      </template>
+
+      <template #dataManage>
+
+      </template>
+
+      <template #updateHistory>
+
+      </template>
+    </page-detail-layout>
+  </div>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue';
+import { useRoute } from 'vue-router';
+import PageDetailLayout from '/@/components/business/page-detail-layout/index.vue';
+import selectedIcon from '/@/assets/images/page-detail-layout/selectedIcon.png';
+import unSelectedIcon from '/@/assets/images/page-detail-layout/unSelectedIcon.png';
+import BasicInfo from './components/basic-info/index.vue'
+// import RetentionTransformation from './components/retention-transformation/index.vue'
+// import ServiceMember from './components/service-member/index.vue'
+// import ActivityInfo from './components/activity-info/index.vue'
+// import ActivitySummary from './components/activity-summary/index.vue'
+// import { getActivityDetail } from '/@/api/market-manage/activity-manage';
+const route = useRoute()
+const { id } = route.query
+const descData = ref(null)
+onMounted(() => {
+
+})
+const tabActiveKey = ref('0');
+
+const tabs = ref([
+  {
+    title: '基本信息',
+    key: '0',
+    slotName: 'basicInfo',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '营销活动指引',
+    key: '1',
+    slotName: 'marketingActivityGuide',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '跟进情况',
+    key: '2',
+    slotName: 'followUpDetails',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '任务看板',
+    key: '3',
+    slotName: 'TaskBoard',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '服务成员',
+    key: '4',
+    slotName: 'serviceMember',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '项目决策链',
+    key: '5',
+    slotName: 'projectDecisionChain',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '竞争管理',
+    key: '6',
+    slotName: 'competitionManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '绩效管理',
+    key: '7',
+    slotName: 'performanceManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '报价管理',
+    key: '8',
+    slotName: 'quotationManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '风险管理',
+    key: '9',
+    slotName: 'riskManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '资料管理',
+    key: '10',
+    slotName: 'dataManage',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+  {
+    title: '更新记录',
+    key: '11',
+    slotName: 'updateHistory',
+    selectedIcon: selectedIcon,
+    unSelectedIcon: unSelectedIcon,
+  },
+]);
+
+const tagList = ref([
+  {
+    title: 'XM20250011200001',
+    // icon: getImgUrl('icon-tianyancha'),
+  },
+  {
+    title: '华东电力集团',
+    // icon: getImgUrl('icon-xiansuodengji'),
+  },
+  {
+    title: '地址',
+    // icon: getImgUrl('icon-biaoqianguanli'),
+  },
+  {
+    title: '项目类',
+    // icon: getImgUrl('icon-biaoqianguanli'),
+  },
+])
+const indexConfig = ref({
+  sourceData: [
+    {
+      label: '预计合同额',
+      value: '3,433,443.89',
+    },
+    {
+      label: '招标方式',
+      value: '公开',
+    },
+    {
+      label: '预计开工日期',
+      value: '2025.09.12',
+    },
+    {
+      label: '预计完工日期',
+      value: '2025.09.12',
+    },
+    {
+      label: '联系人',
+      value: 'xxxx',
+    },
+    {
+      label: '联系电话',
+      value: 'xxxxx',
+    },
+    {
+      label: '操作人',
+      value: 'xxxx',
+    },
+  ],
+  labelKey: 'label',
+  valueKey: 'value',
+})
+const stepsData = ref([
+  {
+    title: '标段',
+    time: '2024-09-18',
+    status: 'completed',
+    number: 1,
+    lineTopNum: 9,
+  },
+  {
+    title: '商机管理',
+    time: '2024-09-20',
+    status: 'current',
+    number: 2,
+    lineTopNum: 0,
+  },
+  {
+    title: '项目立项',
+    time: '2024-10-11',
+    status: 'todo',
+    number: 3,
+    lineTopNum: 0,
+  },
+  {
+    title: '投标评审',
+    status: 'todo',
+    number: 4,
+    lineTopNum: 0,
+  },
+  {
+    title: '投标管理',
+    status: 'todo',
+    number: 5,
+    lineTopNum: 0,
+  },
+  {
+    title: '中标捷报',
+    status: 'todo',
+    number: 6,
+    lineTopNum: 0,
+  },
+  {
+    title: '合同签订',
+    status: 'todo',
+    number: 7,
+    lineTopNum: 0,
+  },
+])
+</script>
+
+<style lang="scss" scoped>
+.page-detail {
+  width: 100%;
+
+  .tag-stl {
+    display: flex;
+    gap: 5px;
+    align-items: center;
+
+    .title-render {
+      color: #999999;
+      font-size: 14px;
+    }
+  }
+}
+</style>

+ 159 - 8
src/views/project-manage/opportunity-manage/index.vue

@@ -1,12 +1,163 @@
 <template>
-  <div class="">
-
-  </div>
+    <div class="opportunity-management">
+        <bs-table v-bind="tableOptions">
+            <template #searchRight>
+                <div>
+                    <a-button type="primary" @click="openCuleDrawer">
+                        <span>市场活动登记</span>
+                    </a-button>
+                </div>
+            </template>
+        </bs-table>
+    </div>
 </template>
-<script setup>
-import {ref,reactive} from "vue"
+<script setup lang="jsx">
+import { ref, reactive } from "vue"
+import { useRouter } from "vue-router";
+import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
+import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+const router =useRouter()
+const {
+    tableOptions,
+    setTablePropsValue: setValue,
+    getTablePropsValue: getValue,
+} = useBsTable({
+    tableOptions: {
+        url: '/supports/activity/queryPage',
+        gridOptions: {
+            loading: false,
+            columns: [
+               {
+                    type: 'seq',
+                    width: 80,
+                },
+                {
+                    field: 'activityName',
+                    title: '项目名称',
+                },
+                {
+                    field: 'activityCode',
+                    title: '项目ID',
 
-</script>
-<style lang="scss" scoped>
+                },
+                {
+                    field: 'activityType',
+                    title: '项目地址',
+                    cellRender: {
+                        name: 'CellDict',
+                    },
+                },
+                {
+                    field: 'address',
+                    title: '项目状态',
+                },
+                {
+                    field: 'activityDate',
+                    title: '甲方名称',
+                },
+                {
+                    field: 'activityStatus',
+                    title: '预计招标日期',
+                },
+                {
+                    field: 'activityBudget',
+                    title: '概算金额(元)',
+                },
+                {
+                    field: 'activityHead',
+                    title: '分厂/几期/机组',
+                },
+                {
+                    field: 'createUserId',
+                    title: '项目来源',
+                },
+                {
+                    field: 'createTime',
+                    title: '项目类型',
+                },
+                {
+                    field: 'createTime',
+                    title: '工程属性',
+                },
+                {
+                    field: 'createTime',
+                    title: '业务类型',
+                },
+                {
+                    field: 'createTime',
+                    title: '归属营销人员',
+                },
+                {
+                    field: 'createTime',
+                    title: '归属营销部门',
+                },
+                {
+                    field: 'createTime',
+                    title: '创建人',
+                },
+                {
+                    field: 'createTime',
+                    title: '创建时间',
+                },
+                {
+                    // fixed: 'right',
+                    cellRender: {
+                        name: 'CellOption',
+                        extraProps: {
+                            buttons: [
+                                {
+                                    title: '查看详情',
+                                    code: 'view',
+                                    display: ({ row }) => {
+                                        return DISPLAY_STATE.VISIBLE;
+                                    },
+                                    disabled({ row }) {
+                                        return false;
+                                    },
+                                    onClick({ row }) {
+                                        router.push('/project-manage/opportunity-manage/detail?id='+row.id)
+                                     },
+                                    extraProps: {},
+                                },
+                            ],
+                        },
+                    },
+                },
+            ],
+        },
+        searchConfig: {
+            enabled: true,
+            fieldSpan: 4,
+            fields: [
+                {
+                    field: 'activityName',
+                    label: '活动名称',
+                    component: 'a-input',
+                    componentProps: {
+                        placeholder: '请输入活动名称',
+                    },
+                },
+                {
+                    field: 'id',
+                    label: '活动地址',
+                    component: 'a-input',
+                    componentProps: {
+                        placeholder: '请输入活动地址',
+                    },
+                },
+            ],
+        },
+        pagerConfig: {
+            enabled: true,
+            pageSize: 10,
+            pageNum: 1,
+            total: 0,
+            // isFixed: false
+        },
+        toolbarConfig: {
 
-</style>
+        },
+    },
+});
+</script>
+<style lang="scss" scoped></style>

+ 257 - 5
src/views/project-manage/project-init-manage/index.vue

@@ -1,12 +1,264 @@
 <template>
-  <div class="">
-
-  </div>
+    <div class="project-init-manage">
+        <a-tabs v-model:activeKey="activeKey" class="tabs">
+            <a-tab-pane v-for="(item, index) in tabsOptions" :key="index">
+                <template #tab>
+                    <span @click="item.onClick(item.params)">
+                        <component :is="item.icon"></component>
+                        {{ item.title }}({{ item.count }})
+                    </span>
+                </template>
+            </a-tab-pane>
+        </a-tabs>
+        <bs-table v-bind="tableOptions"></bs-table>
+    </div>
 </template>
-<script setup >
-import {ref,reactive} from "vue"
+<script setup lang="jsx">
+import { ref, reactive } from "vue"
+import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
+import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+import { message } from "ant-design-vue";
+const activeKey = ref(0);
+
+const tabsOptions = [
+    {
+        title: '全部',
+        icon: 'AppstoreOutlined',
+        count: 0,
+        params: {
+            a: 1,
+        },
+        onClick: (value) => {
+            console.log(value);
+        },
+    },
+    {
+        title: '标段',
+        icon: 'TeamOutlined',
+        count: 0,
+        params: {},
+        onClick: (value) => { },
+    },
+    {
+        title: '商机',
+        count: 0,
+        icon: 'FileSyncOutlined',
+        params: {},
+        onClick: (value) => { },
+    },
+    {
+        title: '立项',
+        count: 0,
+        icon: 'UserDeleteOutlined',
+        params: {},
+        onClick: (value) => { },
+    },
+    {
+        title: '投标',
+        count: 0,
+        icon: 'UserDeleteOutlined',
+        params: {},
+        onClick: (value) => { },
+    },
+    {
+        title: '中标',
+        count: 0,
+        icon: 'UserDeleteOutlined',
+        params: {},
+        onClick: (value) => { },
+    },
+    {
+        title: '合同',
+        count: 0,
+        icon: 'UserDeleteOutlined',
+        params: {},
+        onClick: (value) => { },
+    },
+    {
+        title: '履约',
+        count: 0,
+        icon: 'UserDeleteOutlined',
+        params: {},
+        onClick: (value) => { },
+    },
+    {
+        title: '未中标',
+        count: 0,
+        icon: 'UserDeleteOutlined',
+        params: {},
+        onClick: (value) => { },
+    },
+];
+const {
+    tableOptions,
+    setTablePropsValue: setValue,
+    getTablePropsValue: getValue,
+    fetchTableData,
+} = useBsTable({
+    tableOptions: {
+        url: '/supports/customer/queryPage',
+        gridOptions: {
+            height: 600,
+            loading: false,
+            data: [],
+            columns: [
+                {
+                    type: 'seq',
+                    width: 80,
+                },
+                 {
+                    field: 'activityName',
+                    title: '项目名称',
+                },
+                {
+                    field: 'activityCode',
+                    title: '项目ID',
+
+                },
+                {
+                    field: 'activityType',
+                    title: '项目地址',
+                    cellRender: {
+                        name: 'CellDict',
+                    },
+                },
+                {
+                    field: 'address',
+                    title: '项目状态',
+                },
+                {
+                    field: 'activityDate',
+                    title: '甲方名称',
+                },
+                {
+                    field: 'activityStatus',
+                    title: '预计招标日期',
+                },
+                {
+                    field: 'activityBudget',
+                    title: '概算金额(元)',
+                },
+                {
+                    field: 'activityHead',
+                    title: '分厂/几期/机组',
+                },
+                {
+                    field: 'createUserId',
+                    title: '项目来源',
+                },
+                {
+                    field: 'createTime',
+                    title: '项目类型',
+                },
+                {
+                    field: 'createTime',
+                    title: '工程属性',
+                },
+                {
+                    field: 'createTime',
+                    title: '业务类型',
+                },
+                {
+                    field: 'createTime',
+                    title: '归属营销人员',
+                },
+                {
+                    field: 'createTime',
+                    title: '归属营销部门',
+                },
+                {
+                    field: 'createTime',
+                    title: '创建人',
+                },
+                {
+                    field: 'createTime',
+                    title: '创建时间',
+                },
+                {
+                    cellRender: {
+                        name: 'CellOption',
+                        extraProps: {
+                            buttons: [
+                                {
+                                    title: '查看详情',
+                                    code: 'view',
+                                    display: ({ row }) => {
+                                        return DISPLAY_STATE.VISIBLE;
+                                    },
+                                    disabled({ row }) {
+                                        return false;
+                                    },
+                                    onClick({ row }) {
+
+                                    },
+                                    extraProps: {},
+                                },
+                            ],
+                        },
+                    },
+                },
+            ],
+        },
+        searchConfig: {
+            enabled: true,
+            fieldSpan: 4,
+            fields: [
+                {
+                    field: 'name',
+                    label: '项目名称',
+                    component: 'a-input',
+                    componentProps: {
+                        placeholder: '请输入项目名称',
+                    },
+                },
+                {
+                    field: 'name',
+                    label: '项目ID',
+                    component: 'a-input',
+                    componentProps: {
+                        placeholder: '请输入项目名称',
+                    },
+                },
+                {
+                    field: 'name',
+                    label: '项目地址',
+                    component: 'a-select',
+                    componentProps: {
+                        placeholder: '请选择项目地址',
+                    },
+                },
+                {
+                    field: 'name',
+                    label: '项目状态',
+                    component: 'a-select',
+                    componentProps: {
+                        placeholder: '请选择项目状态',
+                    },
+                },
+            ],
+        },
+        pagerConfig: {
+            enabled: true,
+            pageSize: 10,
+            pageNum: 1,
+            total: 0,
+            isFixed: false,
+        },
+        mounted() {
 
+        },
+    },
+});
 </script>
 <style lang="scss" scoped>
+.project-init-manage{
+    background-color: #fff;
+    .tabs{
+        padding: 0 24px;
 
+      :deep(.anticon) {
+        margin: 0;
+      }
+    }
+}
 </style>