htc 1 gün önce
ebeveyn
işleme
a232fb3195

+ 60 - 2
src/api/agent/index.js

@@ -42,7 +42,7 @@ export function getQueTypePieChart() {
     method: 'get'
   })
 }
-// ---start 工作台
+// ---end 工作台
 
 // ---start 问卷管理
 export function getQuestionnaireList(query) {
@@ -430,4 +430,62 @@ export function genPersonReport(data) {
     data
   })
 }
-// ---end 报告管理
+// ---end 报告管理
+
+
+// ---start 邮件管理
+export function getEmailModelList(query) {
+  return request({
+    url: '/sys/mailtemplate/page',
+    method: 'get',
+    params: query
+  })
+}
+export function saveEmailModel(data) {
+  return request({
+    url: `/sys/mailtemplate`,
+    method: 'post',
+    data
+  })
+}
+export function updateEmailModel(data) {
+  return request({
+    url: `/sys/mailtemplate`,
+    method: 'put',
+    data
+  })
+}
+export function deleteEmailModel(data) {
+  return request({
+    url: `/sys/mailtemplate`,
+    method: 'delete',
+    data
+  })
+}
+export function getEmailModelById(id) {
+  return request({
+    url: `/sys/mailtemplate/${id}`,
+    method: 'get',
+  })
+}
+export function getEmailModelConfig() {
+  return request({
+    url: `/sys/mailtemplate/config`,
+    method: 'get',
+  })
+}
+export function saveEmailModelConfig(data) {
+  return request({
+    url: `/sys/mailtemplate/saveConfig`,
+    method: 'post',
+    data
+  })
+}
+export function sendEmail(data) {
+  return request({
+    url: `/sys/mailtemplate/send`,
+    method: 'post',
+    data
+  })
+}
+// ---end 邮件管理

+ 1 - 1
src/components/reportPdf/pdf.vue

@@ -8,7 +8,7 @@
             <img class="fm_img" src="@/assets/images/agent/logo4.png">
             <div class="fm_title">
                 <div class="pt_p">PERILL</div>
-                <div class="pt_name">团队诊断报告</div>
+                <div class="pt_name">团队诊断报告 教练版</div>
                 <div class="pt_tip">{{ reportData?.cover?.title }}</div>
             </div>
             <div class="fm_pre adfac" style="margin-top: 165px;">

+ 15 - 15
src/views/modules/agent/company.vue

@@ -472,21 +472,21 @@
         enterpriseName: [
             { required: true, message: '请输入公司名称', trigger: 'blur' }
         ],
-        creditCode: [
-            { required: true, message: '请输入统一社会信用代码', trigger: 'blur' }
-        ],
+        // creditCode: [
+        //     { required: true, message: '请输入统一社会信用代码', trigger: 'blur' }
+        // ],
         industryCode: [
             { required: true, message: '请选择所在行业', trigger: 'change' }
         ],
-        staffSizeCode: [
-            { required: true, message: '请选择人员规模', trigger: 'change' }
-        ],
+        // staffSizeCode: [
+        //     { required: true, message: '请选择人员规模', trigger: 'change' }
+        // ],
         area: [
             { required: true, message: '请选择所在地区', trigger: 'change' }
         ],
-        background: [
-            { required: true, message: '请输入企业背景', trigger: 'blur' }
-        ]
+        // background: [
+        //     { required: true, message: '请输入企业背景', trigger: 'blur' }
+        // ]
     });
     const programRef = ref(null);
     const programShow = ref(false);
@@ -519,12 +519,12 @@
         teamName: [
             { required: true, message: '请输入团队类型', trigger: 'blur' }
         ],
-        teamStory: [
-            { required: true, message: '请输入团队故事', trigger: 'blur' }
-        ],
-        projectSituation: [
-            { required: true, message: '请输入项目阶段及状态', trigger: 'blur' }
-        ]
+        // teamStory: [
+        //     { required: true, message: '请输入团队故事', trigger: 'blur' }
+        // ],
+        // projectSituation: [
+        //     { required: true, message: '请输入项目阶段及状态', trigger: 'blur' }
+        // ]
     });
     const programTeamRef = ref(null);
     const programTeamShow = ref(false);

+ 1 - 1
src/views/modules/agent/company/teamUser.vue

@@ -267,7 +267,7 @@
         ],
         email:[
             { required: true, message: '请输入邮箱', trigger: 'blur' },
-            { pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, message: '请输入正确的邮箱', trigger: 'blur' }
+            { pattern: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/, message: '请输入正确的邮箱', trigger: 'blur' }
         ]
     });
 

+ 328 - 0
src/views/modules/email/model.vue

