import React, { useCallback, useEffect, useState } from 'react'; import style from '../../businessPlan/create/index.less' import { useAjax } from '@/Hook/useAjax'; import { welcomeMsgJobTypeApi } from '@/pages/weComTask/API/weMaterial/weMaterial'; import { addTaskApi, getCreateDetailsApi, updateTaskApi } from '@/pages/weComTask/API/businessPlan/create'; import { getBindMpListApi } from '@/pages/weComTask/API/corpUserAssign'; import { App, Button, Card, Empty, Form, Input, Popconfirm, Select, Space, Spin, Table } from 'antd'; import SelectCorpUserGroup from '../../corpUserManage/selectCorpUserGroup'; import { useNavigate } from 'react-router-dom'; import { toJS } from 'mobx'; import { inject, observer } from 'mobx-react'; import Strategy from './components/Strategy'; import Content from './components/content'; import { SaveOutlined, RedoOutlined, SearchOutlined, PlusOutlined } from '@ant-design/icons'; import SelectCorpUser from '../../corpUserManage/selectCorpUser'; import { monmentsColumns } from './tableConfig'; import SubmitModal from '../../businessPlan/create/submitModal'; import { groupBy } from '@/utils/utils'; export const DispatchMomentsTaskCreate = React.createContext(null); /** * 朋友圈创建 * @param param0 * @returns */ const MomentsCreatePage: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookListProps[], bookPlatForm: TASK_CREATE.BookPlatFormProps[] } } }> = ({ weComTaskStore }) => { /*************************************/ const navigate = useNavigate(); const { bookList, bookPlatForm } = toJS(weComTaskStore.data) const { message, modal } = App.useApp() const [settings, setSettings] = useState(); const [msgJobTypeList, setMsgJobTypeList] = useState<{ value: string, label: string }[]>([]) const [previewData, setPreviewData] = useState([]) const [previewDataOld, setPreviewDataOld] = useState([]) const [mpList, setMplist] = useState<{ label: string, value: number }[]>([]) const [previewContent, setPreviewContent] = useState<{ [x: string]: any }>({}) const [projectId, setProjectId] = useState() const [subVisible, setSubVisible] = useState(false) // 选择设置名称弹窗控制 const welcomeMsgJobType = useAjax(() => welcomeMsgJobTypeApi())//获取欢迎语类型 const addTask = useAjax((params) => addTaskApi(params)) const updateTask = useAjax((params) => updateTaskApi(params)) const getCreateDetails = useAjax((params) => getCreateDetailsApi(params)) const getBindMpList = useAjax(() => getBindMpListApi()) /*************************************/ useEffect(() => { const project = sessionStorage.getItem('MOMENTSTASKID') if (project) { const { id, isCopy } = JSON.parse(project) if (!isCopy) { setProjectId(id) } getCreateDetails.run(id).then(res => { sessionStorage.removeItem('MOMENTSTASKID') if (res?.data) { const { corpUsers, bizType, platform, templateProductId, momentCreateDTO } = res.data const corpUserGroups = corpUsers.map(item => { return { corpUsers: item.corpUserList.map(({ corpUserId, name, corpId, mpAccountId, mpAccountInfo, id }) => { return { id: id || (corpId + '_' + corpUserId), corpUserId, name, corpName: item.corpName, corpId, mpAccountId, mpAccountName: mpAccountInfo?.name } }) } }) const newSettings: TASK_MOMENTS_CREATE.SettingsProps = { bizType, platform: Number(platform) as any, templateProductId, corpUserGroups, massSendingStrategy: { momentSendName: momentCreateDTO?.momentSendName || '', strategyList: momentCreateDTO?.strategyList || [] } } setSettings(newSettings) let id = 1; const newPreviewContent: { [x: string]: any } = {}; corpUsers.forEach((cu) => { const momentSendContent = cu?.momentSendContent; (momentCreateDTO?.strategyList || []).forEach((str, s_index) => { const { taskDetail } = str taskDetail?.contentDTO?.forEach((_, c_index) => { const content = momentSendContent?.[s_index]?.[c_index] || {} newPreviewContent[id] = content id++; }) }); }) setPreviewContent(newPreviewContent) } }) } else { const task = localStorage.getItem('TASK_MOMENTS_CREATE') if (task) { setSettings(JSON.parse(task).settings) } } }, []) useEffect(() => { welcomeMsgJobType.run().then(res => { if (res?.data) { setMsgJobTypeList(Object.keys(res.data).map(key => ({ value: key, label: res.data[key] }))) } }) getBindMpList.run().then(res => { setMplist(res?.data?.map((item: any) => ({ label: item.name, value: item.id }))) }) }, []) // 预览 const preview = () => { const { bizType, platform, templateProductId, channel, massSendingStrategy, corpUserGroups } = settings if (!corpUserGroups || corpUserGroups?.length === 0) { message.error('请先选择客服号') return } if (!bizType) { message.error('请选择业务类型') return } if (!platform) { message.error('请选择书城') return } const list: any[] = [] if (!massSendingStrategy?.strategyList?.every((str, s_index) => { const { taskDetail, ...sdto } = str if (taskDetail?.contentDTO?.length) { return taskDetail?.contentDTO?.every((cd, c_index, row) => { if (cd?.attachmentList?.length || cd?.text?.content) { const mediaItem = JSON.parse(JSON.stringify(cd?.attachmentList || [])) if (cd?.text?.content) { mediaItem.push({ msgType: 'TASK_CONTENT_TEXT', textContent: cd?.text?.content }) } const linkData = [] const miniProgramData = [] const contentReactNode = mediaItem.map(item => { switch (item.msgType) { case 'TASK_CONTENT_LINK': linkData.push(item) return `链接` case 'TASK_STATUS_MINIPROGRAM': miniProgramData.push(item) return `小程序` case 'TASK_STATUS_FILE': return `文件` case 'TASK_STATUS_VIDEO': return `视频` case 'TASK_CONTENT_IMAGE': return `图片` case 'TASK_CONTENT_TEXT': return `文本` default: return `请联系管理员` } }) list.push({ bizType, platform, templateProductId, channel, taskName: settings?.massSendingStrategy?.momentSendName, strategyData: sdto, contentReactNode, content: cd, strategyIndex: s_index, contentIndex: c_index, linkData, miniProgramData, strategyRowSpan: c_index === 0 ? row.length : 0, }) return true } else { message.error(`策略:${str?.strategyName}请填写发送内容`) return false } }) } else { message.error(`策略:${str?.strategyName}请填写发送内容`) return false } })) { return } let id = 1 const newPreviewData = corpUserGroups.reduce((pre, cur, index) => { return pre.concat(...list.map((item, i) => { return { ...item, id: id++, corpUserGroupName: `客服组${index + 1}`, corpUsers: cur.corpUsers, mpAccountId: cur.corpUsers?.[0]?.mpAccountId, mpAccountName: cur.corpUsers?.[0]?.mpAccountName, corpUserStrList: cur.corpUsers?.map(item => item.corpId + '_' + item.corpUserId), groupIndex: index, groupRowSpan: i === 0 ? list.length : 0, // 用于表格合并 } })) }, []) console.log(newPreviewData) setPreviewData(newPreviewData) setPreviewDataOld(newPreviewData) } const setTaskName = () => { if (previewDataOld.every((item, index) => { if ((item?.linkData?.length > 0 ? previewContent?.[index + 1]?.linkUrl : true) && (item?.miniProgramData?.length > 0 ? (previewContent?.[index + 1]?.miniprogramAppid && previewContent?.[index + 1]?.miniprogramPage) : true)) { return true } else { message.error('请补充图文或者小程序内容') return false } })) { setSubVisible(true) } } const onSubmit = (values: any) => { const groupData = groupBy(previewDataOld, (item) => item['groupIndex'], true); const { bizType, platform, templateProductId, corpUserGroups, massSendingStrategy } = settings const params = { ...values, bizType, platform, templateProductId, corpUsers: corpUserGroups?.map((item, index) => { const params: { [x: string]: any } = { corpId: item.corpUsers[0].corpId, corpUserIds: item.corpUsers.map(item => item.corpUserId) } const data = groupData[index] || [] const momentSendContent: any[] = [] data.forEach(d => { const { strategyIndex, contentIndex, id } = d if (!momentSendContent[strategyIndex]) momentSendContent[strategyIndex] = []; momentSendContent[strategyIndex][contentIndex] = previewContent?.[id] || {}; }) params.momentSendContent = momentSendContent return params }) } params.momentCreateDTO = { momentSendName: massSendingStrategy.momentSendName, strategyList: massSendingStrategy?.strategyList } if (projectId) { params.projectId = projectId updateTask.run(params).then(res => { if (res?.data) { message.success('修改提交成功') setProjectId(undefined) sessionStorage.setItem('CAMPCORP', values?.projectName) navigate('/weComTask/moments/taskList') } }) } else { addTask.run(params).then(res => { if (res?.data) { modal.success({ content: '任务提交成功', styles: { body: { fontWeight: 700 } }, okText: '跳转任务列表', closable: true, onOk: () => { sessionStorage.setItem('CAMPCORP', values?.projectName) navigate('/weComTask/moments/taskList') }, onCancel: () => { setSubVisible(false) } }) } }) } } // 重置表格 const onPreviewReset = () => { setPreviewData([]) setPreviewDataOld([]) setPreviewContent({}) } const severBd = () => { localStorage.setItem('TASK_MOMENTS_CREATE', JSON.stringify({ settings })) message.success('存储成功') } const tableSearch = useCallback((values) => { console.log(values) if (values?.mpAccountIds?.length > 0 || values?.corpUserIds?.length > 0) { let newPreviewData: TASK_MOMENTS_CREATE.previewDataProps = [] const corpUserStrList = values?.corpUserIds?.map(item => item.corpId + '_' + item.corpUserId) if (previewDataOld?.length > 0) { newPreviewData = previewDataOld.filter(item => ( (values?.mpAccountIds?.length > 0 ? values.mpAccountIds.includes(item?.mpAccountId) : true) && (corpUserStrList?.length > 0 ? item.corpUserStrList.some(str => corpUserStrList.includes(str)) : true) )).map(item => ({ ...item, userRowSpan: 1, strategyRowSpan: 1, sendDataRowSpan: 1 })) } setPreviewData(newPreviewData) } else { setPreviewData(previewDataOld) } }, [previewDataOld, previewData]) return
{projectId ? getCreateDetails?.data?.data?.projectName + '任务编辑' : ''}配置区} className={`${style.card} ${style.config}`}> { setSettings({ ...settings, corpUserGroups: corpUserGroups.map(item => { return { ...item, corpUsers: item.corpUsers.map((item: any) => { const { corpUserId, name, corpName, corpId, mpAccountId, mpAccountInfo, id } = item return { corpUserId, name, corpName, corpId, mpAccountId, mpAccountName: mpAccountInfo?.name || item?.mpAccountName, id } }) } }) }) onPreviewReset() }} /> ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase()) } value={settings?.platform} onChange={(e) => { setSettings({ ...settings, platform: e, templateProductId: undefined }) onPreviewReset() }} options={bookPlatForm.map(item => ({ value: item.id, label: item.platformName }))} /> { setSettings({ ...settings, channel: e.target.value }) onPreviewReset() }} /> : undefined}
{/* 朋友圈策略 */} {/* 朋友圈内容 */}
{ setSettings(undefined) setPreviewData([]) setPreviewDataOld([]) localStorage.removeItem('TASK_MOMENTS_CREATE') }} >
0 ? : undefined} > {previewDataOld?.length > 0 ?
公众号} name="mpAccountIds">