|
@@ -0,0 +1,290 @@
|
|
|
+<script setup>
|
|
|
+import {computed, ref, watch} from 'vue'
|
|
|
+import apiReportEn from '@/api/reportEn'
|
|
|
+import { showToast } from 'vant'
|
|
|
+
|
|
|
+const props=defineProps({
|
|
|
+ defaultThemeVal:{
|
|
|
+ type:String,
|
|
|
+ default:''
|
|
|
+ },
|
|
|
+ reportId:{
|
|
|
+ type:Number,
|
|
|
+ default:0
|
|
|
+ }
|
|
|
+})
|
|
|
+const emits=defineEmits(['close'])
|
|
|
+
|
|
|
+
|
|
|
+const emailOpt=ref([])
|
|
|
+// 获取用户邮箱数据
|
|
|
+function getEmailList(){
|
|
|
+ apiReportEn.getCustomEmailList({
|
|
|
+ CurrentIndex:1,
|
|
|
+ PageSize:10000,
|
|
|
+ ListParam:4
|
|
|
+ }).then(res=>{
|
|
|
+ if(res.Ret===200){
|
|
|
+ emailOpt.value=res.Data?.List||[]
|
|
|
+ handleCheckAllChange()
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+getEmailList()
|
|
|
+
|
|
|
+const btnDisabled=computed(()=>{
|
|
|
+ if(themeVal.value&&checked.value.length>0) return false
|
|
|
+ return true
|
|
|
+})
|
|
|
+
|
|
|
+// 前五名
|
|
|
+const topList=computed(()=>{
|
|
|
+ const arr=checked.value.slice(0,5)
|
|
|
+ return emailOpt.value.filter(item=>arr.includes(item.Id))
|
|
|
+})
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const themeVal=ref(props.defaultThemeVal||'')
|
|
|
+
|
|
|
+const disabledNum=computed(()=>{
|
|
|
+ return emailOpt.value.filter(item=>item.Enabled===0).length
|
|
|
+})
|
|
|
+const checked=ref([])
|
|
|
+const checkedAll=ref(false)
|
|
|
+
|
|
|
+function handleCheckAllChange(){
|
|
|
+ if(checkedAll.value){
|
|
|
+ checked.value=[]
|
|
|
+ }else{
|
|
|
+ checked.value=emailOpt.value.filter(item=>item.Enabled!==0).map(e=>e.Id)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+watch(
|
|
|
+ ()=>checked.value,
|
|
|
+ (n)=>{
|
|
|
+ if(n.length===(emailOpt.value.length-disabledNum.value)){
|
|
|
+ checkedAll.value=true
|
|
|
+ }else{
|
|
|
+ checkedAll.value=false
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+const showSearch=ref(false)
|
|
|
+const searchVal=ref('')
|
|
|
+const searchFilterOpt=ref([])
|
|
|
+const checkedFilter=ref([])
|
|
|
+function handleShowSearch(){
|
|
|
+ checkedFilter.value=checked.value
|
|
|
+ searchVal.value=''
|
|
|
+ searchFilterOpt.value=[]
|
|
|
+ showSearch.value=true
|
|
|
+}
|
|
|
+function handleSearchFilter(){
|
|
|
+ searchFilterOpt.value=emailOpt.value.filter(item=>item.Name.indexOf(searchVal.value)>-1)
|
|
|
+}
|
|
|
+function handleConfirmSearch(){
|
|
|
+ checked.value=checkedFilter.value
|
|
|
+ showSearch.value=false
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// 发送邮件
|
|
|
+function handleConfirmSendEmail(){
|
|
|
+ let ids=[]
|
|
|
+ if(!checkedAll.value){
|
|
|
+ ids=checked.value
|
|
|
+ }
|
|
|
+ if(!themeVal.value){
|
|
|
+ showToast('请填写邮件主题')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if(themeVal.value.length>100){
|
|
|
+ showToast('邮件主题请控制在100个字符以内')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ apiReportEn.sendEmail({
|
|
|
+ ReportId:props.reportId,
|
|
|
+ EmailIds:ids.join(','),
|
|
|
+ Theme:themeVal.value
|
|
|
+ }).then(res=>{
|
|
|
+ if(res.Ret===200){
|
|
|
+ showToast('发送成功')
|
|
|
+ emits('close')
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <div class="send-email-wrap">
|
|
|
+ <div class="top-box">
|
|
|
+ <ul class="left-user-box">
|
|
|
+ <li v-for="item in topList" :key="item.Id">{{item.Name.charAt(0)}}</li>
|
|
|
+ <li class="num" v-if="checked.length>5">+{{checked.length-5}}</li>
|
|
|
+ </ul>
|
|
|
+ <van-search readonly placeholder="搜索" @click="handleShowSearch" />
|
|
|
+ </div>
|
|
|
+ <div class="theme-text-box">
|
|
|
+ <van-field
|
|
|
+ v-model="themeVal"
|
|
|
+ label="主题"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入主题"
|
|
|
+ rows="3"
|
|
|
+ maxlength="100"
|
|
|
+ show-word-limit
|
|
|
+ label-width="40px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="list-wrap">
|
|
|
+ <div class="check-all-btn">
|
|
|
+ <van-checkbox :modelValue="checkedAll" @click="handleCheckAllChange">全选</van-checkbox>
|
|
|
+ </div>
|
|
|
+ <van-checkbox-group v-model="checked">
|
|
|
+ <van-checkbox
|
|
|
+ v-for="item in emailOpt"
|
|
|
+ :key="item.Id"
|
|
|
+ :name="item.Id"
|
|
|
+ :disabled="item.Enabled===0"
|
|
|
+ >{{item.Name}}<{{item.Email}}></van-checkbox>
|
|
|
+ </van-checkbox-group>
|
|
|
+ </div>
|
|
|
+ <van-button
|
|
|
+ class="submit-btn"
|
|
|
+ block
|
|
|
+ type="primary"
|
|
|
+ :disabled="btnDisabled"
|
|
|
+ @click="handleConfirmSendEmail"
|
|
|
+ >发送</van-button>
|
|
|
+ </div>
|
|
|
+ <van-popup
|
|
|
+ v-model:show="showSearch"
|
|
|
+ position="bottom"
|
|
|
+ >
|
|
|
+ <div class="send-email-wrap search-wrap">
|
|
|
+ <div class="top-box">
|
|
|
+ <van-search v-model="searchVal" placeholder="搜索" @search="handleSearchFilter" />
|
|
|
+ </div>
|
|
|
+ <div class="list-wrap">
|
|
|
+ <van-checkbox-group v-model="checkedFilter">
|
|
|
+ <van-checkbox
|
|
|
+ v-for="item in searchFilterOpt"
|
|
|
+ :key="item.Id"
|
|
|
+ :name="item.Id"
|
|
|
+ :disabled="item.Enabled===0"
|
|
|
+ >{{item.Name}}<{{item.Email}}></van-checkbox>
|
|
|
+ </van-checkbox-group>
|
|
|
+ </div>
|
|
|
+ <van-button
|
|
|
+ class="submit-btn"
|
|
|
+ block
|
|
|
+ type="primary"
|
|
|
+ @click="handleConfirmSearch"
|
|
|
+ >完成</van-button>
|
|
|
+ </div>
|
|
|
+ </van-popup>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.send-email-wrap{
|
|
|
+ padding-top: 30px;
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ .top-box{
|
|
|
+ padding: 0 30px;
|
|
|
+ height: 128px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ border-bottom: 1px solid $border-color;
|
|
|
+ .left-user-box{
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ li{
|
|
|
+ width: 80px;
|
|
|
+ height: 80px;
|
|
|
+ border-radius: 50%;
|
|
|
+ overflow: hidden;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 80px;
|
|
|
+ color: #fff;
|
|
|
+ border: 2px solid #fff;
|
|
|
+ position: relative;
|
|
|
+ }
|
|
|
+ li:first-child{
|
|
|
+ background-color: #0052D9;
|
|
|
+ z-index: 6;
|
|
|
+ }
|
|
|
+ li:nth-child(2){
|
|
|
+ background-color: #2BA471;
|
|
|
+ margin-left: -20px;
|
|
|
+ z-index: 5;
|
|
|
+ }
|
|
|
+ li:nth-child(3){
|
|
|
+ background-color: #0052D9;
|
|
|
+ margin-left: -20px;
|
|
|
+ z-index: 4;
|
|
|
+ }
|
|
|
+ li:nth-child(4){
|
|
|
+ background-color: #D54941;
|
|
|
+ margin-left: -20px;
|
|
|
+ z-index: 3;
|
|
|
+ }
|
|
|
+ li:nth-child(5){
|
|
|
+ background-color: #E37318;
|
|
|
+ margin-left: -20px;
|
|
|
+ z-index: 2;
|
|
|
+ }
|
|
|
+ .num{
|
|
|
+ background-color: #D9E1FF !important;
|
|
|
+ margin-left: -20px;
|
|
|
+ z-index: 1 !important;
|
|
|
+ color: $theme-color;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ :deep(.van-search__content){
|
|
|
+ border: none;
|
|
|
+ padding-left: 0;
|
|
|
+ }
|
|
|
+ .van-search{
|
|
|
+ padding: 0;
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .theme-text-box{
|
|
|
+ border-bottom: 1px solid $border-color;
|
|
|
+ }
|
|
|
+ .list-wrap{
|
|
|
+ flex: 1;
|
|
|
+ overflow-y: auto;
|
|
|
+ padding-left: 35px;
|
|
|
+ &::-webkit-scrollbar{
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ :deep(.van-checkbox__label){
|
|
|
+ padding: 32px 32px 32px 0;
|
|
|
+ border-bottom: 1px solid $border-color;
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .submit-btn{
|
|
|
+ width: 90%;
|
|
|
+ margin: 20px auto;
|
|
|
+ }
|
|
|
+}
|
|
|
+.search-wrap{
|
|
|
+ .list-wrap{
|
|
|
+ height: 50vh;
|
|
|
+ flex: none;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|