Przeglądaj źródła

项目进展;报告管理等

htc 2 tygodni temu
rodzic
commit
1ccefa7d2d

+ 79 - 1
src/api/agent/index.js

@@ -75,6 +75,13 @@ export function getQuestionnaireSchedule(teamQuestionnaireId) {
     method: 'get'
   })
 }
+
+export function genTeamReportById(teamQuestionnaireId) {
+  return request({
+    url: `/core/team/questionnaire/genTeamReport/${teamQuestionnaireId}`,
+    method: 'get'
+  })
+}
 // ---end 问卷管理
 
 // ---start 项目管理
@@ -111,9 +118,52 @@ export function deleteCoachProgram(query) {
     method: 'delete'
   })
 }
+
+
+export function getProgramProgressList(query) {
+  return request({
+    url: '/core/project/progress/progressList',
+    method: 'get',
+    params: query
+  })
+}
+export function addProgramProgress(data) {
+  return request({
+    url: '/core/project/progress',
+    method: 'post',
+    data
+  })
+}
+export function updateProgramProgress(data) {
+  return request({
+    url: '/core/project/progress',
+    method: 'put',
+    data
+  })
+}
+export function getProgramProgressInfo(query) {
+  return request({
+    url: `core/project/progress/${query}`,
+    method: 'get'
+  })
+}
+export function deleteProgramProgress(data) {
+  return request({
+    url: `/core/project/progress`,
+    method: 'delete',
+    data
+  })
+}
 // ---end 项目管理
 
 // ---start 团队管理
+export function getTeamListById(query) {
+  return request({
+    url: '/core/team/teamList',
+    method: 'get',
+    params: query
+  })
+}
 export function addProgramTeam(data) {
   return request({
     url: '/core/team',
@@ -248,4 +298,32 @@ export function deleteKnowledgeFile(id) {
     method: 'delete'
   })
 }
-// ---end 知识库管理
+// ---end 知识库管理
+
+// ---start 报告管理
+export function getReportTest() {
+  return request({
+    url: '/core/report/team/member/getReportTest',
+    method: 'get'
+  })
+}
+export function getTeamReportWjList(relationId) {
+  return request({
+    url: `/core/report/team/member/reportList/team/${relationId}`,
+    method: 'get'
+  })
+}
+export function getUserReportWjList(relationId) {
+  return request({
+    url: `/core/report/team/member/reportList/member/${relationId}`,
+    method: 'get'
+  })
+}
+export function deleteTeamReportWj(data) {
+  return request({
+    url: '/core/report/team/member',
+    method: 'delete',
+    data
+  })
+}
+// ---end 报告管理

+ 48 - 27
src/components/reportList/index.vue

@@ -7,31 +7,31 @@
         </div>
         <div class="rlpl_r adfac">
           <div class="rr_pre rp1">
-            <p class="text">{{ item.companyName||'' }}</p>
-            <p class="tip">{{ item.wjName||'' }}</p>
+            <p class="text">{{ item.enterpriseName||'' }}</p>
+            <p class="tip">{{ item.title||'' }}</p>
           </div>
           <div class="rr_pre rp2" v-if="!isTeam">
             <p class="text">{{ item.userName||'' }}</p>
             <p class="tip">姓名</p>
           </div>
           <div class="rr_pre rp2">
-            <p class="text">{{ item.teamType||'' }}</p>
+            <p class="text">{{ item.teamName||'' }}</p>
             <p class="tip">团队类型</p>
           </div>
           <div class="rr_pre rp3" v-if="isTeam">
-            <p class="text">{{ item.jzDatetime||'' }}</p>
+            <p class="text">{{ item.endTime||'' }}</p>
             <p class="tip">截止日期</p>
           </div>
           <div class="rr_pre rp6" v-if="!isTeam">
-            <p class="text">{{ item.jzDatetime||'' }}</p>
+            <p class="text">{{ item.endTime||'' }}</p>
             <p class="tip">截止日期</p>
           </div>
           <div class="rr_pre rp4" v-if="isTeam">
-            <p class="text">{{ item.zdPersons||0 }}</p>
+            <p class="text">{{ item.finishNum||0 }}</p>
             <p class="tip">作答人数</p>
           </div>
           <div class="rr_pre rp5" v-if="isTeam">
-            <p class="text">{{ item.tdPersons||0 }}</p>
+            <p class="text">{{ item.userNum||0 }}</p>
             <p class="tip">团队人数</p>
           </div>
         </div>
@@ -43,26 +43,29 @@
     <div class="rp_bottom" v-if="showMore">
       <el-table :data="reportList" border cell-class-name="vertical-top-cell" empty-text="暂无报告" max-height="578px">
         <el-table-column label="报告名称" prop="reportName" min-width="200"></el-table-column>
-        <el-table-column label="生成时间" prop="reprtTime"></el-table-column>
-        <el-table-column label="状态" prop="status" width="150">
+        <el-table-column label="生成时间" prop="createDate"></el-table-column>
+        <el-table-column label="状态" prop="state" width="150">
           <template #default="{ row }">
             <div class="rp_status adfac">
-              <div class="rps_l" :style="{'background':sColorCfg[row.status]||'#1D2129'}"></div>
-              <div class="rps_r" :style="{'color':sColorCfg[row.status]||'#1D2129'}">{{ sTextCfg[row.status]||'未知' }}</div>
+              <div class="rps_l" :style="{'background':sColorCfg[row.state]||'#1D2129'}"></div>
+              <div class="rps_r" :style="{'color':sColorCfg[row.state]||'#1D2129'}">{{ sTextCfg[row.state]||'未知' }}</div>
             </div>
           </template>
         </el-table-column>
         <el-table-column label="操作" width="300">
             <template #default="scope">
                 <el-button link type="text" size="mini" @click="handleReive(scope.row)">查看</el-button>
-                <el-button link type="text" size="mini" @click="handledDelete(scope.row)">删除</el-button>
-                <el-button link type="text" size="mini" @click="handleSend(scope.row)" v-if="![1,3].includes(scope.row.status)">发送报告</el-button>
-                <el-button link type="text" size="mini" @click="handleCreate(scope.row)" v-if="scope.row.status==3">重新生成</el-button>
+                <el-button link type="text" size="mini" @click="handledDelete(scope.row)" v-hasPermi="['core:report:delete']">删除</el-button>
+                <el-button link type="text" size="mini" @click="handleSend(scope.row)" v-if="![0,'-1'].includes(scope.row.state)">发送报告</el-button>
+                <el-button link type="text" size="mini" @click="handleCreate(scope.row)" v-if="scope.row.state=='-1'">重新生成</el-button>
+                <el-button link type="text" size="mini" @click="handleExport(scope.row)" v-if="scope.row.state>0">导出报告</el-button>
             </template>
         </el-table-column>
     </el-table>
     </div>
-    <report-pdf :show="pdfShow"></report-pdf>
+    <template v-if="pdfShow">
+      <report-pdf :reportData="reportData" @cancel="pdfCancel"></report-pdf>
+    </template>
   </div>
 </template>
 
@@ -87,24 +90,28 @@
     }
   })
   
-  import { ref, getCurrentInstance } from 'vue'
+  import { ref, getCurrentInstance, nextTick } from 'vue'
   const { proxy } = getCurrentInstance();
+  import { 
+    getReportTest
+  } from '@/api/agent/index.js'
 
   const sTextCfg = {
-    0: '未发送',
-    1: '生成中',
-    2: '生成成功',
-    3: '生成失败'
+    1: '未发送',
+    0: '生成中',
+    2: '已发送',
+    '-1': '生成失败'
   }
   const sColorCfg = {
-    0: '#F31616',
-    1: '#FEA400',
+    1: '#F31616',
+    0: '#FEA400',
     2: '#2E69EB',
-    3: '#F31616'
+    '-1': '#F31616'
   }
   const pdfShow = ref(false)
+  const reportData = ref({})
 
-  const emit = defineEmits(['toggleReport'])
+  const emit = defineEmits(['toggleReport','deleteReport'])
   const toggleReport = (item) => {
     emit('toggleReport', item)
   }
@@ -113,19 +120,33 @@
     emit('reviewReport', item)
   }
 
+  const pdfCancel = () => {
+    pdfShow.value = false;
+    reportData.value = {};
+  }
+
   const handleReive = (row) => {
-    console.log(row)
-    pdfShow.value = true;
+    getReportTest().then(res => {
+      if(res.code!==0) proxy.$message.error(res.msg);
+      reportData.value = res.data;
+      nextTick(() => {
+        pdfShow.value = true;
+      })
+    })
   }
   const handledDelete = (row) => {
-    console.log(row)
+    emit('deleteReport', row.id)
   }
+
   const handleSend = (row) => {
     console.log(row)
   }
   const handleCreate = (row) => {
     console.log(row)
   }
+  const handleExport = (row) => {
+    window.open(row.reportUrl)
+  }
 </script>
 
 <style scoped lang="scss">

+ 10 - 4
src/components/reportPdf/index.vue

@@ -1,9 +1,9 @@
 <template>
-    <div class="page adffcacjc" v-if="show">
+    <div class="page adffcacjc">
         <div class="content">
             <div class="c_pdf">
                 <div id="pdf-content">
-                    <pdf></pdf>
+                    <pdf :reportData="reportData"></pdf>
                 </div>
             </div>
             <div class="c_footer adfac">
@@ -21,14 +21,20 @@
       show:{
         type: Boolean,
         default: false
-      }  
+      },
+      reportData:{
+        type: Object,
+        default: () => {}
+      }
     })
 
     import { ref, getCurrentInstance, onMounted } from 'vue'
     const { proxy } = getCurrentInstance();
