Просмотр исходного кода

个人报告页面画写完成;项目管理改版页面画写完成;全局样式添加

htc 1 день назад
Родитель
Сommit
6ebefcd13f

BIN
src/assets/images/agent/book_mini.png


+ 2 - 2
src/assets/scss/global.scss

@@ -1,10 +1,10 @@
 
 
-.el-button--primary{
+.el-button--primary,.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner{
     background: #761E6A !important;
     border-color: #761E6A !important;
 }
-.el-button--text{
+.el-button--text,.el-checkbox__input.is-checked+.el-checkbox__label{
     color: #761E6A !important;
 }
 .el-radio__input.is-checked .el-radio__inner{

+ 2 - 0
src/router/index.js

@@ -56,8 +56,10 @@ export const moduleRoutes = {
     { path: '/agentProgramAddTeam', component: () => import('@/views/modules/agent/program/addTeam'), name: 'agentProgramAddTeam', meta: { title: '添加团队', isTab: false } },
     { path: '/agentKnowledge', component: () => import('@/views/modules/agent/knowledge'), name: 'agentKnowledge', meta: { title: '知识库管理', isTab: false } },
     { path: '/agentKnowledgeAdd', component: () => import('@/views/modules/agent/knowledge/add'), name: 'agentKnowledgeAdd', meta: { title: '创建知识库', isTab: false } },
+    { path: '/agentKnowledgeDetail', component: () => import('@/views/modules/agent/knowledge/detail'), name: 'agentKnowledgeDetail', meta: { title: '知识库详情', isTab: false } },
     { path: '/agentKnowledgeCategory', component: () => import('@/views/modules/agent/knowledgeCategory'), name: 'agentKnowledgeCategory', meta: { title: '类目管理', isTab: false } },
     { path: '/agentUser', component: () => import('@/views/modules/agent/user'), name: 'agentUser', meta: { title: '用户管理', isTab: false } },
+    { path: '/agentReport', component: () => import('@/views/modules/agent/report'), name: 'agentReport', meta: { title: '报告管理', isTab: false } },
   ]
 }
 

+ 8 - 1
src/views/modules/agent/knowledge.vue

@@ -29,7 +29,7 @@
                         <p class="i_text">{{item.time}}</p>
                     </div>
                     <div class="i_opreations adfacjb">
-                        <div class="io_pre">查看</div>
+                        <div class="io_pre" @click="handleDetail(item)">查看</div>
                         <div class="io_pre">编辑</div>
                         <div class="io_pre">删除</div>
                     </div>
@@ -64,6 +64,10 @@
     const handleAdd = () => {
         proxy.$router.push('agentKnowledgeAdd')
     }
+
+    const handleDetail = (item) => {
+        proxy.$router.push({path:'/agentKnowledgeDetail',query:{title:item.name}})
+    }
 </script>
 
 <style scoped lang="scss">
@@ -181,6 +185,9 @@
                         line-height: 32px;
                         text-align: center;
                         cursor: pointer;
+                        &:hover{
+                            color: #761E6A;
+                        }
                     }
                 }
             }

+ 231 - 0
src/views/modules/agent/knowledge/detail.vue

