detail.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="form" ref="form" :rules="rules" label-width="auto" :disabled="disabled">
  4. <el-form-item label="活动名称:" prop="name">
  5. <el-input v-model="form.name" placeholder="请输入活动名称" maxlength="20" show-word-limit />
  6. </el-form-item>
  7. <el-form-item label="活动时间:" prop="startTime">
  8. <el-date-picker v-model="date" type="datetimerange" range-separator="至" start-placeholder="开始日期"
  9. end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" @change="handleChange">
  10. </el-date-picker>
  11. </el-form-item>
  12. <el-form-item label="抽奖积分:" prop="lotteryConsumePoint">
  13. <el-input-number v-model="form.lotteryConsumePoint" :min="1" :max="999" :controls="false" placeholder="请输入抽奖积分" />
  14. <span class="input-number">积分</span>
  15. </el-form-item>
  16. <el-form-item label="每日限抽次数:" prop="lotteryLimitCount">
  17. <el-input-number v-model="form.lotteryLimitCount" :min="1" :max="999" :controls="false" placeholder="请输入每日限抽次数" />
  18. <span class="input-number">次</span>
  19. </el-form-item>
  20. <el-form-item label="活动规则:" prop="rule">
  21. <el-input v-model="form.rule" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" :maxlength="150"
  22. show-word-limit placeholder="请输入活动规则" />
  23. </el-form-item>
  24. <el-form-item label="转盘数量:" prop="goodNum">
  25. <el-select v-model.number="form.goodNum" placeholder="请选择转盘数量" :disabled="form.id ? true : false"
  26. @change="getChange">
  27. <el-option v-for="item in numOptions" :key="item.value" :value="item.value" :label="item.label" />
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item style="width: 100%">
  31. <el-table :data="form.lotteryConfigGoodList">
  32. <el-table-column label="顺序" type="index" align="center" />
  33. <el-table-column label="奖品类型" align="center">
  34. <template slot-scope="scope">
  35. <el-select v-model="scope.row.type" :disabled="form.id ? true : false">
  36. <el-option v-for="item in rewardOptions" :key="item.value" :value="item.value" :label="item.label" />
  37. </el-select>
  38. </template>
  39. </el-table-column>
  40. <el-table-column label="奖品" align="center">
  41. <template slot-scope="scope">
  42. <el-input v-if="scope.row.type === 4" v-model="scope.row.rewardPoint" :disabled="form.id ? true : false">
  43. <span slot="suffix" style="line-height: 36px">积分</span>
  44. </el-input>
  45. <el-input v-else v-model="scope.row.name" :disabled="form.id ? true : false" />
  46. </template>
  47. </el-table-column>
  48. <el-table-column label="奖品数量" align="center">
  49. <template slot-scope="scope">
  50. <el-input v-model="scope.row.totalNum" />
  51. </template>
  52. </el-table-column>
  53. <el-table-column label="已发放数量" prop="useNum" align="center" />
  54. <el-table-column label="奖品图片" align="center">
  55. <template slot-scope="scope">
  56. <Upload listType="picture-card" :url="scope.row.pic" @upload="upload($event, scope.$index)"
  57. :disabled="disabled" />
  58. </template>
  59. </el-table-column>
  60. <el-table-column label="中奖概率 / %" align="center">
  61. <template slot-scope="scope">
  62. <el-input-number style="width: 120px" v-model="scope.row.rate" :controls="false" />
  63. </template>
  64. </el-table-column>
  65. </el-table>
  66. </el-form-item>
  67. </el-form>
  68. <div class="form-btn">
  69. <el-button @click="cancel">取消</el-button>
  70. <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
  71. </div>
  72. </div>
  73. </template>
  74. <script>
  75. import { checkTime, create, detail, edit } from '@/api/registration/lottery'
  76. export default {
  77. // name:"registrationLotteryDetail",
  78. data() {
  79. return {
  80. // 表单
  81. form: {
  82. lotteryConfigGoodList: [],
  83. status: 0
  84. },
  85. // 活动时间
  86. date: [],
  87. // 只读
  88. disabled: false,
  89. // 转盘数量
  90. numOptions: [{
  91. value: 6,
  92. label: '6'
  93. }, {
  94. value: 8,
  95. label: '8'
  96. }],
  97. // 奖品类型
  98. rewardOptions: [{
  99. value: 3,
  100. label: '音响实物'
  101. }, {
  102. value: 4,
  103. label: '积分'
  104. }, {
  105. value: 5,
  106. label: '谢谢参与'
  107. }],
  108. // 校验
  109. rules: {
  110. name: [{
  111. required: true, message: '请输入活动名称', trigger: 'blur'
  112. }],
  113. startTime: [{
  114. required: true, message: '请选择活动时间', trigger: 'change'
  115. }],
  116. lotteryConsumePoint: [{
  117. required: true, message: '请输入抽奖积分', trigger: 'blur'
  118. }],
  119. lotteryLimitCount: [{
  120. required: true, message: '请输入每日限抽次数', trigger: 'blur'
  121. }],
  122. rule: [{
  123. required: true, message: '请输入活动规则', trigger: 'blur'
  124. }],
  125. goodNum: [{
  126. required: true, message: '请选择转盘数量', trigger: 'change'
  127. }]
  128. }
  129. }
  130. },
  131. watch: {
  132. date(val) {
  133. if (val) {
  134. this.form.startTime = val[0]
  135. this.form.endTime = val[1]
  136. }
  137. }
  138. },
  139. mounted() {
  140. if (this.$route.query.id || this.$route.query.copyId) {
  141. this.getList(this.$route.query.id || this.$route.query.copyId)
  142. this.disabled = Boolean(this.$route.query.disabled)
  143. }
  144. },
  145. methods: {
  146. // 详情
  147. getList(id) {
  148. detail({
  149. id: id
  150. }).then(res => {
  151. if (res.code === 0) {
  152. this.form = res.data
  153. this.date = [res.data.startTime, res.data.endTime]
  154. if (this.$route.query.copyId) {
  155. delete this.form.id
  156. this.form.lotteryConfigGoodList.map(i => delete i.useNum)
  157. this.form.status = 1
  158. }
  159. }
  160. })
  161. },
  162. // 校验时间
  163. handleChange(e) {
  164. checkTime({
  165. startTime: e[0],
  166. endTime: e[1]
  167. }).then(res => {
  168. if (res.code === 0) {
  169. if (!res.data) {
  170. this.$message.error('已有其他活动在此活动时间内!')
  171. this.form.date = []
  172. }
  173. }
  174. })
  175. },
  176. // 更改转盘数量
  177. getChange() {
  178. this.form.lotteryConfigGoodList = []
  179. for (let i = 0; i < this.form.goodNum; i++) {
  180. this.form.lotteryConfigGoodList.push({
  181. pic: ''
  182. })
  183. }
  184. },
  185. // 上传
  186. upload(e, index) {
  187. this.form.lotteryConfigGoodList[index].pic = e.file
  188. },
  189. // 取消
  190. cancel() {
  191. this.$tab.closeOpenPage('/registration/registrationLottery')
  192. },
  193. // 确定
  194. getSubmit() {
  195. let rate = 0
  196. this.form.lotteryConfigGoodList.map(i => {
  197. rate += i.rate
  198. })
  199. this.$refs.form.validate((valid) => {
  200. if (valid) {
  201. if (rate !== 100) {
  202. this.$message.error('中奖概率总和要满足100%')
  203. } else {
  204. if (this.form.id) {
  205. edit(this.form).then(res => {
  206. if (res.code === 0) {
  207. this.$message.success('编辑成功!')
  208. this.getList(this.$route.query.id)
  209. }
  210. })
  211. } else {
  212. create(this.form).then(res => {
  213. if (res.code === 0) {
  214. this.$message.success('新增成功!')
  215. this.cancel()
  216. }
  217. })
  218. }
  219. }
  220. } else {
  221. return false
  222. }
  223. })
  224. }
  225. }
  226. }
  227. </script>
  228. <style lang="scss" scoped>
  229. .el-form-item {
  230. width: 500px;
  231. }
  232. ::v-deep .upload {
  233. .el-upload {
  234. width: 100px;
  235. height: 100px;
  236. line-height: 100px;
  237. }
  238. .upload-image {
  239. width: 100px;
  240. height: 100px;
  241. }
  242. .el-icon-plus {
  243. line-height: 100px;
  244. }
  245. }
  246. .form-btn {
  247. margin-left: 120px;
  248. }
  249. .input-number {
  250. margin-left: 10px;
  251. }
  252. </style>