const.tsx 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. import { Badge, Tag } from 'antd'
  2. import { ReactNode } from 'react'
  3. /** 欢迎语模板适用产品 */
  4. export const welcomeTemplateData = [
  5. {
  6. label: '通用',
  7. value: 0
  8. },
  9. {
  10. label: '洗粉',
  11. value: 1
  12. },
  13. {
  14. label: '大主宰',
  15. value: 2
  16. },
  17. {
  18. label: '大队辅导员',
  19. value: 3
  20. }
  21. ]
  22. /** 欢迎语内容组发送模式 */
  23. export const welcomeContentData = [
  24. {
  25. label: '顺序依次发送',
  26. value: 1
  27. },
  28. {
  29. label: '随机发送',
  30. value: 0
  31. }
  32. ]
  33. /** 业务类型 */
  34. export const businessPlanData = [
  35. { label: '付费小说', value: 'NOVEL' },
  36. { label: '小说IAA', value: 'NOVEL_IAA' },
  37. { label: '付费游戏', value: 'GAME' },
  38. { label: '游戏IAA', value: 'GAME_IAA' },
  39. { label: '短剧IAA', value: 'SKIT_IAA' },
  40. ]
  41. export const WEEK_SERIRES = [{ label: '周一', value: 1 }, { label: '周二', value: 2 }, { label: '周三', value: 3 }, { label: '周四', value: 4 }, { label: '周五', value: 5 }, { label: '周六', value: 6 }, { label: '周天', value: 7 }]
  42. export const WEEK_SERIRES_DX: { [x: string]: string } = {
  43. '1': '周一',
  44. '2': '周二',
  45. '3': '周三',
  46. '4': '周四',
  47. '5': '周五',
  48. '6': '周六',
  49. '7': '周天'
  50. }
  51. export const STATUS_ZJ: { [x: string]: JSX.Element } = {
  52. 'TASK_STATUS_CREATE': <Badge status="default" text={'创建中'} />,
  53. 'TASK_STATUS_WAIT': <Badge status="warning" text={'等待中'} />,
  54. 'TASK_STATUS_RUN': <Badge status="processing" text={'执行中'} />,
  55. 'TASK_STATUS_FINISH': <Badge status="success" text={'执行完成'} />,
  56. 'TASK_STATUS_FAIL': <Badge status="error" text={'执行失败'} />,
  57. 'TASK_STATUS_DELETE': <Badge status="error" text={'已删除'} />,
  58. 'TASK_STATUS_SUSPEND': <Badge color={'purple'} text={'执行暂停'} />,
  59. 'TASK_STATUS_CANCEL': <Badge color={'magenta'} text={'执行取消'} />
  60. }
  61. export enum StatusEnum {
  62. TASK_STATUS_CREATE = '创建中',
  63. TASK_STATUS_WAIT = '等待中',
  64. TASK_STATUS_RUN = '执行中',
  65. TASK_STATUS_FINISH = '执行完成',
  66. TASK_STATUS_FAIL = '执行失败',
  67. TASK_STATUS_SUSPEND = '执行暂停',
  68. TASK_STATUS_CANCEL = '执行取消'
  69. }
  70. export const TIME_TYPE: { [x: string]: string } = {
  71. TIME_TYPE_SINGLE_TIMELY: '立即发送',
  72. TIME_TYPE_SINGLE_PLACE: '定时发送',
  73. TIME_TYPE_REPEAT_DAY: '每日循环',
  74. TIME_TYPE_REPEAT_WEEK: '每周循环',
  75. TIME_TYPE_REPEAT_MONTH: '每月循环'
  76. }
  77. export const TIME_TYPE_ZJ: { [x: string]: ReactNode } = {
  78. TIME_TYPE_SINGLE_TIMELY: <Tag color="#f50">立即发送</Tag>,
  79. TIME_TYPE_SINGLE_PLACE: <Tag color="#2db7f5">定时发送</Tag>,
  80. TIME_TYPE_REPEAT_DAY: <Tag color="#87d068">每日循环</Tag>,
  81. TIME_TYPE_REPEAT_WEEK: <Tag color="#108ee9">每周循环</Tag>,
  82. TIME_TYPE_REPEAT_MONTH: <Tag color="#cd201f">每月循环</Tag>
  83. }
  84. export const GENDER_TYPE: { [x: string]: string } = {
  85. '2': '女',
  86. '1': '男',
  87. '0': '未知'
  88. }
  89. export const EUTTaskStatus = { 0: <Badge status="default" text="创建中" />, 1: <Badge status="processing" text='执行中' />, 2: <Badge status="success" text="执行完成" />, 3: <Badge status="warning" text="暂停" /> }
  90. // 拉群
  91. export const LQTaskStatus = { 1: <Badge status="processing" text='执行中' />, 2: <Badge status="success" text="执行完成" />, 3: <Badge status="warning" text="暂停" />, '-1': <Badge status="error" text="执行失败" /> }
  92. /**
  93. * 返回处理过的客户继承数据
  94. * @param schedulingStrategyDTO
  95. * @param taskName
  96. * @returns
  97. */
  98. export const getUserInDataData = (schedulingStrategyDTO: any[], taskName?: string): { taskName: string, strategyData: { [x: string]: any }, inheritData: { [x: string]: any }, strategyIndex: number, inheritIndex: number }[] => {
  99. const userInData = []
  100. schedulingStrategyDTO?.forEach((item, index) => {
  101. // 1、策略 名称 、时间、周期
  102. const { inheritDto, ...strategyData } = JSON.parse(JSON.stringify(item))
  103. inheritDto?.forEach((item1, index1, row) => {
  104. // 2、转移对象、文本
  105. userInData.push({
  106. taskName: taskName || '--',
  107. strategyData,
  108. inheritData: item1,
  109. strategyIndex: index + 1,
  110. inheritIndex: index1 + 1,
  111. strategyRowSpan: index1 === 0 ? row.length : 0
  112. })
  113. })
  114. })
  115. return userInData
  116. }
  117. /**
  118. * 返回处理过的群发数据
  119. * @param settings
  120. * @returns
  121. */
  122. export const getGroupData = (settings: TASK_CREATE.SettingsProps): {
  123. groupSendName: string,
  124. strategyData: { [x: string]: any },
  125. sendData: { [x: string]: any },
  126. content: { [x: string]: any },
  127. strategyIndex: number,
  128. sendDataIndex: number,
  129. contentIndex: number,
  130. sendMode: 0 | 1,
  131. strategyDataCount: number,
  132. sendDataRowSpan: number,
  133. }[] => {
  134. const msgData = []
  135. settings?.massSendingContent?.massSendingContentDTO?.forEach((mediaItem, index) => {
  136. // 2、策略信息 发送 发送时间
  137. const strategyData = settings?.massSendingStrategy?.strategySettings?.[index]
  138. // 下面总共多少发送对象
  139. const strategyDataCount = mediaItem?.sendContentDto?.reduce((pre, cur) => {
  140. return pre + cur.contentDTO.length
  141. }, 0)
  142. // console.log('策略信息' + (index + 1), strategyData)
  143. mediaItem?.sendContentDto?.forEach((contentItem, contentindex) => {
  144. // 发送对象
  145. const sendData = strategyData?.sendData?.[contentindex]
  146. const sendDataCount = contentItem.contentDTO.length
  147. // console.log('发送对象' + (contentindex + 1), sendData)
  148. // 4、群发内容
  149. contentItem?.contentDTO.forEach((item, i) => {
  150. // console.log('发送内容' + (i + 1), item)
  151. const { sendData: aa, ...sd } = strategyData
  152. msgData.push({
  153. groupSendName: settings?.massSendingStrategy?.groupSendName,
  154. // 策略信息
  155. strategyData: sd,
  156. // 发送模式
  157. sendMode: contentItem?.sendMode,
  158. // 发送对象
  159. sendData,
  160. // 群发内容
  161. content: item,
  162. strategyIndex: index + 1,
  163. sendDataIndex: contentindex + 1,
  164. contentIndex: i + 1,
  165. strategyDataCount,
  166. sendDataRowSpan: i === 0 ? sendDataCount : 0
  167. })
  168. })
  169. })
  170. })
  171. return msgData
  172. }
  173. /**
  174. * 返回处理过的高级群发数据
  175. * @param settings
  176. * @returns
  177. */
  178. export const getHighGroupData = (settings: TASK_CREATE.SettingsProps): {
  179. groupSendName: string,
  180. strategyData: { [x: string]: any },
  181. sendData: { [x: string]: any },
  182. content: { [x: string]: any },
  183. strategyIndex: number,
  184. sendDataIndex: number,
  185. contentIndex: number,
  186. sendMode: 0 | 1,
  187. strategyDataCount: number,
  188. sendDataRowSpan: number,
  189. strategyItemSendDataCount: number
  190. }[] => {
  191. const msgData = []
  192. settings?.highMassSendingContent?.massSendingContentDTO?.forEach((mediaItem, index) => {
  193. // 2、策略信息 发送 发送时间
  194. const strategyData = settings?.highMassSendingStrategy?.strategySettings?.[index]
  195. // 下面总共多少发送对象
  196. const strategyDataCount = mediaItem?.sendContentDto?.reduce((pre, cur) => {
  197. return pre + cur.contentDTO.length
  198. }, 0)
  199. // console.log('策略信息' + (index + 1), strategyData)
  200. mediaItem?.sendContentDto?.forEach((contentItem, contentindex) => {
  201. // 发送对象
  202. const sendData = strategyData?.sendData?.[contentindex]
  203. const strategyItemSendDataCount = strategyData?.sendData.length
  204. const sendDataCount = contentItem.contentDTO.length
  205. // console.log('发送对象' + (contentindex + 1), sendData)
  206. // 4、群发内容
  207. contentItem?.contentDTO.forEach((item, i) => {
  208. // console.log('发送内容' + (i + 1), item)
  209. const { sendData: aa, ...sd } = strategyData
  210. msgData.push({
  211. groupSendName: settings?.highMassSendingStrategy?.groupSendName,
  212. // 策略信息
  213. strategyData: sd,
  214. // 发送模式
  215. sendMode: contentItem?.sendMode,
  216. // 发送对象
  217. sendData,
  218. // 群发内容
  219. content: item,
  220. strategyIndex: index + 1,
  221. sendDataIndex: contentindex + 1,
  222. contentIndex: i + 1,
  223. strategyDataCount,
  224. strategyItemSendDataCount,
  225. sendDataRowSpan: i === 0 ? sendDataCount : 0
  226. })
  227. })
  228. })
  229. })
  230. return msgData
  231. }
  232. /**
  233. * 重置客户继承数据成可编辑数据
  234. * @param externalUserTransferTasksDTO
  235. * @returns
  236. */
  237. export const restoreUserInheritData = (externalUserTransferTasksDTO: { [x: string]: any }) => {
  238. const { taskName, schedulingStrategyDTO } = externalUserTransferTasksDTO
  239. return {
  240. taskName,
  241. schedulingStrategyDTO: schedulingStrategyDTO.map(schedulingStrategyDTOItem => {
  242. const { transferStrategyContentDTOS, ...strategy } = schedulingStrategyDTOItem
  243. return {
  244. ...strategy,
  245. inheritDto: transferStrategyContentDTOS.map(item => {
  246. const { externalUserFilter, transferSuccessMsg } = item
  247. const inherit: { [x: string]: any } = {
  248. transferSuccessMsg
  249. }
  250. if (externalUserFilter) {
  251. inherit.transferType = 'specify'
  252. const { configName, ...configContent } = externalUserFilter
  253. inherit.transferUserDto = {
  254. configName,
  255. configContent
  256. }
  257. } else {
  258. inherit.transferType = 'all'
  259. }
  260. return inherit
  261. })
  262. }
  263. })
  264. }
  265. }
  266. /**
  267. * 重置群发数据为可编辑数据
  268. * @param groupSendTaskAddDTO
  269. */
  270. export const restoreGroupData = (groupSendTaskAddDTO: { [x: string]: any }, configType?: BUSINES_SPLAN_API.ConfigTypeProps) => {
  271. const type = configType || 'USER_GROUP'
  272. const { groupSendName, strategyList } = groupSendTaskAddDTO
  273. const massSendingContentDTO: { [x: string]: any }[] = []
  274. const nowTime = Date.now()
  275. const strategySettings = strategyList.map((item, index) => {
  276. const { taskDetail, ...strategy } = item
  277. const sendContentDto = []
  278. const sendData = taskDetail.map((item1, index1) => {
  279. const { sendMode, externalUserFilterName, contentDTO, externalUserFilter } = item1
  280. sendContentDto.push({
  281. sendMode,
  282. contentDTO: type === 'USER_GROUP' ? contentDTO : contentDTO.map(item2 => {
  283. const { msgType, ...content } = item2
  284. if (msgType === 'TASK_STATUS_MINIPROGRAM') {
  285. const { miniprogram: { appId, page, title, picUrl } } = content
  286. return [{
  287. miniprogramAppid: appId,
  288. miniprogramPage: page,
  289. miniprogramTitle: title,
  290. miniprogramPicurl: picUrl,
  291. mediaType: 'miniprogram'
  292. }]
  293. } else if (msgType === 'TASK_CONTENT_TEXT') {
  294. const { text } = content
  295. return [{
  296. textContent: text?.content,
  297. mediaType: 'text'
  298. }]
  299. } else if (msgType === 'TASK_CONTENT_LINK') {
  300. const { link: { desc, picUrl, title, url } } = content
  301. return [{
  302. linkDesc: desc,
  303. linkPicurl: picUrl,
  304. linkTitle: title,
  305. linkUrl: url,
  306. mediaType: 'link'
  307. }]
  308. } else if (msgType === 'TASK_CONTENT_IMAGE') {
  309. const { image: { picUrl } } = content
  310. return [{
  311. imageUrl: picUrl,
  312. mediaType: 'image'
  313. }]
  314. } else if (msgType === 'TASK_STATUS_VIDEO') {
  315. const { video: { videoUrl } } = content
  316. return [{
  317. videoUrl: videoUrl,
  318. mediaType: 'video'
  319. }]
  320. } else if (msgType === 'TASK_STATUS_FILE') {
  321. const { file: { fileUrl } } = content
  322. return [{
  323. fileUrl: fileUrl,
  324. mediaType: 'file'
  325. }]
  326. }
  327. return {
  328. msgType,
  329. content
  330. }
  331. }),
  332. id: nowTime + (index * 1000) + (index1 * 100)
  333. })
  334. if (externalUserFilter) {
  335. const { configName, ...configContent } = externalUserFilter
  336. return {
  337. externalUserType: 'specify',
  338. externalUserFilter: {
  339. configName,
  340. configContent
  341. },
  342. externalUserFilterName,
  343. id: nowTime + (index * 1000) + (index1 * 100)
  344. }
  345. }
  346. return {
  347. externalUserType: 'all',
  348. externalUserFilterName,
  349. id: nowTime + (index * 1000) + (index1 * 100)
  350. }
  351. })
  352. massSendingContentDTO.push({
  353. sendContentDto,
  354. id: nowTime + (index * 1000)
  355. })
  356. return {
  357. ...strategy,
  358. sendData,
  359. id: nowTime + (index * 1000)
  360. }
  361. })
  362. return {
  363. massSendingStrategy: {
  364. groupSendName,
  365. strategySettings
  366. },
  367. massSendingContent: {
  368. massSendingContentDTO
  369. }
  370. }
  371. }
  372. export const momentAttachmentList = (attachmentList: any[]) => {
  373. return attachmentList.map((item: any) => {
  374. switch (item.msgType) {
  375. case 'TASK_CONTENT_IMAGE':
  376. return {
  377. mediaType: 'image',
  378. imageUrl: item.image.picUrl,
  379. mediaFormat: item.image.mediaFormat,
  380. mediaSize: item.image.mediaSize,
  381. mediaPlayTime: item.image.mediaPlayTime,
  382. mediaWidth: item.image.mediaWidth,
  383. mediaHeight: item.image.mediaHeight
  384. }
  385. case 'TASK_STATUS_VIDEO':
  386. return {
  387. mediaType: 'video',
  388. videoUrl: item.video.videoUrl,
  389. mediaFormat: item.image.mediaFormat,
  390. mediaSize: item.image.mediaSize,
  391. mediaPlayTime: item.image.mediaPlayTime,
  392. mediaWidth: item.image.mediaWidth,
  393. mediaHeight: item.image.mediaHeight
  394. }
  395. case 'TASK_STATUS_FILE':
  396. return { mediaType: 'file', fileUrl: item.file.fileUrl }
  397. case "TASK_CONTENT_LINK":
  398. return { mediaType: 'link', linkDesc: item.link.desc, linkPicurl: item.link.picUrl, linkTitle: item.link.title, linkUrl: item.link.url }
  399. case 'TASK_STATUS_MINIPROGRAM':
  400. return {
  401. mediaType: 'miniprogram',
  402. miniprogramAppid: item.miniprogram.appId,
  403. miniprogramPage: item.miniprogram.page,
  404. miniprogramPicurl: item.miniprogram.picUrl,
  405. miniprogramTitle: item.miniprogram.title
  406. }
  407. }
  408. })
  409. }
  410. /**
  411. * 重置朋友圈数据为可编辑数据
  412. * @param momentCreateDTO
  413. * @returns
  414. */
  415. export const restoreMomentData = (momentCreateDTO: { [x: string]: any }) => {
  416. const { momentSendName, strategyList } = momentCreateDTO
  417. const friendsContentDTO: { [x: string]: any }[] = []
  418. const strategySettings = strategyList.map(item => {
  419. const { taskDetail, ...params } = item
  420. friendsContentDTO.push({
  421. ...taskDetail,
  422. contentDTO: taskDetail.contentDTO.map(content => {
  423. return {
  424. text: content.text,
  425. attachmentList: momentAttachmentList(content.attachmentList)
  426. }
  427. })
  428. })
  429. return params
  430. })
  431. return {
  432. friendsStrategy: {
  433. momentSendName,
  434. strategySettings
  435. },
  436. friendsContent: {
  437. friendsContentDTO
  438. }
  439. }
  440. }
  441. // excel 配置
  442. // // 复杂表头示例(两级表头)
  443. // import XLSX from "xlsx-js-style";
  444. // const headers = [
  445. // [
  446. // { v: "账号", s: headerStyle },
  447. // { v: '欢迎语标题', s: headerStyle },
  448. // { v: '智能标签', s: headerStyle },
  449. // { v: '内容组发送模式', s: headerStyle },
  450. // { v: '欢迎语内容', s: headerStyle },
  451. // { v: '图文链接', s: headerStyle },
  452. // { v: '小程序APPID', s: headerMustStyle },
  453. // { v: '小程序路径', s: headerMustStyle }
  454. // ]
  455. // ];
  456. // // 数据内容
  457. // const data = settings?.corpUserList?.map((item) => {
  458. // return mediaContent?.map((mediaItem) => {
  459. // return {
  460. // '账号': `${item.name}(${item.corpUserId})`,
  461. // '欢迎语标题': `${welcomeName}`,
  462. // '智能标签': `${business ? `业务:${businessPlanData.find(i => i.value === business)?.label}` : '--'}\n${bookCity ? `书城;${bookPlatForm.find(i => i.id === bookCity)?.platformName}` : '--'}\n${product ? `产品:${bookList.find(i => i.id === product)?.bookName}` : '--'}`,
  463. // '内容组发送模式': welcomeContentData.find(i => i.value === welcomeContentType)?.label,
  464. // '欢迎语内容': '--',
  465. // '图文链接': '--',
  466. // '小程序APPID': '--',
  467. // '小程序路径': '--'
  468. // }
  469. // })
  470. // })
  471. // // 将数据转换为二维数组
  472. // const dataArray = [
  473. // ...headers,
  474. // ...data.map(row => [
  475. // row['账号'],
  476. // row['欢迎语标题'],
  477. // row['智能标签'],
  478. // row['内容组发送模式'],
  479. // row['欢迎语内容'],
  480. // row['图文链接'],
  481. // row['小程序APPID'],
  482. // row['小程序路径']
  483. // ])
  484. // ];
  485. // // 创建工作表并合并单元格
  486. // const worksheet = XLSX.utils.aoa_to_sheet(dataArray);
  487. // worksheet["!rows"] = [{ hpx: 30 }, ...Array(1000).fill({ hpx: 20 })]; // 设置行高
  488. // worksheet['!cols'] = [{ width: 40 }, { width: 25 }, { width: 30 }, { width: 30 }, { width: 40 }, { width: 30 }, { width: 30 }, { width: 30 }]; // 设置列宽
  489. // // worksheet['!merges'] = [
  490. // // // 合并主标题1(合并前两列)
  491. // // { s: { r: 1, c: 0 }, e: { r: 1, c: 1 } }
  492. // // ];
  493. // // 创建工作簿并导出
  494. // const workbook = XLSX.utils.book_new();
  495. // XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  496. // const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
  497. // const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
  498. // saveAs(blob, 'complex_data.xlsx');
  499. // console.log(dataArray);
  500. // 表头样式
  501. export const headerStyle = {
  502. font: { bold: true, sz: 14, color: { rgb: "FFFFFF" }, name: "微软雅黑" },
  503. fill: { fgColor: { rgb: "1890FF" } },
  504. alignment: { vertical: "center", horizontal: "center" },
  505. border: {
  506. top: { style: "thin", color: { rgb: "FFFFFF" } },
  507. bottom: { style: "thin", color: { rgb: "FFFFFF" } },
  508. left: { style: "thin", color: { rgb: "FFFFFF" } },
  509. right: { style: "thin", color: { rgb: "FFFFFF" } }
  510. }
  511. };
  512. // 必填样式
  513. export const headerMustStyle = {
  514. font: { bold: true, sz: 14, color: { rgb: "FFFFFF" }, name: "微软雅黑" },
  515. fill: { fgColor: { rgb: "ff7875" } },
  516. alignment: { vertical: "center", horizontal: "center" },
  517. border: {
  518. top: { style: "thin", color: { rgb: "FFFFFF" } },
  519. bottom: { style: "thin", color: { rgb: "FFFFFF" } },
  520. left: { style: "thin", color: { rgb: "FFFFFF" } },
  521. right: { style: "thin", color: { rgb: "FFFFFF" } }
  522. }
  523. };
  524. // JS表格头样式
  525. export const headerJsStyle = {
  526. fill: {
  527. type: 'pattern',
  528. pattern: 'solid',
  529. fgColor: { argb: '1890ff' } // 蓝色背景
  530. },
  531. font: {
  532. name: '微软雅黑',
  533. size: 14,
  534. bold: true,
  535. color: { argb: 'FFFFFF' }
  536. },
  537. alignment: {
  538. vertical: 'middle',
  539. horizontal: 'center'
  540. },
  541. border: {
  542. top: { style: 'thin', color: { argb: 'FFFFFF' } },
  543. bottom: { style: 'thin', color: { argb: 'FFFFFF' } },
  544. left: { style: 'thin', color: { argb: 'FFFFFF' } },
  545. right: { style: 'thin', color: { argb: 'FFFFFF' } }
  546. }
  547. };
  548. // JS必填样式
  549. export const headerJsMustStyle = {
  550. fill: {
  551. type: 'pattern',
  552. pattern: 'solid',
  553. fgColor: { argb: 'ff7875' } // 蓝色背景
  554. },
  555. font: {
  556. name: '微软雅黑',
  557. size: 14,
  558. bold: true,
  559. color: { argb: 'FFFFFF' }
  560. },
  561. alignment: {
  562. vertical: 'middle',
  563. horizontal: 'center'
  564. },
  565. border: {
  566. top: { style: 'thin', color: { argb: 'FFFFFF' } },
  567. bottom: { style: 'thin', color: { argb: 'FFFFFF' } },
  568. left: { style: 'thin', color: { argb: 'FFFFFF' } },
  569. right: { style: 'thin', color: { argb: 'FFFFFF' } }
  570. }
  571. };
  572. // 排除标签
  573. export const sysExternalExcludeTagList = [
  574. 'QC_智能_移出',
  575. 'QC_投诉客户',
  576. 'QC_进群_异常'
  577. ]