@@ -0,0 +1,231 @@
+<template>
+    <div class="page">
+        <div class="top adfac">
+            <img src="@/assets/images/agent/arrow_left.png" @click="handleBack">
+            <div class="spans">
+                <span>项目管理</span>
+                <span class="last">&nbsp;/&nbsp;{{ topname }}</span>
+            </div>
+        </div>
+        <div class="content">
+            <div class="c_query adfacjb">
+                <div class="cq_l adfac">
+                    <el-select v-model="queryParams.status" placeholder="全部状态" style="width: 200px;margin-right: 20px;"></el-select>
+                    <el-select v-model="queryParams.category" placeholder="全部类目" style="width: 200px;margin-right: 20px;"></el-select>
+                    <el-input placeholder="搜索文件名称" suffix-icon="el-icon-search" v-model="queryParams.name" style="width: 280px;"></el-input>                
+                </div>
+                <el-button type="primary">导入数据</el-button>
+            </div>
+            <el-table :data="dataList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无文件" max-height="578px" style="margin-top: 20px;">
+                <el-table-column label="文件名称" prop="aaa"></el-table-column>
+                <el-table-column label="状态" prop="bbb">
+                    <template #default="{ row }"></template>
+                </el-table-column>
+                <el-table-column label="数据来源" prop="aaa"></el-table-column>
+                <el-table-column label="文件格式" prop="aaa"></el-table-column>
+                <el-table-column label="所属类目" prop="aaa"></el-table-column>
+                <el-table-column label="最近更新时间" prop="aaa"></el-table-column>
+                <el-table-column label="操作" width="150">
+                    <template #default="scope">
+                        <el-button link type="text" size="mini" @click="handleDetail(scope.row)">详情</el-button>
+                        <el-button link type="text" size="mini" @click="handleTag(scope.row)">标签</el-button>
+                        <el-button link type="text" size="mini" @click="handleDelete(scope.row)">删除</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>
+        <el-dialog width="30%" :visible.sync="tagShow" title="新增标签" @close="tagShow=false">
+            <div class="ed_box">
+                <div class="eb_title">已有标签</div>
+                <div class="eb_list">
+                    <div class="ebl_item adfacjb" v-for="(item, index) in tagList" :key="index">
+                        <div class="el_l">
+                            <el-input v-model="item.name" placeholder="请输入标签名称"></el-input>
+                        </div>
+                        <img src="@/assets/images/agent/delete_mini.png" class="el_r" @click="handleDeleteTag(item,index)">
+                    </div>
+                </div>
+                <div class="eb_add" @click="handleAddTag">+添加标签</div>
+            </div>
+            <div class="demo-drawer__footer" style="display: flex;justify-content: end;margin-top: 100px;">
+                <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+                <el-button @click="cancel" style="margin-right: 5%;">取 消</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup name="">
+    import { ref, getCurrentInstance } from 'vue'
+    const { proxy } = getCurrentInstance();
+    
+    const topname = proxy.$route.query.title;
+    const queryParams = ref({
+        status: '',
+        category: '',
+        name: ''
+    })
+    const dataList = ref([1]);
+    const loading = ref(false);
+    const total = ref(0);
+    const tagShow = ref(false);
+    const tagList = ref([]);
+    const buttonLoading = ref(false);
+
+    const getList = () => {
+        let query = {...queryParams.value};
+        loading.value = true;
+        // const res = await listOrder(query);
+        // userList.value = res.data.list;
+        // total.value = res.data.total;
+        loading.value = false;
+    }
+    const handleSizeChange = (val) => {
+        queryParams.page = val;
+        getList();
+    }
+    const handleCurrentChange = (val) => {
+        queryParams.page = val;
+        getList();
+    }
+
+
+    const handleBack = () => {
+        proxy.$router.go(-1);
+    }
+
+    const handleDetail = (item) => {
+
+    }
+    const handleTag = (item) => {
+        tagShow.value = true;
+    }
+    const handleDelete = (item) => {
+        proxy.$confirm('删除后无法恢复,确认删除吗?', '提示', {
+            confirmButtonText: '确定',
+            confirmButtonColor: '#833478',
+            cancelButtonText: '取消',
+            type: 'warning'
+        }).then(() => {
+            
+        });
+    }
+
+    const handleDeleteTag = (item, index) => {
+        tagList.value.splice(index, 1);
+    }
+
+    const handleAddTag = () => {
+        tagList.value.push({name: ''});
+    }
+
+    const submitForm = () => {
+        buttonLoading.value = true;
+        setTimeout(() => {
+            tagShow.value = false;
+            buttonLoading.value = false;
+        }, 1000)
+    }
+    const cancel = () => {
+        tagShow.value = false;
+    }
+</script>
+
+<style scoped lang="scss">
+    :v-deep .el-dialog__wrapper{
+        background: rgba(0,0,0,.3) !important;
+    }
+    ::v-deep .el-dialog__title{
+        font-weight: bold !important;
+    }
+    ::v-deep .el-dialog{
+        margin-top: 15vh !important;
+    }
+
+    .page{
+        background: #FAFAFA;
+        .top{
+            width: 100%;
+            height: 64px;
+            background: #FFFFFF;
+            border-bottom: 1px solid #F3F4F6;
+            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;
+                    }
+                }
+            }
+        }
+        
+        .content{
+            width: calc(100% - 24px);
+            height: calc(100vh - 88px);
+            padding: 20px;
+            box-sizing: border-box;
+            margin: 12px;
+            background: #FFFFFF;
+            border-radius: 6px 6px 0px 0px;
+            border: 1px solid #F3F4F6;
+        }
+
+        .ed_box{
+            .eb_title{
+                font-family: PingFangSC, PingFang SC;
+                font-weight: 400;
+                font-size: 14px;
+                color: #252525;
+                line-height: 20px;
+            }
+            .eb_list{
+                margin-top: 3px;
+                .ebl_item{
+                    margin-top: 10px;
+                    .el_l{
+                        width: calc(100% - 44px);
+                    }
+                    .el_r{
+                        width: 18px;
+                        height: 18px;
+                        cursor: pointer;
+                    }
+                }
+            }
+            .eb_add{
+                font-family: PingFangSC, PingFang SC;
+                font-weight: 400;
+                font-size: 14px;
+                color: #761E6A;
+                line-height: 20px;
+                margin-top: 17px;
+                cursor: pointer;
+            }
+        }
+    }
+</style>

+ 1 - 74
src/views/modules/agent/program.vue

@@ -107,36 +107,6 @@
         </template>
         <template v-else-if="tidx===2"></template>
         <template v-else-if="tidx===3"></template>
-        <el-dialog width="35%" :visible.sync="dialogVisiabled" title="创建项目" @close="dialogVisiabled=false">
-        <el-form ref="programRef" :model="form" :rules="rules" label-width="140px" style="width: 90%;margin: 0 auto;">
-            <el-form-item label="企业名称" prop="aaa">
-            <el-input v-model="form.aaa" placeholder="请输入企业名称" />
-            </el-form-item>
-            <el-form-item label="统一社会信用代码" prop="bbb">
-            <el-input v-model="form.bbb" placeholder="请输入统一社会信用代码" />
-            </el-form-item>
-            <el-form-item label="所在地区" prop="ccc">
-            <el-select v-model="form.ccc" placeholder="请选择所在地区" style="width: 100%;">
-                <el-option label="区域一" value="shanghai"></el-option>
-            </el-select>
-            </el-form-item>
-            <el-form-item label="所在行业" prop="ddd">
-            <el-select v-model="form.ddd" placeholder="请选择所在行业" style="width: 100%;">
-                <el-option label="行业一" value="shanghai"></el-option>
-            </el-select>
-            </el-form-item>
-            <el-form-item label="人员规模" prop="eee">
-            <el-select v-model="form.eee" placeholder="请选择人员规模" style="width: 100%;">
-                <el-option label="规模一" value="shanghai"></el-option>
-            </el-select>
-            </el-form-item>
-        </el-form>
-        <div class="demo-drawer__footer" style="display: flex;justify-content: end;">
-            <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-            <el-button @click="cancel" style="margin-right: 5%;">取 消</el-button>
-        </div>
-        </el-dialog>
-        
         <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>
