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

增加邮件管理;团队成员可发送邮件

htc 1 день назад
Родитель
Сommit
5932b0029a

+ 22 - 0
src/api/agent/index.js

@@ -488,4 +488,26 @@ export function sendEmail(data) {
     data
   })
 }
+export function sendEmailToUser(data) {
+  return request({
+    url: `/sys/user/sendBatchCode`,
+    method: 'post',
+    data
+  })
+}
+
+export function getSendRecordList(query) {
+  return request({
+    url: '/sys/maillog/page',
+    method: 'get',
+    params: query
+  })
+}
+export function deleteSendRecord(data) {
+  return request({
+    url: `/sys/maillog`,
+    method: 'delete',
+    data
+  })
+}
 // ---end 邮件管理

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

@@ -1,7 +1,7 @@
 import {defineStore} from "pinia";
 import {ref} from "vue";
 
-import { getProgramList,getCoachList,getQuestionnaireList,getCoachProgramList,getTeamListById } from '@/api/agent/index.js'
+import { getProgramList,getCoachList,getQuestionnaireList,getCoachProgramList,getTeamListById,getEmailModelList } from '@/api/agent/index.js'
 
 export const useAgentStore = defineStore('agent', () => {
     const programList = ref([]);
@@ -69,6 +69,19 @@ export const useAgentStore = defineStore('agent', () => {
         });
     };
 
+    const emailModelList = ref([]);
+    const emailModelMap = ref(new Map());
+    const getEmailModelData = () => {
+        getEmailModelList({page:1,limit:-1,name:''}).then((res) => {
+            emailModelList.value = res.data.list;
+            const map = new Map();
+            emailModelList.value.forEach((supplier) => {
+                map.set(supplier.id, supplier);
+            });
+            emailModelMap.value = map;
+        });
+    };
+
     return {
         programList,
         programMap,
@@ -85,5 +98,8 @@ export const useAgentStore = defineStore('agent', () => {
         questionnaireList,
         questionnaireMap,
         getQuestionnaireData,
+        emailModelList,
+        emailModelMap,
+        getEmailModelData,
     };
 })

+ 82 - 5
src/views/modules/agent/company/teamUser.vue

@@ -35,10 +35,15 @@
                                 >
                                 <div class="tr_btn" v-hasPermi="['sys:user:export']">导入成员</div>
                             </el-upload> 
-                            <div class="tr_btn" @click="handleAddUser" v-hasPermi="['sys:user:add']">添加成员</div>
+                            <div class="tr_btn tb2" @click="handleAddUser" v-hasPermi="['sys:user:add']">添加成员</div>
+                            <div class="tr_btn tb2" @click="handleSendEmail">发送邮件</div>
                         </div>
                     </div>
-                    <el-table :data="userList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无人员" max-height="578px" style="margin-top: 16px;">
+                    <el-table ref="multipleTable" @selection-change="handleSelectionChange":data="userList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无人员" max-height="578px" style="margin-top: 16px;">
+                        <el-table-column
+                            type="selection"
+                            width="55">
+                        </el-table-column>
                         <el-table-column label="序号" width="50">
                             <template #default="scope">
                                 {{ scope.$index + 1 }}
@@ -53,10 +58,11 @@
                         </el-table-column>
                         <el-table-column label="人物简介" prop="introduction" width="400" show-overflow-tooltip></el-table-column>
                         <el-table-column label="人物故事" prop="userStory" width="400" show-overflow-tooltip></el-table-column>
-                        <el-table-column label="操作" width="150">
+                        <el-table-column label="操作" width="180">
                             <template #default="scope">
                                 <el-button link type="text" size="mini" @click="handleEdit(scope.row)" v-hasPermi="['sys:user:update']">编辑</el-button>
                                 <el-button link type="text" size="mini" @click="handleDelete(scope.row)" v-hasPermi="['sys:user:delete']">删除</el-button>
+                                <el-button link type="text" size="mini" @click="handleSend(scope.row)" v-hasPermi="['sys:user:delete']">发送邮件</el-button>
                             </template>
                         </el-table-column>
                     </el-table>
@@ -163,6 +169,19 @@
                 <el-button @click="cancel2" style="margin-right: 5%;">取 消</el-button>
             </div>
         </el-drawer>
+        <el-dialog width="30%" :visible.sync="emailShow" title="选择邮件模板" @close="emailCancel">
+            <el-form ref="emailRef" :model="emailForm" :rules="emailRules" label-width="100px" style="width: 90%;margin: 0 auto;">
+                <el-form-item label="邮件模板" prop="tempId">
+                    <el-select v-model="emailForm.tempId" placeholder="请选择邮件模板" style="width: 100%;">
+                        <el-option v-for="item in useAgentStore().emailModelList" :label="item.name" :value="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <div class="demo-drawer__footer" style="display: flex;justify-content: end;">
+                <el-button :loading="emailButtonLoading" type="primary" @click="emailSubmitForm">发 送</el-button>
+                <el-button @click="emailCancel" style="margin-right: 5%;">取 消</el-button>
+            </div>
+        </el-dialog>
     </div>
 </template>
 
@@ -172,6 +191,7 @@
     const { proxy } = getCurrentInstance();
     import {useAgentStore} from "@/store_v3/modules/agent";
     useAgentStore().getCompanyData();
+    useAgentStore().getEmailModelData();
     import { 
         getCoachList,
         updateCoach,
@@ -179,6 +199,7 @@
         deleteCoach,
         addCoach,
         getTeamListById,
+        sendEmailToUser
     } from '@/api/agent/index.js'
 
     const uploadUrl = `${window.SITE_CONFIG["apiURL"]}/sys/user/import`
@@ -270,6 +291,50 @@
             { pattern: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/, message: '请输入正确的邮箱', trigger: 'blur' }
         ]
     });