+    const reportData = ref(props.reportData);
+    const emit = defineEmits(['cancel']);
 
     const cancel = () => {
-        props.show = false;
+        emit('cancel');
     }
 
     const savePdf = () => {

+ 42 - 0
src/components/reportPdf/pdf.scss

@@ -1,6 +1,7 @@
 .cd_box{
     padding: 20px 0 30px;
     box-sizing: border-box;
+    position: relative;
     .cb_db{
         .cb_db_l{
             width: 120px;
@@ -15,9 +16,50 @@
         }
     }
 
+    .cd_page{
+        font-size: 14px;
+        text-align: right;
+        position: absolute;
+        right: 30px;
+        bottom: 20px;
+    }
+
+    p{
+        font-size: 14px;
+        margin-top: 20px;
+    }
+
+    .big_title{
+        font-size: 32px;
+        margin-top: 30px;
+        color: #007EC1;
+    }
+
+    .fm_img{
+        width: calc(100% - 120px);
+        height: 400px;
+        margin: 100px 60px 0;
+    }
+    .fm_title{
+        font-size: 26px;
+        padding-left: 60px;
+        margin-top: 30px;
+        margin-bottom: 30px;
+    }
+    .fm_pre{
+        padding-left: 60px;
+        margin-top: 10px;
+        font-size: 16px;
+        .fmp_l{
+            width: 120px;
+        }
+    }
+
+
     .mddj_title{
         font-size: 28px;
         color: #000000;
+        margin-top: 20px;
     }
     .mddj_tip{
         font-size: 12px;

+ 117 - 4
src/components/reportPdf/pdf.vue

@@ -6,9 +6,66 @@
                 <div class="cb_db_l">{{ datetime }}</div>
                 <div class="cb_db_r">欢迎使用CCMI的PERILL</div>
             </div>
+            <img class="fm_img" src="">
+            <div class="fm_title">诊断总结:</div>
+            <div class="fm_pre adfac">
+                <div class="fmp_l">报告撰写人:</div>
+                <div class="fmp_r">{{ reportData?.cover?.realName }}</div>
+            </div>
+            <div class="fm_pre adfac">
+                <div class="fmp_l">客户名称:</div>
+                <div class="fmp_r">{{ reportData?.cover?.enterpriseName }}</div>
+            </div>
+            <div class="fm_pre adfac">
+                <div class="fmp_l">团队名称:</div>
+                <div class="fmp_r">{{ reportData?.cover?.teamName }}</div>
+            </div>
+            <div class="fm_pre adfac">
+                <div class="fmp_l">团队成员人数:</div>
+                <div class="fmp_r">{{ reportData?.cover?.userNum }}</div>
+            </div>
+            <div class="fm_pre adfac">
+                <div class="fmp_l">报告时间:</div>
+                <div class="fmp_r">{{ reportData?.cover?.genDate }}</div>
+            </div>
+            <div class="fm_pre adfac">
+                <div class="fmp_l">问卷名称:</div>
+                <div class="fmp_r">{{ reportData?.cover?.title }}</div>
+            </div>
+            <div class="cd_page">1/{{ 53 }}</div>
+        </div>
+        <!-- 第二页 -->
+        <div class="cd_box">
+            <div class="cb_db adf">
+                <div class="cb_db_l">{{ datetime }}</div>
+                <div class="cb_db_r">欢迎使用CCMI的PERILL</div>
+            </div>
+            <div class="mddj_title">介绍</div>
+            <p>PERILL模型由发展辅导领域的先驱、世界领先的教练及管理思维和团队绩效的作者大卫·克勒特巴克教授开发。该模型运用复杂的适应性思维,通过6个PERILL支柱来指导团队。这6个关键因素相互作用,共同推动或阻碍团队绩效。</p>
+            <p>以下报告提取了参与PERILL诊断问卷的团队成员提供的分数,并将其应用于PERILL模型。本报告的目的是总结团队中高功能和潜在功能障碍的领域,以帮助推动团队的整体表现。</p>
+            <p>该PERILL报告的结果可以帮助企业与团队更好地了解其优势、问题和差距,或需要克服的潜在挑战,以提高团队绩效、声誉和协作。</p>
+            <div class="big_title">PERILL的六大支柱</div>
+            <p>PERILL诊断提供了一个复杂的概述,不是离散的问题,也不是简单的优点和缺点,而是团队系统的复杂性。它询问了6个影响因素(如下所述)的问题,以找出团队系统元素之间的联系,以及它们如何可能影响团队高效运作的能力。</p>
+            <div class="cd_page">2/{{ 53 }}</div>
+        </div>
+        <!-- 第三页 -->
+        <div class="cd_box">
+            <div class="cb_db adf">
+                <div class="cb_db_l">{{ datetime }}</div>
+                <div class="cb_db_r">欢迎使用CCMI的PERILL</div>
+            </div>
+            <div class="mddj_title">整体团队职能</div>
+            <p style="margin-top: 50px;">本报告的核心是PERILL诊断分析下的整体团队表现。这包括团队在PERILL模型每个关键要素上的综合得分,通过结合得分和置信指数,我们能够展示出高功能领域和低功能领域。</p>
+            <p>下面的条形图上的位置标记显示了团队在各个支柱上的总分。</p>
+            <div ref="zttdznRef" style="width: 100%; height: 500px;margin-top: 20px;"></div>
+            <div class="cd_page">3/{{ 53 }}</div>
         </div>
         <!-- 团队成员评分目的和动机 -->
         <div class="cd_box">
+            <div class="cb_db adf">
+                <div class="cb_db_l">{{ datetime }}</div>
+                <div class="cb_db_r">欢迎使用CCMI的PERILL</div>
+            </div>
             <div class="mddj_title">团队成员评分目的和动机</div>
             <div class="mddj_tip">下表显示了每个团队成员对每个问题的得分,以及最终的总分和方差。</div>
             <div class="mddj_top adf">
@@ -38,7 +95,7 @@
                     </div>
                 </div>
                 <div class="mt_list">
-                    <div class="ml_pre adf" v-for="(item,index) in mddjTableDatas.slice(0,7)" :key="index">
+                    <div class="ml_pre adf" v-for="(item,index) in mddjTableDatas.slice(0,6)" :key="index">
                         <div class="mt_l adfac">{{ item.title }}</div>
                         <div class="mt_r adfac">
                             <div class="mp_pre adffcacjc" :class="{'mp1':pre.status==1,'mp2':pre.status==2,'mp3':pre.status==3}" v-for="(pre,idx) in item.datas" :key="idx">{{ pre.score }}</div>
@@ -46,9 +103,14 @@
                     </div>
                 </div>
             </div>
+            <div class="cd_page">2/{{ 53 }}</div>
         </div>
-        <div class="cd_box" v-if="mddjTableDatas.length>7">
-            <div class="mddj_table" style="margin-top: 0;">
+        <div class="cd_box" v-if="mddjTableDatas.length>6">
+            <div class="cb_db adf">
+                <div class="cb_db_l">{{ datetime }}</div>
+                <div class="cb_db_r">欢迎使用CCMI的PERILL</div>
+            </div>
+            <div class="mddj_table">
                 <div class="mt_top adf">
                     <div class="mt_l adfac">问题</div>
                     <div class="mt_r adf">
@@ -61,7 +123,7 @@
                     </div>
                 </div>
                 <div class="mt_list">
-                    <div class="ml_pre adf" v-for="(item,index) in mddjTableDatas.slice(7,mddjTableDatas.length)" :key="index">
+                    <div class="ml_pre adf" v-for="(item,index) in mddjTableDatas.slice(6,mddjTableDatas.length)" :key="index">
                         <div class="mt_l adfac">{{ item.title }}</div>
                         <div class="mt_r adfac">
                             <div class="mp_pre adffcacjc" :class="{'mp1':pre.status==1,'mp2':pre.status==2,'mp3':pre.status==3}" v-for="(pre,idx) in item.datas" :key="idx">{{ pre.score }}</div>
@@ -69,6 +131,7 @@
                     </div>
                 </div>
             </div>
+            <div class="cd_page">3/{{ 53 }}</div>
         </div>
         <!-- 绩效评级关系 -->
         <div class="cd_box">
@@ -84,9 +147,17 @@
 </template>
 
 <script setup name="">
+    const props = defineProps({
+        reportData:{
+            type: Object,
+            default: () => {}
+        }
+    })
     import * as echarts from "echarts";
     import { ref, getCurrentInstance, onMounted } from 'vue'
     const { proxy } = getCurrentInstance();
+    const reportData = ref(props.reportData);
+    const zttdznRef = ref(null)
     const pjgxRef = ref(null);
     const datetime = proxy.parseTime(new Date(), '{yy}-{mm}-{dd} {hh}:{ii}');
     
@@ -258,6 +329,47 @@
         },
     ])
 
