wjx 1 місяць тому
батько
коміт
3691ccce44
39 змінених файлів з 166 додано та 368 видалено
  1. 5 3
      src/pages/weComTask/components/groupChatGroups/index.tsx
  2. 4 3
      src/pages/weComTask/components/materialMould/contentBox.tsx
  3. 10 8
      src/pages/weComTask/components/materialMould/index.tsx
  4. 5 4
      src/pages/weComTask/components/mindTags/index.tsx
  5. 4 3
      src/pages/weComTask/page/businessPlan/create/components/massSending/content.tsx
  6. 6 4
      src/pages/weComTask/page/businessPlan/create/components/massSending/index.tsx
  7. 3 1
      src/pages/weComTask/page/businessPlan/create/components/massSending/materialNoTextMould.tsx
  8. 2 1
      src/pages/weComTask/page/businessPlan/create/components/massSending/settingsMassSending.tsx
  9. 5 268
      src/pages/weComTask/page/businessPlan/create/components/welcome/index.tsx
  10. 5 5
      src/pages/weComTask/page/businessPlan/create/components/welcome/settingsWelcome.tsx
  11. 9 3
      src/pages/weComTask/page/businessPlan/create/index.tsx
  12. 4 0
      src/pages/weComTask/page/businessPlan/create/typings.d.ts
  13. 2 2
      src/pages/weComTask/page/businessPlan/taskList/index.tsx
  14. 3 2
      src/pages/weComTask/page/businessPlan/taskList/tableConfig.tsx
  15. 5 3
      src/pages/weComTask/page/corpUserManage/selectCorpUserGroup.tsx
  16. 3 1
      src/pages/weComTask/page/corpUserManage/selectCorpUserGroupModal.tsx
  17. 1 0
      src/pages/weComTask/page/groupChat/create/typings.d.ts
  18. 3 1
      src/pages/weComTask/page/groupChatSend/official/create/components/SelectMpCorp/index.tsx
  19. 4 3
      src/pages/weComTask/page/groupChatSend/official/create/components/Strategy/index.tsx
  20. 4 3
      src/pages/weComTask/page/groupChatSend/official/create/components/content/index.tsx
  21. 4 3
      src/pages/weComTask/page/groupChatSend/official/create/components/content/settingsContent.tsx
  22. 18 12
      src/pages/weComTask/page/groupChatSend/official/create/index.tsx
  23. 2 2
      src/pages/weComTask/page/groupChatSend/official/taskList/index.tsx
  24. 2 1
      src/pages/weComTask/page/groupChatSend/official/taskList/tableConfig.tsx
  25. 1 0
      src/pages/weComTask/page/groupChatSend/official/typings.d.ts
  26. 4 3
      src/pages/weComTask/page/groupChatSend/robot/create/components/Strategy/index.tsx
  27. 4 3
      src/pages/weComTask/page/groupChatSend/robot/create/components/content/index.tsx
  28. 4 3
      src/pages/weComTask/page/groupChatSend/robot/create/components/content/settingsContent.tsx
  29. 11 7
      src/pages/weComTask/page/groupChatSend/robot/create/index.tsx
  30. 2 2
      src/pages/weComTask/page/groupChatSend/robot/taskList/index.tsx
  31. 2 1
      src/pages/weComTask/page/groupChatSend/robot/taskList/tableConfig.tsx
  32. 1 0
      src/pages/weComTask/page/groupChatSend/robot/typings.d.ts
  33. 4 3
      src/pages/weComTask/page/moments/create/components/Strategy/index.tsx
  34. 2 1
      src/pages/weComTask/page/moments/create/components/content/index.tsx
  35. 4 3
      src/pages/weComTask/page/moments/create/components/content/settingsContent.tsx
  36. 9 3
      src/pages/weComTask/page/moments/create/index.tsx
  37. 1 0
      src/pages/weComTask/page/moments/create/typings.d.ts
  38. 2 2
      src/pages/weComTask/page/moments/taskList/index.tsx
  39. 2 1
      src/pages/weComTask/page/moments/taskList/tableConfig.tsx

+ 5 - 3
src/pages/weComTask/components/groupChatGroups/index.tsx

@@ -11,6 +11,7 @@ interface GroupChatGroupsProps {
     value?: OFFICIAL_CHAT_CREATE.GroupsProps[];
     onChange?: (value?: OFFICIAL_CHAT_CREATE.GroupsProps[]) => void;
     placeholder?: React.ReactNode
+    disabled?: boolean
 }
 
 /**
@@ -18,7 +19,7 @@ interface GroupChatGroupsProps {
  * @param param0 
  * @returns 
  */