@@ -276,32 +246,6 @@
             expand:false
         }
     ]);
-    const dialogVisiabled = ref(false);
-    const form = ref({
-        aaa: '',
-        bbb: '',
-        ccc: '',
-        ddd: '',
-        eee: ''
-    });
-    const rules = ref({
-        aaa: [
-            { required: true, message: '请输入企业名称', trigger: 'blur' }
-        ],
-        bbb: [
-            { required: true, message: '请输入统一社会信用代码', trigger: 'blur' }
-        ],
-        ccc: [
-            { required: true, message: '请选择所在地区', trigger: 'change' }
-        ],
-        ddd: [
-            { required: true, message: '请选择所在行业', trigger: 'change' }
-        ],
-        eee: [
-            { required: true, message: '请选择人员规模', trigger: 'change' }
-        ]
-    });
-    const buttonLoading = ref(false);
     const loading = ref(false);
     const queryParams = ref({
         page:1,
@@ -387,24 +331,7 @@
         tidx.value = idx;
     }
     const handleAdd = () => {
-        dialogVisiabled.value = true;
-    };
-    const submitForm = () => {
-        proxy.$refs.programRef.validate((valid) => {
-            if (valid) {
-                buttonLoading.value = true;
-                setTimeout(() => {
-                    teamList.value = [...teamList.value, { ...form.value }];
-                    dialogVisiabled.value = false;
-                    buttonLoading.value = false;
-                }, 1000);
-            } else {
-                return false;
-            }
-        });
-    };
-    const cancel = () => {
-        dialogVisiabled.value = false;
+        proxy.$router.push('/agentProgramAddTeam');
     };
 
     const handleExpand = (item, index) => {

+ 474 - 179
src/views/modules/agent/program/addTeam.vue

@@ -1,156 +1,232 @@
 <template>
     <div class="full_page">
-        <div class="top">
-            <img src="@/assets/images/agent/arrow_left.png">
-            <div class="spans">
-                <span>项目管理</span>
-                <span class="last">&nbsp;/&nbsp;添加团队</span>
+        <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;{{ topname }}</span>
+                </div>
+            </div>
+            <div class="t_r">
+                <div class="steps adfacjc">
+                    <div class="s_text adfac" :class="{'active':step<3}">
+                        <div class="st_num">1</div>
+                        <span>创建新项目</span>
+                    </div>
+                    <div class="s_line"></div>
+                    <div class="s_text adfac" :class="{'active':step===2}">
+                        <div class="st_num">2</div>
+                        <span>添加团队及其成员</span>
+                    </div>
+                </div>
             </div>
         </div>
         <div class="content">
             <div class="form">
-                <el-form :model="teamDto" :rules="rules" ref="teamDtoRef" label-width="130px">
-                    <div class="f_title">添加团队</div>
-                    <el-row style="width: 100%;">
-                        <el-col :span="8">
-                            <el-form-item label="所属项目" prop="aaa">
-                                <el-select v-model="teamDto.aaa" placeholder="请选择所属项目" style="width: 100%;"></el-select>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="8">
-                            <el-form-item label="团队名称" prop="bbb">
-                                <el-input v-model="teamDto.bbb" clearable placeholder="请输入团队名称"></el-input>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="8">
-                            <el-form-item label="工作任务" prop="ccc">
-                                <el-input v-model="teamDto.ccc" clearable placeholder="请输入工作任务"></el-input>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
-                    <el-row style="width: 100%;">
-                        <el-col :span="24">
-                            <el-form-item label="团队介绍" prop="ddd">
-                                <el-input type="textarea" v-model="teamDto.ddd" clearable placeholder="请输入团队介绍"></el-input>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
-                    <el-row style="width: 100%;">
-                        <el-col :span="24">
-                            <el-form-item label="团队项目情况" prop="eee">
-                                <el-input type="textarea" v-model="teamDto.eee" clearable placeholder="请输入团队项目情况"></el-input>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
-                    <div class="f_title" style="margin-top: 31px;">添加成员</div>
-                    <el-row style="width: 100%;">
-                        <el-col :span="24">
-                            <el-form-item label="团队成员" prop="">
-                                <div class="f_type">
-                                    <el-radio-group v-model="addType">
-                                        <el-radio :label="1">批量导入</el-radio>
-                                        <el-radio :label="2">手动录入</el-radio>
-                                    </el-radio-group>
-                                </div>
-                                <template v-if="addType===1">
-                                    <div class="f_pldr">
-                                        <div class="fp_box">
-                                            <div class="fpb_pre">
-                                                <div class="fpbp_btn">下载Excel示例文件</div>
-                                            </div>
-                                            <img src="@/assets/images/agent/arrow_right_two.png">
-                                            <div class="fpb_pre sc">
-                                                <div class="fpbp_btn">上传Excel文件</div>
+                <template v-if="step===1">
+                    <el-form ref="programRef" :model="programForm" :rules="programRules" label-width="140px" style="width: 90%;margin: 0 auto;">
+                        <div class="f_title">创建新项目</div>
+                        <el-form-item label="企业名称" prop="aaa">
+                            <el-input v-model="programForm.aaa" placeholder="请输入企业名称" />
+                        </el-form-item>
+                        <el-form-item label="统一社会信用代码" prop="bbb">
+                            <el-input v-model="programForm.bbb" placeholder="请输入统一社会信用代码" />
+                        </el-form-item>
+                        <el-form-item label="所在地区" prop="ccc">
+                            <el-select v-model="programForm.ccc" placeholder="请选择所在地区" style="width: 100%;">
+                                <el-option label="区域一" value="shanghai"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="所在行业" prop="ddd">
+                            <el-select v-model="programForm.ddd" placeholder="请选择所在行业" style="width: 100%;">
+                                <el-option label="行业一" value="shanghai"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="人员规模" prop="eee">
+                            <el-select v-model="programForm.eee" placeholder="请选择人员规模" style="width: 100%;">
+                                <el-option label="规模一" value="shanghai"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="项目教练" prop="eee">
+                            <div class="f_s adfacjb" @click="hangleSelectCoach">
+                                <div class="fs_text" :class="{'active':coachs!=='请选择'}">{{ coachs }}</div>
+                                <i class="el-icon-arrow-down" style="color: #C0C4CC;"></i>
+                            </div>
+                        </el-form-item>
+                    </el-form>
+                </template>
+                <template v-else>
+                    <el-form :model="teamDto" :rules="rules" ref="teamDtoRef" label-width="130px">
+                        <div class="f_title">添加团队</div>
+                        <el-row style="width: 100%;">
+                            <el-col :span="8">
+                                <el-form-item label="所属项目" prop="aaa">
+                                    <el-select v-model="teamDto.aaa" placeholder="请选择所属项目" style="width: 100%;"></el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="团队名称" prop="bbb">
+                                    <el-input v-model="teamDto.bbb" clearable placeholder="请输入团队名称"></el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="工作任务" prop="ccc">
+                                    <el-input v-model="teamDto.ccc" clearable placeholder="请输入工作任务"></el-input>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-row style="width: 100%;">
+                            <el-col :span="24">
+                                <el-form-item label="团队介绍" prop="ddd">
+                                    <el-input type="textarea" v-model="teamDto.ddd" clearable placeholder="请输入团队介绍"></el-input>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-row style="width: 100%;">
+                            <el-col :span="24">
+                                <el-form-item label="团队项目情况" prop="eee">
+                                    <el-input type="textarea" v-model="teamDto.eee" clearable placeholder="请输入团队项目情况"></el-input>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <div class="f_title" style="margin-top: 31px;">添加成员</div>
+                        <el-row style="width: 100%;">
+                            <el-col :span="24">
+                                <el-form-item label="团队成员" prop="">
+                                    <div class="f_type">
+                                        <el-radio-group v-model="addType">
+                                            <el-radio :label="1">批量导入</el-radio>
+                                            <el-radio :label="2">手动录入</el-radio>
+                                        </el-radio-group>
+                                    </div>
+                                    <template v-if="addType===1">
+                                        <div class="f_pldr">
+                                            <div class="fp_box">
+                                                <div class="fpb_pre">
+                                                    <div class="fpbp_btn">下载Excel示例文件</div>
+                                                </div>
+                                                <img src="@/assets/images/agent/arrow_right_two.png">
+                                                <div class="fpb_pre sc">
+                                                    <div class="fpbp_btn">上传Excel文件</div>
+                                                </div>
                                             </div>
+                                            <p>
+                                                1、Excel文件后缀名为xls或者xlsx,文件中所含烈数请勿超过20列<br>
+                                                2、模版中用户姓名为必填,其他为选填,且不能对已有字段进行删除、修改<br>
+                                                3、部门:上下级部门间用“/”符号隔开,且从最上级部门开始,例如“产品部门/设计”。若存在属于多个部门的情况,不同部门之间用 ; 隔开。
+                                            </p>
                                         </div>
-                                        <p>
-                                            1、Excel文件后缀名为xls或者xlsx,文件中所含烈数请勿超过20列<br>
-                                            2、模版中用户姓名为必填,其他为选填,且不能对已有字段进行删除、修改<br>
-                                            3、部门:上下级部门间用“/”符号隔开,且从最上级部门开始,例如“产品部门/设计”。若存在属于多个部门的情况,不同部门之间用 ; 隔开。
-                                        </p>
-                                    </div>
-                                </template>
-                                <template v-else-if="addType===2">
-                                    <div class="f_sdlr">
-                                        <div class="fs_item" v-for="(item,index) in teamDto.userList" :key="index">
-                                            <el-form :model="teamDto.userList[index]" label-width="100px">
-                                                <el-row style="width: 100%;">
-                                                    <el-col :span="8">
-                                                        <el-form-item label="姓名" prop="aa">
-                                                            <el-input v-model="teamDto.userList[index].aa" clearable placeholder="请输入"></el-input>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                    <el-col :span="8">
-                                                        <el-form-item label="性别" prop="bb">
-                                                            <el-select v-model="teamDto.userList[index].bb" placeholder="请选择" style="width: 100%;"></el-select>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                    <el-col :span="8">
-                                                        <el-form-item label="出生日期" prop="cc">
-                                                            <el-select v-model="teamDto.userList[index].cc" placeholder="请选择" style="width: 100%;"></el-select>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                </el-row>
-                                                <el-row style="width: 100%;">
-                                                    <el-col :span="8">
-                                                        <el-form-item label="手机号码" prop="dd">
-                                                            <el-input v-model="teamDto.userList[index].dd" clearable placeholder="请输入"></el-input>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                    <el-col :span="8">
-                                                        <el-form-item label="所属部门" prop="ee">
-                                                            <el-input v-model="teamDto.userList[index].ee" clearable placeholder="请输入"></el-input>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                    <el-col :span="8">
-                                                        <el-form-item label="职位" prop="ff">
-                                                            <el-select v-model="teamDto.userList[index].ff" placeholder="请选择" style="width: 100%;"></el-select>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                </el-row>
-                                                <el-row style="width: 100%;">
-                                                    <el-col :span="8">
-                                                        <el-form-item label="分工" prop="gg">
-                                                            <el-input v-model="teamDto.userList[index].gg" clearable placeholder="请输入"></el-input>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                    <el-col :span="8">
-                                                        <el-form-item label="上级" prop="hh">
-                                                            <el-input v-model="teamDto.userList[index].hh" clearable placeholder="请输入"></el-input>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                    <el-col :span="8">
-                                                        <el-form-item label="教育程度" prop="ii">
-                                                            <el-select v-model="teamDto.userList[index].ii" placeholder="请选择" style="width: 100%;"></el-select>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                </el-row>
-                                                <el-row style="width: 100%;">
-                                                    <el-col :span="8">
-                                                        <el-form-item label="级别" prop="jj">
-                                                            <el-select v-model="teamDto.userList[index].jj" placeholder="请选择" style="width: 100%;"></el-select>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                    <el-col :span="8">
-                                                        <el-form-item label="" prop="">
-                                                            <div class="fs_add del" @click="handleDeleteItem(item,index)">x 删除</div>
-                                                        </el-form-item>
-                                                    </el-col>
-                                                </el-row>
-                                            </el-form>
+                                    </template>
+                                    <template v-else-if="addType===2">
+                                        <div class="f_sdlr">
+                                            <div class="fs_item" v-for="(item,index) in teamDto.userList" :key="index">
+                                                <el-form :model="teamDto.userList[index]" label-width="100px">
+                                                    <el-row style="width: 100%;">
+                                                        <el-col :span="8">
+                                                            <el-form-item label="姓名" prop="aa">
+                                                                <el-input v-model="teamDto.userList[index].aa" clearable placeholder="请输入"></el-input>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                        <el-col :span="8">
+                                                            <el-form-item label="性别" prop="bb">
+                                                                <el-select v-model="teamDto.userList[index].bb" placeholder="请选择" style="width: 100%;"></el-select>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                        <el-col :span="8">
+                                                            <el-form-item label="出生日期" prop="cc">
+                                                                <el-select v-model="teamDto.userList[index].cc" placeholder="请选择" style="width: 100%;"></el-select>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                    </el-row>
+                                                    <el-row style="width: 100%;">
+                                                        <el-col :span="8">
+                                                            <el-form-item label="手机号码" prop="dd">
+                                                                <el-input v-model="teamDto.userList[index].dd" clearable placeholder="请输入"></el-input>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                        <el-col :span="8">
+                                                            <el-form-item label="所属部门" prop="ee">
+                                                                <el-input v-model="teamDto.userList[index].ee" clearable placeholder="请输入"></el-input>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                        <el-col :span="8">
+                                                            <el-form-item label="职位" prop="ff">
+                                                                <el-select v-model="teamDto.userList[index].ff" placeholder="请选择" style="width: 100%;"></el-select>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                    </el-row>
+                                                    <el-row style="width: 100%;">
+                                                        <el-col :span="8">
+                                                            <el-form-item label="分工" prop="gg">
+                                                                <el-input v-model="teamDto.userList[index].gg" clearable placeholder="请输入"></el-input>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                        <el-col :span="8">
+                                                            <el-form-item label="上级" prop="hh">
+                                                                <el-input v-model="teamDto.userList[index].hh" clearable placeholder="请输入"></el-input>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                        <el-col :span="8">
+                                                            <el-form-item label="教育程度" prop="ii">
+                                                                <el-select v-model="teamDto.userList[index].ii" placeholder="请选择" style="width: 100%;"></el-select>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                    </el-row>
+                                                    <el-row style="width: 100%;">
+                                                        <el-col :span="8">
+                                                            <el-form-item label="级别" prop="jj">
+                                                                <el-select v-model="teamDto.userList[index].jj" placeholder="请选择" style="width: 100%;"></el-select>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                        <el-col :span="8">
+                                                            <el-form-item label="" prop="">
+                                                                <div class="fs_add del" @click="handleDeleteItem(item,index)">x 删除</div>
+                                                            </el-form-item>
+                                                        </el-col>
+                                                    </el-row>
+                                                </el-form>
+                                            </div>
+                                            <div class="fs_add" @click="handleAddItem">+ 添加</div>
                                         </div>
-                                        <div class="fs_add" @click="handleAddItem">+ 添加</div>
-                                    </div>
-                                </template>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
-                </el-form>
+                                    </template>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </template>
             </div>
             <div class="btns">
-                <div class="btn">确认</div>
-                <div class="btn">取消</div>
+                <el-button type="primary" @click="handleNext" v-if="step===1" style="margin-left: 20px;">下一步</el-button>
+                <el-button type="primary" @click="handlePrevious" v-if="step===2" style="margin-left: 20px;">上一步</el-button>
+                <el-button type="primary" @click="handleConfirm" v-if="step===2" style="margin-left: 20px;">确认</el-button>
+                <el-button type="default" @click="handleCancel" style="margin-left: 20px;">取消</el-button>
             </div>
+        
+            <el-dialog width="790px" :visible.sync="coachShow" title="选择教练" @close="coachShow=false">
+                <div class="ed_coach adf">
+                    <div class="ec_l">
+                        <el-input placeholder="请输入教练名搜索" suffix-icon="el-icon-search" v-model="coachName" style="width: 100%;"></el-input>
+                        <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" style="margin-top: 65px;">全选</el-checkbox>
+                        <div class="ecl_cbs">
+                            <el-checkbox v-model="coach.checked" v-for="(coach,index) in coachList" :key="coach.id" @change="handleChangeCoach" style="margin-top: 24px;display: block;">{{ coach.name }}</el-checkbox>
+                        </div>
+                    </div>
+                    <div class="ec_r">
+                        <div class="ecr_text">已选择({{ coachSelecteds.length }}/<span>{{ coachList.length }}</span>)</div>
+                        <div class="ecr_names">
+                            <div class="en_pre adfacjc" v-for="(item,index) in coachSelecteds" :key="index">
+                                <span>{{ item.name }}</span>
+                                <img src="@/assets/images/agent/delete_mini.png" @click="handleDeleteCoach(item,index)">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="demo-drawer__footer" style="display: flex;justify-content: end;margin-top: 20px;">
+                    <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 认</el-button>
+                    <el-button @click="cancel" style="margin-right: 5%;">取 消</el-button>
+                </div>
+            </el-dialog>
         </div>
     </div>
 </template>
@@ -159,6 +235,46 @@
     import { ref, getCurrentInstance } from 'vue'
     const { proxy } = getCurrentInstance();
     
+    const topname = ref('创建项目')
+    const step = ref(1)
+    const coachs = ref('请选择')
+    const coachName = ref('')
+    const coachShow = ref(false)
+    const coachSelecteds = ref([])
+    const coachList = ref([
+        {id:1,name:'张三',checked:false},
+        {id:2,name:'李四',checked:false},
+        {id:3,name:'王五',checked:false},
+        {id:4,name:'赵六',checked:false},
+        {id:5,name:'田七',checked:false}
+    ])
+    const isIndeterminate = ref(false)
+    const checkAll = ref(false)
+
+    const programForm = ref({
+        aaa: '',
+        bbb: '',
+        ccc: '',
+        ddd: '',
+        eee: ''
+    });
+    const programRules = ref({
+        aaa: [
+            { required: true, message: '请输入企业名称', trigger: 'blur' }
+        ],
+        bbb: [
+            { required: true, message: '请输入统一社会信用代码', trigger: 'blur' }
+        ],
+        ccc: [
+            { required: true, message: '请选择所在地区', trigger: 'change' }
+        ],
+        ddd: [
+            { required: true, message: '请选择所在行业', trigger: 'change' }
+        ],
+        eee: [
+            { required: true, message: '请选择人员规模', trigger: 'change' }
+        ]
+    });
     const teamDto = ref({
         aaa: '',
         bbb: '',
@@ -168,6 +284,7 @@
         userList:[]
     })
     const addType = ref(1)
+    const programRef = ref(null)
     const teamDtoRef = ref(null)
     const rules = ref({
         aaa: [
@@ -187,6 +304,10 @@
         ]
     })
 
+    const handleBack = () => {
+        proxy.$router.back()
+    }
+
     const handleAddItem = () => {
         teamDto.value.userList.push({
             aa: '',
@@ -205,9 +326,85 @@
     const handleDeleteItem = (item,index) => {
         teamDto.value.userList.splice(index,1)
     }
+
+    const handleNext = () => {
+        proxy.$refs.programRef.validate((valid) => {
+            if (valid) {
+                step.value = 2;
+                topname.value = '添加团队及其成员';
+            } else {
+                return false;
+            }
+        });
+    }
+    const handlePrevious = () => {
+        step.value = 1;
+        topname.value = '创建项目';
+    }
+    const handleConfirm = () => {
+        proxy.$refs.teamDtoRef.validate((valid) => {
+            if (valid) {
+                console.log(programForm.value);
+                console.log(teamDto.value);
+            } else {
+                return false;
+            }
+        });
+    }
+    const handleCancel = () => {
+        proxy.$router.back()
+    }
+
+    const hangleSelectCoach = () => {
+        coachShow.value = true;
+    }
+
+    const submitForm = () => {
+        coachShow.value = false;
+    }
+    const cancel = () => {
+        coachShow.value = false;
+    }
+
+    const handleCheckAllChange = (val) => {
+        coachSelecteds.value = val ? JSON.parse(JSON.stringify(coachList.value)) : [];
+        isIndeterminate.value = false;
+        coachList.value.forEach(item => item.checked = val)
+    }
+    const handleChangeCoach = () => {
+        let trues = coachList.value.filter(item => item.checked).length;
+        if(trues>0&&trues<coachList.value.length) isIndeterminate.value = true;
+        else isIndeterminate.value = false;
+        if(trues===coachList.value.length) checkAll.value = true;
+        else checkAll.value = false;
+
+        coachSelecteds.value = coachList.value.filter(item => item.checked);
+    }
+    const handleDeleteCoach = (item,index) => {
+        let i = coachList.value.findIndex(c => c.id === item.id);
+        if(i>-1) coachList.value[i].checked = false;
+        coachSelecteds.value.splice(index,1);
+
+        let trues = coachList.value.filter(item => item.checked).length;
+        if(trues>0&&trues<coachList.value.length) isIndeterminate.value = true;
+        else isIndeterminate.value = false;
+        if(trues===coachList.value.length) checkAll.value = true;
+        else checkAll.value = false;
+
+    }
 </script>
 
 <style scoped lang="scss">
+    :v-deep .el-dialog__wrapper{
+        background: rgba(0,0,0,.3) !important;
+    }
+    ::v-deep .el-dialog__title{
+        font-weight: bold !important;
+    }
+    ::v-deep .el-dialog{
+        margin-top: 15vh !important;
+    }
+
     .full_page{
         background: #FAFAFA;
         .top{
@@ -215,26 +412,68 @@
             height: 64px;
             background: #FFFFFF;
             border-bottom: 1px solid #F3F4F6;
-            display: flex;
-            align-items: center;
-            img{
-                width: 36px;
-                height: 36px;
-                margin-left: 16px;
-                cursor: pointer;
+            .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;
+                        }
+                    }
+                }
             }
-            .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;
+            .t_r{
+                width: calc(100% - 310px);
+                .steps{
+                    .s_text{
+                        .st_num{
+                            width: 24px;
+                            height: 24px;
+                            border-radius: 50%;
+                            background: #DDE0E6;
+                            font-family: PingFang-SC, PingFang-SC;
+                            font-weight: bold;
+                            font-size: 14px;
+                            color: #FFFFFF;
+                            line-height: 24px;
+                            text-align: center;
+                        }
+                        span{
+                            margin-left: 10px;
+                            font-family: PingFangSC, PingFang SC;
+                            font-weight: 400;
+                            font-size: 14px;
+                            color: #6B7280;
+                            line-height: 14px;
+                        }
+                        &.active{
+                            .st_num{
+                                background: #761E6A;
+                            }
+                            span{
+                                color: #761E6A;
+                            }
+                        }
+                    }
+                    .s_line{
+                        width: 496px;
+                        height: 1px;
+                        border: 1px solid #E5E7EB;
+                        margin: 0 21px;
                     }
                 }
             }
@@ -264,25 +503,6 @@
                 position: absolute;
                 left: 0;
                 bottom: 0;
-                .btn{
-                    width: 80px;
-                    height: 32px;
-                    background: #833478;
-                    border-radius: 6px;
-                    font-family: PingFangSC, PingFang SC;
-                    font-weight: 400;
-                    font-size: 14px;
-                    color: #FFFFFF;
-                    line-height: 32px;
-                    text-align: center;
-                    margin-left: 20px;
-                    cursor: pointer;
-                    &:last-child{
-                        background: #FFFFFF;
-                        border: 1px solid #E5E7EB;
-                        color: #9CA3AF;
-                    }
-                }
             }
         }
 
@@ -376,6 +596,81 @@
                 }
             }
         }
