index.vue 27 KB

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