-const GroupChatGroups: React.FC<GroupChatGroupsProps> = ({ corpList, mpList, value, onChange, placeholder }) => {
+const GroupChatGroups: React.FC<GroupChatGroupsProps> = ({ corpList, mpList, value, onChange, placeholder, disabled }) => {
 
     /************************************************************/
     const { token } = useNewToken()
@@ -41,7 +42,7 @@ const GroupChatGroups: React.FC<GroupChatGroupsProps> = ({ corpList, mpList, val
             <div className='selectCorpUserContent'>
                 {(value && value?.length > 0) ? <>
                     <Tag
-                        closable
+                        closable={!disabled}
                         onClose={(e) => {
                             e.preventDefault();
                             const newData = value?.filter((_, i) => i !== 0)
@@ -55,7 +56,7 @@ const GroupChatGroups: React.FC<GroupChatGroupsProps> = ({ corpList, mpList, val
                         title={<span style={{ color: '#000' }}>
                             {value?.filter((_, index) => index !== 0)?.map((item, index) => <Tag
                                 key={index}
-                                closable
+                                closable={!disabled}
                                 onClose={(e) => {
                                     e.stopPropagation()
                                     const newData = value?.filter((_, i) => i !== index + 1)
@@ -76,6 +77,7 @@ const GroupChatGroups: React.FC<GroupChatGroupsProps> = ({ corpList, mpList, val
             mpList={mpList}
             visible={visible}
             group={value}
+            disabled={disabled}
             onChange={(group) => {
                 onChange?.(group)
                 setVisible(false)

+ 4 - 3
src/pages/weComTask/components/materialMould/contentBox.tsx

@@ -21,13 +21,14 @@ interface Props {
     textCount?: number,  // 可选文案数量
     dataLength: number
     mediaSize?: MediaSize
+    disabledAdd?: boolean
 }
 // 
 /**
  * 素材库使用内容模板
  * @returns 
  */
-const ContentBox: React.FC<Props> = ({ data, onChange, noShowType, dataLength, mediaSize, textCount }) => {
+const ContentBox: React.FC<Props> = ({ data, onChange, noShowType, dataLength, mediaSize, textCount, disabledAdd }) => {
 
     /****************************/
     const { token } = useNewToken()
@@ -72,7 +73,7 @@ const ContentBox: React.FC<Props> = ({ data, onChange, noShowType, dataLength, m
                 </div>
                 <div style={{ opacity: hover === index ? 1 : 0 }} className={style.right}>
                     <Space wrap>
-                        {data.length < dataLength && <Popover
+                        {(data.length < dataLength && !disabledAdd) && <Popover
                             placement="topRight"
                             content={<Space wrap>
                                 {!(noShowType?.some(i => i === 'text')) && !textCount && <Button disabled={data.length === dataLength} onClick={() => { 
@@ -107,7 +108,7 @@ const ContentBox: React.FC<Props> = ({ data, onChange, noShowType, dataLength, m
                                 clickHandle(url, index, 'edit', item?.mediaType, file)
                             }}
                         /> : <Button size="small" onClick={() => clickHandle(item, index, 'edit', item?.mediaType)}><EditOutlined /></Button>}
-                        <Button size="small" onClick={() => clickHandle(item, index, 'del', item?.mediaType)}><DeleteOutlined /></Button>
+                        {!disabledAdd && <Button size="small" onClick={() => clickHandle(item, index, 'del', item?.mediaType)}><DeleteOutlined /></Button>}
                         {data.length > 1 && <>
                             {data.length !== index + 1 && <>
                                 <Button size="small" onClick={() => clickHandle(item, index, 'down', item?.mediaType)}><DownOutlined /></Button>

+ 10 - 8
src/pages/weComTask/components/materialMould/index.tsx

@@ -25,12 +25,13 @@ interface Props {
     type?: 'text' | 'video' | 'file' | 'link' | 'voice' | 'miniprogram' | 'image',//只能选择的素材
     textCount?: number,  // 可选文案数量
     mediaSize?: MediaSize
+    disabledAdd?: boolean
 }
 /**
  * 内容组件
  * @returns 
  */
-const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, noShowType, type = undefined, mediaSize, posiType, textCount }) => {
+const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, noShowType, type = undefined, mediaSize, posiType, textCount, disabledAdd }) => {
     const [dataLength, setDataLength] = useState(dataNum || 9)
     /*******************************/
     const [openText, setOpenText] = useState(false)
@@ -60,8 +61,8 @@ const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, n
             header={null}
             footer={<Space wrap>
                 <Typography.Text>{data.length}/{dataLength}</Typography.Text>
-                {!(noShowType?.some(i => i === 'text')) && !textCount && <Button disabled={data.length === dataLength} onClick={() => { setOpenText(true); setSubscript(data.length); setIsInsert(false) }}>文字</Button>}
-                {!(noShowType?.some(i => i === 'image')) && < UploadButton text="图片" mediaSize={mediaSize} disabled={data.length === dataLength} type='image' onChange={async (url, file) => {
+                {!(noShowType?.some(i => i === 'text')) && !textCount && <Button disabled={data.length === dataLength || disabledAdd} onClick={() => { setOpenText(true); setSubscript(data.length); setIsInsert(false) }}>文字</Button>}
+                {!(noShowType?.some(i => i === 'image')) && < UploadButton text="图片" mediaSize={mediaSize} disabled={data.length === dataLength || disabledAdd} type='image' onChange={async (url, file) => {
                     let NewData: MediaContentProps[] = JSON.parse(JSON.stringify(data))
                     let imgData = await getImgSize(file as RcFile)
                     NewData[data.length] = {
@@ -75,7 +76,7 @@ const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, n
                     setData(NewData)
                     onChange?.(NewData)
                 }} />}
-                {!(noShowType?.some(i => i === 'video')) && <UploadButton text="视频" mediaSize={mediaSize} disabled={data.length === dataLength} type='video' tooltip="发送视频传送比较耗时,如果发送消息间隔设置又较短,可能会出现消息乱序,所以视频尽量压缩小一点" onChange={async (url, file) => {
+                {!(noShowType?.some(i => i === 'video')) && <UploadButton text="视频" mediaSize={mediaSize} disabled={data.length === dataLength || disabledAdd} type='video' tooltip="发送视频传送比较耗时,如果发送消息间隔设置又较短,可能会出现消息乱序,所以视频尽量压缩小一点" onChange={async (url, file) => {
                     let NewData: MediaContentProps[] = JSON.parse(JSON.stringify(data))
                     let videoInfo: any = await videoMessage([file as RcFile])
                     NewData[data.length] = {
@@ -90,7 +91,7 @@ const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, n
                     setData(NewData)
                     onChange?.(NewData)
                 }} />}
-                {!(noShowType?.some(i => i === 'file')) && <UploadButton mediaSize={mediaSize} text="文件" disabled={data.length === dataLength} type='file' onChange={(url, file, name) => {
+                {!(noShowType?.some(i => i === 'file')) && <UploadButton mediaSize={mediaSize} text="文件" disabled={data.length === dataLength || disabledAdd} type='file' onChange={(url, file, name) => {
                     let NewData: MediaContentProps[] = JSON.parse(JSON.stringify(data))
                     NewData[data.length] = {
                         mediaType: 'file',
@@ -102,7 +103,7 @@ const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, n
                     setData(NewData)
                     onChange?.(NewData)
                 }} />}
-                {!(noShowType?.some(i => i === 'link')) && <Button disabled={data.length === dataLength} onClick={() => { setOpenLink(true); setSubscript(data.length); setIsInsert(false) }}>链接</Button>}
+                {!(noShowType?.some(i => i === 'link')) && <Button disabled={data.length === dataLength || disabledAdd} onClick={() => { setOpenLink(true); setSubscript(data.length); setIsInsert(false) }}>链接</Button>}
                 {/* {!(noShowType?.some(i => i === 'voice')) && <UploadButton mediaSize={mediaSize} text="语音" disabled={data.length === dataLength} type='voice' onChange={async (url, file) => {
                     let NewData: MediaContentProps[] = JSON.parse(JSON.stringify(data))
                     let times = await getAudioTime(file as RcFile)
@@ -116,8 +117,8 @@ const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, n
                     setData(NewData)
                     onChange?.(NewData)
                 }} />} */}
-                {!(noShowType?.some(i => i === 'miniprogram')) && <Button disabled={data.length === dataLength} onClick={() => { setOpenMiniprogram(true); setSubscript(data.length); setIsInsert(false) }}>小程序</Button>}
-                {!(noShowType?.some(i => i === 'sck')) && <Button disabled={data.length === dataLength} onClick={() => { setOpenMateria(true); setSubscript(data.length); setIsInsert(false) }}>素材库</Button>}
+                {!(noShowType?.some(i => i === 'miniprogram')) && <Button disabled={data.length === dataLength || disabledAdd} onClick={() => { setOpenMiniprogram(true); setSubscript(data.length); setIsInsert(false) }}>小程序</Button>}
+                {!(noShowType?.some(i => i === 'sck')) && <Button disabled={data.length === dataLength || disabledAdd} onClick={() => { setOpenMateria(true); setSubscript(data.length); setIsInsert(false) }}>素材库</Button>}
             </Space>}
             bordered
             dataSource={['']}
@@ -130,6 +131,7 @@ const MaterialMould: React.FC<Props> = ({ value, onChange, boxHeight, dataNum, n
                             data={data}
                             dataLength={dataLength}
                             textCount={textCount}
+                            disabledAdd={disabledAdd}
                             onChange={async (item, index, type, mediaType, file, name) => {
                                 switch (type) {
                                     case 'add':

+ 5 - 4
src/pages/weComTask/components/mindTags/index.tsx

@@ -12,6 +12,7 @@ interface Props {
     value?: { [x: string]: any }
     onChange?: (value: { [x: string]: any }) => void
     id?: any
+    disabled?: boolean
 }
 
 /**
@@ -19,7 +20,7 @@ interface Props {
  * @param param0 
  * @returns 
  */
-const MindTags: React.FC<Props> = ({ value, onChange, id, isSetTag }) => {
+const MindTags: React.FC<Props> = ({ value, onChange, id, isSetTag, disabled }) => {
 
     /*****************************************/
     const { bookPlatForm, bookList } = toJS(weComTaskStore.data)
@@ -84,7 +85,7 @@ const MindTags: React.FC<Props> = ({ value, onChange, id, isSetTag }) => {
                                         const data = Object.keys(newValue).length === 0 ? undefined : newValue
                                         setMindTagValue(data)
                                         onChange?.(data)
-                                    }} checked={item.value === mindTagValue?.['business']}>{item.label}</Checkbox>
+                                    }} checked={item.value === mindTagValue?.['business']} disabled={disabled}>{item.label}</Checkbox>
                                 </div>)}
                             </div>
                         </div>
@@ -111,7 +112,7 @@ const MindTags: React.FC<Props> = ({ value, onChange, id, isSetTag }) => {
                                         const data = Object.keys(newValue).length === 0 ? undefined : newValue
                                         setMindTagValue(data)
                                         onChange?.(data)
-                                    }} checked={item.id === mindTagValue?.['bookCity']}>{item.platformName}</Checkbox>
+                                    }} checked={item.id === mindTagValue?.['bookCity']} disabled={disabled}>{item.platformName}</Checkbox>
                                 </div>)}
                             </div>
                         </div>
@@ -141,7 +142,7 @@ const MindTags: React.FC<Props> = ({ value, onChange, id, isSetTag }) => {
                                         const data = Object.keys(newValue).length === 0 ? undefined : newValue
                                         setMindTagValue(data)
                                         onChange?.(data)
-                                    }} checked={item.id === mindTagValue?.['product']}>{item.bookName}</Checkbox>
+                                    }} checked={item.id === mindTagValue?.['product']} disabled={disabled}>{item.bookName}</Checkbox>
                                 </div>)}
                             </div>
                         </div>

+ 4 - 3
src/pages/weComTask/page/businessPlan/create/components/massSending/content.tsx

@@ -13,7 +13,7 @@ import FilterUserTooltip from '@/pages/weComTask/components/filterUser/filterUse
  * @param param0 
  * @returns 
  */
-const Content = forwardRef(({ massSendingStrategy, value, onChange, bookCityList }: TASK_CREATE.ContentProps, ref: React.ForwardedRef<{ handleOk: (type: string) => void }>) => {
+const Content = forwardRef(({ massSendingStrategy, value, onChange, bookCityList, isEditSc }: TASK_CREATE.ContentProps, ref: React.ForwardedRef<{ handleOk: (type: string) => void }>) => {
 
     /****************************************/
     const { message } = App.useApp()
@@ -208,6 +208,7 @@ const Content = forwardRef(({ massSendingStrategy, value, onChange, bookCityList
                                                                                         onClick={() => remove(index)}
                                                                                         icon={<MinusOutlined />}
                                                                                         size='small'
+                                                                                        disabled={isEditSc}
                                                                                     >
                                                                                         移除内容
                                                                                     </Button>}
@@ -224,12 +225,12 @@ const Content = forwardRef(({ massSendingStrategy, value, onChange, bookCityList
                                                                                         }
                                                                                     }]}
                                                                                 >
-                                                                                    <MaterialNoTextMould />
+                                                                                    <MaterialNoTextMould disabledAdd={isEditSc}/>
                                                                                 </Form.Item>
                                                                             </div>
                                                                         })}
                                                                         <Form.Item noStyle>
-                                                                            <Button type="dashed" onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
+                                                                            <Button type="dashed" disabled={isEditSc} onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
                                                                                 新增内容
                                                                             </Button>
                                                                         </Form.Item>

+ 6 - 4
src/pages/weComTask/page/businessPlan/create/components/massSending/index.tsx

@@ -17,7 +17,7 @@ const MassSending: React.FC = () => {
     /***************************************************/
     const { token } = useNewToken()
     const { message } = App.useApp()
-    const { setSettings, settings, bookPlatForm, bookList, onPreviewReset } = useContext(DispatchTaskCreate)!;
+    const { setSettings, settings, bookPlatForm, isEditSc, onPreviewReset } = useContext(DispatchTaskCreate)!;
 
     const [newVisible, setNewVisible] = React.useState(false);
     const [createType, setCreateType] = useState<'STRATEGY' | 'CONTENT'>()
@@ -40,8 +40,9 @@ const MassSending: React.FC = () => {
                 <div className={style.detail_footer}>
                     <Button
                         type="link"
-                        style={{ padding: 0, fontSize: 12, color: token.colorPrimary }}
+                        style={{ padding: 0, fontSize: 12 }}
                         size='small'
+                        disabled={isEditSc}
                         onClick={() => {
                             setNewVisible(true);
                             setCreateType('STRATEGY')
@@ -52,7 +53,7 @@ const MassSending: React.FC = () => {
             <div className={`${style.settingsBody_content_col}`} style={{ width: '50%' }}>
                 <div className={style.title}>
                     <span></span>
-                    {(settings?.massSendingStrategy && Object.keys(settings?.massSendingStrategy).length > 0) && <Space>
+                    {(settings?.massSendingStrategy && !isEditSc && Object.keys(settings?.massSendingStrategy).length > 0) && <Space>
                         <Button
                             type="link"
                             danger
@@ -87,7 +88,7 @@ const MassSending: React.FC = () => {
                 <div className={style.detail_footer}>
                     <Button
                         type="link"
-                        style={{ padding: 0, fontSize: 12, color: token.colorPrimary }}
+                        style={{ padding: 0, fontSize: 12 }}
                         size='small'
                         onClick={() => {
                             if (!(settings?.massSendingStrategy && Object.keys(settings?.massSendingStrategy))) {
@@ -103,6 +104,7 @@ const MassSending: React.FC = () => {
 
         {/* 模板配置 */}
         {newVisible && <SettingsMassSending
+            isEditSc={isEditSc}
             visible={newVisible}
             createType={createType}
             bookCityList={bookPlatForm?.map(item => ({ label: item.platformName, value: item.platformKey, id: item.id }))}

+ 3 - 1
src/pages/weComTask/page/businessPlan/create/components/massSending/materialNoTextMould.tsx

@@ -6,12 +6,13 @@ import MaterialMould from "@/pages/weComTask/components/materialMould"
 interface Props {
     value?: TASK_CREATE.ContentDTOProps
     onChange?: (value?: TASK_CREATE.ContentDTOProps) => void
+    disabledAdd?: boolean
 }
 /**
  * 群发文本设置
  * @returns 
  */
-const MaterialNoTextMould: React.FC<Props> = ({ onChange, value }) => {
+const MaterialNoTextMould: React.FC<Props> = ({ onChange, value, disabledAdd }) => {
 
     /***************************************/
     const [textContent, setTextContent] = useState<string>()
@@ -104,6 +105,7 @@ const MaterialNoTextMould: React.FC<Props> = ({ onChange, value }) => {
         />
         <MaterialMould
             posiType="QF"
+            disabledAdd={disabledAdd}
             noShowType={['voice']}
             textCount={1}
             value={attachmentList}

+ 2 - 1
src/pages/weComTask/page/businessPlan/create/components/massSending/settingsMassSending.tsx

@@ -9,7 +9,7 @@ import Content from './content';
  * @param param0 
  * @returns 
  */
-const SettingsMassSending: React.FC<TASK_CREATE.MassSendingProps<any>> = ({ bookCityList, value: { massSendingContent, massSendingStrategy }, createType, onChange, visible, onClose }) => {
+const SettingsMassSending: React.FC<TASK_CREATE.MassSendingProps<any>> = ({ bookCityList, value: { massSendingContent, massSendingStrategy }, createType, onChange, visible, onClose, isEditSc }) => {
 
     /****************************************/
     const { message } = App.useApp()
@@ -84,6 +84,7 @@ const SettingsMassSending: React.FC<TASK_CREATE.MassSendingProps<any>> = ({ book
             }}
         /> : <Content
             ref={ref1}
+            isEditSc={isEditSc}
             bookCityList={bookCityList}
             massSendingStrategy={massSendingStrategy}
             value={massSendingContent}

+ 5 - 268
src/pages/weComTask/page/businessPlan/create/components/welcome/index.tsx

@@ -1,14 +1,8 @@
 import React, { useContext, useState } from 'react';
 import style from '../../index.less';
-import { App, Button, Empty, Space, Upload } from 'antd';
+import { Button, Empty, Space } from 'antd';
 import SettingsWelcome from './settingsWelcome';
-import { businessPlanData, headerJsMustStyle, headerJsStyle, welcomeContentData } from '../../const';
 import useNewToken from '@/Hook/useNewToken';
-import { saveAs } from 'file-saver';
-import ExcelJS from 'exceljs';
-import dayjs from 'dayjs';
-import { RcFile } from 'antd/es/upload';
-import { groupBy, readFileAsBuffer } from '@/utils/utils';
 import PreviewWelcome from './previewWelcome';
 import { DispatchTaskCreate } from '../..';
 
@@ -19,276 +13,18 @@ import { DispatchTaskCreate } from '../..';
 const Welcome: React.FC = () => {
 
     /***************************************************/
-    const { message } = App.useApp()
     const { token } = useNewToken()
-    const { setSettings, settings, bookPlatForm, bookList, onPreviewReset } = useContext(DispatchTaskCreate)!;
-    const { welcomeName, welcomeMsgTagDTO, sendMode, mediaContentList } = settings?.welcomeMsgTemplateDTO || {}
+    const { setSettings, settings, bookPlatForm, bookList, onPreviewReset, isEditSc } = useContext(DispatchTaskCreate)!;
     const [newVisible, setNewVisible] = useState<boolean>(false);
-    const [downloadLoading, setDownloadLoading] = useState<boolean>(false)
     /***************************************************/
 
-    const exportExcel = async () => {
-        setDownloadLoading(true)
-        const workbook = new ExcelJS.Workbook();  // 创建空工作簿:ml-citation{ref="1,7" data="citationList"}
-        const worksheet = workbook.addWorksheet('Sheet1');  // 添加工作表:ml-citation{ref="1,8" data="citationList"}
-        const headerRowIndex = 1; // 表头行索引
-
-        // 表头冻结
-        worksheet.views = [
-            {
-                state: 'frozen',
-                ySplit: 1,          // 冻结行数
-                topLeftCell: 'A2'   // 冻结后可见区域的起始单元格
-            }
-        ];
-
-        // 设置全局禁止
-        worksheet.protect('yourPwd', {
-            deleteColumns: false,       // 禁止删除列
-            sort: false,                // 禁止排序
-            autoFilter: false           // 禁止自动筛选:ml-citation{ref="5,7" data="citationList"}
-        });
-
-        worksheet.columns = [
-            { key: 'A1', width: 20, header: '账号' },
-            { key: 'A2', width: 20, header: '欢迎语标题' },
-            { key: 'A3', width: 30, header: '智能标签' },
-            { key: 'A4', width: 18, header: '内容组发送模式' },
-            { key: 'A5', width: 70, header: '欢迎语内容' },
-            { key: 'A6', width: 30, header: '图文链接' },
-            { key: 'A7', width: 30, header: '小程序APPID' },
-            { key: 'A8', width: 30, header: '小程序路径' },
-        ];
-
-        // 表头设置样式
-        worksheet.getRow(headerRowIndex).height = 30;
-        Array(8).fill(0).forEach((_, index) => {
-            const col = index + 1; // 从第1列开始
-            // 设置表头字体样式
-            worksheet.getCell(headerRowIndex, col).style = index >= 5 ? headerJsMustStyle as any : headerJsStyle as any;
-        })
-
-        const corpUserListLength = settings?.corpUsers?.length || 0;
-        const mediaContentLength = mediaContentList?.length || 0;
-        // 合并单元集合
-        const mergeCells = [];
-        // 解放填写限制区域
-        const unLockArea = [];
-        let dataRow = 1
-        // 数据内容
-        settings?.corpUsers?.forEach((item, i) => {
-            const startRow = 2 + (i * mediaContentLength)
-            const endRow = startRow + mediaContentLength - 1
-            mergeCells.push({
-                startRow,
-                startColumn: 1,
-                endRow,
-                endColumn: 1,
-            })
-            mergeCells.push({
-                startRow,
-                startColumn: 2,
-                endRow,
-                endColumn: 2,
-            })
-            mergeCells.push({
-                startRow,
-                startColumn: 3,
-                endRow,
-                endColumn: 3,
-            })
-            mergeCells.push({
-                startRow,
-                startColumn: 4,
-                endRow,
-                endColumn: 4,
-            })
-
-            mediaContentList?.forEach((mediaItem, index) => {
-                let linkPlaceholder = '<空>'
-                let miniprogramPlaceholder = '<空>'
-
-                const contentRichText = mediaItem.map(item => {
-                    switch (item.mediaType) {
-                        case 'link':
-                            linkPlaceholder = '请输入'
-                            return { text: `链接:${item.linkTitle}_${item.linkDesc}\n`, font: { color: { argb: "FF0000" } } }
-                        case 'miniprogram':
-                            miniprogramPlaceholder = '请输入'
-                            return { text: `小程序:${item.miniprogramTitle}\n`, font: { color: { argb: "FF0000" } } }
-                        case 'file':
-                            return { text: `文件:${item.fileUrl}\n` }
-                        case 'video':
-                            return { text: `视频:${item.videoUrl}\n` }
-                        case 'image':
-                            return { text: `图片:${item.imageUrl}\n` }
-                        case 'text':
-                            return { text: `文本:${item.textContent}\n` }
-                        default:
-                            return { text: `该类型没有请联系管理员` }
-                    }
-                })
-
-                const richText = {
-                    richText: [
-                        { text: `内容${index + 1}:\n` },
-                        ...contentRichText
-                    ]
-                }
-                if (linkPlaceholder !== '<空>') {
-                    unLockArea.push(`${dataRow}_6`)
-                }
-                if (miniprogramPlaceholder !== '<空>') {
-                    unLockArea.push(`${dataRow}_7`, `${dataRow}_8`)
-                }
-                console.log(dataRow)
-                dataRow++;
-                worksheet.addRow([
-                    // 账号
-                    `${item.name}(ID:${item.corpUserId})`,
-                    // 欢迎语标题
-                    `${welcomeName}`,
-                    // 智能标签
-                    `${welcomeMsgTagDTO?.business ? `业务:${businessPlanData.find(i => i.value === welcomeMsgTagDTO.business)?.label}` : '--'}\r\n${welcomeMsgTagDTO?.bookCity ? `书城;${bookPlatForm.find(i => i.id === welcomeMsgTagDTO.bookCity)?.platformName}` : '--'}\r\n${welcomeMsgTagDTO?.product ? `产品:${bookList.find(i => i.id === welcomeMsgTagDTO.product)?.bookName}` : '--'}`,
-                    // 内容组发送模式
-                    welcomeContentData.find(i => i.value === sendMode)?.label,
-                    // 欢迎语内容
-                    richText,
-                    // 图文链接
-                    linkPlaceholder,
-                    // 小程序APPID
-                    miniprogramPlaceholder,
-                    // 小程序路径
-                    miniprogramPlaceholder
-                ])
-            })
-        })
-        Array(corpUserListLength * mediaContentLength).fill(0).forEach((_, index) => {
-            worksheet.getRow(index + headerRowIndex + 1).height = 100; // 设置行高
-            worksheet.getRow(index + headerRowIndex + 1).alignment = {
-                vertical: 'middle',
-                wrapText: true
-            }
-            // 分组设置背景色
-            if (index % (mediaContentLength * 2) < mediaContentLength) {
-                worksheet.getRow(index + headerRowIndex + 1).eachCell(function (cell, rowNumber) {
-                    if (rowNumber <= 8) {
-                        cell.border = {
-                            top: { style: 'thin', color: { argb: 'D4D4D4' } },
-                            bottom: { style: 'thin', color: { argb: 'D4D4D4' } },
-                            left: { style: 'thin', color: { argb: 'D4D4D4' } },
-                            right: { style: 'thin', color: { argb: 'D4D4D4' } }
-                        }
-                        cell.fill = {
-                            type: 'pattern',
-                            pattern: 'solid',
-                            fgColor: { argb: 'f0f0f0' }
-                        }
-                    }
-                })
-            } else {
-                worksheet.getRow(index + headerRowIndex + 1).eachCell(function (cell, rowNumber) {
-                    if (rowNumber <= 8) {
-                        cell.border = {
-                            top: { style: 'thin', color: { argb: 'D4D4D4' } },
-                            bottom: { style: 'thin', color: { argb: 'D4D4D4' } },
-                            left: { style: 'thin', color: { argb: 'D4D4D4' } },
-                            right: { style: 'thin', color: { argb: 'D4D4D4' } }
-                        }
-                    }
-                })
-            }
-        })
-        // 合并单元格
-        mergeCells.forEach(({ startRow, startColumn, endRow, endColumn }) => {
-            worksheet.mergeCells(startRow, startColumn, endRow, endColumn); // 合并单元格
-        })
-        // 设置可填写区域
-        for (let rowNum = 1; rowNum <= corpUserListLength * mediaContentLength; rowNum++) {
-            for (let colNum = 1; colNum <= 3; colNum++) {
-                if (unLockArea.includes(`${rowNum}_${colNum + 5}`)) {
-                    const cell = worksheet.getCell(rowNum + 1, colNum + 5);
-                    cell.protection = { locked: false };
-                    cell.fill = {
-                        type: 'pattern',
-                        pattern: 'solid',
-                        fgColor: { argb: 'ffadd2' }
-                    }
-
-                }
-            }
-        }
-
-        // 生成文件内容
-        const buffer = await workbook.xlsx.writeBuffer();
-        // 通过 Blob 下载
-        const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
-        saveAs(blob, `欢迎语内容配置_${dayjs().format('YYYYMMDDHHmmss')}.xlsx`);
-        setTimeout(() => setDownloadLoading(false), 100)
-    }
-
-    // 读取Excel
-    const readExcelContent = async (file: RcFile) => {
-        console.log(file)
-        const buffer: any = await readFileAsBuffer(file);
-        const workbook = new ExcelJS.Workbook();
-        await workbook.xlsx.load(buffer);  // 加载 Excel 内容
-
-        const worksheet = workbook.worksheets[0];  // 获取第一个工作表
-        const data = [];
-
-        worksheet.eachRow((row) => {
-            const rowData = {};
-            row.eachCell((cell, colNumber) => {
-                if (cell.isHyperlink) {
-                    rowData[`col${colNumber}`] = cell.text || '';
-                } else {
-                    rowData[`col${colNumber}`] = cell.value || '';
-                }
-            });
-            data.push(rowData);
-        });
-
-        data.shift();  // 删除表头
-        const NULLDATA = ['请输入', '']
-        if (data?.some(item => (NULLDATA.includes(item.col6) || !item?.col6 || NULLDATA.includes(item.col7) || !item?.col7 || NULLDATA.includes(item.col8) || !item?.col8))) {
-            message.error('请正确填写Excel内容!')
-            return
-        }
-
-        const groupData = groupBy(data, (item) => [item['col1']]).reduce((acc, cur) => {
-            const id = cur[0]['col1'].split('ID:')[1].replace(/\)$/, '');
-            acc[id] = cur
-            return acc;
-        }, {});
-
-        const corpUsers = settings?.corpUsers?.map(item => {
-            const welcomeMsgContent = groupData[item.corpUserId]?.map((i: any) => {
-                return {
-                    linkUrl: i.col6 === '<空>' ? undefined : i.col6?.toString()?.trim(),
-                    miniprogramAppid: i.col7 === '<空>' ? undefined : i.col7?.toString()?.trim(),
-                    miniprogramPage: i.col8 === '<空>' ? undefined : i.col8?.toString()?.trim(),
-                }
-            })
-            return {
-                ...item,
-                welcomeMsgContent
-            }
-        })
-
-        setSettings({
-            ...settings,
-            corpUsers
-        })
-    }
-
     return <>
         <div className={`${style.settingsBody_content_row}`}>
             <div className={`${style.settingsBody_content_col}`} style={{ width: '100%' }}>
                 <div className={style.title}>
                     <span>欢迎语</span>
 
-                    {(settings?.welcomeMsgTemplateDTO && Object.keys(settings?.welcomeMsgTemplateDTO).length > 0) && <Space>
+                    {(settings?.welcomeMsgTemplateDTO && Object.keys(settings?.welcomeMsgTemplateDTO).length > 0 && !isEditSc) && <Space>
                         <Button
                             type="link"
                             danger
@@ -320,7 +56,7 @@ const Welcome: React.FC = () => {
                     </div>
                 </div>
                 <div className={style.detail_footer}>
-                    <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
+                    <Button type="link" style={{ padding: 0, fontSize: 12 }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
                 </div>
             </div>
         </div>
@@ -329,6 +65,7 @@ const Welcome: React.FC = () => {
         {newVisible && <SettingsWelcome
             visible={newVisible}
             value={settings?.welcomeMsgTemplateDTO}
+            isEditSc={isEditSc}
             onClose={() => {
                 setNewVisible(false)
             }}

+ 5 - 5
src/pages/weComTask/page/businessPlan/create/components/welcome/settingsWelcome.tsx

@@ -13,7 +13,7 @@ import { welcomeContentData } from '../../const';
  * @param param0 
  * @returns 
  */
-const SettingsWelcome: React.FC<TASK_CREATE.WelcomeProps<any>> = ({ visible, onClose, value, onChange }) => {
+const SettingsWelcome: React.FC<TASK_CREATE.WelcomeProps<any>> = ({ visible, onClose, value, onChange, isEditSc }) => {
 
     /***************************************************/
     const { message } = App.useApp()
@@ -139,7 +139,7 @@ const SettingsWelcome: React.FC<TASK_CREATE.WelcomeProps<any>> = ({ visible, onC
 
                 <Card title={<strong>智能标签配置</strong>} style={{ background: '#fff', marginBottom: 10, display: step === 1 ? 'none' : 'block' }} styles={{ body: { padding: '6px 0 6px 16px' } }} id='intelligentLabel'>
                     <Form.Item name="welcomeMsgTagDTO" rules={[{ required: true, message: '请选择智能标签!' }]} style={{ marginBottom: 0 }}>
-                        <MindTags />
+                        <MindTags disabled={isEditSc} />
                     </Form.Item>
                 </Card>
 
@@ -173,15 +173,15 @@ const SettingsWelcome: React.FC<TASK_CREATE.WelcomeProps<any>> = ({ visible, onC
                                             name={name}
                                             rules={[{ required: step === 0 ? false : true, message: '请完善内容!' }]}
                                         >
-                                            <MaterialMould noShowType={noShowType} />
+                                            <MaterialMould noShowType={noShowType} disabledAdd={isEditSc}/>
                                         </Form.Item>
-                                        {mediaContent?.length > 1 && <div className={style.remove} onClick={() => remove(name)}>
+                                        {(mediaContent?.length > 1 && !isEditSc) && <div className={style.remove} onClick={() => remove(name)}>
                                             <MinusCircleOutlined />
                                         </div>}
                                     </div>
                                 })}
                                 <Form.Item>
-                                    <Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}>
+                                    <Button type="dashed" onClick={() => add()} block disabled={isEditSc} icon={<PlusOutlined />}>
                                         新增内容组
                                     </Button>
                                 </Form.Item>

+ 9 - 3
src/pages/weComTask/page/businessPlan/create/index.tsx

@@ -33,6 +33,7 @@ const Create: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookLis
     const { bookList, bookPlatForm } = toJS(weComTaskStore.data)
     const [settings, setSettings] = useState<TASK_CREATE.SettingsProps>();
     const [projectId, setProjectId] = useState<number>()
+    const [isEditSc, setIsEditSc] = useState<boolean>(false) // 是否编辑素材
     const { message, modal } = App.useApp()
     const [msgJobTypeList, setMsgJobTypeList] = useState<{ value: string, label: string }[]>([])
     const [previewData, setPreviewData] = useState<TASK_CREATE.previewDataProps>({})
@@ -55,7 +56,8 @@ const Create: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookLis
     useEffect(() => {
         const project = sessionStorage.getItem('OFFICIALTASKID')
         if (project) {
-            const { id, isCopy } = JSON.parse(project)
+            const { id, isCopy, isEditSc } = JSON.parse(project)
+            setIsEditSc(isEditSc)
             if (!isCopy) {
                 setProjectId(id)
             }
@@ -506,7 +508,9 @@ const Create: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookLis
     const onPreviewReset = () => {
         setPreviewData({})
         setPreviewDataOld({})
-        setPreviewContent({})
+        if (!isEditSc) {
+            setPreviewContent({})
+        }
     }
 
     const severBd = () => {
@@ -575,6 +579,7 @@ const Create: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookLis
                     <Space.Compact>
                         <Button>客服组</Button>
                         <SelectCorpUserGroup
+                            disabled={isEditSc}
                             value={settings?.corpUserGroups}
                             onChange={(corpUserGroups) => {
                                 console.log(corpUserGroups)
@@ -694,7 +699,8 @@ const Create: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookLis
                                 bookPlatForm,
                                 bookList,
                                 msgJobTypeList,
-                                onPreviewReset
+                                onPreviewReset,
+                                isEditSc
                             }}>
                             <div className={style.settingsBody_content_right}>
                                 {/* 欢迎语 */}

+ 4 - 0
src/pages/weComTask/page/businessPlan/create/typings.d.ts

@@ -19,6 +19,7 @@ declare namespace TASK_CREATE {
             label: string;
         }[]
         onPreviewReset: () => void
+        isEditSc: boolean
     }
     interface previewDataProps {
         welcome?: any[];
@@ -29,6 +30,7 @@ declare namespace TASK_CREATE {
     }
     interface WelcomeProps<T> extends DefaultProps, DefaultChangeProps<T> {
         value?: { [x: string]: any };
+        isEditSc?: boolean
     }
     interface MassSendingProps<T> extends DefaultProps, DefaultChangeProps<T> {
         bookCityList: { label: string, value: string }[]
@@ -38,6 +40,7 @@ declare namespace TASK_CREATE {
         };
         onChange?: (value?: { [x: string]: any }, type?: string) => void;
         createType?: 'STRATEGY' | 'CONTENT';
+        isEditSc?: boolean
     }
     interface HighMassSendingProps<T> extends DefaultProps, DefaultChangeProps<T> {
         value?: {
@@ -106,6 +109,7 @@ declare namespace TASK_CREATE {
         bookCityList?: { label: string, value: string }[]
         onChange?: (value?: { [x: string]: any }, type: string) => void;
         value?: { massSendingContentDTO: any };
+        isEditSc?: boolean
     }
     interface FriendsContentProps {
         friendsStrategy: { [x: string]: any };

+ 2 - 2
src/pages/weComTask/page/businessPlan/taskList/index.tsx

@@ -48,8 +48,8 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
     }
 
     // 复制
-    const handleCopy = (data: any, isCopy: boolean) => {
-        sessionStorage.setItem('OFFICIALTASKID', JSON.stringify({ id: data.id, isCopy }))
+    const handleCopy = (data: any, isCopy: boolean, isEditSc?: boolean) => {
+        sessionStorage.setItem('OFFICIALTASKID', JSON.stringify({ id: data.id, isCopy, isEditSc: isEditSc || false }))
         sessionStorage.setItem('oldPath', '/weComTask/businessPlan/create')
         window.location.href = '/weComTask#/weComTask/businessPlan/create'
     }

+ 3 - 2
src/pages/weComTask/page/businessPlan/taskList/tableConfig.tsx

@@ -14,7 +14,7 @@ const taskListColumns = (
     bookPlatForm: any[],
     bookList: any[],
     handleLog: (data: any) => void,
-    handleCopy: (data: any, isCopy: boolean) => void,
+    handleCopy: (data: any, isCopy: boolean, isEditSc?: boolean) => void,
     handleDel: (data: any, type: 'del' | 'cancel' | 'open') => void,
 ): ColumnsType<AnyObject> => {
 
@@ -23,7 +23,7 @@ const taskListColumns = (
             title: '操作',
             dataIndex: 'cz',
             key: 'cz',
-            width: 160,
+            width: 210,
             render(_, record) {
                 return <Space>
                     {record?.status === 1 ? <Popconfirm
@@ -39,6 +39,7 @@ const taskListColumns = (
                     </Popconfirm> : undefined}
                     <a onClick={() => handleCopy(record, true)}>复制</a>
                     <a onClick={() => handleCopy(record, false)}>编辑</a>
+                    <a onClick={() => handleCopy(record, false, true)}>编辑素材</a>
                     <a onClick={() => handleLog(record)}>详情</a>
                     <Popconfirm
                         title="确定删除?"

+ 5 - 3
src/pages/weComTask/page/corpUserManage/selectCorpUserGroup.tsx

@@ -10,6 +10,7 @@ interface SelectCorpUserGroupProps {
     value?: TASK_CREATE.CorpUserGroupProps[];
     onChange?: (value?: TASK_CREATE.CorpUserGroupProps[]) => void;
     placeholder?: React.ReactNode
+    disabled?: boolean
 }
 
 /**
@@ -17,7 +18,7 @@ interface SelectCorpUserGroupProps {
  * @param param0 
  * @returns 
  */
-const SelectCorpUserGroup: React.FC<SelectCorpUserGroupProps> = ({ placeholder, value = [{ corpUsers: [] }], onChange }) => {
+const SelectCorpUserGroup: React.FC<SelectCorpUserGroupProps> = ({ placeholder, value = [{ corpUsers: [] }], onChange, disabled }) => {
 
     /************************************************************/
     const { token } = useNewToken()
@@ -48,7 +49,7 @@ const SelectCorpUserGroup: React.FC<SelectCorpUserGroupProps> = ({ placeholder,
             <div className='selectCorpUserContent'>
                 {(corpUserList && corpUserList?.length > 0) ? <>
                     <Tag
-                        closable
+                        closable={!disabled}
                         onClose={(e) => {
                             e.preventDefault();
                             const newData = value?.map(item => ({ ...item, corpUsers: item.corpUsers?.filter(item => item.corpUserId !== corpUserList?.[0]?.corpUserId) }))?.filter(item => item?.corpUsers?.length > 0)
@@ -62,7 +63,7 @@ const SelectCorpUserGroup: React.FC<SelectCorpUserGroupProps> = ({ placeholder,
                         title={<span style={{ color: '#000' }}>
                             {corpUserList?.filter((_, index) => index !== 0)?.map((item) => <Tag
                                 key={item.corpUserId}
-                                closable
+                                closable={!disabled}
                                 onClose={(e) => {
                                     e.stopPropagation()
                                     const newData = value?.map(ii => ({ ...ii, corpUsers: ii.corpUsers?.filter(i => i.corpUserId !== item.corpUserId) }))?.filter(item => item?.corpUsers?.length > 0)
@@ -80,6 +81,7 @@ const SelectCorpUserGroup: React.FC<SelectCorpUserGroupProps> = ({ placeholder,
         {visible && <SelectCorpUserGroupModal
             visible={visible}
             value={value}
+            disabled={disabled}
             onClose={() => setVisible(false)}
             onChange={(value) => {
                 setVisible(false)

+ 3 - 1
src/pages/weComTask/page/corpUserManage/selectCorpUserGroupModal.tsx

@@ -17,8 +17,9 @@ interface Props {
     onClose?: () => void;
     value?: TASK_CREATE.CorpUserGroupProps[];
     onChange?: (value?: TASK_CREATE.CorpUserGroupProps[]) => void;
+    disabled?: boolean;
 }
-const SelectCorpUserGroupModal: React.FC<Props> = ({ visible, onClose, value, onChange }) => {
+const SelectCorpUserGroupModal: React.FC<Props> = ({ visible, onClose, value, onChange, disabled }) => {
 
     /*****************************************/
     const { message } = App.useApp()
@@ -92,6 +93,7 @@ const SelectCorpUserGroupModal: React.FC<Props> = ({ visible, onClose, value, on
         onOk={handleOk}
         width={1100}
         className={`${style.SelectPackage}`}
+        okButtonProps={{ disabled }}
         styles={{
             body: {
                 padding: '0 10px 0 10px'

+ 1 - 0
src/pages/weComTask/page/groupChat/create/typings.d.ts

@@ -28,6 +28,7 @@ declare namespace GROUP_CHAT_CREATE {
     }
     interface FoundationProps<T> extends TASK_CREATE.DefaultProps, TASK_CREATE.DefaultChangeProps<T> {
         value?: { [x: string]: any };
+        isEditSc?: boolean // 是否编辑素材
     }
     interface AddGroupObjectProps {
         bookPlatForm: TASK_CREATE.BookPlatFormProps[]

+ 3 - 1
src/pages/weComTask/page/groupChatSend/official/create/components/SelectMpCorp/index.tsx

@@ -12,13 +12,14 @@ interface Props {
     visible?: boolean;
     onClose?: () => void;
     onChange?: (value: OFFICIAL_CHAT_CREATE.GroupsProps[]) => void;
+    disabled?: boolean;
 }
 /**
  * 高级群发外部客户选择
  * @param param0 
  * @returns 
  */
-const SelectMpCorp: React.FC<Props> = ({ corpList, mpList, group, visible, onClose, onChange }) => {
+const SelectMpCorp: React.FC<Props> = ({ corpList, mpList, group, visible, onClose, onChange, disabled }) => {
 
     /***************************************/
     const [data, setData] = useState<OFFICIAL_CHAT_CREATE.GroupsProps[]>(group && group?.length > 0 ? group : [{}]);
@@ -48,6 +49,7 @@ const SelectMpCorp: React.FC<Props> = ({ corpList, mpList, group, visible, onClo
         onOk={handleOk}
         width={1100}
         className={`${style.SelectPackage}`}
+        okButtonProps={{ disabled }}
         styles={{
             body: {
                 padding: '0 10px 0 10px'

+ 4 - 3
src/pages/weComTask/page/groupChatSend/official/create/components/Strategy/index.tsx

@@ -10,7 +10,7 @@ const Strategy: React.FC = () => {
 
     /*********************************/
     const { token } = useNewToken()
-    const { setSettings, settings, onPreviewReset, mpList, corpList } = useContext(DispatchOfficialChatCreate)!;
+    const { setSettings, settings, onPreviewReset, isEditSc } = useContext(DispatchOfficialChatCreate)!;
     const [newVisible, setNewVisible] = useState<boolean>(false);
     /*********************************/
 
@@ -19,12 +19,13 @@ const Strategy: React.FC = () => {
             <div className={`${style.settingsBody_content_col}`} style={{ width: '100%' }}>
                 <div className={style.title}>
                     <span>策略</span>
-                    {settings?.strategyDTO && Object.keys(settings?.strategyDTO).length > 0 && <Popconfirm
+                    {(settings?.strategyDTO && !isEditSc) && Object.keys(settings?.strategyDTO).length > 0 && <Popconfirm
                         title="确定清空?"
                         onConfirm={() => {
                             setSettings(undefined)
                             onPreviewReset();
                         }}
+                        disabled={isEditSc}
                     >
                         <a style={{ color: 'red' }}>清空</a>
                     </Popconfirm>}
@@ -38,7 +39,7 @@ const Strategy: React.FC = () => {
                     </div>
                 </div>
                 <div className={style.detail_footer}>
-                    <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
+                    <Button type="link" style={{ padding: 0, fontSize: 12 }} disabled={isEditSc} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
                 </div>
             </div>
         </div>

+ 4 - 3
src/pages/weComTask/page/groupChatSend/official/create/components/content/index.tsx

@@ -10,7 +10,7 @@ const Content: React.FC = () => {
 
     /*******************************************/
     const { token } = useNewToken()
-    const { setSettings, settings, onPreviewReset } = useContext(DispatchOfficialChatCreate)!;
+    const { setSettings, settings, onPreviewReset, isEditSc } = useContext(DispatchOfficialChatCreate)!;
     const [newVisible, setNewVisible] = useState<boolean>(false);
     /*******************************************/
 
@@ -30,8 +30,8 @@ const Content: React.FC = () => {
                 </div>
                 <div className={style.detail_footer}>
                     {settings?.strategyDTO && Object.keys(settings?.strategyDTO).length > 0
-                        ? <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
-                        : <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => message.error('请先设置策略')}>编辑</Button>
+                        ? <Button type="link" style={{ padding: 0, fontSize: 12 }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
+                        : <Button type="link" style={{ padding: 0, fontSize: 12 }} size="small" onClick={() => message.error('请先设置策略')}>编辑</Button>
                     }
                 </div>
             </div>
@@ -42,6 +42,7 @@ const Content: React.FC = () => {
             visible={newVisible}
             value={settings?.strategyDTO}
             onClose={() => setNewVisible(false)}
+            isEditSc={isEditSc}
             onChange={(values) => {
                 setSettings({
                     ...settings,

+ 4 - 3
src/pages/weComTask/page/groupChatSend/official/create/components/content/settingsContent.tsx

@@ -10,7 +10,7 @@ import NewSteps from '@/pages/weComTask/components/newSteps';
  * @param param0 
  * @returns 
  */
-const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ visible, onClose, value, onChange }) => {
+const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ visible, onClose, value, onChange, isEditSc }) => {
 
     /***********************************************/
     const { message } = App.useApp()
@@ -191,6 +191,7 @@ const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ vis
                                                                                         onClick={() => remove(c_index)}
                                                                                         icon={<MinusOutlined />}
                                                                                         size='small'
+                                                                                        disabled={isEditSc}
                                                                                     >
                                                                                         移除内容
                                                                                     </Button>}
@@ -207,12 +208,12 @@ const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ vis
                                                                                         }
                                                                                     }]}
                                                                                 >
-                                                                                    <MaterialNoTextMould />
+                                                                                    <MaterialNoTextMould disabledAdd={isEditSc} />
                                                                                 </Form.Item>
                                                                             </div>
                                                                         })}
                                                                         <Form.Item noStyle>
-                                                                            <Button type="dashed" onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
+                                                                            <Button type="dashed" disabled={isEditSc} onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
                                                                                 新增内容
                                                                             </Button>
                                                                         </Form.Item>

+ 18 - 12
src/pages/weComTask/page/groupChatSend/official/create/index.tsx

@@ -34,6 +34,7 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
     const [settings, setSettings] = useState<OFFICIAL_CHAT_CREATE.SettingsProps>();
     const [msgJobTypeList, setMsgJobTypeList] = useState<{ value: string, label: string }[]>([])
     const [projectId, setProjectId] = useState<number>()
+    const [isEditSc, setIsEditSc] = useState<boolean>(false)
     const [previewData, setPreviewData] = useState<any[]>([])
     const [previewDataOld, setPreviewDataOld] = useState<any[]>([])
     const [mpList, setMpList] = useState<DefaultOptionType[]>([])
@@ -52,7 +53,8 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
     useEffect(() => {
         const project = sessionStorage.getItem('PGSD_OFFICIALTASKID')
         if (project) {
-            const { id, isCopy } = JSON.parse(project)
+            const { id, isCopy, isEditSc } = JSON.parse(project)
+            setIsEditSc(isEditSc)
             if (!isCopy) {
                 setProjectId(id)
             }
@@ -61,15 +63,15 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
                 if (res?.data) {
                     const { bizType, platform, templateProductId, channel, groupChatSendTaskAddDTO, mpAccounts } = res.data
                     const group = mpAccounts.map(m => {
-                            return {
-                                mpAccount: m?.mpAccountVO?.name ? {
-                                    label: m?.mpAccountVO?.name || '',
-                                    value: m?.mpAccountVO?.id || '',
-                                    appId: m?.mpAccountVO?.appId || '',
-                                } : undefined,
-                                corp: m?.corpVOList?.map(c => ({ label: c.corpName, value: c.corpId })) || []
-                            }
-                        })
+                        return {
+                            mpAccount: m?.mpAccountVO?.name ? {
+                                label: m?.mpAccountVO?.name || '',
+                                value: m?.mpAccountVO?.id || '',
+                                appId: m?.mpAccountVO?.appId || '',
+                            } : undefined,
+                            corp: m?.corpVOList?.map(c => ({ label: c.corpName, value: c.corpId })) || []
+                        }
+                    })
                     let newSettings: OFFICIAL_CHAT_CREATE.SettingsProps = {
                         bizType,
                         platform: Number(platform) as any,
@@ -171,7 +173,9 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
     const onPreviewReset = () => {
         setPreviewData([])
         setPreviewDataOld([])
-        setPreviewContent({})
+        if (!isEditSc) {
+            setPreviewContent({})
+        }
     }
 
     const severBd = () => {
@@ -405,6 +409,7 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
                         <GroupChatGroups
                             mpList={mpList}
                             corpList={corpList}
+                            disabled={isEditSc}
                             value={settings?.group}
                             onChange={(group) => {
                                 setSettings({
@@ -494,7 +499,8 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
                                 onPreviewReset,
                                 bookPlatForm, bookList,
                                 mpList,
-                                corpList
+                                corpList,
+                                isEditSc
                             }}
                         >
                             {/* 策略配置 */}

+ 2 - 2
src/pages/weComTask/page/groupChatSend/official/taskList/index.tsx

@@ -66,8 +66,8 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
     }
 
     // 复制
-    const handleCopy = (data: any, isCopy: boolean) => {
-        sessionStorage.setItem('PGSD_OFFICIALTASKID', JSON.stringify({ id: data.id, isCopy }))
+    const handleCopy = (data: any, isCopy: boolean, isEditSc?: boolean) => {
+        sessionStorage.setItem('PGSD_OFFICIALTASKID', JSON.stringify({ id: data.id, isCopy, isEditSc }))
         sessionStorage.setItem('oldPath', '/weComTask/groupChatSend/official/create')
         window.location.href = '/weComTask#/weComTask/groupChatSend/official/create'
     }

+ 2 - 1
src/pages/weComTask/page/groupChatSend/official/taskList/tableConfig.tsx

@@ -13,7 +13,7 @@ const taskListColumns = (
     mpList: DefaultOptionType[],
     corpList: DefaultOptionType[],
     handleLog: (data: any) => void,
-    handleCopy: (data: any, isCopy: boolean) => void,
+    handleCopy: (data: any, isCopy: boolean, isEditSc?: boolean) => void,
     handleDel: (data: any, type: 'del' | 'cancel' | 'open') => void,
 ): ColumnsType<AnyObject> => {
 
@@ -38,6 +38,7 @@ const taskListColumns = (
                     </Popconfirm> : undefined}
                     <a onClick={() => handleCopy(record, true)}>复制</a>
                     <a onClick={() => handleCopy(record, false)}>编辑</a>
+                    <a onClick={() => handleCopy(record, false, true)}>编辑素材</a>
                     <a onClick={() => handleLog(record)}>详情</a>
                     <Popconfirm
                         title="确定删除?"

+ 1 - 0
src/pages/weComTask/page/groupChatSend/official/typings.d.ts

@@ -7,6 +7,7 @@ declare namespace OFFICIAL_CHAT_CREATE {
         bookList: TASK_CREATE.BookListProps[]
         mpList: DefaultOptionType[]
         corpList: DefaultOptionType[]
+        isEditSc: boolean // 是否编辑素材
     }
     interface GroupsProps {
         mpAccount?: {

+ 4 - 3
src/pages/weComTask/page/groupChatSend/robot/create/components/Strategy/index.tsx

@@ -11,7 +11,7 @@ const Strategy: React.FC = () => {
     /*********************************/
     const { message } = App.useApp()
     const { token } = useNewToken()
-    const { setSettings, settings, onPreviewReset, corpList } = useContext(DispatchRobotChatCreate)!;
+    const { setSettings, settings, onPreviewReset, corpList, isEditSc } = useContext(DispatchRobotChatCreate)!;
     const [newVisible, setNewVisible] = useState<boolean>(false);
     /*********************************/
 
@@ -20,12 +20,13 @@ const Strategy: React.FC = () => {
             <div className={`${style.settingsBody_content_col}`} style={{ width: '100%' }}>
                 <div className={style.title}>
                     <span>策略</span>
-                    {settings?.strategyDTO && Object.keys(settings?.strategyDTO).length > 0 && <Popconfirm
+                    {(settings?.strategyDTO && !isEditSc) && Object.keys(settings?.strategyDTO).length > 0 && <Popconfirm
                         title="确定清空?"
                         onConfirm={() => {
                             setSettings(undefined)
                             onPreviewReset();
                         }}
+                        disabled={isEditSc}
                     >
                         <a style={{ color: 'red' }}>清空</a>
                     </Popconfirm>}
@@ -39,7 +40,7 @@ const Strategy: React.FC = () => {
                     </div>
                 </div>
                 <div className={style.detail_footer}>
-                    <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
+                    <Button type="link" style={{ padding: 0, fontSize: 12 }} disabled={isEditSc} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
                 </div>
             </div>
         </div>

+ 4 - 3
src/pages/weComTask/page/groupChatSend/robot/create/components/content/index.tsx

@@ -10,7 +10,7 @@ const Content: React.FC = () => {
 
     /*******************************************/
     const { token } = useNewToken()
-    const { setSettings, settings, onPreviewReset } = useContext(DispatchRobotChatCreate)!;
+    const { setSettings, settings, onPreviewReset, isEditSc } = useContext(DispatchRobotChatCreate)!;
     const [newVisible, setNewVisible] = useState<boolean>(false);
     /*******************************************/
 
@@ -30,8 +30,8 @@ const Content: React.FC = () => {
                 </div>
                 <div className={style.detail_footer}>
                     {settings?.strategyDTO && Object.keys(settings?.strategyDTO).length > 0
-                        ? <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
-                        : <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => message.error('请先设置策略')}>编辑</Button>
+                        ? <Button type="link" style={{ padding: 0, fontSize: 12 }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
+                        : <Button type="link" style={{ padding: 0, fontSize: 12 }} size="small" onClick={() => message.error('请先设置策略')}>编辑</Button>
                     }
                 </div>
             </div>
@@ -39,6 +39,7 @@ const Content: React.FC = () => {
 
         {/* 群聊群发内容配置 */}
         {newVisible && <SettingsContent
+            isEditSc={isEditSc}
             visible={newVisible}
             value={settings?.strategyDTO}
             onClose={() => setNewVisible(false)}

+ 4 - 3
src/pages/weComTask/page/groupChatSend/robot/create/components/content/settingsContent.tsx

@@ -10,7 +10,7 @@ import NewSteps from '@/pages/weComTask/components/newSteps';
  * @param param0 
  * @returns 
  */
-const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ visible, onClose, value, onChange }) => {
+const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ visible, onClose, value, onChange, isEditSc }) => {
 
     /***********************************************/
     const { message } = App.useApp()
@@ -191,6 +191,7 @@ const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ vis
                                                                                         onClick={() => remove(c_index)}
                                                                                         icon={<MinusOutlined />}
                                                                                         size='small'
+                                                                                        disabled={isEditSc}
                                                                                     >
                                                                                         移除内容
                                                                                     </Button>}
@@ -207,12 +208,12 @@ const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ vis
                                                                                         }
                                                                                     }]}
                                                                                 >
-                                                                                    <MaterialNoTextMould />
+                                                                                    <MaterialNoTextMould disabledAdd={isEditSc} />
                                                                                 </Form.Item>
                                                                             </div>
                                                                         })}
                                                                         <Form.Item noStyle>
-                                                                            <Button type="dashed" onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
+                                                                            <Button type="dashed" disabled={isEditSc} onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
                                                                                 新增内容
                                                                             </Button>
                                                                         </Form.Item>

+ 11 - 7
src/pages/weComTask/page/groupChatSend/robot/create/index.tsx

@@ -34,6 +34,7 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
     const [settings, setSettings] = useState<ROBOT_CHAT_CREATE.SettingsProps>();
     const [msgJobTypeList, setMsgJobTypeList] = useState<{ value: string, label: string }[]>([])
     const [projectId, setProjectId] = useState<number>()
+    const [isEditSc, setIsEditSc] = useState<boolean>(false)
     const [previewData, setPreviewData] = useState<any[]>([])
     const [previewDataOld, setPreviewDataOld] = useState<any[]>([])
     const [mpList, setMpList] = useState<DefaultOptionType[]>([])
@@ -53,7 +54,8 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
     useEffect(() => {
         const project = sessionStorage.getItem('ROBOT_OFFICIALTASKID')
         if (project) {
-            const { id, isCopy } = JSON.parse(project)
+            const { id, isCopy, isEditSc } = JSON.parse(project)
+            setIsEditSc(isEditSc)
             if (!isCopy) {
                 setProjectId(id)
             }
@@ -82,7 +84,7 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
                     if (robotGroupChatSendTaskAddDTO && Object.keys(robotGroupChatSendTaskAddDTO).length > 0) {
                         const data = getRobotSendData(robotGroupChatSendTaskAddDTO)
                         newSettings = { ...newSettings, strategyDTO: data }
-                        
+
                         // 处理链接小程序 历史数据
                         const list: any[] = []
                         data?.strategyList?.forEach((str, s_index) => {
@@ -188,14 +190,14 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
         })
     }, [])
 
-    console.log('settings--->', settings)
-
     // 重置表格
     const onPreviewReset = () => {
         setPreviewData([])
         setPreviewDataOld([])
-        setPreviewContent({})
-        setCorpGroupChat({})
+        if (!isEditSc) {
+            setPreviewContent({})
+            setCorpGroupChat({})
+        }
     }
 
     const severBd = () => {
@@ -453,6 +455,7 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
                             mpList={mpList}
                             corpList={corpList}
                             value={settings?.group}
+                            disabled={isEditSc}
                             onChange={(group) => {
                                 setSettings({
                                     ...settings,
@@ -541,7 +544,8 @@ const OfficialCreate: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE
                                 onPreviewReset,
                                 bookPlatForm, bookList,
                                 mpList,
-                                corpList
+                                corpList,
+                                isEditSc
                             }}
                         >
                             {/* 策略配置 */}

+ 2 - 2
src/pages/weComTask/page/groupChatSend/robot/taskList/index.tsx

@@ -66,8 +66,8 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
     }
 
     // 复制
-    const handleCopy = (data: any, isCopy: boolean) => {
-        sessionStorage.setItem('ROBOT_OFFICIALTASKID', JSON.stringify({ id: data.id, isCopy }))
+    const handleCopy = (data: any, isCopy: boolean, isEditSc?: boolean) => {
+        sessionStorage.setItem('ROBOT_OFFICIALTASKID', JSON.stringify({ id: data.id, isCopy, isEditSc: isEditSc || false }))
         sessionStorage.setItem('oldPath', '/weComTask/groupChatSend/robot/create')
         window.location.href = '/weComTask#/weComTask/groupChatSend/robot/create'
     }

+ 2 - 1
src/pages/weComTask/page/groupChatSend/robot/taskList/tableConfig.tsx

@@ -13,7 +13,7 @@ const taskListColumns = (
     mpList: DefaultOptionType[],
     corpList: DefaultOptionType[],
     handleLog: (data: any) => void,
-    handleCopy: (data: any, isCopy: boolean) => void,
+    handleCopy: (data: any, isCopy: boolean, isEditSc?: boolean) => void,
     handleDel: (data: any, type: 'del' | 'cancel' | 'open') => void,
 ): ColumnsType<AnyObject> => {
 
@@ -38,6 +38,7 @@ const taskListColumns = (
                     </Popconfirm> : undefined}
                     <a onClick={() => handleCopy(record, true)}>复制</a>
                     <a onClick={() => handleCopy(record, false)}>编辑</a>
+                    <a onClick={() => handleCopy(record, false, true)}>编辑素材</a>
                     <a onClick={() => handleLog(record)}>详情</a>
                     <Popconfirm
                         title="确定删除?"

+ 1 - 0
src/pages/weComTask/page/groupChatSend/robot/typings.d.ts

@@ -7,6 +7,7 @@ declare namespace ROBOT_CHAT_CREATE {
         bookList: TASK_CREATE.BookListProps[]
         mpList: DefaultOptionType[]
         corpList: DefaultOptionType[]
+        isEditSc: boolean // 是否编辑素材
     }
     interface GroupsProps {
         mpAccount?: {

+ 4 - 3
src/pages/weComTask/page/moments/create/components/Strategy/index.tsx

@@ -10,7 +10,7 @@ const Strategy: React.FC = () => {
 
     /*********************************/
     const { token } = useNewToken()
-    const { setSettings, settings, onPreviewReset } = useContext(DispatchMomentsTaskCreate)!;
+    const { setSettings, settings, onPreviewReset, isEditSc } = useContext(DispatchMomentsTaskCreate)!;
     const [newVisible, setNewVisible] = useState<boolean>(false);
     /*********************************/
 
@@ -19,12 +19,13 @@ const Strategy: React.FC = () => {
             <div className={`${style.settingsBody_content_col}`} style={{ width: '100%' }}>
                 <div className={style.title}>
                     <span>策略</span>
-                    {settings?.massSendingStrategy && Object.keys(settings?.massSendingStrategy).length > 0 && <Popconfirm
+                    {(settings?.massSendingStrategy && !isEditSc) && Object.keys(settings?.massSendingStrategy).length > 0 && <Popconfirm
                         title="确定清空?"
                         onConfirm={() => {
                             setSettings(undefined)
                             onPreviewReset();
                         }}
+                        disabled={isEditSc}
                     >
                         <a style={{ color: 'red' }}>清空</a>
                     </Popconfirm>}
@@ -38,7 +39,7 @@ const Strategy: React.FC = () => {
                     </div>
                 </div>
                 <div className={style.detail_footer}>
-                    <Button type="link" style={{ padding: 0, fontSize: 12, color: token.colorPrimary }} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
+                    <Button type="link" style={{ padding: 0, fontSize: 12 }} disabled={isEditSc} size="small" onClick={() => setNewVisible(true)}>编辑</Button>
                 </div>
             </div>
         </div>

+ 2 - 1
src/pages/weComTask/page/moments/create/components/content/index.tsx

@@ -11,7 +11,7 @@ const Content: React.FC = () => {
     /*******************************************/
     const { token } = useNewToken()
     const { message } = App.useApp()
-    const { setSettings, settings, onPreviewReset } = useContext(DispatchMomentsTaskCreate)!;
+    const { setSettings, settings, onPreviewReset, isEditSc } = useContext(DispatchMomentsTaskCreate)!;
     const [newVisible, setNewVisible] = useState<boolean>(false);
     /*******************************************/
 
@@ -51,6 +51,7 @@ const Content: React.FC = () => {
         {/* 配置朋友圈对象 */}
         {newVisible && <SettingsContent
             visible={newVisible}
+            isEditSc={isEditSc}
             onClose={() => setNewVisible(false)}
             onChange={(values) => {
                 const corpUsers = settings?.corpUsers?.map(item => {

+ 4 - 3
src/pages/weComTask/page/moments/create/components/content/settingsContent.tsx

@@ -10,7 +10,7 @@ import NewSteps from '@/pages/weComTask/components/newSteps';
  * @param param0 
  * @returns 
  */
-const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ visible, onClose, value, onChange }) => {
+const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ visible, onClose, value, onChange, isEditSc }) => {
 
     /***********************************************/
     const { message } = App.useApp()
@@ -177,6 +177,7 @@ const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ vis
                                                                     onClick={() => remove(c_index)}
                                                                     icon={<MinusOutlined />}
                                                                     size='small'
+                                                                    disabled={isEditSc}
                                                                 >
                                                                     移除内容
                                                                 </Button>}
@@ -193,12 +194,12 @@ const SettingsContent: React.FC<GROUP_CHAT_CREATE.FoundationProps<any>> = ({ vis
                                                                     }
                                                                 }]}
                                                             >
-                                                                <MaterialNoTextMould />
+                                                                <MaterialNoTextMould disabledAdd={isEditSc} />
                                                             </Form.Item>
                                                         </div>
                                                     })}
                                                     <Form.Item noStyle>
-                                                        <Button type="dashed" onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
+                                                        <Button type="dashed" disabled={isEditSc} onClick={() => add()} style={{ width: '100%' }} icon={<PlusOutlined />}>
                                                             新增内容
                                                         </Button>
                                                     </Form.Item>

+ 9 - 3
src/pages/weComTask/page/moments/create/index.tsx

@@ -37,6 +37,7 @@ const MomentsCreatePage: React.FC<{ weComTaskStore: { data: { bookList: TASK_CRE
     const [mpList, setMplist] = useState<{ label: string, value: number }[]>([])
     const [previewContent, setPreviewContent] = useState<{ [x: string]: any }>({})
     const [projectId, setProjectId] = useState<number>()
+     const [isEditSc, setIsEditSc] = useState<boolean>(false)
     const [subVisible, setSubVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
 
     const welcomeMsgJobType = useAjax(() => welcomeMsgJobTypeApi())//获取欢迎语类型
@@ -50,7 +51,8 @@ const MomentsCreatePage: React.FC<{ weComTaskStore: { data: { bookList: TASK_CRE
     useEffect(() => {
         const project = sessionStorage.getItem('MOMENTSTASKID')
         if (project) {
-            const { id, isCopy } = JSON.parse(project)
+            const { id, isCopy, isEditSc } = JSON.parse(project)
+            setIsEditSc(isEditSc)
             if (!isCopy) {
                 setProjectId(id)
             }
@@ -294,7 +296,9 @@ const MomentsCreatePage: React.FC<{ weComTaskStore: { data: { bookList: TASK_CRE
     const onPreviewReset = () => {
         setPreviewData([])
         setPreviewDataOld([])
-        setPreviewContent({})
+        if (!isEditSc) {
+            setPreviewContent({})
+        }
     }
 
     const severBd = () => {
@@ -327,6 +331,7 @@ const MomentsCreatePage: React.FC<{ weComTaskStore: { data: { bookList: TASK_CRE
                     <Space.Compact>
                         <Button>客服组</Button>
                         <SelectCorpUserGroup
+                            disabled={isEditSc}
                             value={settings?.corpUserGroups}
                             onChange={(corpUserGroups) => {
                                 setSettings({
@@ -422,7 +427,8 @@ const MomentsCreatePage: React.FC<{ weComTaskStore: { data: { bookList: TASK_CRE
                                 bookPlatForm,
                                 bookList,
                                 msgJobTypeList,
-                                onPreviewReset
+                                onPreviewReset,
+                                isEditSc
                             }}
                         >
                             {/* 朋友圈策略 */}

+ 1 - 0
src/pages/weComTask/page/moments/create/typings.d.ts

@@ -26,5 +26,6 @@ declare namespace TASK_MOMENTS_CREATE {
             label: string;
         }[]
         onPreviewReset: () => void
+        isEditSc: boolean
     }
 }

+ 2 - 2
src/pages/weComTask/page/moments/taskList/index.tsx

@@ -48,8 +48,8 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
     }
 
     // 复制
-    const handleCopy = (data: any, isCopy: boolean) => {
-        sessionStorage.setItem('MOMENTSTASKID', JSON.stringify({ id: data.id, isCopy }))
+    const handleCopy = (data: any, isCopy: boolean, isEditSc?: boolean) => {
+        sessionStorage.setItem('MOMENTSTASKID', JSON.stringify({ id: data.id, isCopy, isEditSc: isEditSc || false }))
         sessionStorage.setItem('oldPath', '/weComTask/moments/create')
         window.location.href = '/weComTask#/weComTask/moments/create'
     }

+ 2 - 1
src/pages/weComTask/page/moments/taskList/tableConfig.tsx

@@ -9,7 +9,7 @@ import PreviewMomentsStrategy from "../create/components/Strategy/previewMoments
 const { Text, Paragraph } = Typography;
 const taskListColumns = (
     handleLog: (data: any) => void,
-    handleCopy: (data: any, isCopy: boolean) => void,
+    handleCopy: (data: any, isCopy: boolean, isEditSc?: boolean) => void,
     handleDel: (data: any, type: 'del' | 'cancel' | 'open') => void,
 ): ColumnsType<AnyObject> => {
 
@@ -34,6 +34,7 @@ const taskListColumns = (
                     </Popconfirm> : undefined}
                     <a onClick={() => handleCopy(record, true)}>复制</a>
                     <a onClick={() => handleCopy(record, false)}>编辑</a>
+                    <a onClick={() => handleCopy(record, false, true)}>编辑素材</a>
                     <a onClick={() => handleLog(record)}>详情</a>
                     <Popconfirm
                         title="确定删除?"