This commit is contained in:
BianLzhaoMin 2026-02-02 11:10:40 +08:00
parent 521ae6e1ad
commit 2a0b910c7a
6 changed files with 395 additions and 192 deletions

View File

@ -91,3 +91,12 @@ export function resendOneLoopMsgAPI(data) {
}) })
} }
// 立即执行一次
export function runOneLoopMsgAPI(data) {
return request({
url: '/msgJob/executeOnceJob',
method: 'POST',
data,
})
}

View File

@ -101,34 +101,54 @@
</el-table> </el-table>
</el-col> </el-col>
<!-- 右侧已选人员 --> <!-- 右侧已选内容 -->
<el-col :span="8"> <el-col :span="8">
<div class="selected-persons"> <div class="selected-persons">
<div class="selected-header"> <div class="selected-header">
<span>已选人员</span> <span>{{ activeTab === 'person' ? '已选人员' : '已选分组人员' }}</span>
<el-button <el-button
type="text" type="text"
size="small" size="small"
@click="handleClearAll" @click="handleClearAll"
:disabled="allSelectedPersons.length === 0" :disabled="
activeTab === 'person'
? directSelectedPersonIds.length === 0
: selectedGroupIds.length === 0
"
> >
清空 清空
</el-button> </el-button>
</div> </div>
<div class="selected-list"> <div class="selected-list">
<div <!-- 人员tab显示已选人员 -->
v-for="person in allSelectedPersons" <template v-if="activeTab === 'person'">
:key="person.id" <div
class="selected-item" v-for="person in directSelectedPersons"
> :key="person.id"
<span>{{ person.workerName }}</span> class="selected-item"
<el-icon class="remove-icon" @click="handleRemovePerson(person.id)"> >
<Close /> <span>{{ person.workerName }}</span>
</el-icon> <el-icon class="remove-icon" @click="handleRemovePerson(person.id)">
</div> <Close />
<div v-if="allSelectedPersons.length === 0" class="empty-tip"> </el-icon>
暂未选择人员 </div>
</div> <div v-if="directSelectedPersons.length === 0" class="empty-tip">
暂未选择人员
</div>
</template>
<!-- 分组tab显示已选分组的所有人员 -->
<template v-else>
<div
v-for="person in groupSelectedPersons"
:key="`${person.groupId}-${person.id}`"
class="selected-item"
>
<span>{{ person.workerName }}</span>
</div>
<div v-if="groupSelectedPersons.length === 0" class="empty-tip">
暂未选择分组
</div>
</template>
</div> </div>
</div> </div>
</el-col> </el-col>
@ -147,9 +167,13 @@ const props = defineProps({
type: Array, type: Array,
default: () => [], default: () => [],
}, },
groupList: {
type: Array,
default: () => [],
},
}) })
const emit = defineEmits(['update:modelValue', 'confirm']) const emit = defineEmits(['update:modelValue', 'update:groupList', 'confirm'])
const activeTab = ref('person') const activeTab = ref('person')
const searchKeyword = ref('') const searchKeyword = ref('')
@ -170,6 +194,9 @@ const selectedGroupIds = ref([])
// //
const isSyncing = ref(false) const isSyncing = ref(false)
//
const isInitialized = ref(false)
// //
const filteredPersonList = computed(() => { const filteredPersonList = computed(() => {
if (!searchKeyword.value) { if (!searchKeyword.value) {
@ -190,7 +217,7 @@ const filteredGroupList = computed(() => {
} }
const keyword = groupSearchKeyword.value.toLowerCase() const keyword = groupSearchKeyword.value.toLowerCase()
return groupList.value.filter((item) => { return groupList.value.filter((item) => {
const groupName = (item.groupName || '').toLowerCase() const groupName = (item.groupName || item.workerName || '').toLowerCase()
return groupName.includes(keyword) return groupName.includes(keyword)
}) })
}) })
@ -198,46 +225,46 @@ const filteredGroupList = computed(() => {
// //
const selectedGroupCount = computed(() => selectedGroupIds.value.length) const selectedGroupCount = computed(() => selectedGroupIds.value.length)
// // tab
const allSelectedPersons = computed(() => { const directSelectedPersons = computed(() => {
const personMap = new Map() return directSelectedPersonIds.value
.map((personId) => {
const person = personList.value.find((p) => p.id === personId)
if (person) {
return {
id: person.id,
workerName: person.workerName,
orgName: person.orgName,
sex: person.sex,
phone: person.phone,
}
}
return null
})
.filter(Boolean)
})
// // tab
directSelectedPersonIds.value.forEach((personId) => { const groupSelectedPersons = computed(() => {
const person = personList.value.find((p) => p.id === personId) const persons = []
if (person) {
personMap.set(person.id, {
id: person.id,
workerName: person.workerName,
orgName: person.orgName,
sex: person.sex,
phone: person.phone,
})
}
})
//
selectedGroupIds.value.forEach((groupId) => { selectedGroupIds.value.forEach((groupId) => {
const group = groupList.value.find((g) => g.id === groupId) const group = groupList.value.find((g) => g.id === groupId)
if (group && group.workerList && Array.isArray(group.workerList)) { if (group && group.workerList && Array.isArray(group.workerList)) {
group.workerList.forEach((worker) => { group.workerList.forEach((worker) => {
if (worker && worker.id) { if (worker && worker.id) {
// persons.push({
if (!personMap.has(worker.id)) { id: worker.id,
personMap.set(worker.id, { groupId: groupId,
id: worker.id, workerName: worker.workerName || worker.name || '',
workerName: worker.workerName || worker.name || '', orgName: worker.orgName || '',
orgName: worker.orgName || '', sex: worker.sex,
sex: worker.sex, phone: worker.phone || '',
phone: worker.phone || '', })
})
}
} }
}) })
} }
}) })
return persons
return Array.from(personMap.values())
}) })
// //
@ -249,6 +276,7 @@ const selectedPersonCount = computed(() => {
const handleTabChange = (tabName) => { const handleTabChange = (tabName) => {
searchKeyword.value = '' searchKeyword.value = ''
groupSearchKeyword.value = '' groupSearchKeyword.value = ''
// tabtab
nextTick(() => { nextTick(() => {
if (tabName === 'person') { if (tabName === 'person') {
syncPersonTableSelection() syncPersonTableSelection()
@ -293,47 +321,37 @@ const onPersonSelectionChange = (selection) => {
updateSelectedPersons() updateSelectedPersons()
} }
// //
const updateSelectedPersons = () => { const updateSelectedPersons = () => {
const personMap = new Map() // watch
isInitialized.value = true
// //
directSelectedPersonIds.value.forEach((personId) => { const persons = directSelectedPersonIds.value
const person = personList.value.find((p) => p.id === personId) .map((personId) => {
if (person) { const person = personList.value.find((p) => p.id === personId)
personMap.set(person.id, { if (person) {
id: person.id, return {
workerName: person.workerName, id: person.id,
orgName: person.orgName, workerName: person.workerName,
sex: person.sex, orgName: person.orgName,
phone: person.phone, sex: person.sex,
}) phone: person.phone,
}
})
//
selectedGroupIds.value.forEach((groupId) => {
const group = groupList.value.find((g) => g.id === groupId)
if (group && group.workerList && Array.isArray(group.workerList)) {
group.workerList.forEach((worker) => {
if (worker && worker.id) {
//
if (!personMap.has(worker.id)) {
personMap.set(worker.id, {
id: worker.id,
workerName: worker.workerName || worker.name || '',
orgName: worker.orgName || '',
sex: worker.sex,
phone: worker.phone || '',
})
}
} }
}) }
} return null
}) })
.filter(Boolean)
emit('update:modelValue', persons)
// //
emit('update:modelValue', Array.from(personMap.values())) const groups = selectedGroupIds.value
.map((groupId) => {
const group = groupList.value.find((g) => g.id === groupId)
return group ? { id: group.id, groupName: group.groupName || group.workerName } : null
})
.filter(Boolean)
emit('update:groupList', groups)
} }
// //
@ -354,7 +372,7 @@ const onGroupSelectionChange = (selection) => {
// IDID // IDID
selectedGroupIds.value = [...preservedIds, ...selectedVisibleIds] selectedGroupIds.value = [...preservedIds, ...selectedVisibleIds]
// //
updateSelectedPersons() updateSelectedPersons()
} }
@ -418,40 +436,10 @@ const syncGroupTableSelection = () => {
}) })
} }
// // tab
const handleRemovePerson = (personId) => { const handleRemovePerson = (personId) => {
// directSelectedPersonIds.value = directSelectedPersonIds.value.filter((id) => id !== personId)
const isDirectSelected = directSelectedPersonIds.value.includes(personId)
//
const groupsContainingPerson = []
selectedGroupIds.value.forEach((groupId) => {
const group = groupList.value.find((g) => g.id === groupId)
if (group && group.workerList && Array.isArray(group.workerList)) {
const hasPerson = group.workerList.some((w) => w.id === personId)
if (hasPerson) {
groupsContainingPerson.push(groupId)
}
}
})
//
if (isDirectSelected) {
directSelectedPersonIds.value = directSelectedPersonIds.value.filter(
(id) => id !== personId,
)
} else if (groupsContainingPerson.length > 0) {
//
selectedGroupIds.value = selectedGroupIds.value.filter(
(id) => !groupsContainingPerson.includes(id),
)
nextTick(() => {
syncGroupTableSelection()
})
}
updateSelectedPersons() updateSelectedPersons()
// //
nextTick(() => { nextTick(() => {
syncPersonTableSelection() syncPersonTableSelection()
@ -461,15 +449,18 @@ const handleRemovePerson = (personId) => {
// //
const handleClearAll = () => { const handleClearAll = () => {
isSyncing.value = true isSyncing.value = true
directSelectedPersonIds.value = [] if (activeTab.value === 'person') {
selectedGroupIds.value = [] directSelectedPersonIds.value = []
emit('update:modelValue', []) if (personTableRef.value) {
if (personTableRef.value) { personTableRef.value.clearSelection()
personTableRef.value.clearSelection() }
} } else {
if (groupTableRef.value) { selectedGroupIds.value = []
groupTableRef.value.clearSelection() if (groupTableRef.value) {
groupTableRef.value.clearSelection()
}
} }
updateSelectedPersons()
nextTick(() => { nextTick(() => {
isSyncing.value = false isSyncing.value = false
}) })
@ -495,7 +486,11 @@ const getGroupList = async () => {
try { try {
const result = await getAllGroupAPI() const result = await getAllGroupAPI()
if (result.code === 200 && result.rows) { if (result.code === 200 && result.rows) {
groupList.value = result.rows || [] // workerName groupName
groupList.value = (result.rows || []).map((group) => ({
...group,
groupName: group.groupName || group.workerName || '',
}))
nextTick(() => { nextTick(() => {
syncGroupTableSelection() syncGroupTableSelection()
}) })
@ -505,37 +500,99 @@ const getGroupList = async () => {
} }
} }
// modelValue // modelValue
watch( watch(
() => props.modelValue, () => props.modelValue,
(newVal) => { (newVal) => {
//
//
if (directSelectedPersonIds.value.length > 0 || selectedGroupIds.value.length > 0) {
return
}
if (!newVal || newVal.length === 0) { if (!newVal || newVal.length === 0) {
directSelectedPersonIds.value = [] //
if (directSelectedPersonIds.value.length === 0) {
return
}
//
if (!isInitialized.value) {
directSelectedPersonIds.value = []
}
return return
} }
// // ID
// const externalPersonIds = newVal.map((p) => p.id).filter(Boolean)
// updateSelectedPersons
const personIds = newVal.map((p) => p.id).filter(Boolean)
directSelectedPersonIds.value = personIds
if (activeTab.value === 'person') { //
nextTick(() => { const currentIds = new Set(directSelectedPersonIds.value.map((id) => Number(id)))
syncPersonTableSelection() const externalIds = new Set(externalPersonIds.map((id) => Number(id)))
}) const isEqual =
currentIds.size === externalIds.size &&
[...currentIds].every((id) => externalIds.has(id))
if (isEqual && isInitialized.value) {
return
}
// ID
if (!isInitialized.value || !isEqual) {
directSelectedPersonIds.value = externalPersonIds
isInitialized.value = true
if (activeTab.value === 'person') {
nextTick(() => {
syncPersonTableSelection()
})
}
}
},
{ deep: true, immediate: true },
)
// groupList
watch(
() => props.groupList,
(newVal) => {
if (!newVal || newVal.length === 0) {
//
if (selectedGroupIds.value.length === 0) {
return
}
//
if (!isInitialized.value) {
selectedGroupIds.value = []
}
return
}
// ID
const externalGroupIds = newVal.map((g) => g.id).filter(Boolean)
//
const currentIds = new Set(selectedGroupIds.value.map((id) => Number(id)))
const externalIds = new Set(externalGroupIds.map((id) => Number(id)))
const isEqual =
currentIds.size === externalIds.size &&
[...currentIds].every((id) => externalIds.has(id))
if (isEqual && isInitialized.value) {
return
}
// ID
if (!isInitialized.value || !isEqual) {
selectedGroupIds.value = externalGroupIds
isInitialized.value = true
if (activeTab.value === 'group') {
nextTick(() => {
syncGroupTableSelection()
})
}
} }
}, },
{ deep: true, immediate: true }, { deep: true, immediate: true },
) )
onMounted(() => { onMounted(() => {
//
isInitialized.value = false
getPersonList() getPersonList()
getGroupList() getGroupList()
}) })

View File

@ -33,14 +33,21 @@
</template> </template>
<script setup name="Index"> <script setup name="Index">
import { ref } from 'vue' import { ref, markRaw } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { Message, Bell, Document, Setting, DataAnalysis, Connection } from '@element-plus/icons-vue' import { Message, Bell, Document, Setting, DataAnalysis, Connection } from '@element-plus/icons-vue'
const router = useRouter() const router = useRouter()
// // - 使 markRaw
const icons = ref([Message, Bell, Document, Setting, DataAnalysis, Connection]) const icons = ref([
markRaw(Message),
markRaw(Bell),
markRaw(Document),
markRaw(Setting),
markRaw(DataAnalysis),
markRaw(Connection),
])
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -60,6 +60,10 @@ export const tableColumns = [
label: '任务状态', label: '任务状态',
slot: 'taskStatus', slot: 'taskStatus',
}, },
{
prop: 'remark',
label: '备注',
},
] ]
export default { export default {

View File

@ -10,21 +10,21 @@
</template> </template>
<el-form <el-form
ref="formRef" ref="formRef"
:model="formData"
:rules="!isDetail ? rules : {}"
size="large" size="large"
:model="formData"
label-width="auto" label-width="auto"
:disabled="isDetail" :disabled="isDetail"
:rules="!isDetail ? rules : {}"
> >
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="任务名称" prop="taskName"> <el-form-item label="任务名称" prop="taskName">
<el-input <el-input
v-model.trim="formData.taskName" clearable
placeholder="请输入任务名称"
maxlength="50" maxlength="50"
show-word-limit show-word-limit
clearable placeholder="请输入任务名称"
v-model.trim="formData.taskName"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -32,10 +32,10 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="短信类型" prop="msgType"> <el-form-item label="短信类型" prop="msgType">
<el-select <el-select
v-model="formData.msgType"
placeholder="请选择短信类型"
clearable clearable
style="width: 100%" style="width: 100%"
v-model="formData.msgType"
placeholder="请选择短信类型"
> >
<el-option label="通知" value="1" /> <el-option label="通知" value="1" />
<el-option label="计划" value="2" /> <el-option label="计划" value="2" />
@ -77,26 +77,26 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="是否并发" prop="concurrent"> <el-form-item label="是否并发" prop="concurrent">
<el-radio-group v-model="formData.concurrent"> <el-radio-group v-model="formData.concurrent">
<el-radio-button value="0">允许</el-radio-button> <el-radio-button value="0">允许</el-radio-button>
<el-radio-button value="1">禁止</el-radio-button> <el-radio-button value="1">禁止</el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col> -->
</el-row> </el-row>
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="发送内容" prop="sendContent"> <el-form-item label="发送内容" prop="sendContent">
<el-input <el-input
v-model.trim="formData.sendContent"
type="textarea"
:rows="5" :rows="5"
placeholder="请输入发送内容" type="textarea"
maxlength="500" maxlength="500"
show-word-limit show-word-limit
placeholder="请输入发送内容"
v-model.trim="formData.sendContent"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -106,12 +106,12 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input <el-input
v-model.trim="formData.remark"
type="textarea"
:rows="5" :rows="5"
placeholder="请输入备注"
maxlength="500" maxlength="500"
type="textarea"
show-word-limit show-word-limit
placeholder="请输入备注"
v-model.trim="formData.remark"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -136,30 +136,41 @@
<el-form-item label="接收人员" prop="recipientList"> <el-form-item label="接收人员" prop="recipientList">
<div class="recipient-select"> <div class="recipient-select">
<el-button <el-button
type="primary"
link link
icon="Plus" icon="Plus"
@click="onOpenPersonPicker" type="primary"
:disabled="isDetail"
v-if="!isDetail" v-if="!isDetail"
:disabled="isDetail"
@click="onOpenPersonPicker"
> >
选择 选择
</el-button> </el-button>
<span class="selected-names">{{ selectedRecipientNames }}</span> <span class="selected-names">{{ selectedRecipientNames }}</span>
</div> </div>
<el-table <el-table
v-if="formData.recipientList && formData.recipientList.length > 0"
:data="formData.recipientList"
border border
style="margin-top: 10px" style="margin-top: 10px"
v-if="formData.recipientList && formData.recipientList.length > 0"
> >
<el-table-column
width="80"
type="index"
label="序号"
align="center"
:data="formData.recipientList"
/>
<el-table-column align="center" prop="workerName" label="姓名" /> <el-table-column align="center" prop="workerName" label="姓名" />
<el-table-column align="center" prop="phone" label="电话" /> <el-table-column align="center" prop="phone" label="电话" />
<el-table-column v-if="!isDetail" label="操作" align="center"> <el-table-column
width="140"
label="操作"
align="center"
v-if="!isDetail"
>
<template #default="{ $index }"> <template #default="{ $index }">
<el-button <el-button
type="danger"
link link
type="danger"
icon="Delete" icon="Delete"
@click="handleRemoveRecipient($index)" @click="handleRemoveRecipient($index)"
> >
@ -172,10 +183,52 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="24" v-if="isGenderSendGroup === 0">
<el-col :span="24">
<el-form-item label="已选分组">
<el-table
border
style="margin-top: 10px"
:data="formData.groupList"
v-if="formData.groupList && formData.groupList.length > 0"
>
<el-table-column
width="80"
type="index"
label="序号"
align="center"
/>
<el-table-column align="center" prop="groupName" label="分组名称" />
<el-table-column
label="操作"
width="140"
align="center"
v-if="!isDetail"
>
<template #default="{ $index }">
<el-button
link
type="danger"
icon="Delete"
@click="handleRemoveGroup($index)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<div v-else class="recipient-select">
<span class="selected-names">暂未选择分组</span>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" v-if="isGenderSendGroup === 1"> <el-row :gutter="24" v-if="isGenderSendGroup === 1">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="群发短信群体" prop="genderSendGroup"> <el-form-item label="群发短信群体" prop="sex">
<el-radio-group v-model="formData.genderSendGroup"> <el-radio-group v-model="formData.sex">
<el-radio-button :value="1"></el-radio-button> <el-radio-button :value="1"></el-radio-button>
<el-radio-button :value="0"></el-radio-button> <el-radio-button :value="0"></el-radio-button>
</el-radio-group> </el-radio-group>
@ -198,8 +251,8 @@
<template #outerContent> <template #outerContent>
<crontab <crontab
ref="crontabRef" ref="crontabRef"
@hide="handleCronHide"
@fill="crontabFill" @fill="crontabFill"
@hide="handleCronHide"
:expression="cronExpression" :expression="cronExpression"
/> />
</template> </template>
@ -208,7 +261,12 @@
<!-- 人员选择弹窗 --> <!-- 人员选择弹窗 -->
<ComDialog :dialog-config="managerDialogConfig" @closeDialogOuter="onCloseDialogOuter"> <ComDialog :dialog-config="managerDialogConfig" @closeDialogOuter="onCloseDialogOuter">
<template #outerContent> <template #outerContent>
<PersonPicker v-model="formData.recipientList" /> <PersonPicker
v-model="formData.recipientList"
:group-list="formData.groupList"
@update:groupList="handleGroupListUpdate"
:key="`picker-${managerDialogConfig.outerVisible}`"
/>
<el-row class="common-btn-row fixed-bottom"> <el-row class="common-btn-row fixed-bottom">
<ComButton plain type="info" @click="managerDialogConfig.outerVisible = false"> <ComButton plain type="info" @click="managerDialogConfig.outerVisible = false">
取消 取消
@ -251,19 +309,19 @@ const pageTitle = computed(() => {
}) })
const formRef = ref(null) const formRef = ref(null)
const crontabRef = ref(null)
const personTableRef = ref(null)
const cronExpression = ref('')
const taskStatus = ref('') const taskStatus = ref('')
const crontabRef = ref(null)
const cronExpression = ref('')
const personTableRef = ref(null)
const isGenderSendGroup = ref(0) const isGenderSendGroup = ref(0)
// Cron // Cron
const cronDialogConfig = reactive({ const cronDialogConfig = reactive({
maxHeight: '80vh',
minHeight: '500px',
outerWidth: '70%',
outerVisible: false, outerVisible: false,
outerTitle: 'Cron表达式生成器', outerTitle: 'Cron表达式生成器',
outerWidth: '70%',
minHeight: '500px',
maxHeight: '80vh',
}) })
// //
@ -275,8 +333,9 @@ const getInitFormData = () => ({
misfirePolicy: '1', // 1-2-3- misfirePolicy: '1', // 1-2-3-
concurrent: '1', // 0-1- concurrent: '1', // 0-1-
sendContent: '', // sendContent: '', //
genderSendGroup: '', // 0-1- sex: '', // 0-1-
recipientList: [], // recipientList: [], //
groupList: [], //
}) })
const formData = ref(getInitFormData()) const formData = ref(getInitFormData())
@ -290,18 +349,24 @@ const rules = {
recipientList: [ recipientList: [
{ {
required: true, required: true,
message: '请至少选择一个接收人员', message: '请至少选择一个接收人员或分组',
trigger: 'change', trigger: 'change',
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
//
if (formData.value.groupList && formData.value.groupList.length > 0) {
callback()
return
}
//
if (!value || value.length === 0) { if (!value || value.length === 0) {
callback(new Error('请至少选择一个接收人员')) callback(new Error('请至少选择一个接收人员或分组'))
} else { } else {
callback() callback()
} }
}, },
}, },
], ],
genderSendGroup: [{ required: true, message: '请选择群发短信群体', trigger: 'change' }], sex: [{ required: true, message: '请选择群发短信群体', trigger: 'change' }],
} }
// //
@ -321,6 +386,11 @@ const selectedRecipientNames = computed(() => {
return formData.value.recipientList.map((item) => item.workerName).join('、') return formData.value.recipientList.map((item) => item.workerName).join('、')
}) })
//
const handleGroupListUpdate = (groupList) => {
formData.value.groupList = groupList || []
}
// //
const onOpenPersonPicker = () => { const onOpenPersonPicker = () => {
managerDialogConfig.outerVisible = true managerDialogConfig.outerVisible = true
@ -336,6 +406,10 @@ const handleRemoveRecipient = (index) => {
formData.value.recipientList.splice(index, 1) formData.value.recipientList.splice(index, 1)
} }
//
const handleRemoveGroup = (index) => {
formData.value.groupList.splice(index, 1)
}
// //
const onCloseDialogOuter = (visible) => { const onCloseDialogOuter = (visible) => {
managerDialogConfig.outerVisible = visible managerDialogConfig.outerVisible = visible
@ -386,11 +460,26 @@ const onSubmit = async () => {
misfirePolicy: formData.value.misfirePolicy, misfirePolicy: formData.value.misfirePolicy,
concurrent: formData.value.concurrent, concurrent: formData.value.concurrent,
sendContent: formData.value.sendContent, sendContent: formData.value.sendContent,
workerList: formData.value.recipientList.map((item) => { sex: formData.value.sex,
}
// workerListgroupList
if (formData.value.groupList && formData.value.groupList.length > 0) {
// ID
params.groupList = formData.value.groupList.map((item) => {
return { return {
id: item.id, id: item.id,
} }
}), })
}
if (formData.value.recipientList && formData.value.recipientList.length > 0) {
// ID
params.workerList = formData.value.recipientList.map((item) => {
return {
id: item.id,
}
})
} }
// id // id
@ -419,6 +508,13 @@ const getDetail = async () => {
const result = await getLoopSendDetailAPI(route.query.id) const result = await getLoopSendDetailAPI(route.query.id)
if (result.code === 200 && result.data) { if (result.code === 200 && result.data) {
const data = result.data const data = result.data
// workerName groupName
const groupList = (data.groupList || []).map((group) => ({
id: group.id,
groupName: group.workerName || group.groupName || '',
}))
formData.value = { formData.value = {
id: data.id, id: data.id,
taskName: data.taskName || '', taskName: data.taskName || '',
@ -428,7 +524,13 @@ const getDetail = async () => {
concurrent: String(data.concurrent || '1'), concurrent: String(data.concurrent || '1'),
sendContent: data.sendContent || '', sendContent: data.sendContent || '',
recipientList: data.workerList || [], recipientList: data.workerList || [],
groupList: groupList,
remark: data.remark || '', remark: data.remark || '',
sex: data.sex || '',
}
if (data.sex === 1 || data.sex === 0) {
isGenderSendGroup.value = 1
} }
taskStatus.value = data.taskStatus || '' taskStatus.value = data.taskStatus || ''
cronExpression.value = data.cronExpression || '' cronExpression.value = data.cronExpression || ''
@ -450,12 +552,12 @@ const onHandleDetail = async (row) => {
// //
const handleGenderSendGroupChange = (value) => { const handleGenderSendGroupChange = (value) => {
console.log(value, 'value')
if (value === 0) { if (value === 0) {
//
formData.value.recipientList = [] formData.value.recipientList = []
formData.value.groupList = []
} else { } else {
formData.value.genderSendGroup = null formData.value.sex = ''
} }
} }
@ -539,6 +641,12 @@ onMounted(() => {
} }
} }
.no-group-tip {
color: #909399;
font-size: 14px;
padding: 10px 0;
}
.person-search-bar { .person-search-bar {
margin-bottom: 8px; margin-bottom: 8px;
} }

View File

@ -52,6 +52,7 @@ import {
delLoopSendAPI, delLoopSendAPI,
listLoopSendAPI, listLoopSendAPI,
getSmsBalanceAPI, getSmsBalanceAPI,
runOneLoopMsgAPI,
updateLoopSendStatusAPI, updateLoopSendStatusAPI,
} from '@/api/sMsSendManage/loopSend.js' } from '@/api/sMsSendManage/loopSend.js'
import config from './config' import config from './config'
@ -100,13 +101,20 @@ const actionColumns = [
}, },
{ {
label: '发送详情', label: '立即执行一次',
type: 'primary', type: 'primary',
link: true, link: true,
handler: (row) => { handler: (row) => {
sendDetailsDialogConfig.outerTitle = `发送详情 - ${row.taskName || ''}` runOneLoopMsgAPI({ id: row.id, jobId: row.jobId })
sendDetailsId.value = row.id .then((res) => {
sendDetailsDialogConfig.outerVisible = true if (res.code === 200) {
proxy.$modal.msgSuccess('执行成功')
comTableRef.value?.refresh()
}
})
.catch(() => {
proxy.$modal.msgError('执行失败')
})
}, },
}, },
{ {
@ -139,6 +147,16 @@ const actionColumns = [
}) })
}, },
}, },
{
label: '发送详情',
type: 'primary',
link: true,
handler: (row) => {
sendDetailsDialogConfig.outerTitle = `发送详情 - ${row.taskName || ''}`
sendDetailsId.value = row.id
sendDetailsDialogConfig.outerVisible = true
},
},
] ]
// //