@@ -0,0 +1,328 @@
+<template>
+    <div class="page">
+        <div class="title">{{ title }}</div>
+        <div class="query adfacjb">
+            <el-input placeholder="请输入名称" prefix-icon="el-icon-search" v-model="queryParams.name" style="flex: 1;padding-right: 20px;" @keyup.enter.native="getList"></el-input>
+            <el-button type="primary" icon="el-icon-plus" @click="handleAddModel">新增</el-button>
+            <el-button type="primary" icon="el-icon-setting" @click="handleSetModel">邮件配置</el-button>
+            <el-button type="danger" icon="el-icon-delete" @click="handleDeleteMore">删除</el-button>
+        </div>
+        <div class="content">
+            <el-table ref="multipleTable" @selection-change="handleSelectionChange" :data="modelList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无邮件模板" max-height="578px">
+                <el-table-column
+                    type="selection"
+                    width="55">
+                </el-table-column>
+                <el-table-column label="名称" prop="name"></el-table-column>
+                <el-table-column label="主题" prop="subject"></el-table-column>
+                <el-table-column label="发送时间" prop="createDate" sortable></el-table-column>
+                <el-table-column label="操作" width="150">
+                    <template #default="scope">
+                        <el-button link type="text" size="mini" @click="handleEditModel(scope.row)">修改</el-button>
+                        <!-- <el-button link type="text" size="mini" @click="handleSendEamil(scope.row)">发送邮件</el-button> -->
+                        <el-button link type="text" size="mini" @click="handleDeleteModel(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="60%" :visible.sync="show" :title="modelTitle" @close="cancel">
+            <el-form ref="modelRef" :model="modelForm" :rules="modelRules" label-width="100px" style="width: 90%;margin: 0 auto;">
+                <el-form-item label="名称" prop="name">
+                    <el-input v-model="modelForm.name" placeholder="名称"></el-input>
+                </el-form-item>
+                <el-form-item label="主题" prop="subject">
+                    <el-input v-model="modelForm.subject" placeholder="主题"></el-input>
+                </el-form-item>
+                <el-form-item label="内容" prop="content">
+                    <template>
+                        <div style="border: 1px solid #ccc;">
+                            <Toolbar
+                                style="border-bottom: 1px solid #ccc"
+                                :editor="editor"
+                                :defaultConfig="toolbarConfig"
+                                :mode="mode"
+                            />
+                            <Editor
+                                style="height: 500px; overflow-y: hidden;"
+                                v-model="modelForm.content"
+                                :defaultConfig="editorConfig"
+                                :mode="mode"
+                                @onCreated="onCreated"
+                            />
+                        </div>
+                    </template>
+                </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-dialog width="50%" :visible.sync="setShow" title="邮件配置" @close="setCancel">
+            <el-form ref="setRef" :model="setForm" :rules="setRules" label-width="100px" style="width: 90%;margin: 0 auto;">
+                <el-form-item label="邮件配置" prop="smtp">
+                    <el-input v-model="setForm.smtp" placeholder="邮件配置"></el-input>
+                </el-form-item>
+                <el-form-item label="端口号" prop="port">
+                    <el-input v-model="setForm.port" placeholder="端口号"></el-input>
+                </el-form-item>
+                <el-form-item label="邮箱账号" prop="username">
+                    <el-input v-model="setForm.username" placeholder="邮箱账号"></el-input>
+                </el-form-item>
+                <el-form-item label="邮箱密码" prop="password">
+                    <el-input v-model="setForm.password" placeholder="邮箱密码"></el-input>
+                </el-form-item>
+            </el-form>
+            <div class="demo-drawer__footer" style="display: flex;justify-content: end;">
+                <el-button :loading="setButtonLoading" type="primary" @click="setSubmitForm">保 存</el-button>
+                <el-button @click="setCancel" style="margin-right: 5%;">取 消</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup name="">
+    import '@wangeditor/editor/dist/css/style.css'
+    import { onBeforeUnmount, ref, getCurrentInstance, onMounted } from 'vue'
+    import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
+    import {
+        getEmailModelList,
+        saveEmailModel,
+        updateEmailModel,
+        deleteEmailModel,
+        getEmailModelById,
+        getEmailModelConfig,
+        saveEmailModelConfig
+    } from '@/api/agent'
+    const { proxy } = getCurrentInstance();
+    const editor = ref(null)
+    const toolbarConfig = {}
+    const mode = 'default'
+    const editorConfig = { placeholder: '请输入内容...' }
+    onBeforeUnmount(() => {
+        if (editor.value == null) return
+        editor.value.destroy()
+    })
+
+    const onCreated = (editor2) => {
+        editor.value = Object.seal(editor2)
+    }
+
+    const title = proxy.$route.meta.title;
+    const queryParams = ref({
+        name:'',
+        page:1,
+        limit:10
+    })
+    const modelList = ref([])
+    const total = ref(0)
+    const loading = ref(false)
+    const multipleSelection = ref([])
+
+    const modelTitle = ref('新增邮件模板')
+    const modelRef = ref(null)
+    const show = ref(false)
+    const buttonLoading = ref(false)
+    const modelForm = ref({
+        id:'',
+        name:'',
+        subject:'',
+        content:''
+    })
+    const modelRules = ref({
+        name:[{ required: true, message: '请输入名称', trigger: 'blur' }],
+        subject:[{ required: true, message: '请输入主题', trigger: 'blur' }],
+        content:[{ required: true, message: '请输入内容', trigger: 'blur' }]
+    })
+
+    const setRef = ref(null)
+    const setShow = ref(false)
+    const setButtonLoading = ref(false)
+    const setForm = ref({})
+    const setRules = ref({
+        smtp:[{ required: true, message: '请输入邮件配置', trigger: 'blur' }],
+        port:[{ required: true, message: '请输入端口号', trigger: 'blur' }],
+        username:[
+            { required: true, message: '请输入邮箱账号', trigger: 'blur' },
+            { pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, message: '请输入正确的邮箱账号', trigger: 'blur' }
+        ],
+        password:[{ required: true, message: '请输入邮箱密码', trigger: 'blur' }]
+    })
+
+    const handleSelectionChange = (val) => {
+        multipleSelection.value = val;
+    }
+
+    const handleSizeChange = (val) => {
+        queryParams.value.limit = val;
+        getList();
+    }
+    const handleCurrentChange = (val) => {
+        queryParams.value.page = val;
+        getList();
+    }
+    const getList = () => {
+        loading.value = true;
+        getEmailModelList(queryParams.value).then(res => {
+            if(res.code!==0) return proxy.$message.error(res.msg);
+            modelList.value = res.data.list;
+            total.value = res.data.total;
+            loading.value = false;
+        }).finally(()=>{loading.value = false})
+    }
+
+    const handleAddModel = () => {
+        reset();
+        modelTitle.value = '新增邮件模板';
+        show.value = true;
+    }
+    const handleEditModel = (row) => {
+        modelTitle.value = '编辑邮件模板';
+        getEmailModelById(row.id).then(res=>{
+            if(res.code!==0) return proxy.$message.error(res.msg);
+            show.value = true;
+            modelForm.value = res.data;
+            editor.value = Object.seal(res.data?.content)
+        })
+    }
+    const cancel = () => {
+        show.value = false;
+    }
+    const submitForm = () => {
+        proxy.$refs.modelRef.validate((valid) => {
+            if (valid) {
+                if(modelForm.value.content==='<p><br></p>') return proxy.$message.error('请输入内容');
+                buttonLoading.value = true;
+                if(modelForm.value.id){
+                    updateEmailModel(modelForm.value).then(res=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        proxy.$modal.msgSuccess("修改成功");
+                        getList();
+                    }).finally(()=>{buttonLoading.value = false;show.value = false;})
+                }else{
+                    saveEmailModel(modelForm.value).then(res=>{
+                        if(res.code!==0) return proxy.$message.error(res.msg);
+                        proxy.$modal.msgSuccess("保存成功");
+                        getList();
+                    }).finally(()=>{buttonLoading.value = false;show.value = false;})
+                }
+            }else return buttonLoading.value = false
+        })
+    }
+    const reset = () => {
+        modelForm.value = {
+            id:'',
+            name:'',
+            subject:'',
+            content:''
+        }
+        proxy.resetForm("modelRef");
+    }
+    
+
+    const handleSetModel = () => {
+        setShow.value = true;
+    }
+    const setCancel = () => {
+        setShow.value = false;
+    }
+    const setSubmitForm = () => {
+        setButtonLoading.value = true;
+        proxy.$refs.setRef.validate((valid) => {
+            if (valid) {
+                saveEmailModelConfig(setForm.value).then(res=>{
+                    if(res.code!==0) return proxy.$message.error(res.msg);
+                    proxy.$modal.msgSuccess("保存成功");
+                }).finally(()=>{setButtonLoading.value = false;setShow.value = false;})
+            }else return setButtonLoading.value = false
+        })
+    }
+    const handleDeleteMore = () => {
+        if(multipleSelection.value.length === 0) return proxy.$modal.msgError("请选择要删除的数据");
+        proxy.$modal.confirm('确认删除选中的数据吗?').then(()=>{
+            // deleteProgramProgress(ids).then(res=>{
+            //     if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+            //     else return proxy?.$modal.msgError(res.msg);
+            //     getList();
+            // });
+        })
+    }
+
+    const handleSendEamil = (row) => {
+
+    }
+    const handleDeleteModel = async (row) => {
+        await proxy.$modal.confirm('确认删除邮件模板【' + row.name + '】吗?');
+        // deleteProgramProgress([row.id]).then(res=>{
+        //     if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+        //     else return proxy?.$modal.msgError(res.msg);
+        //     getList();
+        // });
+    }
+
+    const getEmailModelConfigFn = () => {
+        getEmailModelConfig().then(res=>{
+            if(res.code!==0) return proxy.$message.error(res.msg);
+            setForm.value = res.data;
+        })
+    }
+
+    onMounted(()=>{
+        getList();
+        getEmailModelConfigFn();
+    })
+</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;
+    }
+
+    .query{
+        width: 100%;
+        padding: 16px 20px;
+        box-sizing: border-box;
+        background: #FFFFFF;
+        border-radius: 6px;
+        border: 1px solid #F3F4F6;
+        margin-top: 31px;
+    }
+
+    
+    .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;
+        }
+
+        
+        .content{
+            width: 100%;
+            height: calc(100vh - 170px);
+            background: #FFFFFF;
+            border: 1px solid #F3F4F6;
+            margin-top: 5px;
+        }
+    }
+</style>