+
+        .f_s{
+            width: 100%;
+            height: 42px;
+            border-radius: 6px;
+            border: 1px solid #dcdfe6;
+            padding: 11px 11px 11px 16px;
+            box-sizing: border-box;
+            cursor: pointer;
+            .fs_text{
+                font-family: PingFangSC, PingFang SC;
+                font-weight: 400;
+                font-size: 14px;
+                color: #C0C4CC;
+                line-height: 20px;
+                &.active{
+                    color: #606266;
+                }
+            }
+        }
+
+        .ed_coach{
+            .ec_l{
+                width: calc(50% - 1px);
+                height: 100%;
+                padding-right: 30px;
+                box-sizing: border-box;
+                border-right: 1px solid #ECEEF5;
+                .ecl_cbs{
+                    width: 100%;
+                    // height: calc(100% - 143px);
+                    max-height: 376px;
+                    overflow-y: auto;
+                }
+            }
+            .ec_r{
+                width: 50%;
+                padding-left: 30px;
+                box-sizing: border-box;
+                .ecr_text{
+                    font-family: PingFang-SC, PingFang-SC;
+                    font-weight: bold;
+                    font-size: 16px;
+                    color: #252525;
+                    line-height: 22px;
+                    span{
+                        color: #B9B9B9;
+                    }
+                }
+                .ecr_names{
+                    margin-left: -16px;
+                    overflow: hidden;
+                    .en_pre{
+                        float: left;
+                        padding: 10px;
+                        background: #F9FAFB;
+                        border-radius: 6px;
+                        margin: 19px 0 0 16px;
+                        span{
+                            font-family: PingFangSC, PingFang SC;
+                            font-weight: 400;
+                            font-size: 14px;
+                            color: #252525;
+                            line-height: 14px;
+                        }
+                        img{
+                            width: 16px;
+                            height: 16px;
+                            margin-left: 10px;
+                            cursor: pointer;
+                        }
+                    }
+                }
+            }
+        }
     }
 
     ::v-deep .el-form-item{

+ 15 - 0
src/views/modules/agent/questionnaireList.vue

@@ -0,0 +1,15 @@
+<template>
+    <div class="page">
+        
+    </div>
+</template>
+
+<script setup name="">
+    import { ref, getCurrentInstance } from 'vue'
+    const { proxy } = getCurrentInstance();
+    
+</script>
+
+<style scoped lang="scss">
+    
+</style>

+ 203 - 0
src/views/modules/agent/report.vue

@@ -0,0 +1,203 @@
+<template>
+    <div class="page">
+        <div class="top adfacjb">
+            <div class="t_l">
+                <p>报告管理</p>
+                <p class="tip">访问和分析PERILL评估报告</p>
+            </div>
+            <div class="t_r">
+                <el-button type="primary" icon="el-icon-upload2">导出报告</el-button>
+            </div>
+        </div>
+        <div class="tabs adfac">
+            <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>
+        <div class="query adfacjb">
+            <el-input placeholder="请输入内容" prefix-icon="el-icon-search" v-model="queryParams.name" style="width: calc(100% - 448px);"></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>
+        <template v-if="tidx===1">
+            <div class="list">
+                <div class="l_item adfacjb" v-for="(item, index) in teamList" :key="index">
+                    <div class="li_l adfac">
+                        <div class="li_pre">
+                            <p class="lit_text">{{item.title}}</p>
+                            <p class="lit_tip">产品研发 · 创新科技</p>
+                        </div>
+                        <div class="li_pre">
+                            <p class="lit_text">{{item.time}}</p>
+                            <p class="lit_tip">报告时间</p>
+                        </div>
+                        <div class="li_pre">
+                            <p class="lit_text">{{item.persons}}/{{ item.sum }}</p>
+                            <p class="lit_tip">答卷人数</p>
+                        </div>
+                    </div>
+                    <div class="li_r">
+                        <el-button type="primary">查看报告</el-button>
+                    </div>
+                </div>
+            </div>
+        </template>
+        <template v-else-if="tidx===2">
+            <div class="list">
+                <div class="l_item adfacjb" v-for="(item, index) in personList" :key="index">
+                    <div class="li_l adfac">
+                        <div class="li_pre">
+                            <p class="lit_text">{{item.title}}</p>
+                            <p class="lit_tip">产品研发 · 创新科技</p>
+                        </div>
+                        <div class="li_pre">
+                            <p class="lit_text">{{item.time}}</p>
+                            <p class="lit_tip">报告时间</p>
+                        </div>
+                        <div class="li_pre">
+                            <p class="lit_text">{{item.name}}</p>
+                            <p class="lit_tip">用户名</p>
+                        </div>
+                    </div>
+                    <div class="li_r">
+                        <el-button type="primary">查看报告</el-button>
+                    </div>
+                </div>
+            </div>
+        </template>
+    </div>
+</template>
+
+<script setup name="">
+    import { ref, getCurrentInstance } from 'vue'
+    const { proxy } = getCurrentInstance();
+    
+    const tidx = ref(1)
+    const queryParams = ref({
+        name: '',
+        team: '',
+        sort: ''
+    })
+    const teamList = ref([
+        {title:'TechCorp 领导团队评估',time:'2023-05-18 12:00:30',sum:20,persons:20},
+        {title:'TechCorp 领导团队评估',time:'2023-05-18 12:00:30',sum:20,persons:20},
+        {title:'TechCorp 领导团队评估',time:'2023-05-18 12:00:30',sum:20,persons:20}
+
+    ])
+
+    const personList = ref([
+        {title:'TechCorp 领导团队评估',time:'2023-05-18 12:00:30',name:'张三'},
+        {title:'TechCorp 领导团队评估',time:'2023-05-18 12:00:30',name:'张三'},
+        {title:'TechCorp 领导团队评估',time:'2023-05-18 12:00:30',name:'张三'}
+    ])
+
+    const handleChangeTab = (idx) => {
+        tidx.value = idx
+    }
+</script>
+
+<style scoped lang="scss">
+    .page{
+        padding: 28px 20px;
+        background: #FAFAFA;
+
+        .top{
+            .t_l{
+                p{
+                    font-family: PingFang-SC, PingFang-SC;
+                    font-weight: bold;
+                    font-size: 16px;
+                    color: #252525;
+                    line-height: 16px;
+                    &.tip{
+                        font-family: PingFangSC, PingFang SC;
+                        font-weight: 400;
+                        font-size: 14px;
+                        color: #6B7280;
+                        line-height: 14px;
+                        margin-top: 16px;
+                    }
+
+                }
+            }
+        }
+
+        .tabs{
+            width: 100%;
+            margin-top: 28px;
+            border-bottom: 1px solid #E5E7EB;
+            .t_pre{
+                width: 116px;
+                padding-bottom: 18px;
+                position: relative;
+                font-family: PingFangSC, PingFang SC;
+                font-weight: 400;
+                font-size: 14px;
+                color: #252525;
+                line-height: 16px;
+                text-align: center;
+                cursor: pointer;
+                &.active{
+                    font-weight: bold;
+                    color: #761E6A;
+                    &::after{
+                        content: '';
+                        width: 116px;
+                        height: 2px;
+                        background: #833478;
+                        position: absolute;
+                        left: 0;
+                        bottom: 0;
+                    }
+
+                }
+            }
+        }
+
+        .query{
+            width: 100%;
+            padding: 16px 20px;
+            box-sizing: border-box;
+            background: #FFFFFF;
+            border-radius: 6px;
+            border: 1px solid #F3F4F6;
+            margin-top: 31px;
+        }
+
+        .list{
+            .l_item{
+                margin-top: 10px;
+                width: 100%;
+                padding: 24px;
+                box-sizing: border-box;
+                background: #FFFFFF;
+                border-radius: 6px;
+                border: 1px solid #F3F4F6;
+                .li_l{
+                    .li_pre{
+                        width: 335px;
+                        .lit_text{
+                            font-family: PingFang-SC, PingFang-SC;
+                            font-weight: bold;
+                            font-size: 14px;
+                            color: #252525;
+                            line-height: 14px;
+                            text-align: left;
+                            overflow: hidden;
+                            text-overflow: ellipsis;
+                            white-space: nowrap;
+                        }
+                        .lit_tip{
+                            font-family: PingFangSC, PingFang SC;
+                            font-weight: 400;
+                            font-size: 14px;
+                            color: #6B7280;
+                            line-height: 14px;
+                            text-align: left;
+                            margin-top: 16px;
+                        }
+                    }
+                }
+            }
+        }
+    }
+</style>