+    const initZttdznChart = () => {
+        let myChart = echarts.init(zttdznRef.value);
+        let option = {
+            tooltip: {
+                trigger: 'axis',
+                axisPointer: {
+                type: 'shadow'
+                }
+            },
+            legend: {},
+            grid: {
+                left: '3%',
+                right: '8%',
+                bottom: '3%',
+                containLabel: true
+            },
+            xAxis: {
+                type: 'value',
+                boundaryGap: [0, 0.01]
+            },
+            yAxis: {
+                type: 'category',
+                data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World']
+            },
+            series: [
+                {
+                name: '2011',
+                type: 'bar',
+                data: [18203, 23489, 29034, 104970, 131744, 630230],
+                itemStyle:{
+                    color: function(params) {
+                        var colorList = ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83'];
+                        return colorList[params.dataIndex]
+                    }
+                }
+                }
+            ]
+        };
+        myChart.setOption(option)
+    }
+
     const initPlgxChart = () => {
         let myChart = echarts.init(pjgxRef.value);
         let option = {
@@ -298,6 +410,7 @@
     }
 
     onMounted(() => {
+        initZttdznChart();
         initPlgxChart();
     })
 </script>

+ 1 - 0
src/router/index.js

@@ -62,6 +62,7 @@ export const moduleRoutes = {
     { path: '/agentQuestionnaireDetail', component: () => import('@/views/modules/agent/questionnaire/detail'), name: 'agentQuestionnaireDetail', meta: { title: '问卷详情', isTab: false } },
     { path: '/agentQuestionnairePublish', component: () => import('@/views/modules/agent/questionnaire/publish'), name: 'agentQuestionnairePublish', meta: { title: '发布问卷', isTab: false } },
     { path: '/agentUserInfo', component: () => import('@/views/modules/agent/userInfo'), name: 'agentUserInfo', meta: { title: '个人信息', isTab: false } },
+    { path: '/agentTeamUser', component: () => import('@/views/modules/agent/program/teamUser'), name: 'agentTeamUser', meta: { title: '成员管理', isTab: false } },
   ]
 }
 

+ 17 - 1
src/store_v3/modules/agent.js

@@ -1,9 +1,22 @@
 import {defineStore} from "pinia";
 import {ref} from "vue";
 
