Commit 19046586 by Sweet Zhang

调通发邮件

parent 70b9e0d4
...@@ -7,6 +7,8 @@ import type { ...@@ -7,6 +7,8 @@ import type {
Sender, Sender,
Variable, Variable,
VariableTemplate, VariableTemplate,
SubTask,
EmailTask,
} from '@/types/index' } from '@/types/index'
import type { ApiResponse } from '@/utils/request' import type { ApiResponse } from '@/utils/request'
...@@ -129,6 +131,10 @@ export const importContactApi = { ...@@ -129,6 +131,10 @@ export const importContactApi = {
getEmailContactImportList: (params: EditContactImport): Promise<ApiResponse> => { getEmailContactImportList: (params: EditContactImport): Promise<ApiResponse> => {
return request.post('/emailContactImport/page', params) return request.post('/emailContactImport/page', params)
}, },
// 详情会话信息前端展示收件人,抄送人
getEmailContactImportDetail: (id: string): Promise<ApiResponse> => {
return request.get('/emailContactImport/detail/sessionId?sessionId=' + id)
},
} }
/** /**
* 发送邮件 * 发送邮件
...@@ -142,4 +148,22 @@ export const sendEmailApi = { ...@@ -142,4 +148,22 @@ export const sendEmailApi = {
testSendEmail: (data: SendEmail): Promise<ApiResponse> => { testSendEmail: (data: SendEmail): Promise<ApiResponse> => {
return request.post('/email/test/send', data) return request.post('/email/test/send', data)
}, },
// 发送任务列表查询
getEmailTaskList: (params: SubTask): Promise<ApiResponse> => {
return request.post('/emailTaskRecipients/page', params)
},
// 主线任务列表查询
getEmailTaskMainList: (params: EmailTask): Promise<ApiResponse> => {
return request.post('/emailTask/page', params)
},
}
/**
* 文件服务接口
*/
export const uploadApi = {
// 上传文件
uploadFile: (data: FormData): Promise<ApiResponse> => {
return request.post('/oss/upload', data)
},
} }
...@@ -9,7 +9,7 @@ export interface Pagination<T> { ...@@ -9,7 +9,7 @@ export interface Pagination<T> {
} }
// 联系人类型 // 联系人类型
export interface Contact extends Pagination<Contact> { export interface Contact<T> extends Pagination<Contact> {
contactBizId?: string contactBizId?: string
name?: string name?: string
type?: string type?: string
...@@ -50,29 +50,6 @@ export interface VariableTemplate extends Pagination<VariableTemplate> { ...@@ -50,29 +50,6 @@ export interface VariableTemplate extends Pagination<VariableTemplate> {
variableNameEns?: string[] variableNameEns?: string[]
} }
// 邮件类型
export interface Email extends Pagination<Email> {
id?: string
sender?: string
to?: string[]
cc?: string[]
subject?: string
content?: string
sendTime?: string
status?: 'sent' | 'scheduled' | 'draft' | 'failed'
attachments?: { name: string }[]
}
// 邮件表单类型
export interface EmailForm extends Pagination<EmailForm> {
to: string
cc: string
subject: string
content: string
scheduleSend: boolean
sendTime: string
}
// 忘记密码表单类型 // 忘记密码表单类型
export interface ForgotPasswordForm { export interface ForgotPasswordForm {
email: string email: string
...@@ -81,18 +58,16 @@ export interface ForgotPasswordForm { ...@@ -81,18 +58,16 @@ export interface ForgotPasswordForm {
} }
// 导入记录类型 // 导入记录类型
export interface ImportRecord { export interface ImportRecord extends Contact<ImportRecord> {
id: string sessionId?: string
to: string receiveEmailList?: string[]
cc: string ccEmailList?: string[]
createdAt: string
updatedAt: string
} }
// 选择联系人时,调用接口,获取sessionId // 选择联系人时,调用接口,获取sessionId
export interface ContactSessionId { export interface ContactSessionId {
sessionId?: string sessionId?: string
apiEmailContactDtoList?: Contact[] apiEmailContactDtoList?: Contact<unknown>[]
} }
// 编辑-邮件联系人导入信息 // 编辑-邮件联系人导入信息
...@@ -104,11 +79,32 @@ export interface EditContactImport extends Pagination<EditContactImport> { ...@@ -104,11 +79,32 @@ export interface EditContactImport extends Pagination<EditContactImport> {
// 发送邮件 // 发送邮件
export interface SendEmail { export interface SendEmail {
senderBizId?: string senderBizId?: string
sendEmail?: string
subject?: string
content?: string
scheduleTime?: string
attachmentPath?: string
variableGroupBizId?: string
sessionId?: string
recipientEmailList?: string[] recipientEmailList?: string[]
ccEmailList?: string[] ccEmailList?: string[]
bccEmailList?: string[] bccEmailList?: string[]
receiveEmailList?: string[]
}
export interface EmailForm {
senderBizId?: string
sendEmail?: string
variableGroupBizId?: string
receiveEmail?: string
ccEmailList?: string[]
subject?: string subject?: string
body?: string content?: string
attachmentPath?: string
sessionId?: string
ccEmails?: string
scheduleSend?: boolean
scheduleTime?: string
} }
//邮件服务商类型 //邮件服务商类型
export interface EmailProvider extends Pagination<EmailProvider> { export interface EmailProvider extends Pagination<EmailProvider> {
...@@ -120,3 +116,22 @@ export interface EmailProvider extends Pagination<EmailProvider> { ...@@ -120,3 +116,22 @@ export interface EmailProvider extends Pagination<EmailProvider> {
active?: number active?: number
description?: string description?: string
} }
// 发送任务列表查询参数
export interface SubTask extends Pagination<SubTask> {
taskBizId?: string
receiveEmail?: string
status?: string
}
// 主线任务列表查询参数
export interface EmailTask extends Pagination<EmailTask> {
queryContent?: string
status?: string
taskBizId?: string
taskName?: string
senderBizId?: string
sendEmail?: string
receiveEmails?: string
subject?: string
scheduleTime?: string
sendTime?: string
}
...@@ -17,7 +17,7 @@ const request = axios.create({ ...@@ -17,7 +17,7 @@ const request = axios.create({
'Content-Type': 'application/json', 'Content-Type': 'application/json',
// Authorization: 'Bearer ' + localStorage.getItem('authToken'), // Authorization: 'Bearer ' + localStorage.getItem('authToken'),
Authorization: Authorization:
'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c2VyXzEwMDEiLCJyb2xlcyI6W10sImlhdCI6MTc1ODc4NTY3NCwiZXhwIjoxNzU4ODcyMDc0fQ.tjTO6vdpwLpNjVa1DhxRBdpjZsdhbx6g1TdtpAm7BZBRMwanM_ci7dsnbc8FNXpyfSb-ifXW7ccxwyQbtCaKiQ', 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c2VyXzEwMDEiLCJyb2xlcyI6W10sImlhdCI6MTc1ODg3MjMyOSwiZXhwIjoxNzU4OTU4NzI5fQ.McyflIoI_ltve_uy2-mZTjOfxYfBGNMEuOoIVfeEtXdAuoycggGErq8yU3mc15npsIWJy2a8zJ5cNpx_NVtGIw',
}, },
}) })
......
...@@ -99,12 +99,6 @@ const confirmSelection = () => { ...@@ -99,12 +99,6 @@ const confirmSelection = () => {
const selected = props.contacts.filter((contact) => const selected = props.contacts.filter((contact) =>
selectedContacts.value.includes(contact.contactBizId || ''), selectedContacts.value.includes(contact.contactBizId || ''),
) )
const to = selected.map((contact) => contact.email).join(',') emits('confirm-selection', selected)
const cc = selected
.map((contact) => contact.ccEmailList?.join(',') || '')
.filter((email) => email)
.join(',')
emits('confirm-selection', { to, cc })
} }
</script> </script>
...@@ -65,9 +65,9 @@ ...@@ -65,9 +65,9 @@
</tr> </tr>
</thead> </thead>
<tbody class="bg-white divide-y divide-gray-200"> <tbody class="bg-white divide-y divide-gray-200">
<tr v-for="email in filteredEmails" :key="email.id"> <tr v-for="email in emails" :key="email.taskBizId">
<td class="px-6 py-4 whitespace-nowrap">{{ email.sender }}</td> <td class="px-6 py-4 whitespace-nowrap">{{ email.sendEmail }}</td>
<td class="px-6 py-4 whitespace-nowrap max-w-xs truncate">{{ email.to }}</td> <td class="px-6 py-4 whitespace-nowrap max-w-xs truncate">{{ email.receiveEmails }}</td>
<td class="px-6 py-4 max-w-xs truncate">{{ email.subject }}</td> <td class="px-6 py-4 max-w-xs truncate">{{ email.subject }}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500"> <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ formatDate(email.sendTime) }} {{ formatDate(email.sendTime) }}
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div v-if="filteredEmails.length === 0" class="p-8 text-center text-gray-500"> <div v-if="emails.length === 0" class="p-8 text-center text-gray-500">
<i class="fas fa-history text-4xl mb-3 opacity-30"></i> <i class="fas fa-history text-4xl mb-3 opacity-30"></i>
<p>暂无邮件发送记录</p> <p>暂无邮件发送记录</p>
</div> </div>
...@@ -119,27 +119,17 @@ ...@@ -119,27 +119,17 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, defineProps, defineEmits } from 'vue' import { ref, computed, onMounted } from 'vue'
import type { Email } from '@/types/index' import type { EmailTask } from '@/types/index'
import { sendEmailApi } from '@/api/api'
// 状态 // 状态
const emails = ref<Email[]>([]) const emails = ref<EmailTask[]>([])
const searchTerm = ref('') const searchTerm = ref('')
const filterStatus = ref('') const filterStatus = ref('')
// 计算属性 onMounted(() => {
const filteredEmails = computed(() => { getEmailTaskMainList()
return emails.value
.filter((email) => {
const matchesSearch =
email.subject.toLowerCase().includes(searchTerm.value.toLowerCase()) ||
email.to.toLowerCase().includes(searchTerm.value.toLowerCase())
const matchesStatus = !filterStatus.value || email.status === filterStatus.value
return matchesSearch && matchesStatus
})
.sort((a, b) => new Date(b.sendTime).getTime() - new Date(a.sendTime).getTime())
}) })
// 方法 // 方法
...@@ -148,7 +138,7 @@ const formatDate = (dateString: string) => { ...@@ -148,7 +138,7 @@ const formatDate = (dateString: string) => {
return date.toLocaleString() return date.toLocaleString()
} }
const viewEmailDetail = (email: Email) => { const viewEmailDetail = (email: EmailTask) => {
// 显示邮件详情 // 显示邮件详情
alert( alert(
`邮件主题: ${email.subject || '无'}\n收件人: ${email.to || '无'}\n发送时间: ${formatDate(email.sendTime || '')}`, `邮件主题: ${email.subject || '无'}\n收件人: ${email.to || '无'}\n发送时间: ${formatDate(email.sendTime || '')}`,
...@@ -156,7 +146,19 @@ const viewEmailDetail = (email: Email) => { ...@@ -156,7 +146,19 @@ const viewEmailDetail = (email: Email) => {
// 实际项目中可以打开详情弹窗 // 实际项目中可以打开详情弹窗
} }
const reuseEmailContent = (email: Email) => { const reuseEmailContent = (email: EmailTask) => {
// 触发复用邮件内容事件 // 触发复用邮件内容事件
} }
// 发送任务列表查询
const getEmailTaskMainList = async () => {
const params: EmailTask = {
pageNum: 1,
pageSize: 100,
}
const res = await sendEmailApi.getEmailTaskMainList(params)
if (res.code === 200) {
emails.value = res.data.records || []
}
}
</script> </script>
...@@ -148,7 +148,7 @@ ...@@ -148,7 +148,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, defineProps, defineEmits, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { emailProviderApi, senderApi, getEmailSenderConfigList } from '@/api/api' import { emailProviderApi, senderApi, getEmailSenderConfigList } from '@/api/api'
import type { Sender } from '@/types/index' import type { Sender } from '@/types/index'
// 引入弹窗组件 // 引入弹窗组件
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment