123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- import OPopup from '@/components/o-popup'
- import { sendType } from '@/constant'
- import request from '@/helpers/request'
- import { getOssUploadUrl } from '@/state'
- import dayjs from 'dayjs'
- import umiRequest from 'umi-request'
- import {
- ActionSheet,
- Button,
- Cell,
- CellGroup,
- closeToast,
- DatePicker,
- Field,
- Icon,
- Image,
- PickerGroup,
- Popup,
- showLoadingToast,
- showToast,
- TimePicker,
- Uploader
- } from 'vant'
- import { computed, defineComponent, onMounted, reactive } from 'vue'
- import styles from './index.module.less'
- import SelectSned from './select-sned'
- import iconStudent from '@common/images/icon_student.png'
- import iconTeacher from '@common/images/icon_teacher.png'
- import iconJiaoFu from '@common/images/icon_jiaofu.png'
- import ODialog from '@/components/o-dialog'
- import OSticky from '@/components/o-sticky'
- import { useRoute, useRouter } from 'vue-router'
- export default defineComponent({
- name: 'create-message',
- setup() {
- const router = useRouter()
- const route = useRoute()
- const forms = reactive({
- id: route.query.id,
- type: 'ADD',
- bucket: 'i-m',
- sendStatus: false,
- sendType: 'IMMEDIATELY' as any,
- textMessage: null,
- sendTime: null as any,
- sendTimeStatus: false,
- maxDate: dayjs(new Date()).add(60, 'day').toDate(),
- currentDate: [],
- currentTime: [dayjs().format('HH'), dayjs().format('mm')],
- attachments: [] as any, //群发消息附件
- receives: [] as any, // 群发消息对象
- selectStatus: false,
- selectList: {} as any, // 选中发送的信息
- delSelectItem: {} as any,
- delStatus: false,
- sureLoading: false,
- updateLoading: false,
- closeLoading: false
- })
- const beforeRead = (file: any) => {
- // console.log(file, 'beforeRead')
- const isLt2M = file.size / 1024 / 1024 < 5
- if (!isLt2M) {
- showToast(`上传文件大小不能超过 5MB`)
- return false
- }
- return true
- }
- const beforeDelete = (file: any, detail: { index: any }) => {
- // this.dataModel.splice(detail.index, 1)
- return true
- }
- const afterRead = async (file: any, detail: any) => {
- try {
- file.status = 'uploading'
- file.message = '上传中...'
- await uploadFile(file)
- } catch (error) {
- //
- closeToast()
- }
- }
- const uploadFile = async (files: any) => {
- // 上传文件
- try {
- console.log(files, 'files')
- const file = files.file
- // 获取签名
- const signUrl = '/api-school/open/getUploadSign'
- const tempName = file.name || ''
- const fileName = '/i-m/' + (tempName && tempName.replace(/ /gi, '_'))
- const key = new Date().getTime() + fileName
- // showLoadingToast({
- // message: '加载中...',
- // forbidClick: true,
- // loadingType: 'spinner',
- // duration: 0
- // })
- const res = await request.post(signUrl, {
- hideLoading: true,
- data: {
- filename: fileName,
- bucketName: forms.bucket,
- postData: {
- filename: fileName,
- acl: 'public-read',
- key: key,
- unknowValueField: []
- }
- }
- })
- // setTimeout(() => {
- // }, 100)
- const obj = {
- policy: res.data.policy,
- signature: res.data.signature,
- key: key,
- KSSAccessKeyId: res.data.kssAccessKeyId,
- acl: 'public-read',
- name: fileName
- }
- const formData = new FormData()
- for (const key in obj) {
- formData.append(key, obj[key])
- }
- formData.append('file', file, fileName)
- await umiRequest(getOssUploadUrl(forms.bucket), {
- method: 'POST',
- data: formData
- })
- // console.log(getOssUploadUrl(state.bucket) + key)
- const uploadUrl = getOssUploadUrl(forms.bucket) + key
- // closeToast()
- // state.fileList.push({ url: uploadUrl })
- files.url = uploadUrl
- files.status = 'done'
- } catch (error) {
- files.status = 'failed'
- // closeToast()
- console.log(error, 'uploadFile')
- }
- }
- const onSubmit = async () => {
- try {
- if (!forms.sendType) {
- showToast('请选择发送方式')
- return
- }
- if (!forms.textMessage) {
- showToast('请输入发送内容')
- return
- }
- if (forms.receives.length <= 0) {
- showToast('请选择发送对象')
- return
- }
- const tempAttachments: any = []
- forms.attachments.forEach((item: any) => {
- tempAttachments.push({
- imgUrl: item.url,
- imgMessage: item.url
- })
- })
- const tempReceives: any = []
- forms.receives.forEach((item: any) => {
- tempReceives.push({
- receiveType: item.receiveType,
- receiveId: item.receiveId
- })
- })
- const params: any = {
- sendType: forms.sendType,
- textMessage: forms.textMessage,
- attachments: tempAttachments,
- receives: tempReceives,
- sendTime: forms.sendTime
- }
- console.log(params, 'params')
- if (forms.id) {
- forms.updateLoading = true
- } else {
- forms.sureLoading = true
- }
- if (forms.id) {
- params.id = forms.id
- await request.post('/api-school/imMessageBatchSending/update', {
- hideLoading: false,
- data: params
- })
- } else {
- await request.post('/api-school/imMessageBatchSending/save', {
- hideLoading: false,
- data: params
- })
- }
- setTimeout(() => {
- showToast(forms.id ? '修改成功' : '添加成功')
- }, 100)
- setTimeout(() => {
- router.replace('/mass-message')
- forms.sureLoading = false
- forms.updateLoading = false
- }, 1100)
- } catch {
- //
- forms.sureLoading = false
- forms.updateLoading = false
- }
- }
- const getDetails = async () => {
- try {
- if (!forms.id) return
- const { data } = await request.get('/api-school/imMessageBatchSending/detail/' + forms.id)
- forms.sendType = data.sendType
- forms.textMessage = data.textMessage
- forms.sendTime = data.sendTime
- forms.type = data.sendStatus
- const receives = data.receives || []
- const tempList: any = {
- class: [] as any,
- teacher: [] as any,
- student: [] as any,
- school: [] as any
- }
- receives.forEach((item: any) => {
- const temp = {
- receiveType: item.receiveType,
- receiveId: item.receiveId,
- receiveName: item.receiveName,
- avatar: item.avatar
- }
- forms.receives.push(temp)
- const temp2 = {
- id: item.receiveId,
- value: item.receiveName,
- avatar: item.avatar
- }
- if (item.receiveType === 'CLASS') {
- tempList.class.push(temp2)
- } else if (item.receiveType === 'STUDENT') {
- tempList.student.push(temp2)
- } else if (item.receiveType === 'TEACHER') {
- tempList.teacher.push(temp2)
- } else if (item.receiveType === 'SCHOOL') {
- tempList.school.push(temp2)
- }
- })
- forms.selectList = tempList
- const attachments = data.attachments || []
- const tempAtt: any = []
- attachments.forEach((item: any) => {
- tempAtt.push({
- url: item.imgUrl || item.imgMessage
- })
- })
- forms.attachments = tempAtt
- } catch (e: any) {
- //
- console.log(e, 'e')
- }
- }
- // 判断是否是查看
- const formDisabled = computed(() => forms.type === 'SEND')
- const onClose = async () => {
- try {
- forms.closeLoading = true
- await request.post('/api-school/imMessageBatchSending/remove', {
- requestType: 'form',
- hideLoading: false,
- data: {
- id: forms.id
- }
- })
- setTimeout(() => {
- showToast('撤销成功')
- }, 100)
- setTimeout(() => {
- router.replace('/mass-message')
- forms.closeLoading = false
- }, 1100)
- } catch {
- //
- forms.closeLoading = false
- }
- }
- onMounted(() => {
- getDetails()
- })
- return () => (
- <div class={styles['create-message']}>
- {/* <OHeader /> */}
- <CellGroup inset class={styles.cellGroup}>
- <Field
- inputAlign="right"
- label="发送方式"
- modelValue={sendType[forms.sendType]}
- placeholder="请选择发送方式"
- onClick={() => {
- if (formDisabled.value) return
- forms.sendStatus = true
- }}
- readonly
- isLink={!formDisabled.value}
- class={styles.inputForm}
- />
- {/* 定时发送才会有时间 */}
- {forms.sendType === 'SCHEDULED' && (
- <Field
- inputAlign="right"
- label="发送时间"
- modelValue={forms.sendTime}
- placeholder="请选择发送时间"
- onClick={() => {
- if (formDisabled.value) return
- forms.sendTimeStatus = true
- }}
- readonly
- isLink
- class={styles.inputForm}
- />
- )}
- <Cell title="发送内容">
- {{
- label: () => (
- <Field
- style={{ padding: '0', marginTop: '12px' }}
- placeholder="请输入发送内容"
- v-model={forms.textMessage}
- type="textarea"
- rows={3}
- showWordLimit
- maxlength={400}
- readonly={formDisabled.value}
- />
- )
- }}
- </Cell>
- <Cell title="上传附件">
- {{
- label: () => (
- <Uploader
- style={{ marginTop: '12px' }}
- v-model={forms.attachments}
- afterRead={afterRead}
- beforeRead={beforeRead}
- beforeDelete={beforeDelete}
- accept="image/*"
- maxCount={9}
- disabled={formDisabled.value}
- />
- )
- }}
- </Cell>
- <Field
- label="发送对象"
- readonly
- inputAlign="right"
- class={styles.sendObjPlaceholder}
- placeholder={formDisabled.value ? '' : '请选择发送对象'}
- isLink={!formDisabled.value}
- border={false}
- onClick={() => {
- if (formDisabled.value) return
- forms.selectStatus = true
- }}
- />
- {forms.receives.map((item: any) => {
- let img: any = iconStudent
- if (item.receiveType === 'CLASS') {
- img = iconJiaoFu
- } else if (item.receiveType === 'STUDENT') {
- img = iconStudent
- } else if (item.receiveType === 'TEACHER' || item.receiveType === 'SCHOOL') {
- img = iconTeacher
- }
- return (
- <Cell class={styles.receives} title={item.receiveName} center border={false}>
- {{
- icon: () => <Image class={styles.img} src={item.avatar || img} />,
- extra: () =>
- !formDisabled.value && (
- <Icon
- name="clear"
- color="#d7d7d7"
- size={20}
- onClick={() => {
- forms.delSelectItem = item
- forms.delStatus = true
- }}
- />
- )
- }}
- </Cell>
- )
- })}
- </CellGroup>
- <OSticky position="bottom">
- {forms.type === 'ADD' && (
- <div class={'btnGroup'}>
- <Button round block type="primary" onClick={onSubmit} disabled={forms.sureLoading}>
- 确认发送
- </Button>
- </div>
- )}
- {forms.type === 'WAIT' && (
- <div class={['btnGroup', 'btnMore']}>
- <Button round type="primary" onClick={onSubmit} disabled={forms.updateLoading}>
- 修改
- </Button>
- <Button round color="#64A9FF" onClick={onClose} disabled={forms.closeLoading}>
- 撤销
- </Button>
- </div>
- )}
- </OSticky>
- <ActionSheet
- v-model:show={forms.sendStatus}
- cancelText="取消"
- actions={
- [
- { name: '即时发送', value: 'IMMEDIATELY' },
- { name: '定时发送', value: 'SCHEDULED' }
- ] as any
- }
- onSelect={(val: any) => {
- console.log(val)
- forms.sendType = val.value
- forms.sendStatus = false
- }}
- />
- <Popup v-model:show={forms.sendTimeStatus} position="bottom" round>
- <PickerGroup
- title="发送时间"
- tabs={['选择日期', '选择时间']}
- onCancel={() => (forms.sendTimeStatus = false)}
- onConfirm={(val: any) => {
- const first = val[0].selectedValues.join('-')
- const second = val[1].selectedValues.join(':')
- forms.sendTime = dayjs(first + ' ' + second).format('YYYY-MM-DD HH:mm:ss')
- forms.sendTimeStatus = false
- }}
- >
- <DatePicker minDate={new Date()} maxDate={forms.maxDate} v-model={forms.currentDate} />
- <TimePicker v-model={forms.currentTime} />
- </PickerGroup>
- </Popup>
- <OPopup v-model:modelValue={forms.selectStatus}>
- <SelectSned
- v-model:selectList={forms.selectList}
- onClose={() => (forms.selectStatus = false)}
- onConfirm={(val: any) => {
- const classList = val.class || []
- const studentList = val.student || []
- const teacherList = val.teacher || []
- const schoolList = val.school || []
- const tempList: any = []
- classList.forEach((item: any) => {
- tempList.push({
- receiveType: 'CLASS',
- receiveId: item.id,
- receiveName: item.value,
- avatar: item.avatar
- })
- })
- studentList.forEach((item: any) => {
- tempList.push({
- receiveType: 'STUDENT',
- receiveId: item.id,
- receiveName: item.value,
- avatar: item.avatar
- })
- })
- teacherList.forEach((item: any) => {
- tempList.push({
- receiveType: 'TEACHER',
- receiveId: item.id,
- receiveName: item.value,
- avatar: item.avatar
- })
- })
- schoolList.forEach((item: any) => {
- tempList.push({
- receiveType: 'SCHOOL',
- receiveId: item.id,
- receiveName: item.value,
- avatar: item.avatar
- })
- })
- forms.receives = tempList
- }}
- />
- </OPopup>
- <ODialog
- v-model:show={forms.delStatus}
- showCancelButton
- message="您是否删除该数据"
- onConfirm={() => {
- const selectList = forms.selectList
- if (forms.delSelectItem.receiveType === 'CLASS') {
- const tempClass = selectList.class || []
- const sIndex = tempClass.findIndex(
- (item: any) => item.id === forms.delSelectItem.receiveId
- )
- tempClass.splice(sIndex, 1)
- } else if (forms.delSelectItem.receiveType === 'SCHOOL') {
- const tempSchool = selectList.school || []
- const sIndex = tempSchool.findIndex(
- (item: any) => item.id === forms.delSelectItem.receiveId
- )
- tempSchool.splice(sIndex, 1)
- } else if (forms.delSelectItem.receiveType === 'TEACHER') {
- const tempTeacher = selectList.teacher || []
- const sIndex = tempTeacher.findIndex(
- (item: any) => item.id === forms.delSelectItem.receiveId
- )
- tempTeacher.splice(sIndex, 1)
- } else if (forms.delSelectItem.receiveType === 'STUDENT') {
- const tempStudent = selectList.student || []
- const sIndex = tempStudent.findIndex(
- (item: any) => item.id === forms.delSelectItem.receiveId
- )
- tempStudent.splice(sIndex, 1)
- }
- forms.selectList = selectList
- console.log(forms.selectList, 'forms.selectList')
- const index = forms.receives.findIndex(
- (item: any) => item.receiveId === forms.delSelectItem.receiveId
- )
- forms.receives.splice(index, 1)
- }}
- />
- </div>
- )
- }
- })
|