-import { getCoachList,getQuestionnaireList } from '@/api/agent/index.js'
+import { getCoachList,getQuestionnaireList,getCoachProgramList } from '@/api/agent/index.js'
 
 export const useAgentStore = defineStore('agent', () => {
+    const companyList = ref([]);
+    const companyMap = ref(new Map());
+    const getCompanyData = () => {
+        getCoachProgramList({enterpriseName:''}).then((res) => {
+            companyList.value = res.data;
+            const map = new Map();
+            companyList.value.forEach((supplier) => {
+                map.set(supplier.id, supplier);
+            });
+            companyMap.value = map;
+        });
+    };
+
     const coachList = ref([]);
     const coachMap = ref(new Map());
     const getCoachData = () => {
@@ -31,6 +44,9 @@ export const useAgentStore = defineStore('agent', () => {
     };
 
     return {
+        companyList,
+        companyMap,
+        getCompanyData,
         coachList,
         coachMap,
         getCoachData,

+ 351 - 174
src/views/modules/agent/program.vue

@@ -3,28 +3,32 @@
         <div class="title">{{ title }}</div>
         <div class="tabs">
             <div class="t_pre" :class="{'active':tidx===1}" @click="handleChangeTab(1)">活动项目</div>
-            <div class="t_pre" :class="{'active':tidx===2}" @click="handleChangeTab(2)">已完成</div>
-            <!-- <div class="t_pre" :class="{'active':tidx===3}" @click="handleChangeTab(3)">已归档</div>-->
-            <div class="t_add" @click="handleAdd" v-hasPermi="['core:project:add']">+ 创建新项目</div>
+            <div class="t_pre" :class="{'active':tidx===2}" @click="handleChangeTab(2)">项目进展</div>
+            <template v-if="tidx===1">
+                <div class="t_add t_add2" @click="handleAddTeam" v-hasPermi="['core:project:addTeam']">+ 添加团队</div>
+                <div class="t_add" @click="handleAdd" v-hasPermi="['core:project:add']">+ 创建项目</div>
+            </template>
+            <template v-else-if="tidx===2">
+                <div class="t_add" @click="handleAddJZ">+ 添加项目进展</div>
+            </template>
         </div>
         <template v-if="tidx===1">
+            <div class="query adfacjb">
+                <el-input placeholder="请输入内容" prefix-icon="el-icon-search" v-model="programName" style="width: calc(100% - 448px);" @keyup.enter.native="getProgramList"></el-input>
+                <el-select v-model="queryParams.team" placeholder="所有团队" style="width: 200px;"></el-select>
+                <el-select v-model="queryParams.sort" placeholder="排序方式" style="width: 200px;"></el-select>
+            </div>
             <div class="content">
-                <template v-if="teamList.length">
+                <template v-if="companyList.length">
                     <div class="team_user_list">
                         <div class="tul_left">
                             <div class="tull_top">
-                                <div class="tullt_l">项目管理</div>
-                                <div class="tullt_r" @click="handleAddTeam" v-hasPermi="['core:project:addTeam']">+添加团队</div>
-                            </div>
-                            <div class="tull_query queryInput">
-                                <el-input v-model="programName" placeholder="请输入公司名称" @keyup.enter.native="getProgramList"></el-input>
-                                <img src="@/assets/images/agent/query_mini.png">
+                                <div class="tullt_l">全部项目</div>
                             </div>
                             <div class="tull_list">
                                 <div class="tull_item" :class="{'active':item.select}" v-for="(item,index) in companyList" :key="index" @click="handleExpand(item,index)">
                                     <div class="tname">
                                         <div>
-                                            <img src="@/assets/images/agent/down_sj.png">
                                             <span>{{ item.enterpriseName }}</span>
                                         </div>
                                         <el-popover placement="right" width="177" trigger="click">
@@ -32,84 +36,33 @@
                                                 <div class="tlc_pre" @click="handleProgramDetail(item)" v-hasPermi="['core:program:info']">项目详情</div>
                                                 <div class="tlc_pre" @click="handleProgramDelete(item)" v-hasPermi="['core:program:delete']">删除项目</div>
                                             </div>
-                                            <i slot="reference" class="el-icon-more" style="font-size: 14px;color: #999; transform: rotate(90deg);" @click.stop="handleSetTeam(team,idx)"></i>
+                                            <i slot="reference" class="el-icon-edit" style="font-size: 16px;color: #999;" @click.stop="handleSetTeam(team,idx)"></i>
                                         </el-popover>
                                     </div>
-                                    <template v-if="item.expand&&item.teams&&item.teams.length">
-                                        <div class="tuser_list" :class="{'active':team.select}" v-for="(team,idx) in item.teams" :key="idx" @click.stop="handleSelect(team,idx)">
-                                            <span>{{ team.teamName }}</span>
-                                            <span>({{ team.teamNum||0 }}人)</span>
-                                            <el-popover placement="right" width="177" trigger="click">
-                                                <div class="tl_czs">
-                                                    <div class="tlc_pre" @click="handleTeamDetail(team,item)" v-hasPermi="['core:team:info']">团队详情</div>
-                                                    <div class="tlc_pre" @click="handleTeamDelete(team)" v-hasPermi="['core:team:delete']">删除团队</div>
-                                                </div>
-                                                <i slot="reference" class="el-icon-more" style="font-size: 14px;color: #999; transform: rotate(90deg);" @click.stop="handleSetTeam(team,idx)"></i>
-                                            </el-popover>
-                                        </div>
-                                    </template>
                                 </div>
                             </div>
                         </div>
                         <div class="tul_right">
                             <div class="tulr_top">
-                                <div class="tulrt_l queryInput">
-                                    <el-input v-model="queryParams.realName" placeholder="请输入姓名查询" @keyup.enter.native="getUserList"></el-input>
-                                    <img src="@/assets/images/agent/query_mini.png">
-                                </div>
-                                <div class="tulrt_r">
-                                    <div class="tr_btn" @click="handleDownloadExcel" v-hasPermi="['core:project:downloadExcel']" v-if="programid&&teamid">模板下载</div>
-                                    <el-upload v-if="programid&&teamid"
-                                        :action="uploadUrl"
-                                        :data="{enterpriseId: programid, teamId: teamid}"
-                                        :headers="uploadHeaders"
-                                        :before-upload="handleBeforeUpload"
-                                        :on-success="handleSuccess"
-                                        >
-                                        <div class="tr_btn" v-hasPermi="['sys:user:export']">批量导入</div>
-                                    </el-upload> 
-                                    <div class="tr_btn" @click="handleAddUser" v-hasPermi="['sys:user:add']">添加成员</div>
-                                </div>
+                                <div class="tullt_l">项目团队</div>
                             </div>
-                            <el-table :data="userList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无人员" max-height="578px" style="margin-top: 16px;">
+                            <el-table :data="teamList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无团队" max-height="578px" style="margin-top: 16px;">
                                 <el-table-column label="序号" width="50">
                                     <template #default="scope">
                                         {{ scope.$index + 1 }}
                                     </template>
                                 </el-table-column>
-                                <el-table-column label="姓名" prop="realName"></el-table-column>
-                                <el-table-column label="性别" prop="gender">
-                                    <template #default="{ row }">{{ genderCfg[row.gender]||'未知' }}</template>
-                                </el-table-column>
-                                <el-table-column label="类型" prop="category">
-                                    <template #default="{ row }">{{ UserCategory.find(u=>u.value===row.category)?.label ||'未知' }}</template>
-                                </el-table-column>
-                                <el-table-column label="所属部门" prop="dept"></el-table-column>
-                                <el-table-column label="手机号码" prop="mobile"></el-table-column>
-                                <el-table-column label="职位" prop="post"></el-table-column>
-                                <el-table-column label="级别" prop="level"></el-table-column>
-                                <el-table-column label="分工" prop="divisionOfLabour"></el-table-column>
-                                <!-- <el-table-column label="上级" prop="realName"></el-table-column> -->
-                                <el-table-column label="创建时间" prop="createDate" width="200"></el-table-column>
-                                <el-table-column label="操作" width="150">
+                                <el-table-column label="团队类型" prop="teamName"></el-table-column>
+                                <el-table-column label="团队人数" prop="teamNum"></el-table-column>
+                                <el-table-column label="团队故事" prop="teamStory" width="700" show-overflow-tooltip></el-table-column>
+                                <el-table-column label="操作" width="200">
                                     <template #default="scope">
-                                        <el-button link type="text" size="mini" @click="handleEdit(scope.row)" v-hasPermi="['sys:user:update']">编辑</el-button>
-                                        <el-button link type="text" size="mini" @click="handleDelete(scope.row)" v-hasPermi="['sys:user:delete']">删除</el-button>
+                                        <el-button link type="text" size="mini" @click="handleTeamDetail(scope.row)" v-hasPermi="['core:team:info']">编辑</el-button>
+                                        <el-button link type="text" size="mini" @click="handleUsers(scope.row)">成员管理</el-button>
+                                        <el-button link type="text" size="mini" @click="handleTeamDelete(scope.row)" v-hasPermi="['core:team:delete']">删除</el-button>
                                     </template>
                                 </el-table-column>
                             </el-table>
-                            <el-row style="display: flex;justify-content: center;">
-                                <el-pagination
-                                    @size-change="handleSizeChange"
-                                    @current-change="handleCurrentChange"
-                                    :current-page="queryParams.page"
-                                    :page-sizes="[5, 10, 20, 50]"
-                                    :page-size="10"
-                                    layout="total, sizes, prev, pager, next, jumper"
-                                    :total="total"
-                                    v-show="total > 0">
-                                </el-pagination>
-                            </el-row>
                         </div>
                     </div>
                 </template>
@@ -122,7 +75,36 @@
                 </template>
             </div>
         </template>
-        <template v-else-if="tidx===2"></template>
+        <template v-else-if="tidx===2">
+            <div class="query adfacjb">
+                <el-input placeholder="请输入内容" prefix-icon="el-icon-search" v-model="programName2" style="width: calc(100% - 448px);" @keyup.enter.native="getProgramList2"></el-input>
+                <el-select v-model="queryParams2.team" placeholder="所有团队" style="width: 200px;"></el-select>
+                <el-select v-model="queryParams2.sort" placeholder="排序方式" style="width: 200px;"></el-select>
+            </div>
+            <div class="content">
+                <template v-if="companyList2.length">
+                    <el-table :data="companyList2" border cell-class-name="vertical-top-cell" v-loading="loading7" empty-text="暂无项目" max-height="578px" style="margin-top: 6px;">
+                        <el-table-column label="公司名称" prop="enterpriseName"></el-table-column>
+                        <el-table-column label="更新时间" prop="updateDate"></el-table-column>
+                        <el-table-column label="公司背景" prop="background" width="400" show-overflow-tooltip></el-table-column>
+                        <el-table-column label="项目的阶段及状态" prop="progress" width="400" show-overflow-tooltip></el-table-column>
+                        <el-table-column label="操作" width="150">
+                            <template #default="scope">
+                                <el-button link type="text" size="mini" @click="handleEdit7(scope.row)" v-hasPermi="['core:projectprogress:update']">编辑</el-button>
+                                <el-button link type="text" size="mini" @click="handleDelete7(scope.row)" v-hasPermi="['core:projectprogress:delete']">删除</el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </template>
+                <template v-else>
+                    <div class="empty">
+                        <img src="@/assets/images/agent/team.png">
+                        <p>您还没有任何项目及团队成员信息</p>
+                        <div class="e_add" @click="handleAdd" v-hasPermi="['core:project:add']">+ 创建新项目</div>
+                    </div>
+                </template>
+            </div>
+        </template>
         <template v-else-if="tidx===3"></template>
         <el-drawer :title="userTitle" :visible.sync="userShow" append-to-body size="60%" @close="userShow=false">
             <el-form ref="userRef" :model="userForm" :rules="userRules" label-width="100px" style="width: 90%;margin: 0 auto;">
@@ -243,7 +225,7 @@
                 <el-button @click="cancel3" style="margin-right: 5%;">取 消</el-button>
             </div>
         </el-drawer>
-        <el-drawer title="项目详情" :visible.sync="programShow" append-to-body size="60%" @close="programShow=false">
+        <el-drawer :title="programTitle" :visible.sync="programShow" append-to-body size="60%" @close="cancel4">
             <el-form ref="programRef" :model="programForm" :rules="programRules" label-width="140px" style="width: 90%;margin: 0 auto;">
                 <el-form-item label="公司名称" prop="enterpriseName">
                     <el-input v-model="programForm.enterpriseName" placeholder="请输入公司名称" />
@@ -305,7 +287,7 @@
                             </div>
                         </div>
                         <div class="demo-drawer__footer" style="display: flex;justify-content: end;margin-top: 20px;">
-                            <el-button :loading="buttonLoading5" type="primary" @click="submitForm5">确 认</el-button>
+                            <el-button type="primary" @click="submitForm5">确 认</el-button>
                             <el-button @click="cancel5" style="margin-right: 5%;">取 消</el-button>
                         </div>
                         <div slot="reference">
@@ -328,7 +310,7 @@
                 <el-button @click="cancel4" style="margin-right: 5%;">取 消</el-button>
             </div>
         </el-drawer>
-        <el-drawer title="添加团队" :visible.sync="programTeamShow" append-to-body size="80%" @close="programTeamShow=false">
+        <el-drawer title="添加团队" :visible.sync="programTeamShow" append-to-body size="60%" @close="programTeamShow=false">
             <el-form :model="programTeamForm" :rules="programTeamRules" ref="programTeamRef" label-width="130px" style="margin: 0 25px;">
                 <el-row style="width: 100%;">
                     <el-col :span="12">
@@ -362,6 +344,51 @@
                 <el-button @click="cancel6" style="margin-right: 5%;">取 消</el-button>
             </div>
         </el-drawer>
+        <el-drawer :title="xmjzTitle" :visible.sync="xmjzShow" append-to-body size="60%" @close="xmjzClose">
+            <el-form :model="xmjzForm" :rules="xmjzRules" ref="xmjzRef" label-width="130px" style="margin: 0 25px;">
+                <el-row style="width: 100%;">
+                    <el-col :span="24">
+                        <el-form-item label="公司名称" prop="enterpriseId">
+                            <el-select v-model="xmjzForm.enterpriseId" placeholder="请选择" @change="handleChange7" style="width: 100%;">
+                                <el-option v-for="item in useAgentStore().companyList" :key="item.id" :label="item.enterpriseName" :value="item.id"></el-option>                        
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row style="width: 100%;">
+                    <el-col :span="24">
+                        <el-form-item label="人员规模" prop="">
+                            <el-input v-model="xmjzForm.bbb" clearable disabled></el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row style="width: 100%;">
+                    <el-col :span="24">
+                        <el-form-item label="项目教练" prop="">
+                            <el-input v-model="xmjzForm.ccc" clearable disabled></el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row style="width: 100%;">
+                    <el-col :span="24">
+                        <el-form-item label="公司背景" prop="">
+                            <el-input type="textarea" v-model="xmjzForm.background" clearable disabled></el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row style="width: 100%;">
+                    <el-col :span="24">
+                        <el-form-item label="项目进展" prop="progress">
+                            <el-input :rows="3" type="textarea" v-model="xmjzForm.progress" clearable placeholder="请输入"></el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <div class="demo-drawer__footer" style="display: flex;justify-content: end;">
+                <el-button :loading="buttonLoading7" type="primary" @click="submitForm7" v-hasPermi="['core:projectprogress:save']">保 存</el-button>
+                <el-button @click="cancel7" style="margin-right: 5%;">取 消</el-button>
+            </div>
+        </el-drawer>
     </div>
 </template>
 
@@ -369,6 +396,8 @@
     import Cookies from "js-cookie";
     import { ref, reactive, getCurrentInstance,onMounted } from 'vue'
     import { useRegion } from "@/mixins/region-module";
+    import {useAgentStore} from "@/store_v3/modules/agent";
+    useAgentStore().getCompanyData();
     const { proxy } = getCurrentInstance();
     const { companyIndustry, staffSize, UserCategory} = proxy.useDict("companyIndustry", "staffSize", "UserCategory");
     const {
@@ -394,32 +423,39 @@
         deleteCoach,
         updateProgramTeam,
         getProgramTeamInfo,
-        deleteProgramTeam 
+        deleteProgramTeam,
+        getTeamListById,
+        addCoachProgram,
+        getProgramProgressList,
+        addProgramProgress,
+        updateProgramProgress,
+        getProgramProgressInfo,
+        deleteProgramProgress,
     } from '@/api/agent/index.js'
-    const uploadUrl = `${window.SITE_CONFIG["apiURL"]}/sys/user/import`
-    const uploadUrl2 = `${window.SITE_CONFIG["apiURL"]}/sys/oss/uploadFile`
-    const uploadHeaders = {token:Cookies.get("token")}; 
-
     const tidx = ref(1);
-    const teamList = ref([1]);
+    const teamList = ref([]);
     const programName = ref('')
+    const programName2 = ref('')
     const companyList = ref([]);
+    const companyList2 = ref([]);
     const programid = ref('')
     const teamid = ref('')
     const loading = ref(false);
+    const programTitle = ref('项目详情');
     const queryParams = ref({
         page:1,
         limit:10,
         teamId:'',
         realName:'',
     })
+    const queryParams2 = ref({
+        page:1,
+        limit:10,
+        teamId:'',
+        enterpriseName:'',
+    })
     const userList = ref([]);
     const total = ref(0);
-    const genderCfg = {
-        '0': '男',
-        '1': '女',
-        '2': '保密',
-    }
     const userTitle = ref('添加成员信息');
     const userShow = ref(false);
     const userRef = ref(null);
@@ -522,7 +558,8 @@
         city:'',
         area:'',
         areaCode:'',
-        coachList:[]
+        coachList:[],
+        background:''
     });
     const programRules = ref({
         enterpriseName: [
@@ -539,6 +576,9 @@
         ],
         area: [
             { required: true, message: '请选择所在地区', trigger: 'change' }
+        ],
+        background: [
+            { required: true, message: '请输入企业背景', trigger: 'blur' }
         ]
     });
     const programRef = ref(null);
@@ -583,22 +623,82 @@
     const programTeamRef = ref(null);
     const programTeamShow = ref(false);
     const buttonLoading6 = ref(false);
-    const addType = ref(1)
+
+    const xmjzTitle = ref('添加项目进展');
+    const xmjzShow = ref(false);
+    const loading7 = ref(false);
+    const xmjzForm = ref({
+        id:'',
+        enterpriseId:'',
+        bbb:'',
+        ccc:'',
+        background:'',
+        progress:''
+    });
+    const xmjzRules = ref({
+        enterpriseId: [
+            { required: true, message: '请选择公司', trigger: 'change' }
+        ],
+        progress: [
+            { required: true, message: '请输入项目进展', trigger: 'blur' }
+        ]
+    });
+    const xmjzRef = ref(null);
+    const buttonLoading7 = ref(false);
+
 
     const handleChangeTab = (idx) => {
         tidx.value = idx;
+        if(idx===2){
+            getProgramProgressData();
+        }
     }
     const handleAdd = () => {
-        proxy.$router.push('/agentProgramAddTeam');
+        programid.value = '';
+        programTitle.value = '创建项目';
+        programShow.value = true;
+        programForm.value = {
+            id:'',
+            enterpriseName: '',
+            creditCode: '',
+            industryCode: '',
+            staffSizeCode: '',
+            province:'',
+            city:'',
+            area:'',
+            areaCode:'',
+            coachList:[],
+            background:''
+        };
+        proxy.$refs.programRef.resetFields();
+    };
+
+    const handleAddJZ = () => {
+        xmjzTitle.value = '添加项目进展';
+        xmjzShow.value = true;
+        xmjzForm.value = {
+            id:'',
+            enterpriseId:'',
+            bbb:'',
+            ccc:'',
+            background:'',
+            progress:''
+        };
     };
 
     const handleExpand = (item, index) => {
         programid.value = item.id;
         programTeamForm.value.companyName = item.enterpriseName;
-        item.expand = !item.expand;
         companyList.value.forEach(c => { c.select = false; });
         item.select = true;
+        getTeamListByCompanyId();
     };
+    const getTeamListByCompanyId = ()=> {
+        getTeamListById({enterpriseId: programid.value}).then(res=>{
+            if(res.code!==0) proxy.$message.error(res.msg);
+            teamList.value = res.data;
+        })
+    }
     const handleSelect = (team, index) => {
         teamid.value = team.teamId;
         queryParams.value.teamId = team.teamId;
@@ -638,20 +738,23 @@
         getUserList();
     }
 
-    const handleTeamDetail = (team,item) => {
-        getProgramTeamInfo(team.teamId).then(res=>{
+    const handleTeamDetail = (team) => {
+        getProgramTeamInfo(team.id).then(res=>{
             if(res.code!==0) return proxy.$message.error(res.msg);
             teamForm.value = {...teamForm.value,...res.data};
-            teamForm.value.companyName = item.enterpriseName;
+            teamForm.value.companyName = companyList.value.find(c => c.id === team.enterpriseId)?.enterpriseName;
             teamShow.value = true;
         })
     }
+    const handleUsers = (team) => {
+        proxy.$router.push({path:'/agentTeamUser',query:{teamId: team.id, enterpriseId: team.enterpriseId}});
+    }
     const handleTeamDelete = async team => {
         await proxy.$modal.confirm('确认删除团队【' + team.teamName + '】吗?').finally(() => buttonLoading3.value = false);
-        deleteProgramTeam(team.teamId).then(res=>{
+        deleteProgramTeam(team.id).then(res=>{
             if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
             else return proxy?.$modal.msgError(res.msg);
-            getProgramList();
+            getTeamListByCompanyId();
         });
     }
 
@@ -674,10 +777,12 @@
         });
         loading.value = false;
         userList.value = [];
+        teamList.value = [];
         total.value = 0;
         queryParams.value.teamId = '';
         queryParams.value.page = 1;
         queryParams.value.realName = '';
+        programid.value = '';
     }
 
     const handleEdit = (row) => {
@@ -785,7 +890,7 @@
                     if(res.code!==0) return proxy.$message.error(res.msg);
                     buttonLoading3.value = false;
                     teamShow.value = false;
-                    getProgramList();
+                    getTeamListByCompanyId();
                 })
             } else {
                 return false;
@@ -797,8 +902,9 @@
     }
 
     const handleProgramDetail = program => {
+        programTitle.value = "项目详情";
         programid.value = program.id;
-       getCoachProgramInfo(program.id).then(res => {
+        getCoachProgramInfo(program.id).then(res => {
             programForm.value = {...programForm.value,...res.data};
             if(programForm.value.coachList===null) programForm.value.coachList = [];
             let areas = programForm.value.areaCode.split('-');
@@ -851,13 +957,25 @@
                 buttonLoading5.value = true;
                 programForm.value.id = programid.value;
                 programForm.value.areaCode = `${programForm.value.province}-${programForm.value.city}-${programForm.value.area}`;
-                updateCoachProgram(programForm.value).then((res)=>{
-                    if(res.code!==0) return proxy.$message.error(res.msg);
-                    else proxy?.$modal.msgSuccess("保存成功");
-                    buttonLoading5.value = false;
-                    programShow.value = false;
-                    getProgramList();
-                })
+                let dto = JSON.parse(JSON.stringify(programForm.value));
+                if(dto.coachList.length===0) return proxy.$message.warning('请至少选择一位教练');
+                if(dto.id){
+                    updateCoachProgram(programForm.value).then((res)=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        else proxy?.$modal.msgSuccess("编辑成功");
+                        buttonLoading5.value = false;
+                        programShow.value = false;
+                        getProgramList();
+                    })
+                }else{
+                    addCoachProgram(dto).then((res)=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        else proxy?.$modal.msgSuccess("创建成功");
+                        buttonLoading5.value = false;
+                        programShow.value = false;
+                        getProgramList();
+                    })
+                }
             } else {
                 return false;
             }
@@ -865,6 +983,20 @@
     }
     const cancel4 = () => {
         programShow.value = false;
+        programForm.value = {
+            id:'',
+            enterpriseName: '',
+            creditCode: '',
+            industryCode: '',
+            staffSizeCode: '',
+            province:'',
+            city:'',
+            area:'',
+            areaCode:'',
+            coachList:[],
+            background:''
+        }
+        proxy.$refs.programRef.resetFields();
     }
     const handleCheckAllChange = (val) => {
         coachSelecteds.value = val ? JSON.parse(JSON.stringify(coachList.value)) : [];
@@ -921,9 +1053,8 @@
                     else proxy?.$modal.msgSuccess("保存成功");
                     buttonLoading6.value = false;
                     programTeamShow.value = false;
-                    getProgramList();
+                    getTeamListByCompanyId();
                 })
-            
             } else {
                 return false;
             }
@@ -932,25 +1063,85 @@
     const cancel6 = () => {
         programTeamShow.value = false;
     }
-    
-    // const handleAddItem = () => {
-    //     programTeamForm.value.users.push({
-    //         id:'',
-    //         realName:'',
-    //         gender:'',
-    //         birthdate:'',
-    //         mobile:'',
-    //         dept:'',
-    //         post:'',
-    //         divisionOfLabour:'',
-    //         education:'',
-    //         level:'',
-    //     })
-    // }
 
-    // const handleDeleteItem = (item,index) => {
-    //     programTeamForm.value.users.splice(index,1)
-    // }
+    const getProgramProgressData = async () => {
+        loading.value = true;
+        const res = await getProgramProgressList({enterpriseName:programName2.value});
+        if(res.code!==0) return proxy.$message.error(res.msg);
+        else{
+            companyList2.value = res.data;
+            loading.value = false;
+        }
+    }
+
+    const handleEdit7 = (row) => {
+        xmjzTitle.value = '编辑项目进展';
+        getProgramProgressInfo(row.id).then((res)=>{
+            if(res.code!==0) return proxy.$message.error(res.msg);
+            else{
+                xmjzForm.value = res.data;
+                getCoachProgramInfo(res.data.enterpriseId).then(res => {
+                    xmjzForm.value.bbb = staffSize.value.find(item => item.value === res.data.staffSizeCode).label;
+                    xmjzForm.value.ccc = res.data.coachList.map(item => item.coachName);
+                    xmjzShow.value = true;
+                })
+            }
+        })
+    }
+
+    const handleDelete7 = async (row) => {
+        await proxy.$modal.confirm('确认删除吗?');
+        deleteProgramProgress([row.id]).then(res=>{
+            if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+            else return proxy?.$modal.msgError(res.msg);
+            getProgramProgressData();
+        });
+    }
+
+    const handleChange7 = row => {
+        getCoachProgramInfo(row).then(res => {
+            xmjzForm.value.bbb = staffSize.value.find(item => item.value === res.data.staffSizeCode).label;
+            xmjzForm.value.ccc =res.data.coachList.map(item => item.coachName);
+        })
+    }
+
+    const submitForm7 = () => {
+        proxy.$refs.xmjzRef.validate((valid) => {
+            if (valid) {
+                buttonLoading7.value = true;
+                if(xmjzForm.value.id){
+                    updateProgramProgress(xmjzForm.value).then((res)=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        buttonLoading7.value = false;
+                        xmjzShow.value = false;
+                        getProgramProgressData();
+                    })
+                }else{
+                    addProgramProgress(xmjzForm.value).then((res)=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        buttonLoading7.value = false;
+                        xmjzShow.value = false;
+                        getProgramProgressData();
+                    })
+                }
+            } else {
+                return false;
+            }
+        });
+    }
+
+    const cancel7 = () => {
+        xmjzShow.value = false;
+        xmjzForm.value = {
+            id:'',
+            enterpriseId:'',
+            bbb:'',
+            ccc:'',
+            background:'',
+            progress:''
+        }
+        proxy.$refs.xmjzRef.resetFields();
+    }
 
     onMounted(() => {
         getProgramList();
@@ -966,6 +1157,16 @@
         width: 200px !important;
     }
 
+    .query{
+            width: 100%;
+            padding: 16px 20px;
+            box-sizing: border-box;
+            background: #FFFFFF;
+            border-radius: 6px;
+            border: 1px solid #F3F4F6;
+            margin-top: 11px;
+        }
+
     .page{
         padding: 28px 16px 12px;
         background: #FAFAFA;
@@ -1009,29 +1210,35 @@
                 }
             }
             .t_add{
-                width: 114px;
-                height: 32px;
+                width: 112px;
+                height: 30px;
                 background: #761E6A;
                 border-radius: 6px;
                 font-family: PingFangSC, PingFang SC;
                 font-weight: 400;
                 font-size: 14px;
                 color: #FFFFFF;
-                line-height: 32px;
+                line-height: 26px;
                 text-align: center;
                 position: absolute;
                 top: -10px;
                 right: 0;
                 cursor: pointer;
+                border: 1px solid #833478;
+                &.t_add2{
+                    background: #FFFFFF;
+                    color: #833478;
+                    right: 130px;
+                }
             }
         }
 
         .content{
             width: 100%;
-            height: calc(100vh - 140px);
+            height: calc(100vh - 220px);
             background: #FFFFFF;
             border: 1px solid #F3F4F6;
-            margin-top: 15px;
+            margin-top: 5px;
 
             .team_user_list{
                 height: 100%;
@@ -1086,15 +1293,20 @@
                         }
                     }
                     .tull_list{
+                        width: 100%;
                         height: calc(100% - 100px);
                         overflow-y: auto;
-                        margin-top: 24px;
+                        margin-top: 20px;
                         .tull_item{
+                            width: 100%;
                             margin-top: 24px;
                             cursor: pointer;
-                            &.active{
+                            padding: 12px;
+                            box-sizing: border-box;
+                            border-radius: 6px;
+                            &:hover,&.active{
+                                background: rgba(118,30,106,0.06);
                                 .tname span{
-                                    font-weight: bold;
                                     color: #761E6A;
                                     i{
                                         color: #761E6A !important;
@@ -1126,7 +1338,6 @@
                                 &:hover,&.active{
                                     border-radius: 6px;
                                     span{
-                                        font-weight: bold;
                                         color: #761E6A;
                                     }
                                     i{
@@ -1157,7 +1368,6 @@
                                     background: #F0F2F8;
                                     border-radius: 6px;
                                     span{
-                                        font-weight: bold;
                                         color: #761E6A;
                                     }
                                     i{
@@ -1178,45 +1388,12 @@
                     padding-left: 23px;
                     box-sizing: border-box;
                     .tulr_top{
-                        display: flex;
-                        align-items: center;
-                        justify-content: space-between;
-                        .tulrt_l{
-                            width: 278px;
-                            height: 34px;
-                            border-radius: 6px;
-                            border: 1px solid #E2E7F5;
-                            padding: 0 16px;
-                            box-sizing: border-box;
-                            display: flex;
-                            align-items: center;
-                            justify-content: space-between;
-                            img{
-                                width: 16px;
-                                height: 16px;
-                                cursor: pointer;
-                            }
-                        }
-                        .tulrt_r{
-                            display: flex;
-                            .tr_btn{
-                                width: 92px;
-                                height: 36px;
-                                border-radius: 6px;
-                                border: 1px solid #C1C7D2;
-                                margin-left: 20px;
-                                cursor: pointer;
-                                font-family: PingFangSC, PingFang SC;
-                                font-weight: 400;
-                                font-size: 14px;
-                                color: #111111;
-                                line-height: 36px;
-                                text-align: center;
-                                &:last-child{
-                                    background: #761E6A;
-                                    color: #FFFFFF;
-                                }
-                            }
+                        .tullt_l{
+                            font-family: PingFangSC, PingFang SC;
+                            font-weight: 600;
+                            font-size: 16px;
+                            color: #0D162A;
+                            line-height: 16px;
                         }
                     }
                 }

+ 544 - 0
src/views/modules/agent/program/teamUser.vue

@@ -0,0 +1,544 @@
+<template>
+    <div class="full_page">
+        <div class="content">
+            <div class="top adfac">
+                <div class="t_l adfac">
+                    <img src="@/assets/images/agent/arrow_left.png" @click="handleBack">
+                    <div class="spans">
+                        <span>项目管理</span>
+                        <span class="last">&nbsp;/&nbsp;成员管理</span>
+                    </div>
+                </div>
+            </div>
+            <div class="c_bottom adf">
+                <div class="cb_l">
+                    <el-select v-model="programid" placeholder="请选择项目" @change="handleChange">
+                        <el-option v-for="item in useAgentStore().companyList" :key="item.id" :label="item.enterpriseName" :value="item.id"></el-option>                        
+                    </el-select>
+                    <div class="cbl_list">
+                        <div class="cbl_item" :class="{'active':tidx===index}" v-for="(item, index) in teamList" :key="index" @click="handleTeam(item,index)">
+                            {{ item.teamName }}
+                        </div>
+                    </div>
+                </div>
+                <div class="cb_r">
+                    <div class="cbr_top adfacjb">
+                        <div class="ct_l">团队成员</div>
+                        <div class="ct_r adfac">
+                            <div class="tr_btn" @click="handleDownloadExcel" v-hasPermi="['core:project:downloadExcel']" v-if="programid&&teamid">模板下载</div>
+                            <el-upload v-if="programid&&teamid"
+                                :action="uploadUrl"
+                                :data="{enterpriseId: programid, teamId: teamid}"
+                                :headers="uploadHeaders"
+                                :before-upload="handleBeforeUpload"
+                                :on-success="handleSuccess"
+                                >
+                                <div class="tr_btn" v-hasPermi="['sys:user:export']">导入成员</div>
+                            </el-upload> 
+                            <div class="tr_btn" @click="handleAddUser" v-hasPermi="['sys:user:add']">添加成员</div>
+                        </div>
+                    </div>
+                    <el-table :data="userList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无人员" max-height="578px" style="margin-top: 16px;">
+                        <el-table-column label="序号" width="50">
+                            <template #default="scope">
+                                {{ scope.$index + 1 }}
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="姓名" prop="realName"></el-table-column>
+                        <el-table-column label="性别" prop="gender">
+                            <template #default="{ row }">{{ genderCfg[row.gender]||'未知' }}</template>
+                        </el-table-column>
+                        <el-table-column label="类型" prop="category">
+                            <template #default="{ row }">{{ UserCategory.find(u=>u.value===row.category)?.label ||'未知' }}</template>
+                        </el-table-column>
+                        <el-table-column label="人物简介" prop="introduction" width="400" show-overflow-tooltip></el-table-column>
+                        <el-table-column label="人物故事" prop="userStory" width="400" show-overflow-tooltip></el-table-column>
+                        <el-table-column label="操作" width="150">
+                            <template #default="scope">
+                                <el-button link type="text" size="mini" @click="handleEdit(scope.row)" v-hasPermi="['sys:user:update']">编辑</el-button>
+                                <el-button link type="text" size="mini" @click="handleDelete(scope.row)" v-hasPermi="['sys:user:delete']">删除</el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                    <el-row style="display: flex;justify-content: center;">
+                        <el-pagination
+                            @size-change="handleSizeChange"
+                            @current-change="handleCurrentChange"
+                            :current-page="queryParams.page"
+                            :page-sizes="[5, 10, 20, 50]"
+                            :page-size="10"
+                            layout="total, sizes, prev, pager, next, jumper"
+                            :total="total"
+                            v-show="total > 0">
+                        </el-pagination>
+                    </el-row>
+                </div>
+            </div>
+        </div>
+        <el-drawer :title="userTitle" :visible.sync="userShow" append-to-body size="60%" @close="userShow=false">
+            <el-form ref="userRef" :model="userForm" :rules="userRules" label-width="100px" style="width: 90%;margin: 0 auto;">
+                <el-row>
+                  <el-col :span="12">
+                    <el-form-item label="姓名" prop="realName">
+                      <el-input v-model="userForm.realName" placeholder="请输入姓名" />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item label="性别" prop="gender">
+                        <el-select v-model="userForm.gender" placeholder="请选择性别" style="width: 100%;">
+                            <el-option label="男" :value="0"></el-option>
+                            <el-option label="女" :value="1"></el-option>
+                            <el-option label="保密" :value="2"></el-option>
+                        </el-select>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-col :span="12">
+                        <el-form-item label="类型" prop="category">
+                            <el-select v-model="userForm.category" placeholder="请选择类型" style="width: 100%;">
+                                <el-option v-for="item in UserCategory" :label="item.label" :value="item.value"></el-option>
+                            </el-select>
+                        </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item label="手机号码" prop="mobile">
+                      <el-input type="number" v-model="userForm.mobile" placeholder="请输入手机号码" />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-col :span="12">
+                    <el-form-item label="所属部门" prop="dept">
+                      <el-input v-model="userForm.dept" placeholder="请输入所属部门" />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item label="教育程度" prop="education">
+                        <el-input v-model="userForm.education" placeholder="请输入教育程度" />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-col :span="12">
+                    <el-form-item label="分工" prop="divisionOfLabour">
+                      <el-input v-model="userForm.divisionOfLabour" placeholder="请输入分工" />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item label="职位" prop="post">
+                      <el-input v-model="userForm.post" placeholder="请输入职位" />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-col :span="12">
+                    <el-form-item label="级别" prop="level">
+                        <el-input v-model="userForm.level" placeholder="请输入级别" />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-col :span="24">
+                    <el-form-item label="人物简介" prop="introduction">
+                        <el-input type="textarea" :rows="2" v-model="userForm.introduction" placeholder="请输入人物简介" />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-col :span="24">
+                    <el-form-item label="人物故事" prop="userStory">
+                        <el-input type="textarea" :rows="2" v-model="userForm.userStory" placeholder="请输入人物故事" />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+            </el-form>
+            <div class="demo-drawer__footer" style="display: flex;justify-content: end;">
+                <el-button :loading="buttonLoading2" type="primary" @click="submitForm2" v-hasPermi="['sys:user:save']">保 存</el-button>
+                <el-button @click="cancel2" style="margin-right: 5%;">取 消</el-button>
+            </div>
+        </el-drawer>
+    </div>
+</template>
+
+<script setup name="">
+    import Cookies from "js-cookie";
+    import { ref, getCurrentInstance, onMounted } from 'vue'
+    const { proxy } = getCurrentInstance();
+    import {useAgentStore} from "@/store_v3/modules/agent";
+    useAgentStore().getCompanyData();
+    import { 
+        getCoachList,
+        updateCoach,
+        getCoachInfo,
+        deleteCoach,
+        addCoach,
+        getTeamListById,
+    } from '@/api/agent/index.js'
+
+    const uploadUrl = `${window.SITE_CONFIG["apiURL"]}/sys/user/import`
+    const uploadHeaders = {token:Cookies.get("token")}; 
+    const { companyIndustry, staffSize, UserCategory} = proxy.useDict("companyIndustry", "staffSize", "UserCategory");
+    
+    const programid = ref('')
+    const teamid = ref('')
+    const teamList = ref([]);
+    const tidx = ref('')
+    const userList = ref([]);
+    const total = ref(0);
+    const loading = ref(false);
+    const genderCfg = {
+        '0': '男',
+        '1': '女',
+        '2': '保密',
+    }
+    const userTitle = ref('添加成员信息');
+    const userShow = ref(false);
+    const buttonLoading2 = ref(false);
+    const userRef = ref(null);
+    const queryParams = ref({
+        page:1,
+        limit:10,
+        teamId:'',
+        realName:'',
+    })
+    const userForm = ref({
+        id:'',
+        enterpriseId:'',
+        teamId:'',
+        realName:'',
+        username:'',
+        gender:'',
+        birthdate:'',
+        mobile:'',
+        dept:'',
+        education:'',
+        divisionOfLabour:'',
+        post:'',
+        level:'',
+        userType:2,
+        category:'',
+        introduction:'',
+        userStory:''
+    });
+    const userRules = ref({
+        realName: [
+            { required: true, message: '请输入姓名', trigger: 'blur' }
+        ],
+        gender: [
+            { required: true, message: '请选择性别', trigger: 'change' }
+        ],
+        birthdate: [
+            { required: true, message: '请选择出生日期', trigger: 'change' }
+        ],
+        mobile: [
+            { required: true, message: '请输入手机号码', trigger: 'blur' },
+            { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
+        ],
+        dept: [
+            { required: true, message: '请输入所属部门', trigger: 'blur' }
+        ],
+        education: [
+            { required: true, message: '请输入教育程度', trigger: 'blur' }
+        ],
+        divisionOfLabour: [
+            { required: true, message: '请输入分工', trigger: 'blur' }
+        ],
+        post: [
+            { required: true, message: '请输入职位', trigger: 'blur' }
+        ],
+        level:[
+            { required: true, message: '请输入级别', trigger: 'blur' }
+        ],
+        category:[
+            { required: true, message: '请选择成员类型', trigger: 'change' }
+        ],
+        introduction:[
+            { required: true, message: '请输入成员简介', trigger: 'blur' }
+        ],
+        userStory:[
+            { required: true, message: '请输入成员故事', trigger: 'blur' }
+        ]
+    });
+
+    const handleBack = () => {
+        proxy.$router.back()
+    }
+
+    const handleBeforeUpload = (e,node,data)=>{
+        let type = e.name.split('.')[e.name.split('.').length-1];
+        let isExcel = e.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
+        if(type.toLowerCase() !== 'xlsx' && type.toLowerCase() !== 'xls' && !isExcel){
+            proxy?.$modal.msgError('请上传xlsx或xls格式的Excel文件!');
+            return false;
+        }
+        setTimeout(()=>{
+            getUserList();
+        },1000)
+    }
+
+    const handleSuccess = (e,node,data)=>{
+        if(e.code===0){
+            proxy?.$modal.msgSuccess('导入成功!'+e.msg);
+        }else {
+            proxy?.$modal.msgError('导入失败!'+e.msg);
+        }
+    }
+
+    const handleChange = (val) => {
+        programid.value = val;
+        getTeamListByCompanyId();
+    }
+
+    const getTeamListByCompanyId = ()=> {
+        getTeamListById({enterpriseId: programid.value}).then(res=>{
+            if(res.code!==0) proxy.$message.error(res.msg);
+            teamList.value = res.data;
+            if(teamid.value){
+                let idx = teamList.value.findIndex(item=>{
+                    return item.id === teamid.value;
+                });
+                if(idx>-1){
+                    tidx.value = idx;
+                }
+            }
+        })
+    }
+
+    const handleTeam = (item, index) => {
+        tidx.value = index;
+        teamid.value = item.id;
+        getUserList();
+    }
+
+    const getUserList = async () => {
+        queryParams.value.teamId = teamid.value;
+        let query = {...queryParams.value};
+        loading.value = true;
+        const res = await getCoachList(query);
+        userList.value = res.data.list;
+        total.value = res.data.total;
+        loading.value = false;
+    }
+
+    const handleSizeChange = (e)=>{
+        queryParams.value.limit = e;
+        getUserList();
+    }
+    const handleCurrentChange = (e)=>{
+        queryParams.value.page = e;
+        getUserList();
+    }
+
+    const handleDownloadExcel = () => {
+        window.location.href = `${window.SITE_CONFIG["apiURL"]}/sys/user/download?token=${Cookies.get("token")}`;
+    }
+
+    const handleAddUser = () => {
+        if(!teamid.value) return proxy.$message.error('请先选择团队');
+        reset();
+        userTitle.value = "新增成员详情";
+        userShow.value = true;
+    }
+    
+    const reset = () => {
+        userForm.value = {
+            id:'',
+            enterpriseId:'',
+            teamId:'',
+            realName:'',
+            username:'',
+            gender:'',
+            birthdate:'',
+            mobile:'',
+            dept:'',
+            education:'',
+            divisionOfLabour:'',
+            post:'',
+            level:'',
+            userType:2,
+            category:'',
+            introduction:'',
+            userStory:''
+        };
+        proxy.resetForm("userRef");
+    }
+    
+    const submitForm2 = () => {
+        proxy.$refs.userRef.validate((valid) => {
+            if (valid) {
+                buttonLoading2.value = true;
+                userForm.value.username = userForm.value.mobile;
+                userForm.value.enterpriseId = programid.value;
+                userForm.value.teamId = teamid.value;
+                if(userForm.value.id){
+                    updateCoach(userForm.value).then((res)=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        buttonLoading2.value = false;
+                        userShow.value = false;
+                        getUserList();
+                    })
+                }else{
+                    addCoach(userForm.value).then((res)=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        buttonLoading2.value = false;
+                        userShow.value = false;
+                        getUserList();
+                    })
+                }
+            } else {
+                return false;
+            }
+        });
+    }
+
+    const cancel2 = () => {
+        userShow.value = false;
+        reset();
+    }
+    
+    const handleEdit = (row) => {
+        reset();
+        getCoachInfo(row.id).then(response => {
+            userForm.value = {...userForm.value,...response.data};
+            userTitle.value = "编辑成员详情";
+            userShow.value = true;
+        });
+    }
+    async function handleDelete(row) {
+        await proxy?.$modal.confirm('确认删除成员【' + row.realName + '】吗?').finally(() => loading.value = false);
+        let res = await deleteCoach([row.id]);
+        if (res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+        else return proxy?.$modal.msgError(res.msg);
+        await getUserList();
+    }
+
+    onMounted(()=>{
+        programid.value = proxy.$route?.query?.enterpriseId;
+        teamid.value = proxy.$route?.query?.teamId;
+        getTeamListByCompanyId();
+        getUserList();
+    })
+</script>
+
+<style scoped lang="scss">
+    .full_page{
+        background: #FAFAFA;
+
+        .content{
+            width: calc(100% - 24px);
+            height: calc(100vh - 30px);
+            margin: 12px;
+            background: #FFFFFF;
+            border-radius: 6px 6px 0px 0px;
+            border: 1px solid #F3F4F6;
+            position: relative;
+            display: flex;
+            flex-direction: column;
+
+            .top{
+                width: 100%;
+                height: 64px;
+                background: #FFFFFF;
+                border-bottom: 1px solid #F3F4F6;
+                .t_l{
+                    width: 310px;
+                    img{
+                        width: 36px;
+                        height: 36px;
+                        margin-left: 16px;
+                        cursor: pointer;
+                    }
+                    .spans{
+                        display: flex;
+                        align-items: center;
+                        margin-left: 23px;
+                        span{
+                            font-family: PingFangSC, PingFang SC;
+                            font-weight: 400;
+                            font-size: 14px;
+                            color: #6B7280;
+                            line-height: 14px;
+                            &.last{
+                                color: #111111;
+                            }
+                        }
+                    }
+                }
+            }
+
+            .c_bottom{
+                width: 100%;
+                flex: 1;
+                display: flex;
+                .cb_l{
+                    width: 280px;
+                    height: 100%;
+                    border-right: 1px solid #E5E7EB;
+                    padding: 24px 16px;
+                    box-sizing: border-box;
+
+                    .cbl_list{
+                        margin-top: 24px;
+                        width: 100%;
+                        flex: 1;
+                        overflow-y: auto;
+                        .cbl_item{
+                            width: 100%;
+                            padding: 24px 16px;
+                            box-sizing: border-box;
+                            box-shadow: inset 0px -1px 0px 0px #EFEFEF;
+                            font-family: PingFangSC, PingFang SC;
+                            font-weight: 400;
+                            font-size: 14px;
+                            color: #252525;
+                            line-height: 14px;
+                            overflow: hidden;
+                            text-overflow: ellipsis;
+                            white-space: nowrap;
+                            cursor: pointer;
+                            &.active,&:hover{
+                                background: rgba(118,30,106,0.06);
+                                font-weight: bold;
+                                color: #761E6A;
+                            }
+                        }
+                    }
+                }
+                .cb_r{
+                    padding: 30px 16px 24px;
+                    flex: 1;
+                    box-sizing: border-box;
+                    .ct_l{
+                        font-family: PingFang-SC, PingFang-SC;
+                        font-weight: bold;
+                        font-size: 16px;
+                        color: #252525;
+                        line-height: 16px;
+                    }
+                    .ct_r{
+                        .tr_btn{
+                            width: 92px;
+                            height: 36px;
+                            border-radius: 6px;
+                            border: 1px solid #C1C7D2;
+                            margin-left: 20px;
+                            cursor: pointer;
+                            font-family: PingFangSC, PingFang SC;
+                            font-weight: 400;
+                            font-size: 14px;
+                            color: #111111;
+                            display: flex;
+                            align-items: center;
+                            justify-content: center;
+                            &:last-child{
+                                background: #761E6A;
+                                color: #FFFFFF;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+</style>

+ 8 - 7
src/views/modules/agent/questionnaire/schedule.vue

@@ -76,7 +76,7 @@
 <script setup name="">
     import { ref, getCurrentInstance, onMounted, nextTick } from 'vue'
     const { proxy } = getCurrentInstance();
-    import { getQuestionnaireSchedule } from '@/api/agent/index.js'
+    import { getQuestionnaireSchedule,genTeamReportById } from '@/api/agent/index.js'
     const { UserCategory} = proxy.useDict("UserCategory");
     
     const genderCfg = { 0: '男', 1: '女', 2: '保密' }
@@ -115,17 +115,18 @@
     }
 
     const handleTeamReport = () => {
-        setTimeout(()=>{
+        genTeamReportById(questionnaireInfo.value.id).then(res => {
+            if(res.code!==0) return proxy.$message.error(res.msg)
             reportShow.value = true
-        },1000)
+        })
     }
 
 
     const handleReport = (row) => {
-        // proxy.$router.push({ path: '/agentQuestionnaireReport' })
-        setTimeout(()=>{
-            reportShow.value = true
-        },1000)
+        // genTeamReportById(row.id).then(res => {
+        //     if(res.data!==0) return proxy.$message({ type: 'error', message: res.msg })
+        //     reportShow.value = true
+        // })
     }
     const handleRemind = (row) => {
         proxy.$confirm('是否确认发送通知提醒??', '警告', {

+ 53 - 70
src/views/modules/agent/report.vue

@@ -6,7 +6,7 @@
                 <p class="tip">访问和分析PERILL评估报告</p>
             </div>
             <div class="t_r">
-                <el-button type="primary" icon="el-icon-upload2">导出报告</el-button>
+                <!-- <el-button type="primary" icon="el-icon-upload2">导出报告</el-button> -->
             </div>
         </div>
         <div class="tabs adfac">
@@ -22,7 +22,7 @@
             <div class="list">
                 <reportList :item="item" :reportList="item.reportList" :showMore="item.showMore"
                     v-for="(item, index) in teamList" :key="index"
-                    @toggleReport="e=>toggleReportTeam(e,index)">
+                    @toggleReport="e=>toggleReportTeam(e,index)" @deleteReport="e=>deleteTeamReport(e,index,item)">
                 </reportList>
             </div>
         </template>
@@ -39,8 +39,14 @@
 
 <script setup name="">
     import reportList from '@/components/reportList/index.vue'
-    import { ref, getCurrentInstance } from 'vue'
+    import { ref, getCurrentInstance, onMounted } from 'vue'
     const { proxy } = getCurrentInstance();
+    import { 
+        getTeamQuestionnaireList,
+        getTeamReportWjList,
+        getUserReportWjList,
+        deleteTeamReportWj 
+     } from "@/api/agent/index.js";
     
     const tidx = ref(1)
     const queryParams = ref({
@@ -48,68 +54,9 @@
         team: '',
         sort: ''
     })
-    const teamList = ref([
-        {
-            companyName:'甜梦巧克力工厂',
-            wjName:'问卷名称问卷名称问卷名称问卷名称问卷名称',
-            teamType:'市场部',
-            jzDatetime:'2025-06-18 12:00:30',
-            zdPersons:20,
-            tdPersons:99,
-            showMore:false,
-            reportList:[]
-        },
-        {
-            companyName:'甜梦巧克力工厂',
-            wjName:'问卷名称问卷名称问卷名称问卷名称问卷名称',
-            teamType:'市场部',
-            jzDatetime:'2025-06-18 12:00:30',
-            zdPersons:20,
-            tdPersons:99,
-            showMore:false,
-            reportList:[]
-        },
-        {
-            companyName:'甜梦巧克力工厂',
-            wjName:'问卷名称问卷名称问卷名称问卷名称问卷名称',
-            teamType:'市场部',
-            jzDatetime:'2025-06-18 12:00:30',
-            zdPersons:20,
-            tdPersons:99,
-            showMore:false,
-            reportList:[]
-        }
-    ])
+    const teamList = ref([])
 
-    const personList = ref([
-        {
-            companyName:'甜梦巧克力工厂',
-            wjName:'问卷名称问卷名称问卷名称问卷名称问卷名称',
-            userName:'刘俊',
-            teamType:'市场部',
-            jzDatetime:'2025-06-18 12:00:30',
-            showMore:false,
-            reportList:[]
-        },
-        {
-            companyName:'甜梦巧克力工厂',
-            wjName:'问卷名称问卷名称问卷名称问卷名称问卷名称',
-            userName:'刘俊',
-            teamType:'市场部',
-            jzDatetime:'2025-06-18 12:00:30',
-            showMore:false,
-            reportList:[]
-        },
-        {
-            companyName:'甜梦巧克力工厂',
-            wjName:'问卷名称问卷名称问卷名称问卷名称问卷名称',
-            userName:'刘俊',
-            teamType:'市场部',
-            jzDatetime:'2025-06-18 12:00:30',
-            showMore:false,
-            reportList:[]
-        }
-    ])
+    const personList = ref([])
 
     const handleChangeTab = (idx) => {
         tidx.value = idx
@@ -118,12 +65,10 @@
     const toggleReportTeam = (e,idx) => {
         teamList.value[idx].showMore = !teamList.value[idx].showMore;
         if(teamList.value[idx].showMore){
-            teamList.value[idx].reportList = [
-                {reportName:'报告名称报告名称报告名称报告名称',reprtTime:'2025-06-18 12:00:30',status:1},
-                {reportName:'报告名称报告名称报告名称报告名称',reprtTime:'2025-06-18 12:00:30',status:3},
-                {reportName:'报告名称报告名称报告名称报告名称',reprtTime:'2025-06-18 12:00:30',status:0},
-                {reportName:'报告名称报告名称报告名称报告名称',reprtTime:'2025-06-18 12:00:30',status:2}
-            ];
+            getTeamReportWjList(e.id).then(res=>{
+                if(res.code!==0) return proxy.$message.error(res.msg)
+                teamList.value[idx].reportList = res.data;
+            })
         }else teamList.value[idx].reportList = [];
     }
     const toggleReportPerson = (e,idx) => {
@@ -137,6 +82,44 @@
             ];
         }else personList.value[idx].reportList = [];
     }
+
+    const getTeamList = () => {
+        getTeamQuestionnaireList(queryParams.value).then(res=>{
+            if(res.code!==0) return proxy.$message.error(res.msg)
+            teamList.value = res.data.list;
+            teamList.value = teamList.value.map(item=>{
+                return {
+                    ...item,
+                    showMore:false,
+                    reportList:[]
+                };
+            })
+        })
+    }
+
+    const getPersonList = () => {
+        getUserReportWjList().then(res=>{
+            if(res.code!==0) return proxy.$message.error(res.msg)
+            personList.value = res.data;
+        })
+    }
+
+    const deleteTeamReport = (e,idx,item) => {
+        proxy.$modal.confirm('确认删除该报告吗?如确认会立即执行!').then(async function () {
+        let res = await deleteTeamReportWj([e]);
+        if(res.code===0){
+            proxy.$message.success('删除成功!');
+            getTeamReportWjList(item.id).then(res=>{
+                if(res.code!==0) return proxy.$message.error(res.msg)
+                teamList.value[idx].reportList = res.data;
+            })
+        } else proxy.$message.error(res.msg)
+        }).then(() => {}).finally(() => {});
+    }
+
+    onMounted(()=>{
+        getTeamList()
+    })
 </script>
 
 <style scoped lang="scss">