+    const multipleSelection = ref([])
+
+    const emailShow = ref(false);
+    const emailRef = ref(null);
+    const emailButtonLoading = ref(false);
+    const emailForm = ref({
+        tempId:null,
+        userIdList:[]
+    });
+    const emailRules = ref({
+        tempId: [
+            { required: true, message: '请选择邮件模板', trigger: 'change' }
+        ]
+    });
+    const currentUserId = ref(null);
+
+    const emailSubmitForm = async () => {
+        proxy.$refs.emailRef.validate((valid) => {
+            if (valid) {
+                emailButtonLoading.value = true;
+                emailForm.value.userIdList =  multipleSelection.value.length>0?multipleSelection.value.map(item=>item.id):[currentUserId.value];
+                sendEmailToUser(emailForm.value).then(res=>{
+                    if(res.code!==0) return proxy.$message.error(res.msg);
+                    proxy?.$modal.msgSuccess('发送成功!')
+                }).finally(()=>{emailButtonLoading.value=false;emailShow.value = false;})
+            } else {
+                return false;
+            }
+        });
+    };
+    const emailCancel = () => {
+        emailShow.value = false;
+        emailButtonLoading.value = false;
+        currentUserId.value = null;
+        emailForm.value = {
+            tempId:null,
+            userIdList:[]
+        };
+    };
+
+
+    const handleSelectionChange = (val) => {
+        multipleSelection.value = val;
+    }
 
     const handleBack = () => {
         proxy.$router.back()
@@ -350,6 +415,18 @@
         userTitle.value = "新增成员详情";
         userShow.value = true;
     }
