index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. <template>
  2. <template-page ref="pageRef" :get-list="getList" :exportList="exportList" :table-attributes="tableAttributes"
  3. :table-events="tableEvents" :options-evens-group="optionsEvensGroup"
  4. :column-parsing="columnParsing" :operation="operation()">
  5. <div class="cartographer">
  6. <el-dialog title="新增" 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"
  10. :form-items="formItems">
  11. </zj-form-module>
  12. <zj-form-module title="活动填写内容" label-width="100px" :form-data="formData"
  13. :form-items="formItems2">
  14. </zj-form-module>
  15. </zj-form-container>
  16. <div slot="footer" class="dialog-footer">
  17. <el-button size="mini" @click="formCancel">取 消</el-button>
  18. <el-button size="mini" type="primary" @click="formConfirm">确 定</el-button>
  19. </div>
  20. </el-dialog>
  21. </div>
  22. <answer v-if="showQuestion" :defaultData="questionData" @close="questionClose" @confirm="questionConfirm"/>
  23. </template-page>
  24. </template>
  25. <script>
  26. import TemplatePage from '@/components/template/template-page-1.vue'
  27. import import_mixin from '@/components/template/import_mixin.js'
  28. import operation_mixin from '@/components/template/operation_mixin.js'
  29. import {promotionQuestionnaireList,promotionQuestionnaireExport,promotionQuestionnaireAdd,promotionQuestionnaireDetail} from "@/api/setActivity.js"
  30. import answer from "./answer.vue"
  31. import ImageUpload from '@/components/file-upload'
  32. import quillEditor from '@/components/v-quill-editor'
  33. import editTable from "@/components/template/editTable.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": "",
  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. }
  68. },
  69. computed:{
  70. // 事件组合
  71. optionsEvensGroup() {
  72. return [
  73. [
  74. [
  75. this.optionsEvensAuth('add', {
  76. click: this.addData
  77. })
  78. ]
  79. ]
  80. ]
  81. },
  82. formItems(){
  83. return [
  84. {
  85. name: 'el-input',
  86. md: 12,
  87. attributes: { disabled: true, placeholder: '请选择' },
  88. formItemAttributes: { label: '所属商户', prop: 'companyWechatName' }
  89. },
  90. {
  91. name: 'el-date-picker',
  92. md: 6,
  93. attributes: {
  94. disabled: !!this.formData.id,
  95. style: { width: '100%' },
  96. placeholder: '请选择',
  97. 'value-format': 'yyyy-MM-dd HH:mm:ss',
  98. },
  99. formItemAttributes: {
  100. label: '活动开始日期',
  101. prop: 'startTime',
  102. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  103. }
  104. },
  105. {
  106. name: 'el-date-picker',
  107. md: 6,
  108. attributes: {
  109. disabled: !!this.formData.id,
  110. style: { width: '100%' },
  111. placeholder: '请选择',
  112. 'value-format': 'yyyy-MM-dd HH:mm:ss',
  113. },
  114. formItemAttributes: {
  115. label: '活动结束日期',
  116. prop: 'endTime',
  117. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  118. }
  119. },
  120. {
  121. name: 'el-input',
  122. md: 12,
  123. attributes: { disabled: !!this.formData.id, placeholder: '请选择' },
  124. formItemAttributes: {
  125. label: '活动名称',
  126. prop: 'name',
  127. rules: [{ required: true, message: '请填写', trigger: 'blur' }]
  128. }
  129. },
  130. {
  131. name: 'el-input',
  132. md: 12,
  133. attributes: { disabled: !!this.formData.id, placeholder: '请选择' },
  134. formItemAttributes: {
  135. label: '二维码主题',
  136. prop: 'title',
  137. rules: [{ required: true, message: '请填写', trigger: 'blur' }]
  138. }
  139. },
  140. {
  141. md: 24,
  142. name: 'slot-component',
  143. attributes: { placeholder: '请输入' },
  144. formItemAttributes: {
  145. label: '提交次数',
  146. prop: 'submitLimitBool',
  147. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  148. },
  149. render: (h, { props, onInput }) => {
  150. var { value } = props
  151. console.log(value)
  152. return (
  153. <div class="redbordererr" style="">
  154. <el-form-item label="" label-width="0px" prop="submitLimit" rules={value ? [{ required: true, message: '请填写', trigger: 'blur' }] : []}>
  155. <el-radio-group disabled={!!this.formData.id} value={value} onInput={onInput}>
  156. <el-radio disabled={!!this.formData.id} label={0}>不限制</el-radio>
  157. <el-radio disabled={!!this.formData.id} label={1}>
  158. 限制{value?[<el-input disabled={!!this.formData.id} style="margin: 0 10px;width:100px;" value={this.formData.submitLimit} onInput={(val)=>{this.formData.submitLimit = val}} type="number" placeholder="请输入内容"></el-input>,<span>次</span>]:null}
  159. </el-radio>
  160. </el-radio-group>
  161. </el-form-item>
  162. </div>
  163. )
  164. }
  165. },
  166. {
  167. md: 24,
  168. name: 'slot-component',
  169. attributes: { placeholder: '请输入' },
  170. formItemAttributes: {
  171. label: '首页广告图',
  172. prop: 'banner',
  173. rules: [{ required: true, message: '请上传', trigger: 'blur' }]
  174. },
  175. render: (h, { props, onInput }) => {
  176. var { value } = props
  177. return (
  178. <ImageUpload isEdit={!this.formData.id} fileList={this.formData.banner} uid={`questionFiles_bananner`} limit={1} isUpdate={false} />
  179. )
  180. }
  181. },
  182. {
  183. md: 24,
  184. name: 'slot-component',
  185. attributes: { placeholder: '请输入' },
  186. formItemAttributes: {
  187. label: '活动详情图',
  188. prop: 'detailImgs',
  189. rules: [{ required: true, message: '请上传', trigger: 'blur' }]
  190. },
  191. render: (h, { props, onInput }) => {
  192. var { value } = props
  193. return (
  194. <ImageUpload isEdit={!this.formData.id} fileList={this.formData.detailImgs} uid={`questionFiles_detaidetailImgsdetailImgs`} limit={100} isUpdate={false} />
  195. )
  196. }
  197. },
  198. {
  199. md: 24,
  200. name: 'slot-component',
  201. attributes: { placeholder: '请输入' },
  202. formItemAttributes: {
  203. label: '活动说明',
  204. prop: 'content',
  205. rules: []
  206. },
  207. render: (h, { props, onInput }) => {
  208. var { value } = props
  209. return (
  210. <quillEditor disabled={!!this.formData.id} value={value} onInput={onInput}></quillEditor>
  211. )
  212. }
  213. },
  214. {
  215. name: 'slot-component',
  216. md: 24,
  217. formItemAttributes: { label: '提交记录', prop: 'promotionQuestionnaireUsers' },
  218. render: (h, { props, onInput }) => {
  219. var { value } = props
  220. return this.convertTableJson(value, [
  221. {
  222. columnAttributes: {
  223. label: '*姓名',
  224. prop: 'name',
  225. },
  226. editRender: (h, { row, column, index }) => {
  227. return (
  228. <div class="redbordererr">
  229. <el-form-item label="" label-width="0px" prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`} rules={[{ required: true, message: '请填写', trigger: 'blur' }]}>
  230. <el-input value={row[column.columnAttributes.prop]} onInput={val => { row[column.columnAttributes.prop] = val }} placeholder="请输入内容"></el-input>
  231. </el-form-item>
  232. </div>
  233. )
  234. },
  235. viewRender: (h, { row, column, index }) => {
  236. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  237. }
  238. },
  239. {
  240. columnAttributes: {
  241. label: '*电话',
  242. prop: 'mobile',
  243. },
  244. editRender: (h, { row, column, index }) => {
  245. return (
  246. <div class="redbordererr">
  247. <el-form-item label="" label-width="0px" prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`} rules={[{ required: true, message: '请填写', trigger: 'blur' }]}>
  248. <el-input value={row[column.columnAttributes.prop]} onInput={val => { row[column.columnAttributes.prop] = val }} placeholder="请输入内容"></el-input>
  249. </el-form-item>
  250. </div>
  251. )
  252. },
  253. viewRender: (h, { row, column, index }) => {
  254. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  255. }
  256. },
  257. {
  258. columnAttributes: {
  259. label: '*时间(分钟)',
  260. prop: 'min',
  261. },
  262. editRender: (h, { row, column, index }) => {
  263. return (
  264. <div class="redbordererr">
  265. <el-form-item label="" label-width="0px" prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`} rules={[{ required: true, message: '请填写', trigger: 'blur' }]}>
  266. <el-input type="number" value={row[column.columnAttributes.prop]} onInput={val => { row[column.columnAttributes.prop] = val }} placeholder="请输入内容"></el-input>
  267. </el-form-item>
  268. </div>
  269. )
  270. },
  271. viewRender: (h, { row, column, index }) => {
  272. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  273. }
  274. },
  275. {
  276. columnAttributes: {
  277. label: '*备注',
  278. prop: 'remark',
  279. },
  280. editRender: (h, { row, column, index }) => {
  281. return (
  282. <div class="redbordererr">
  283. <el-form-item label="" label-width="0px" prop={`promotionQuestionnaireUsers.${index}.${column.columnAttributes.prop}`} rules={[{ required: true, message: '请填写', trigger: 'blur' }]}>
  284. <el-input value={row[column.columnAttributes.prop]} onInput={val => { row[column.columnAttributes.prop] = val }} placeholder="请输入内容"></el-input>
  285. </el-form-item>
  286. </div>
  287. )
  288. },
  289. viewRender: (h, { row, column, index }) => {
  290. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  291. }
  292. },
  293. ], {
  294. isEdit: !this.formData.id,
  295. isAdd: !this.formData.id,
  296. isDel: !this.formData.id,
  297. }, {
  298. add: ()=>{
  299. this.formData.promotionQuestionnaireUsers.push({
  300. "min": '',
  301. "mobile": "",
  302. "name": "",
  303. "promotionQuestionnaireId": "",
  304. "remark": ""
  305. })
  306. this.isEditTableIndex = this.formData.promotionQuestionnaireUsers.length - 1
  307. },
  308. delete: ({ row, column, index }, cb) => {
  309. if (this.isEditTableIndex == index) {
  310. this.isEditTableIndex = -1
  311. } else if (this.isEditTableIndex > index) {
  312. this.isEditTableIndex--
  313. }
  314. cb && cb()
  315. },
  316. verify: ({ row, column, index }, isEditTableIndex) => {
  317. return new Promise(r => {
  318. if (isEditTableIndex > -1) {
  319. this.$refs.formRef.validateField([
  320. `promotionQuestionnaireUsers.${isEditTableIndex}.min`,
  321. `promotionQuestionnaireUsers.${isEditTableIndex}.mobile`,
  322. `promotionQuestionnaireUsers.${isEditTableIndex}.name`,
  323. `promotionQuestionnaireUsers.${isEditTableIndex}.remark`,
  324. ], (v) => {
  325. if (v) {
  326. r(true)
  327. } else {
  328. r(false)
  329. }
  330. })
  331. } else {
  332. r(true)
  333. }
  334. })
  335. },
  336. })
  337. }
  338. },
  339. ]
  340. },
  341. formItems2(){
  342. return [{
  343. md: 24,
  344. name: 'slot-component',
  345. attributes: { placeholder: '请输入' },
  346. formItemAttributes: {
  347. label: '',
  348. 'label-width': '0px',
  349. prop: 'promotionQuestionnaireItems',
  350. rules: []
  351. },
  352. render: (h, { props, onInput }) => {
  353. return (
  354. <div>
  355. <div>
  356. <el-button type="primary" onClick={()=>{ this.showQuestion = true }}>新增</el-button>
  357. </div>
  358. <div>
  359. <zj-table
  360. columns={[{
  361. columnAttributes: {
  362. label: '填写内容',
  363. prop: '',
  364. },
  365. render: (h, { row, column, index }) => {
  366. return (
  367. <div style="padding:6px;">
  368. <div style="font-weight:bold;">{row.isRequire?<span style="color:red">*</span> : null}{index+1}、{row.question}({['单选','多选','填写'][row.type-1]})</div>
  369. {[
  370. <div>
  371. {row.answer.map(item=><el-radio disabled label="">{item.option_value}</el-radio>)}
  372. </div>,
  373. <div>
  374. {row.answer.map(item=><el-checkbox disabled label="">{item.option_value}</el-checkbox>)}
  375. </div>,
  376. <div>
  377. <el-input disabled placeholder="请输入内容"></el-input>
  378. </div>
  379. ][row.type-1]}
  380. </div>
  381. )
  382. },
  383. },
  384. ...(()=>{
  385. if(!this.formData.id){
  386. return[{
  387. columnAttributes: {
  388. label: '操作',
  389. prop: '',
  390. width: '200px'
  391. },
  392. render: (h, { row, column, index }) => {
  393. return (
  394. <div style="padding-left:5px">
  395. <el-button size="mini" onClick={()=>{
  396. this.questionData = {
  397. ...JSON.parse(JSON.stringify(row)),
  398. rowIndex: index
  399. }
  400. this.$nextTick(()=>{
  401. this.showQuestion = true
  402. })
  403. }}>编辑</el-button>
  404. <el-button size="mini" onClick={()=>{
  405. this.formData.promotionQuestionnaireItems.push({...JSON.parse(JSON.stringify(row))})
  406. }}>复制</el-button>
  407. <el-button size="mini" onClick={()=>{
  408. this.formData.promotionQuestionnaireItems.splice(index, 1)
  409. }}>删除</el-button>
  410. </div>
  411. )
  412. },
  413. }]
  414. }
  415. return []
  416. })()]}
  417. table-data={this.formData.promotionQuestionnaireItems}
  418. />
  419. </div>
  420. </div>
  421. )
  422. }
  423. }]
  424. }
  425. },
  426. methods: {
  427. // 列表请求函数
  428. getList:promotionQuestionnaireList,
  429. // 列表导出函数
  430. exportList: promotionQuestionnaireExport,
  431. // 表格列解析渲染数据更改
  432. columnParsing(item, defaultData) {
  433. return defaultData
  434. },
  435. // 操作按钮
  436. operation() {
  437. return this.operationBtn({
  438. detail: {
  439. click: ({ row, index, column }) => {
  440. promotionQuestionnaireDetail({
  441. id: row.id
  442. }).then(res=>{
  443. this.formData = {
  444. ...res.data,
  445. submitLimitBool: res.data.submitLimit == -1 ? 0 : 1,
  446. promotionQuestionnaireItems:res.data.promotionQuestionnaireItems.map(item=>{
  447. return {
  448. ...item,
  449. answer: JSON.parse(item?.answer||"[]")
  450. }
  451. }),
  452. banner:res.data?.banner?.split(",").map(url=>({url})),
  453. detailImgs:res.data?.detailImgs?.split(",").map(url=>({url}))
  454. }
  455. this.$nextTick(()=>{
  456. this.formDialog = true
  457. })
  458. })
  459. }
  460. },
  461. })
  462. },
  463. // 新增
  464. addData(){
  465. this.formDialog = true
  466. },
  467. // 关闭弹窗
  468. formCancel(){
  469. this.formDialog = false
  470. this.$data.formData = this.$options.data().formData
  471. },
  472. // 确定
  473. formConfirm() {
  474. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  475. if (valid) {
  476. var data = {
  477. ...this.formData,
  478. banner:this.formData.banner.map(item=>item.url).join(","),
  479. detailImgs:this.formData.detailImgs.map(item=>item.url).join(","),
  480. promotionQuestionnaireItems:this.formData.promotionQuestionnaireItems.map(item=>{
  481. return {
  482. ...item,
  483. answer: JSON.stringify(item.answer)
  484. }
  485. }),
  486. submitLimit: !!this.formData.submitLimitBool ? this.formData.submitLimit : -1
  487. }
  488. promotionQuestionnaireAdd(data).then(res=>{
  489. this.$message({
  490. type: 'success',
  491. message: `添加成功成功!`,
  492. })
  493. this.$refs.pageRef.refreshList()
  494. this.formCancel()
  495. })
  496. }
  497. })
  498. },
  499. // 关闭题目编辑
  500. questionClose(){
  501. this.showQuestion = false
  502. this.questionData = {
  503. rowIndex: -1
  504. }
  505. },
  506. // 确定题目编辑
  507. questionConfirm(data){
  508. if(data.rowIndex==-1){
  509. this.formData.promotionQuestionnaireItems.push({...data})
  510. }else{
  511. this.formData.promotionQuestionnaireItems.splice(data.rowIndex, 1, {...data})
  512. }
  513. this.questionClose()
  514. }
  515. }
  516. }
  517. </script>
  518. <style lang="scss">
  519. </style>