|
@@ -0,0 +1,870 @@
|
|
|
+<template>
|
|
|
+ <div class="page">
|
|
|
+ <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>
|
|
|
+ <template v-if="tidx===1">
|
|
|
+ <div class="t_add" @click="handleAddProgram" 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="queryParams.programName" style="width: 100%" @keyup.enter.native="getProgramListFn"></el-input>
|
|
|
+ </div>
|
|
|
+ <div class="content">
|
|
|
+ <template v-if="programList.length">
|
|
|
+ <el-table :data="programList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无项目" max-height="578px">
|
|
|
+ <el-table-column label="序号" width="50">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ scope.$index + 1 }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="项目编号" prop="programNo" width="150"></el-table-column>
|
|
|
+ <el-table-column label="项目名称" prop="programName"></el-table-column>
|
|
|
+ <el-table-column label="公司名称" prop="enterpriseName"></el-table-column>
|
|
|
+ <el-table-column label="团队名称" prop="teamName"></el-table-column>
|
|
|
+ <el-table-column label="教练" prop="coachNames"></el-table-column>
|
|
|
+ <el-table-column label="备注" prop="remark" width="300" 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)">编辑</el-button>
|
|
|
+ <el-button link type="text" size="mini" @click="handleDelete(scope.row)" v-hasPermi="['core:program: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>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div class="empty">
|
|
|
+ <img src="@/assets/images/agent/team.png">
|
|
|
+ <p>您还没有添加过任何项目</p>
|
|
|
+ <div class="e_add" @click="handleAddProgram">+ 添加项目</div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else-if="tidx===2">
|
|
|
+ <div class="query adfacjb">
|
|
|
+ <el-input placeholder="请输入项目名称" prefix-icon="el-icon-search" v-model="programName2" style="width: 100%" @keyup.enter.native="getProgramProgressData"></el-input>
|
|
|
+ </div>
|
|
|
+ <div class="content">
|
|
|
+ <template v-if="programList2.length">
|
|
|
+ <el-table :data="programList2" border cell-class-name="vertical-top-cell" v-loading="loading2" empty-text="暂无项目进展" max-height="578px">
|
|
|
+ \<el-table-column label="序号" width="50">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ scope.$index + 1 }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="项目编号" prop="programNo"></el-table-column>
|
|
|
+ <el-table-column label="项目名称" prop="programName"></el-table-column>
|
|
|
+ <el-table-column label="公司名称" prop="enterpriseName"></el-table-column>
|
|
|
+ <el-table-column label="更新时间" prop="updateDate"></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="handleEdit2(scope.row)" v-hasPermi="['core:projectprogress:update']">编辑</el-button>
|
|
|
+ <el-button link type="text" size="mini" @click="handleDelete2(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="handleAddJZ">+ 添加项目进展</div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <el-drawer :title="programTitle" :visible.sync="programShow" append-to-body size="50%" @close="cancel">
|
|
|
+ <el-form ref="programRef" :model="programForm" :rules="programRules" label-width="100px" style="width: 90%;margin: 0 auto;">
|
|
|
+ <el-form-item label="项目编号" prop="programNo">
|
|
|
+ <el-input v-model="programForm.programNo"disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目名称" prop="programName">
|
|
|
+ <el-input v-model="programForm.programName" placeholder="请输入项目名称" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="公司名称" prop="enterpriseId">
|
|
|
+ <el-select v-model="programForm.enterpriseId" placeholder="请选择公司" filterable clearable style="width: 100%;" @change="handleChangeCompany">
|
|
|
+ <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-form-item label="团队名称" prop="teamId">
|
|
|
+ <el-select v-model="programForm.teamId" placeholder="请选择团队" filterable clearable style="width: 100%;" :disabled="!programForm.enterpriseId">
|
|
|
+ <el-option v-for="item in teamList" :key="item.id" :label="item.teamName" :value="item.id"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目教练" prop="">
|
|
|
+ <el-popover
|
|
|
+ placement="top-start"
|
|
|
+ title="选择教练"
|
|
|
+ width="790"
|
|
|
+ trigger="click"
|
|
|
+ v-model="coachShow"
|
|
|
+ @show="hangleSelectCoach">
|
|
|
+ <div class="ed_coach adf">
|
|
|
+ <div class="ec_l">
|
|
|
+ <el-input placeholder="请输入教练名搜索" suffix-icon="el-icon-search" v-model="coachName" style="width: 100%;" @keyup.enter.native="handleQueryCoach"></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.realName }}</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.realName }}</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 type="primary" @click="submitForm2">确 认</el-button>
|
|
|
+ <el-button @click="cancel2" style="margin-right: 5%;">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ <div slot="reference">
|
|
|
+ <div class="f_s adfacjb" v-if="programForm.coachList.length===0">
|
|
|
+ <div class="fs_text" :class="{'active':coachs!=='请选择'}">{{ coachs }}</div>
|
|
|
+ <i class="el-icon-arrow-down" style="color: #C0C4CC;"></i>
|
|
|
+ </div>
|
|
|
+ <div class="f_s adfacjb" v-else>
|
|
|
+ <p>{{ cocahNames }}</p>
|
|
|
+ <i class="el-icon-arrow-down" style="color: #C0C4CC;"></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-popover>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目备注" prop="remark">
|
|
|
+ <el-input type="textarea" :rows="2" v-model="programForm.remark" placeholder="请输入项目概述" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div class="demo-drawer__footer" style="display: flex;justify-content: end;">
|
|
|
+ <el-button :loading="buttonLoading" type="primary" @click="submitForm" v-hasPermi="['core:program:save']">保 存</el-button>
|
|
|
+ <el-button @click="cancel" style="margin-right: 5%;">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-drawer>
|
|
|
+ <el-drawer :title="progressTitle" :visible.sync="progressShow" append-to-body size="50%" @close="cancel">
|
|
|
+ <el-form ref="progressRef" :model="progressForm" :rules="progressRules" label-width="140px" style="width: 90%;margin: 0 auto;">
|
|
|
+ <el-form-item label="项目名称" prop="programId">
|
|
|
+ <el-select v-model="progressForm.programId" placeholder="请选择项目名称" filterable clearable style="width: 100%;" @change="handleChangeProgram">
|
|
|
+ <el-option v-for="item in useAgentStore().programList" :key="item.id" :label="item.programName" :value="item.id"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="公司名称">
|
|
|
+ <el-select v-model="progressForm.enterpriseId" placeholder="请选择公司" filterable clearable style="width: 100%;" disabled>
|
|
|
+ <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-form-item label="团队名称">
|
|
|
+ <el-select v-model="progressForm.teamId" placeholder="请选择团队" filterable clearable style="width: 100%;" disabled>
|
|
|
+ <el-option v-for="item in teamList" :key="item.id" :label="item.teamName" :value="item.id"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目教练" prop="">
|
|
|
+ <el-input v-model="progressForm.cocahNames" disabled></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目的阶段及状态" prop="progress">
|
|
|
+ <el-input type="textarea" :rows="2" v-model="progressForm.progress" placeholder="请输入项目的阶段及状态" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div class="demo-drawer__footer" style="display: flex;justify-content: end;">
|
|
|
+ <el-button :loading="buttonLoading3" type="primary" @click="submitForm3" v-hasPermi="['core:projectprogress:save']">保 存</el-button>
|
|
|
+ <el-button @click="cancel3" style="margin-right: 5%;">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-drawer>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup name="">
|
|
|
+ import { generateNo } from '@/utils/ruoyi'
|
|
|
+ import { ref, getCurrentInstance, onMounted } from 'vue'
|
|
|
+ const { proxy } = getCurrentInstance();
|
|
|
+ import { useAgentStore } from '@/store_v3/modules/agent';
|
|
|
+ useAgentStore().getCompanyData();
|
|
|
+ useAgentStore().getProgramData();
|
|
|
+ import {
|
|
|
+ getProgramList,
|
|
|
+ addProgram,
|
|
|
+ updateProgram,
|
|
|
+ getProgramInfo,
|
|
|
+ deleteProgram,
|
|
|
+ getCoachList,
|
|
|
+ getTeamListById,
|
|
|
+ getProgramProgressList,
|
|
|
+ addProgramProgress,
|
|
|
+ updateProgramProgress,
|
|
|
+ getProgramProgressInfo,
|
|
|
+ deleteProgramProgress,
|
|
|
+ } from '@/api/agent/index.js'
|
|
|
+
|
|
|
+ const title = ref('项目管理')
|
|
|
+ const tidx = ref(1)
|
|
|
+ const programName2 = ref('')
|
|
|
+ const programList = ref([])
|
|
|
+ const total = ref(0)
|
|
|
+ const programList2 = ref([])
|
|
|
+ const teamList = ref([])
|
|
|
+ const loading = ref(false)
|
|
|
+ const loading2 = ref(false)
|
|
|
+ const coachs = ref('请选择')
|
|
|
+ const coachName = ref('')
|
|
|
+ const coachShow = ref(false)
|
|
|
+ const coachSelecteds = ref([])
|
|
|
+ const coachList = ref([])
|
|
|
+ const isIndeterminate = ref(false)
|
|
|
+ const checkAll = ref(false)
|
|
|
+ const cocahNames = ref('')
|
|
|
+ const queryParams = ref({
|
|
|
+ page: 1,
|
|
|
+ limit: 10,
|
|
|
+ programName: ''
|
|
|
+ })
|
|
|
+ const programTitle = ref('添加项目')
|
|
|
+ const programShow = ref(false)
|
|
|
+ const programRef = ref(null)
|
|
|
+ const programForm = ref({
|
|
|
+ id: '',
|
|
|
+ programNo: '',
|
|
|
+ programName: '',
|
|
|
+ enterpriseId: '',
|
|
|
+ enterpriseName: '',
|
|
|
+ teamId: '',
|
|
|
+ teamName: '',
|
|
|
+ coachList: [],
|
|
|
+ remark: ''
|
|
|
+ })
|
|
|
+ const programRules = ref({
|
|
|
+ programNo: [
|
|
|
+ { required: true, message: '请输入项目编号', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ programName: [
|
|
|
+ { required: true, message: '请输入项目名称', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ enterpriseId: [
|
|
|
+ { required: true, message: '请选择公司', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ teamId: [
|
|
|
+ { required: true, message: '请选择团队', trigger: 'change' }
|
|
|
+ ]
|
|
|
+ })
|
|
|
+ const buttonLoading = ref(false)
|
|
|
+
|
|
|
+ const progressTitle = ref('添加项目阶段及进展')
|
|
|
+ const progressShow = ref(false)
|
|
|
+ const progressRef = ref(null)
|
|
|
+ const progressForm = ref({
|
|
|
+ id: '',
|
|
|
+ programId: '',
|
|
|
+ enterpriseId: '',
|
|
|
+ teamId: '',
|
|
|
+ cocahNames: '',
|
|
|
+ progress: ''
|
|
|
+ })
|
|
|
+ const progressRules = ref({
|
|
|
+ programId: [
|
|
|
+ { required: true, message: '请选择项目', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ progress: [
|
|
|
+ { required: true, message: '请输入项目的阶段及状态', trigger: 'blur' }
|
|
|
+ ]
|
|
|
+ })
|
|
|
+ const buttonLoading3 = ref(false)
|
|
|
+
|
|
|
+ const getProgramListFn = async () => {
|
|
|
+ loading.value = true;
|
|
|
+ const res = await getProgramList(queryParams.value);
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ programList.value = res.data.list;
|
|
|
+ programList.value.forEach(p=>{
|
|
|
+ p.coachNames = p.coachList.map(c=>c.coachName).join('、');
|
|
|
+ })
|
|
|
+ total.value = res.data.total;
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+ const handleSizeChange = (val) => {
|
|
|
+ queryParams.value.limit = val
|
|
|
+ getProgramListFn()
|
|
|
+ }
|
|
|
+ const handleCurrentChange = (val) => {
|
|
|
+ queryParams.value.page = val
|
|
|
+ getProgramListFn()
|
|
|
+ }
|
|
|
+ const handleChangeTab = (idx) => {
|
|
|
+ tidx.value = idx;
|
|
|
+ if(idx===2){
|
|
|
+ getProgramProgressData();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const handleAddProgram = () => {
|
|
|
+ reset();
|
|
|
+ programTitle.value = '添加项目';
|
|
|
+ programForm.value.programNo = generateNo();
|
|
|
+ programShow.value = true;
|
|
|
+ }
|
|
|
+ const handleEdit = (row) => {
|
|
|
+ programTitle.value = '编辑项目';
|
|
|
+ getProgramInfo(row.id).then(res=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ programForm.value = {...programForm.value,...res.data};
|
|
|
+ if(programForm.value.coachList===null) programForm.value.coachList = [];
|
|
|
+ cocahNames.value = programForm.value.coachList.map(item => item.coachName).join(';');
|
|
|
+ getTeamListById({enterpriseId: res.data.enterpriseId}).then(r=>{
|
|
|
+ if(r.code!==0) return proxy.$message.error(r.msg);
|
|
|
+ teamList.value = r.data;
|
|
|
+ })
|
|
|
+ programShow.value = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ const handleDelete = async (row) => {
|
|
|
+ await proxy.$modal.confirm('确认删除项目【' + row.programName + '】吗?');
|
|
|
+ deleteProgram([row.id]).then(res=>{
|
|
|
+ if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
|
|
|
+ else return proxy?.$modal.msgError(res.msg);
|
|
|
+ getProgramListFn();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ const handleChangeCompany = (e) => {
|
|
|
+ getTeamListById({enterpriseId: e}).then(res=>{
|
|
|
+ if(res.code!==0) proxy.$message.error(res.msg);
|
|
|
+ teamList.value = res.data;
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ const submitForm = () => {
|
|
|
+ proxy.$refs.programRef.validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ let dto = JSON.parse(JSON.stringify(programForm.value));
|
|
|
+ if(dto.coachList.length===0) return proxy.$message.warning('请至少选择一位教练');
|
|
|
+ if(dto.id){
|
|
|
+ updateProgram(dto).then((res)=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ buttonLoading.value = false;
|
|
|
+ programShow.value = false;
|
|
|
+ getProgramListFn();
|
|
|
+ })
|
|
|
+ }else{
|
|
|
+ addProgram(dto).then((res)=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ buttonLoading.value = false;
|
|
|
+ programShow.value = false;
|
|
|
+ getProgramListFn();
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }else return false
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const reset = () => {
|
|
|
+ programForm.value = {
|
|
|
+ id: '',
|
|
|
+ programNo: '',
|
|
|
+ programName: '',
|
|
|
+ enterpriseId: '',
|
|
|
+ enterpriseName: '',
|
|
|
+ teamId: '',
|
|
|
+ teamName: '',
|
|
|
+ coachList: [],
|
|
|
+ remark: ''
|
|
|
+ };
|
|
|
+ proxy.resetForm("programRef");
|
|
|
+ }
|
|
|
+
|
|
|
+ const cancel = () => {
|
|
|
+ programShow.value = false;
|
|
|
+ reset();
|
|
|
+ }
|
|
|
+
|
|
|
+ const hangleSelectCoach = () => {
|
|
|
+ getCoachList({page:1,limit:-1,realName:coachName.value}).then(res => {
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ coachList.value = res.data.list.filter(d=>d.userType=='1');
|
|
|
+ coachList.value.forEach(item => {
|
|
|
+ item.checked = false;
|
|
|
+ })
|
|
|
+ coachShow.value = true;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const handleQueryCoach = e =>{
|
|
|
+ coachList.value = [];
|
|
|
+ getCoachList({page:1,limit:-1,realName:e.target.value}).then(res => {
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ coachList.value = res.data.list.filter(d=>d.userType=='1');
|
|
|
+ coachList.value.forEach(item => {
|
|
|
+ item.checked = false;
|
|
|
+ })
|
|
|
+ checkAll.value = false;
|
|
|
+ isIndeterminate.value = false;
|
|
|
+ coachSelecteds.value = [];
|
|
|
+ })
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ const submitForm2 = () => {
|
|
|
+ if(coachSelecteds.value.length===0) return proxy.$message.warning('请至少选择一位教练')
|
|
|
+ programForm.value.coachList = JSON.parse(JSON.stringify(coachSelecteds.value)).map(c=>{return {coachId:c.id,coachName:c.realName}});
|
|
|
+ cocahNames.value = programForm.value.coachList.map(c=>c.coachName).join(';');
|
|
|
+ checkAll.value = false;
|
|
|
+ isIndeterminate.value = false;
|
|
|
+ coachSelecteds.value = [];
|
|
|
+ coachList.value = [];
|
|
|
+ coachName.value = '';
|
|
|
+ coachShow.value = false;
|
|
|
+ }
|
|
|
+ const cancel2 = () => {
|
|
|
+ checkAll.value = false;
|
|
|
+ isIndeterminate.value = false;
|
|
|
+ coachSelecteds.value = [];
|
|
|
+ coachList.value = [];
|
|
|
+ coachName.value = '';
|
|
|
+ coachShow.value = false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ const getProgramProgressData = async () => {
|
|
|
+ loading2.value = true;
|
|
|
+ const res = await getProgramProgressList({programName:programName2.value});
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ programList2.value = res.data;
|
|
|
+ loading2.value = false;
|
|
|
+ }
|
|
|
+ const handleAddJZ = () => {
|
|
|
+ reset2();
|
|
|
+ progressTitle.value = '添加项目阶段及进展';
|
|
|
+ progressShow.value = true;
|
|
|
+ }
|
|
|
+ const reset2 = () => {
|
|
|
+ progressForm.value = {
|
|
|
+ id: '',
|
|
|
+ programId: '',
|
|
|
+ enterpriseId: '',
|
|
|
+ teamId: '',
|
|
|
+ cocahNames: '',
|
|
|
+ progress: ''
|
|
|
+ };
|
|
|
+ proxy.resetForm("progressRef");
|
|
|
+ }
|
|
|
+ const handleChangeProgram = e =>{
|
|
|
+ getProgramInfo(e).then(res=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ progressForm.value = {...progressForm.value,...res.data};
|
|
|
+ progressForm.value.id = '';
|
|
|
+ getTeamListById({enterpriseId: res.data.enterpriseId}).then(res=>{
|
|
|
+ if(res.code!==0) proxy.$message.error(res.msg);
|
|
|
+ teamList.value = res.data;
|
|
|
+ })
|
|
|
+ progressForm.value.cocahNames = res.data.coachList.map(item => item.coachName).join('、');
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const submitForm3 = () => {
|
|
|
+ proxy.$refs.progressRef.validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ let dto = JSON.parse(JSON.stringify(progressForm.value));
|
|
|
+ if(dto.id){
|
|
|
+ updateProgramProgress(dto).then((res)=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ buttonLoading3.value = false;
|
|
|
+ progressShow.value = false;
|
|
|
+ getProgramProgressData();
|
|
|
+ })
|
|
|
+ }else{
|
|
|
+ addProgramProgress(dto).then((res)=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ buttonLoading3.value = false;
|
|
|
+ progressShow.value = false;
|
|
|
+ getProgramProgressData();
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }else return false
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const cancel3 = () => {
|
|
|
+ progressShow.value = false;
|
|
|
+ reset2();
|
|
|
+ }
|
|
|
+ const handleEdit2 = (item) => {
|
|
|
+ reset2();
|
|
|
+ progressTitle.value = '编辑项目阶段及进展';
|
|
|
+ getProgramProgressInfo(item.id).then(res=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res.msg);
|
|
|
+ progressForm.value = {...progressForm.value,...res.data};
|
|
|
+ getProgramInfo(res.data.programId).then(res2=>{
|
|
|
+ if(res.code!==0) return proxy.$message.error(res2.msg);
|
|
|
+ progressForm.value.enterpriseId = res2.data.enterpriseId;
|
|
|
+ progressForm.value.teamId = res2.data.teamId;
|
|
|
+ getTeamListById({enterpriseId: res2.data.enterpriseId}).then(res3=>{
|
|
|
+ if(res.code!==0) proxy.$message.error(res3.msg);
|
|
|
+ teamList.value = res3.data;
|
|
|
+ })
|
|
|
+ progressForm.value.cocahNames = res2.data.coachList.map(item => item.coachName).join('、');
|
|
|
+ })
|
|
|
+ progressShow.value = true;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const handleDelete2 = async (row) => {
|
|
|
+ await proxy.$modal.confirm('确认删除项目进展【' + row.programName + '】吗?');
|
|
|
+ deleteProgramProgress([row.id]).then(res=>{
|
|
|
+ if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
|
|
|
+ else return proxy?.$modal.msgError(res.msg);
|
|
|
+ getProgramProgressData();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ onMounted(()=>{
|
|
|
+ getProgramListFn();
|
|
|
+ })
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+ ::v-deep .queryInput .el-input__inner{
|
|
|
+ border: none !important;
|
|
|
+ height: 30px !important;
|
|
|
+ line-height: 30px !important;
|
|
|
+ padding: 0 !important;
|
|
|
+ width: 200px !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ :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;
|
|
|
+ }
|
|
|
+ ::v-deep .el-drawer__header span{
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 16px;
|
|
|
+ color: #1D2129;
|
|
|
+ line-height: 22px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .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;
|
|
|
+
|
|
|
+ .title{
|
|
|
+ font-family: PingFang-SC, PingFang-SC;
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 16px;
|
|
|
+ color: #111111;
|
|
|
+ line-height: 16px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tabs{
|
|
|
+ position: relative;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ border-bottom: 1px solid #E5E7EB;
|
|
|
+ padding-bottom: 18px;
|
|
|
+ margin-top: 32px;
|
|
|
+ .t_pre{
|
|
|
+ width: 116px;
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #111111;
|
|
|
+ line-height: 16px;
|
|
|
+ text-align: center;
|
|
|
+ position: relative;
|
|
|
+ cursor: pointer;
|
|
|
+ &.active{
|
|
|
+ font-weight: bold;
|
|
|
+ color: #761E6A;
|
|
|
+ &::after{
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ bottom: -18px;
|
|
|
+ left: 0;
|
|
|
+ width: 100%;
|
|
|
+ height: 2px;
|
|
|
+ background: #761E6A;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .t_add{
|
|
|
+ width: 112px;
|
|
|
+ height: 30px;
|
|
|
+ background: #761E6A;
|
|
|
+ border-radius: 6px;
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #FFFFFF;
|
|
|
+ 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 - 220px);
|
|
|
+ background: #FFFFFF;
|
|
|
+ border: 1px solid #F3F4F6;
|
|
|
+ margin-top: 5px;
|
|
|
+
|
|
|
+
|
|
|
+ .empty{
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ img{
|
|
|
+ width: 90px;
|
|
|
+ height: 76px;
|
|
|
+ }
|
|
|
+ p{
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #1D2129;
|
|
|
+ line-height: 20px;
|
|
|
+ margin-top: 20px;
|
|
|
+ }
|
|
|
+ .e_add{
|
|
|
+ width: 114px;
|
|
|
+ height: 32px;
|
|
|
+ background: #761E6A;
|
|
|
+ border-radius: 6px;
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #FFFFFF;
|
|
|
+ line-height: 32px;
|
|
|
+ text-align: center;
|
|
|
+ margin-top: 36px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ .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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .f_title{
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 16px;
|
|
|
+ color: #0D162A;
|
|
|
+ line-height: 16px;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .f_pldr{
|
|
|
+ margin-top: 20px;
|
|
|
+ .fp_box{
|
|
|
+ display: flex;
|
|
|
+ width: 526px;
|
|
|
+ height: 125px;
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid #EDEEF0;
|
|
|
+ position: relative;
|
|
|
+ .fpb_pre{
|
|
|
+ width: calc(50% - 1px);
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ .fpbp_btn{
|
|
|
+ width: 140px;
|
|
|
+ height: 36px;
|
|
|
+ border-radius: 6px;
|
|
|
+ border: 1px solid #E5E7EB;
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #761E6A;
|
|
|
+ line-height: 32px;
|
|
|
+ text-align: center;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ &.sc{
|
|
|
+ border-left: 1px solid #EDEEF0;
|
|
|
+ .fpbp_btn{
|
|
|
+ background: #761E6A;
|
|
|
+ border: 1px solid #761E6A;
|
|
|
+ color: #FFFFFF;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ img{
|
|
|
+ width: 50px;
|
|
|
+ height: 20px;
|
|
|
+ position: absolute;
|
|
|
+ left: 50%;
|
|
|
+ margin-left: -25px;
|
|
|
+ top: 50%;
|
|
|
+ margin-top: -10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ p{
|
|
|
+ margin-top: 11px;
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #C1C7D2;
|
|
|
+ line-height: 20px;
|
|
|
+ text-align: justify;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .f_sdlr{
|
|
|
+ padding-top: 10px;
|
|
|
+
|
|
|
+ .fs_add{
|
|
|
+ width: 80px;
|
|
|
+ height: 32px;
|
|
|
+ background: #761E6A;
|
|
|
+ border-radius: 6px;
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #FFFFFF;
|
|
|
+ line-height: 32px;
|
|
|
+ text-align: center;
|
|
|
+ margin-top: 20px;
|
|
|
+ cursor: pointer;
|
|
|
+ &.del{
|
|
|
+ background: rgb(212, 96, 96);
|
|
|
+ margin: 0;
|
|
|
+ margin-top: 5px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|