+ 148 - 0
src/views/modules/email/sendRecord.vue

@@ -0,0 +1,148 @@
+<template>
+    <div class="page">
+        <div class="title">{{ title }}</div>
+        <div class="query adfacjb">
+            <el-input placeholder="模板ID" v-model="queryParams.name" style="flex: 1;padding-right: 20px;" @keyup.enter.native="getList"></el-input>
+            <el-input placeholder="收件人" v-model="queryParams.user" style="flex: 1;padding-right: 20px;" @keyup.enter.native="getList"></el-input>
+            <el-select v-model="queryParams.status" placeholder="状态" style="flex: 1;padding-right: 20px;" @change="getList">
+                <el-option label="发送成功" :value="1"></el-option>
+                <el-option label="发送失败" :value="2"></el-option>
+            </el-select>
+            <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+            <el-button type="danger" icon="el-icon-delete" @click="handleDeleteMore">删除</el-button>
+        </div>
+        <div class="content">
+            <el-table ref="multipleTable" @selection-change="handleSelectionChange" :data="sendlList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无发送记录" max-height="578px">
+                <el-table-column
+                    type="selection"
+                    width="55">
+                </el-table-column>
+                <el-table-column label="模板ID" prop="aaa" sortable></el-table-column>
+                <el-table-column label="发送者" prop="bbb"></el-table-column>
+                <el-table-column label="收件人" prop="ccc"></el-table-column>
+                <el-table-column label="抄送" prop="ddd"></el-table-column>
+                <el-table-column label="主题" prop="eee"></el-table-column>
+                <el-table-column label="状态" prop="fff" sortable></el-table-column>
+                <el-table-column label="发送时间" prop="ggg" sortable></el-table-column>
+                <el-table-column label="操作" width="150">
+                    <template #default="scope">
+                        <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>
+    </div>
+</template>
+
+<script setup name="">
+    import { ref, getCurrentInstance, onMounted } from 'vue'
+    const { proxy } = getCurrentInstance();
+    const title = proxy.$route.meta.title;
+    
+    const queryParams = ref({
+        name: '',
+        user: '',
+        status: ''
+    })
+
+    const sendlList = ref([])
+    const total = ref(0)
+    const loading = ref(false)
+    const multipleSelection = ref([])
+
+    const handleSelectionChange = (val) => {
+        multipleSelection.value = val;
+    }
+
+    const handleSizeChange = (val) => {
+        queryParams.value.limit = val;
+        getList();
+    }
+    const handleCurrentChange = (val) => {
+        queryParams.value.page = val;
+        getList();
+    }
+    const getList = () => {
+        loading.value = true;
+        setTimeout(()=>{
+            sendlList.value = [1];
+            total.value = 10;
+            loading.value = false;
+        },1000)
+    }
+    const handleDeleteMore = async () => {
+        if(multipleSelection.value.length === 0) return proxy.$modal.msgError("请选择要删除的数据");
+        await proxy.$modal.confirm('确认删除选中的数据吗?');
+        // deleteProgramProgress(ids).then(res=>{
+        //     if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+        //     else return proxy?.$modal.msgError(res.msg);
+        //     getList();
+        // });
+    }
+    const handleDelete = 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);
+        //     getList();
+        // });
+    }
+    
+    onMounted(()=>{
+        getList();
+    })
+</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;
+    }
+
+    .query{
+        width: 100%;
+        padding: 16px 20px;
+        box-sizing: border-box;
+        background: #FFFFFF;
+        border-radius: 6px;
+        border: 1px solid #F3F4F6;
+        margin-top: 31px;
+    }
+
+    
+    .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;
+        }
+
+        
+        .content{
+            width: 100%;
+            height: calc(100vh - 170px);
+            background: #FFFFFF;
+            border: 1px solid #F3F4F6;
+            margin-top: 5px;
+        }
+    }
+</style>