+
+    const handleSendEmail = async () => {
+        if(multipleSelection.value.length === 0) return proxy.$message.error('请选择要发送邮件的成员!');
+        emailShow.value = true;
+        // await proxy.$modal.confirm('确定要发送邮件给选中的成员吗?', '提示').finally(()=>{})
+    }
+
+    const handleSend = async row => {
+        emailShow.value = true;
+        currentUserId.value = row.id;
+        // await proxy.$modal.confirm('确定要发送邮件给成员【'+row.realName+'】吗?', '提示').finally(()=>{})
+    }
     
     const reset = () => {
         userForm.value = {
@@ -378,7 +455,7 @@
         proxy.$refs.userRef.validate((valid) => {
             if (valid) {
                 buttonLoading2.value = true;
-                userForm.value.username = userForm.value.mobile;
+                // userForm.value.username = userForm.value.mobile;
                 userForm.value.enterpriseId = programid.value;
                 userForm.value.teamId = teamid.value;
                 if(userForm.value.id){
@@ -542,7 +619,7 @@
                             display: flex;
                             align-items: center;
                             justify-content: center;
-                            &:last-child{
+                            &.tb2{
                                 background: #761E6A;
                                 color: #FFFFFF;
                             }

+ 11 - 10
src/views/modules/email/model.vue

@@ -251,12 +251,13 @@
     }
     const handleDeleteMore = () => {
         if(multipleSelection.value.length === 0) return proxy.$modal.msgError("请选择要删除的数据");
+        let ids = multipleSelection.value.map(item => item.id);
         proxy.$modal.confirm('确认删除选中的数据吗?').then(()=>{
-            // deleteProgramProgress(ids).then(res=>{
-            //     if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
-            //     else return proxy?.$modal.msgError(res.msg);
-            //     getList();
-            // });
+            deleteEmailModel(ids).then(res=>{
+                if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+                else return proxy?.$modal.msgError(res.msg);
+                getList();
+            });
         })
     }
 
@@ -265,11 +266,11 @@
     }
     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();
-        // });
+        deleteEmailModel([row.id]).then(res=>{
+            if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+            else return proxy?.$modal.msgError(res.msg);
+            getList();
+        });
     }
 
     const getEmailModelConfigFn = () => {

+ 40 - 26
src/views/modules/email/sendRecord.vue

@@ -2,11 +2,13 @@
     <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.templateId" placeholder="邮件模板" style="width: 100%;flex: 1;padding-right: 20px;" @change="getList">
+                    <el-option v-for="item in useAgentStore().emailModelList" :label="item.name" :value="item.id"></el-option>
+                </el-select>
+            <el-input placeholder="收件人" v-model="queryParams.mailTo" 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-option label="发送失败" :value="0"></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>
@@ -17,13 +19,21 @@
                     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="模板ID" prop="templateId" sortable></el-table-column>
+                <el-table-column label="发送者" prop="mailFrom"></el-table-column>
+                <el-table-column label="收件人" prop="mailTo">
+                    <template #default="scope">
+                        {{JSON.parse(scope.row.mailTo)&&JSON.parse(scope.row.mailTo)[0]||''}}
+                    </template>
+                </el-table-column>
+                <!-- <el-table-column label="抄送" prop="mailCc"></el-table-column> -->
+                <el-table-column label="主题" prop="subject"></el-table-column>
+                <el-table-column label="状态" prop="status" sortable>
+                    <template #default="scope">
+                        {{ scope.row.status === 1 ? '发送成功' : '发送失败' }}
+                    </template>
+                </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="handleDelete(scope.row)">删除</el-button>
@@ -48,12 +58,15 @@
 
 <script setup name="">
     import { ref, getCurrentInstance, onMounted } from 'vue'
+    import { getSendRecordList,deleteSendRecord } from '@/api/agent'
     const { proxy } = getCurrentInstance();
+    import {useAgentStore} from "@/store_v3/modules/agent";
+    useAgentStore().getEmailModelData();
     const title = proxy.$route.meta.title;
     
     const queryParams = ref({
-        name: '',
-        user: '',
+        templateId: '',
+        mailTo: '',
         status: ''
     })
 
@@ -76,28 +89,29 @@
     }
     const getList = () => {
         loading.value = true;
-        setTimeout(()=>{
-            sendlList.value = [1];
-            total.value = 10;
+        getSendRecordList(queryParams.value).then(res=>{
+            sendlList.value = res.data.list;
+            total.value = res.data.total;
             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 ids = multipleSelection.value.map(item=>item.id);
+        deleteSendRecord(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();
-        // });
+        deleteSendRecord([row.id]).then(res=>{
+            if(res.code === 0) proxy?.$modal.msgSuccess("删除成功");
+            else return proxy?.$modal.msgError(res.msg);
+            getList();
+        });
     }
     
     onMounted(()=>{