index.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  1. <template>
  2. <template-page
  3. ref="pageRef"
  4. :get-list="getList"
  5. :exportList="exportList"
  6. :table-attributes="tableAttributes"
  7. :table-events="tableEvents"
  8. :options-evens-group="optionsEvensGroup"
  9. :column-parsing="columnParsing"
  10. :operation="operation()"
  11. :operationColumnWidth="250"
  12. :moreParameters="moreParameters"
  13. >
  14. <div class="cartographer">
  15. <el-dialog
  16. :title="formData.id ? '详情' : '新增'"
  17. width="100%"
  18. :modal="false"
  19. :visible.sync="formDialog"
  20. :before-close="formCancel"
  21. >
  22. <zj-form-container v-if="formDialog" ref="formRef" :form-data="formData" :styleSwitch="false">
  23. <zj-form-module title="活动信息" label-width="120px" :form-data="formData" :form-items="formItems">
  24. </zj-form-module>
  25. <formModule :item="formData" :typeView="typeView"></formModule>
  26. <zj-form-module title="活动填写内容" label-width="100px" :form-data="formData" :form-items="formItems2">
  27. </zj-form-module>
  28. </zj-form-container>
  29. <div slot="footer" class="dialog-footer">
  30. <el-button size="mini" @click="formCancel">取 消</el-button>
  31. <el-button v-if="formData.id && qx(formData)" size="mini" type="primary" @click="zhongzhi">终 止</el-button>
  32. <el-button v-if="qx(formData)" size="mini" type="primary" @click="formConfirm">确 定</el-button>
  33. </div>
  34. </el-dialog>
  35. </div>
  36. <answer v-if="showQuestion" :defaultData="questionData" @close="questionClose" @confirm="questionConfirm" />
  37. </template-page>
  38. </template>
  39. <script>
  40. import TemplatePage from '@/components/template/template-page-1.vue'
  41. import import_mixin from '@/components/template/import_mixin.js'
  42. import operation_mixin from '@/components/template/operation_mixin.js'
  43. import {
  44. promotionQuestionnaireList,
  45. promotionQuestionnaireExport,
  46. promotionQuestionnaireAdd,
  47. promotionQuestionnaireStop,
  48. promotionQuestionnaireDetail,
  49. promotionQuestionnaireShow
  50. } from '@/api/setActivity.js'
  51. import answer from './answer.vue'
  52. import ImageUpload from '@/components/file-upload'
  53. import quillEditor from '@/components/v-quill-editor'
  54. import editTable from '@/components/template/editTable.js'
  55. import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
  56. import formModule from './formModule.vue'
  57. export default {
  58. components: { TemplatePage, answer, ImageUpload, quillEditor, formModule },
  59. mixins: [import_mixin, operation_mixin, editTable],
  60. data() {
  61. return {
  62. formDialog: false,
  63. showQuestion: false,
  64. questionData: {
  65. rowIndex: -1
  66. },
  67. formData: {
  68. companyWechatId: '',
  69. companyWechatName: JSON.parse(localStorage.getItem('greemall_user')).companyName,
  70. startTime: '',
  71. endTime: '',
  72. name: '',
  73. submitLimit: '',
  74. submitLimitBool: 0,
  75. qrcode: '',
  76. title: '',
  77. content: '',
  78. banner: [],
  79. detailImgs: [],
  80. promotionQuestionnaireItems: [],
  81. promotionQuestionnaireUsers: [],
  82. promotionQuestionnaireQrcodes: []
  83. },
  84. // 表格属性
  85. tableAttributes: {
  86. // 启用勾选列
  87. selectColumn: false
  88. },
  89. // 表格事件
  90. tableEvents: {},
  91. typeView: 0
  92. }
  93. },
  94. computed: {
  95. moreParameters() {
  96. return [
  97. {
  98. name: '状态',
  99. key: 'status',
  100. value: '',
  101. conditions: [
  102. {
  103. label: '生效中',
  104. value: '1'
  105. },
  106. {
  107. label: '待生效',
  108. value: '0'
  109. },
  110. {
  111. label: '已过期',
  112. value: '2'
  113. },
  114. {
  115. label: '已终止',
  116. value: '3'
  117. },
  118. {
  119. label: '全部',
  120. value: ''
  121. }
  122. ]
  123. }
  124. ]
  125. },
  126. // 事件组合
  127. optionsEvensGroup() {
  128. return [
  129. [
  130. [
  131. this.optionsEvensAuth('add', {
  132. click: this.addData
  133. })
  134. ]
  135. ]
  136. ]
  137. },
  138. formItems() {
  139. return [
  140. {
  141. name: 'el-date-picker',
  142. md: 6,
  143. attributes: {
  144. disabled: !this.qx(this.formData),
  145. style: { width: '100%' },
  146. placeholder: '请选择',
  147. 'value-format': 'yyyy-MM-dd HH:mm:ss',
  148. 'picker-options': {
  149. disabledDate: time => {
  150. return time.getTime() < Date.now() - 86400000
  151. }
  152. }
  153. },
  154. formItemAttributes: {
  155. label: '活动开始日期',
  156. prop: 'startTime',
  157. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  158. },
  159. events: {
  160. change: () => {
  161. this.formData.endTime = ''
  162. }
  163. }
  164. },
  165. {
  166. name: 'el-date-picker',
  167. md: 6,
  168. attributes: {
  169. disabled: !this.qx(this.formData),
  170. style: { width: '100%' },
  171. placeholder: '请选择',
  172. 'value-format': 'yyyy-MM-dd HH:mm:ss',
  173. 'picker-options': {
  174. disabledDate: time => {
  175. if (this.formData.startTime) {
  176. return time.getTime() < new Date(this.formData.startTime).getTime()
  177. }
  178. return true
  179. }
  180. }
  181. },
  182. formItemAttributes: {
  183. label: '活动结束日期',
  184. prop: 'endTime',
  185. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  186. }
  187. },
  188. {
  189. name: 'el-input',
  190. md: 12,
  191. attributes: { disabled: !this.qx(this.formData), placeholder: '请选择' },
  192. formItemAttributes: {
  193. label: '活动名称',
  194. prop: 'name',
  195. rules: [{ required: true, message: '请填写', trigger: 'blur' }]
  196. }
  197. },
  198. {
  199. name: 'el-input',
  200. md: 12,
  201. attributes: { disabled: !this.qx(this.formData), placeholder: '请选择', maxlength: 8 },
  202. formItemAttributes: {
  203. label: '二维码主题',
  204. prop: 'title',
  205. rules: [{ required: true, message: '请填写', trigger: 'blur' }]
  206. }
  207. },
  208. {
  209. md: 24,
  210. name: 'slot-component',
  211. attributes: { placeholder: '请输入' },
  212. formItemAttributes: {
  213. label: '提交次数',
  214. prop: 'submitLimitBool',
  215. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  216. },
  217. render: (h, { props, onInput }) => {
  218. var { value } = props
  219. return (
  220. <div class="redbordererr" style="">
  221. <el-form-item
  222. label=""
  223. label-width="0px"
  224. prop="submitLimit"
  225. rules={value ? [{ required: true, message: '请填写', trigger: 'blur' }] : []}
  226. >
  227. <el-radio-group disabled={!this.qx(this.formData)} value={value} onInput={onInput}>
  228. <el-radio disabled={!this.qx(this.formData)} label={0}>
  229. 不限制
  230. </el-radio>
  231. <el-radio disabled={!this.qx(this.formData)} label={1}>
  232. 限制
  233. {value
  234. ? [
  235. <el-input
  236. disabled={!this.qx(this.formData)}
  237. style="margin: 0 10px;width:100px;"
  238. value={this.formData.submitLimit}
  239. onInput={val => {
  240. this.formData.submitLimit = val
  241. }}
  242. type="number"
  243. placeholder="请输入内容"
  244. ></el-input>,
  245. <span>次</span>
  246. ]
  247. : null}
  248. </el-radio>
  249. </el-radio-group>
  250. </el-form-item>
  251. </div>
  252. )
  253. }
  254. },
  255. {
  256. md: 24,
  257. name: 'slot-component',
  258. attributes: { placeholder: '请输入' },
  259. formItemAttributes: {
  260. label: '首页广告图',
  261. prop: 'banner',
  262. rules: [{ required: true, message: '请上传', trigger: 'blur' }]
  263. },
  264. render: (h, { props, onInput }) => {
  265. var { value } = props
  266. return (
  267. <ImageUpload
  268. isEdit={this.qx(this.formData)}
  269. fileList={this.formData.banner}
  270. uid={`questionFiles_bananner`}
  271. limit={1}
  272. isUpdate={false}
  273. />
  274. )
  275. }
  276. },
  277. {
  278. md: 24,
  279. name: 'slot-component',
  280. attributes: { placeholder: '请输入' },
  281. formItemAttributes: {
  282. label: '活动详情图',
  283. prop: 'detailImgs',
  284. rules: [{ required: true, message: '请上传', trigger: 'blur' }]
  285. },
  286. render: (h, { props, onInput }) => {
  287. var { value } = props
  288. return (
  289. <ImageUpload
  290. isEdit={this.qx(this.formData)}
  291. fileList={this.formData.detailImgs}
  292. uid={`questionFiles_detaidetailImgsdetailImgs`}
  293. limit={100}
  294. isUpdate={false}
  295. />
  296. )
  297. }
  298. },
  299. {
  300. md: 24,
  301. name: 'slot-component',
  302. attributes: { placeholder: '请输入' },
  303. formItemAttributes: {
  304. label: '活动说明',
  305. prop: 'content',
  306. rules: []
  307. },
  308. render: (h, { props, onInput }) => {
  309. var { value } = props
  310. return <quillEditor disabled={!this.qx(this.formData)} value={value} onInput={onInput}></quillEditor>
  311. }
  312. },
  313. {
  314. name: 'slot-component',
  315. md: 24,
  316. formItemAttributes: {
  317. label: '提交记录',
  318. prop: 'promotionQuestionnaireUsers',
  319. rules: [{ required: true, message: '请设置', trigger: 'blur' }]
  320. },
  321. render: (h, { props, onInput }) => {
  322. var { value } = props
  323. return this.convertTableJson(
  324. value,
  325. [
  326. {
  327. columnAttributes: {
  328. label: '*姓名',
  329. prop: 'name'
  330. },
  331. editRender: (h, { row, column, index }) => {
  332. return (
  333. <div class="redbordererr">
  334. <el-form-item
  335. label=""
  336. label-width="0px"
  337. prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`}
  338. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  339. >
  340. <el-input
  341. value={row[column.columnAttributes.prop]}
  342. onInput={val => {
  343. row[column.columnAttributes.prop] = val
  344. }}
  345. placeholder="请输入内容"
  346. ></el-input>
  347. </el-form-item>
  348. </div>
  349. )
  350. },
  351. viewRender: (h, { row, column, index }) => {
  352. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  353. }
  354. },
  355. {
  356. columnAttributes: {
  357. label: '*电话',
  358. prop: 'mobile'
  359. },
  360. editRender: (h, { row, column, index }) => {
  361. return (
  362. <div class="redbordererr">
  363. <el-form-item
  364. label=""
  365. label-width="0px"
  366. prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`}
  367. rules={mobileRequired}
  368. >
  369. <el-input
  370. value={row[column.columnAttributes.prop]}
  371. onInput={val => {
  372. row[column.columnAttributes.prop] = val
  373. }}
  374. placeholder="请输入内容"
  375. ></el-input>
  376. </el-form-item>
  377. </div>
  378. )
  379. },
  380. viewRender: (h, { row, column, index }) => {
  381. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  382. }
  383. },
  384. {
  385. columnAttributes: {
  386. label: '*时间(分钟)',
  387. prop: 'min'
  388. },
  389. editRender: (h, { row, column, index }) => {
  390. return (
  391. <div class="redbordererr">
  392. <el-form-item
  393. label=""
  394. label-width="0px"
  395. prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`}
  396. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  397. >
  398. <el-input
  399. type="number"
  400. value={row[column.columnAttributes.prop]}
  401. onInput={val => {
  402. row[column.columnAttributes.prop] = val
  403. }}
  404. placeholder="请输入内容"
  405. ></el-input>
  406. </el-form-item>
  407. </div>
  408. )
  409. },
  410. viewRender: (h, { row, column, index }) => {
  411. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  412. }
  413. },
  414. {
  415. columnAttributes: {
  416. label: '*备注',
  417. prop: 'remark'
  418. },
  419. editRender: (h, { row, column, index }) => {
  420. return (
  421. <div class="redbordererr">
  422. <el-form-item
  423. label=""
  424. label-width="0px"
  425. prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`}
  426. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  427. >
  428. <el-input
  429. value={row[column.columnAttributes.prop]}
  430. onInput={val => {
  431. row[column.columnAttributes.prop] = val
  432. }}
  433. placeholder="请输入内容"
  434. ></el-input>
  435. </el-form-item>
  436. </div>
  437. )
  438. },
  439. viewRender: (h, { row, column, index }) => {
  440. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  441. }
  442. }
  443. ],
  444. {
  445. isEdit: this.qx(this.formData),
  446. isAdd: this.qx(this.formData),
  447. isDel: this.qx(this.formData)
  448. },
  449. {
  450. add: () => {
  451. this.formData.promotionQuestionnaireUsers.push({
  452. min: '',
  453. mobile: '',
  454. name: '',
  455. promotionQuestionnaireId: '',
  456. remark: ''
  457. })
  458. this.isEditTableIndex = this.formData.promotionQuestionnaireUsers.length - 1
  459. },
  460. delete: ({ row, column, index }, cb) => {
  461. if (this.isEditTableIndex == index) {
  462. this.isEditTableIndex = -1
  463. } else if (this.isEditTableIndex > index) {
  464. this.isEditTableIndex--
  465. }
  466. cb && cb()
  467. },
  468. verify: ({ row, column, index }, isEditTableIndex) => {
  469. return new Promise(r => {
  470. if (isEditTableIndex > -1) {
  471. this.$refs.formRef.validateField(
  472. [
  473. `promotionQuestionnaireUsers.${isEditTableIndex}.min`,
  474. `promotionQuestionnaireUsers.${isEditTableIndex}.mobile`,
  475. `promotionQuestionnaireUsers.${isEditTableIndex}.name`,
  476. `promotionQuestionnaireUsers.${isEditTableIndex}.remark`
  477. ],
  478. v => {
  479. if (v) {
  480. r(true)
  481. } else {
  482. r(false)
  483. }
  484. }
  485. )
  486. } else {
  487. r(true)
  488. }
  489. })
  490. }
  491. }
  492. )
  493. }
  494. }
  495. ]
  496. },
  497. formItems2() {
  498. return [
  499. {
  500. md: 24,
  501. name: 'slot-component',
  502. attributes: { placeholder: '请输入' },
  503. formItemAttributes: {
  504. label: '',
  505. 'label-width': '0px',
  506. prop: 'promotionQuestionnaireItems',
  507. rules: [{ required: true, message: '请设置', trigger: 'blur' }]
  508. },
  509. render: (h, { props, onInput }) => {
  510. return (
  511. <div>
  512. <div>
  513. {this.qx(this.formData) ? (
  514. <el-button
  515. type="primary"
  516. onClick={() => {
  517. this.showQuestion = true
  518. }}
  519. >
  520. 新增
  521. </el-button>
  522. ) : null}
  523. </div>
  524. <div>
  525. <zj-table
  526. columns={[
  527. {
  528. columnAttributes: {
  529. label: '填写内容',
  530. prop: ''
  531. },
  532. render: (h, { row, column, index }) => {
  533. return (
  534. <div style="padding:6px;">
  535. <div style="font-weight:bold;">
  536. {row.isRequire ? <span style="color:red">*</span> : null}
  537. {index + 1}、{row.question}({['单选', '多选', '填写', '图片', '视频'][row.type - 1]})
  538. </div>
  539. {
  540. [
  541. <div style="display: flex">
  542. {row.answer.map(item => {
  543. return (
  544. <div style="margin-right:10px">
  545. <el-radio disabled label="">
  546. {item.option_value}
  547. </el-radio>
  548. <div>
  549. {item.option_files.map(v => (
  550. <el-image
  551. src={this.$showImgUrl(v.url)}
  552. preview-src-list={[this.$showImgUrl(v.url)]}
  553. fit="fit"
  554. style="width:80px;height:80px;"
  555. />
  556. ))}
  557. </div>
  558. </div>
  559. )
  560. })}
  561. </div>,
  562. <div style="display: flex">
  563. {row.answer.map(item => {
  564. return (
  565. <div style="margin-right:10px">
  566. <el-checkbox disabled label="">
  567. {item.option_value}
  568. </el-checkbox>
  569. <div>
  570. {item.option_files.map(v => (
  571. <el-image
  572. src={this.$showImgUrl(v.url)}
  573. preview-src-list={[this.$showImgUrl(v.url)]}
  574. fit="fit"
  575. style="width:80px;height:80px;"
  576. />
  577. ))}
  578. </div>
  579. </div>
  580. )
  581. })}
  582. </div>,
  583. <div>
  584. <el-input disabled placeholder="请输入内容"></el-input>
  585. </div>,
  586. null
  587. ][row.type - 1]
  588. }
  589. </div>
  590. )
  591. }
  592. },
  593. ...(() => {
  594. if (this.qx(this.formData)) {
  595. return [
  596. {
  597. columnAttributes: {
  598. label: '操作',
  599. prop: '',
  600. width: '200px'
  601. },
  602. render: (h, { row, column, index }) => {
  603. return (
  604. <div style="padding-left:5px">
  605. <el-button
  606. size="mini"
  607. onClick={() => {
  608. this.questionData = {
  609. ...JSON.parse(JSON.stringify(row)),
  610. rowIndex: index
  611. }
  612. this.$nextTick(() => {
  613. this.showQuestion = true
  614. })
  615. }}
  616. >
  617. 编辑
  618. </el-button>
  619. <el-button
  620. size="mini"
  621. onClick={() => {
  622. this.formData.promotionQuestionnaireItems.push({
  623. ...JSON.parse(JSON.stringify(row))
  624. })
  625. }}
  626. >
  627. 复制
  628. </el-button>
  629. <el-button
  630. size="mini"
  631. onClick={() => {
  632. this.formData.promotionQuestionnaireItems.splice(index, 1)
  633. }}
  634. >
  635. 删除
  636. </el-button>
  637. </div>
  638. )
  639. }
  640. }
  641. ]
  642. }
  643. return []
  644. })()
  645. ]}
  646. table-data={this.formData.promotionQuestionnaireItems}
  647. />
  648. </div>
  649. </div>
  650. )
  651. }
  652. }
  653. ]
  654. }
  655. },
  656. methods: {
  657. // 列表请求函数
  658. getList: promotionQuestionnaireList,
  659. // 列表导出函数
  660. exportList: promotionQuestionnaireExport,
  661. // 表格列解析渲染数据更改
  662. columnParsing(item, defaultData) {
  663. if (item.jname === 'qrcode') {
  664. defaultData.render = (h, { row, index, column }) => {
  665. return (
  666. <div style="padding:0 6px;cursor: pointer;">
  667. {row.qrcode
  668. ? row.qrcode
  669. .split(',')
  670. .map(url => (
  671. <el-image
  672. src={this.$showImgUrl(url)}
  673. preview-src-list={[this.$showImgUrl(url)]}
  674. fit="fit"
  675. style="width:80px;height:80px;"
  676. />
  677. ))
  678. : null}
  679. </div>
  680. )
  681. }
  682. }
  683. if (item.jname == 'startTime') {
  684. defaultData.render = (h, { row, index, column }) => {
  685. return <div style="padding:0 6px;cursor: pointer;">{row.startTime && row.startTime.split(' ')[0]}</div>
  686. }
  687. }
  688. if (item.jname == 'endTime') {
  689. defaultData.render = (h, { row, index, column }) => {
  690. return <div style="padding:0 6px;cursor: pointer;">{row.endTime && row.endTime.split(' ')[0]}</div>
  691. }
  692. }
  693. return defaultData
  694. },
  695. // 操作按钮
  696. operation() {
  697. return this.operationBtn({
  698. detail: {
  699. click: ({ row, index, column }) => {
  700. promotionQuestionnaireDetail({
  701. id: row.id
  702. }).then(res => {
  703. this.formData = {
  704. ...res.data,
  705. submitLimitBool: res.data.submitLimit == -1 ? 0 : 1,
  706. promotionQuestionnaireItems: res.data.promotionQuestionnaireItems.map(item => {
  707. return {
  708. ...item,
  709. answer: JSON.parse(item?.answer || '[]')
  710. }
  711. }),
  712. banner: res.data?.banner?.split(',').map(url => ({ url })),
  713. detailImgs: res.data?.detailImgs?.split(',').map(url => ({ url }))
  714. }
  715. this.$nextTick(() => {
  716. this.formDialog = true
  717. })
  718. })
  719. }
  720. },
  721. edit: {
  722. conditions: ({ row, index, column }) => {
  723. return !!~[0, 1].indexOf(row.status) || !!~['待生效', '生效中'].indexOf(row.statusText)
  724. },
  725. click: ({ row, index, column }) => {
  726. this.typeView = 1
  727. promotionQuestionnaireDetail({
  728. id: row.id
  729. }).then(res => {
  730. this.formData = {
  731. ...res.data,
  732. submitLimitBool: res.data.submitLimit == -1 ? 0 : 1,
  733. promotionQuestionnaireItems: res.data.promotionQuestionnaireItems.map(item => {
  734. return {
  735. ...item,
  736. answer: JSON.parse(item?.answer || '[]')
  737. }
  738. }),
  739. banner: res.data?.banner?.split(',').map(url => ({ url })),
  740. detailImgs: res.data?.detailImgs?.split(',').map(url => ({ url }))
  741. }
  742. this.$nextTick(() => {
  743. this.formDialog = true
  744. })
  745. })
  746. }
  747. },
  748. createActivity: {
  749. conditions: ({ row, index, column }) => {
  750. return !!~[0, 1].indexOf(row.status) || !!~['待生效', '生效中'].indexOf(row.statusText)
  751. },
  752. click: ({ row, index, column }) => {
  753. this.$router.push({
  754. name: 'activityOrder',
  755. params: {
  756. pageName: row.id,
  757. pageType: 'detail',
  758. pageCode: row.id
  759. }
  760. })
  761. }
  762. },
  763. viewActivity: {
  764. click: ({ row, index, column }) => {
  765. this.$router.push({
  766. name: 'activityOrder',
  767. params: {
  768. pageName: row.id,
  769. pageType: 'list',
  770. pageCode: row.id
  771. }
  772. })
  773. }
  774. },
  775. isView: {
  776. name: ({ row, index, column }) => {
  777. return row.isShow ? '隐藏' : '显示'
  778. },
  779. click: ({ row, index, column }) => {
  780. this.$confirm(`是否确定${row.isShow ? '隐藏' : '显示'}?`, '提示', {
  781. confirmButtonText: '确定',
  782. cancelButtonText: '取消',
  783. type: 'warning'
  784. })
  785. .then(() => {
  786. promotionQuestionnaireShow({
  787. id: row.id,
  788. isShow: !row.isShow
  789. }).then(res => {
  790. this.$message({
  791. type: 'success',
  792. message: `设置成功!`
  793. })
  794. this.$refs.pageRef.refreshList()
  795. })
  796. })
  797. .catch(() => {})
  798. }
  799. }
  800. })
  801. },
  802. // 新增
  803. addData() {
  804. this.typeView = 1
  805. this.formDialog = true
  806. },
  807. // 关闭弹窗
  808. formCancel() {
  809. this.typeView = 0
  810. this.formDialog = false
  811. this.$data.formData = this.$options.data().formData
  812. },
  813. // 确定
  814. formConfirm() {
  815. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  816. if (valid) {
  817. var data = {
  818. ...this.formData,
  819. endTime: this.formData.endTime ? `${this.formData.endTime.split(' ')[0]} 23:59:59` : '',
  820. banner: this.formData.banner.map(item => item.url).join(','),
  821. detailImgs: this.formData.detailImgs.map(item => item.url).join(','),
  822. promotionQuestionnaireItems: this.formData.promotionQuestionnaireItems.map(item => {
  823. return {
  824. ...item,
  825. answer: JSON.stringify(item.answer)
  826. }
  827. }),
  828. submitLimit: !!this.formData.submitLimitBool ? this.formData.submitLimit : -1
  829. }
  830. promotionQuestionnaireAdd(data).then(res => {
  831. this.$message({
  832. type: 'success',
  833. message: `添加成功!`
  834. })
  835. this.$refs.pageRef.refreshList()
  836. this.formCancel()
  837. })
  838. }
  839. })
  840. },
  841. // 终止
  842. zhongzhi() {
  843. promotionQuestionnaireStop({
  844. id: this.formData.id
  845. }).then(res => {
  846. this.$message({
  847. type: 'success',
  848. message: `终止成功!`
  849. })
  850. this.$refs.pageRef.refreshList()
  851. this.formCancel()
  852. })
  853. },
  854. // 关闭题目编辑
  855. questionClose() {
  856. this.showQuestion = false
  857. this.questionData = {
  858. rowIndex: -1
  859. }
  860. },
  861. // 确定题目编辑
  862. questionConfirm(data) {
  863. if (data.rowIndex == -1) {
  864. this.formData.promotionQuestionnaireItems.push({ ...data })
  865. } else {
  866. this.formData.promotionQuestionnaireItems.splice(data.rowIndex, 1, { ...data })
  867. }
  868. this.questionClose()
  869. this.$nextTick(() => {
  870. this.$refs.formRef.validateField(['promotionQuestionnaireItems'], v => {})
  871. })
  872. },
  873. qx(item) {
  874. return (
  875. !!this.typeView &&
  876. (!item.id || !!~[0, 1].indexOf(item.status) || !!~['待生效', '生效中'].indexOf(item.statusText))
  877. )
  878. },
  879. dqangqianyemian(...p) {
  880. return this.$refs.formRef.validateField(...p)
  881. }
  882. }
  883. }
  884. </script>
  885. <style lang="scss"></style>