trophyManager.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <!-- -->
  2. <template>
  3. <div class="m-container">
  4. <h2>
  5. <div class="squrt"></div>奖品设置
  6. </h2>
  7. <div class="newBand" v-permission="'luckDrawPrize/batchAdd'" @click="onOperationTrophy('create')">添加</div>
  8. <!-- 搜索标题 -->
  9. <save-form :inline="true"
  10. class="searchForm"
  11. @submit="getList"
  12. :model="searchForm">
  13. <el-form-item>
  14. <el-input v-model.trim="searchForm.name" clearable
  15. placeholder="请输入奖品名称"></el-input>
  16. </el-form-item>
  17. <el-form-item>
  18. <el-select v-model.trim="searchForm.groupId"
  19. style="width: 100% !important"
  20. placeholder="请选择所属活动">
  21. <el-option v-for="item in groupList" :key="item.id" :value="item.id" :label="item.name"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item>
  25. <el-button native-type="submit" type="danger">搜索</el-button>
  26. </el-form-item>
  27. </save-form>
  28. <!-- 列表 -->
  29. <div class="tableWrap">
  30. <el-table :data="tableList"
  31. :header-cell-style="{background:'#EDEEF0',color:'#444'}">
  32. <el-table-column align="center"
  33. prop="name"
  34. label="奖品名称"></el-table-column>
  35. <!-- <el-table-column align="center"
  36. prop="groupName"
  37. label="所属活动"></el-table-column> -->
  38. <el-table-column align="center"
  39. prop="chances"
  40. label="中奖概率">
  41. <template slot-scope="scope">
  42. {{ Number((scope.row.chances * 100).toFixed(4)) }}%
  43. </template>
  44. </el-table-column>
  45. <el-table-column align="center"
  46. prop="stock"
  47. label="库存"></el-table-column>
  48. <el-table-column align="center"
  49. prop="enabled"
  50. label="是否启用">
  51. <template slot-scope="scope">
  52. {{ scope.row.enabled ? '启用' : '不启用' }}
  53. </template>
  54. </el-table-column>
  55. <el-table-column align="center"
  56. prop="isDefault"
  57. label="是否默认">
  58. <template slot-scope="scope">
  59. {{ scope.row.isDefault ? '是' : '否' }}
  60. </template>
  61. </el-table-column>
  62. <el-table-column align="center"
  63. prop="memo"
  64. label="备注">
  65. <template slot-scope="scope">
  66. <tooltip :content="scope.row.memo" />
  67. </template>
  68. </el-table-column>
  69. <el-table-column align="center" label="操作">
  70. <template slot-scope="scope">
  71. <el-button @click="onOperationTrophy('update', scope.row)" v-permission="'luckDrawPrize/update'" type="text">修改</el-button>
  72. </template>
  73. </el-table-column>
  74. </el-table>
  75. <pagination sync :total.sync="pageInfo.total"
  76. :page.sync="pageInfo.page"
  77. :limit.sync="pageInfo.limit"
  78. :page-sizes="pageInfo.page_size"
  79. @pagination="getList" />
  80. </div>
  81. <el-dialog :title="formTitle[formActionTitle]"
  82. :visible.sync="lotteryCreateStatus"
  83. width="800px">
  84. <trophy-create :groupList="groupList"
  85. :getList="getList"
  86. :close="onPopupClose"></trophy-create>
  87. </el-dialog>
  88. <el-dialog :title="formTitle[formActionTitle]"
  89. :visible.sync="lotteryStatus"
  90. @close="onFormClose('trophyForm')"
  91. width="500px">
  92. <el-form :model="form"
  93. :rules="rules"
  94. label-width="100PX"
  95. ref="trophyForm">
  96. <el-form-item label="奖品名称"
  97. prop="name">
  98. <el-input v-model.trim="form.name"
  99. autocomplete="off"
  100. placeholder="请输入奖品名称"></el-input>
  101. </el-form-item>
  102. <el-form-item label="所属活动" prop="groupId">
  103. <el-select v-model.trim="form.groupId"
  104. style="width: 100% !important"
  105. placeholder="请选择所属活动">
  106. <el-option v-for="item in groupList" :key="item.id" :value="item.id" :label="item.name"></el-option>
  107. </el-select>
  108. </el-form-item>
  109. <el-form-item label="中奖概率"
  110. prop="chances">
  111. <el-input v-model.trim="form.chances"
  112. type="number"
  113. autocomplete="off"
  114. placeholder="请输入中奖概率">
  115. <i slot="suffix" class="el-input__icon" style="padding-right: 5px;">%</i>
  116. </el-input>
  117. </el-form-item>
  118. <el-form-item label="库存"
  119. prop="stock">
  120. <el-input v-model.trim="form.stock"
  121. type="number"
  122. autocomplete="off"
  123. placeholder="请输入库存">
  124. </el-input>
  125. </el-form-item>
  126. <el-form-item label="是否默认"
  127. prop="isDefault">
  128. <el-select v-model.trim="form.isDefault"
  129. style="width: 100% !important"
  130. placeholder="请选择是否是默认">
  131. <el-option :value="true" label="是"></el-option>
  132. <el-option :value="false" label="否"></el-option>
  133. </el-select>
  134. </el-form-item>
  135. <el-form-item label="备注"
  136. prop="memo">
  137. <el-input type="textarea" :rows="2" v-model.trim="form.memo"
  138. autocomplete="off"
  139. placeholder="请输入备注"></el-input>
  140. </el-form-item>
  141. </el-form>
  142. <span slot="footer"
  143. class="dialog-footer">
  144. <el-button @click="lotteryStatus = false">取 消</el-button>
  145. <el-button type="primary" @click="onSubmit('trophyForm')">确 定</el-button>
  146. </span>
  147. </el-dialog>
  148. </div>
  149. </template>
  150. <script>
  151. import Tooltip from '@/components/Tooltip/index'
  152. import pagination from "@/components/Pagination/index";
  153. import trophyCreate from './trophyCreate'
  154. import dayjs from 'dayjs';
  155. import numeral from 'numeral';
  156. import cleanDeep from 'clean-deep';
  157. import { luckDrawPrizeList, luckDrawPrizeUpdate, luckDrawGroupFindAll } from './api'
  158. const validNumber1 = (rule, value, callback) => {
  159. const re = /^[0-9]+$/
  160. if (value == '' && typeof value == 'string' || value == null) {
  161. callback(new Error('请输入库存'))
  162. } else if (!re.test(value) && value < 0) {
  163. callback(new Error('输入库存为正整数'))
  164. } else {
  165. callback()
  166. }
  167. }
  168. const validNumber = (rule, value, callback) => {
  169. if (value == '' && typeof value == 'string' || value == null) {
  170. callback(new Error('请输入中奖概率'))
  171. } else if (value < 0) {
  172. callback(new Error('输入值不能小于0'))
  173. } else {
  174. callback()
  175. }
  176. }
  177. export default {
  178. components: { pagination, Tooltip, trophyCreate },
  179. data () {
  180. return {
  181. searchForm: {
  182. name: null,
  183. groupId: null
  184. },
  185. formTitle: {
  186. create: "添加奖品",
  187. update: "修改奖品"
  188. },
  189. formActionTitle: 'create',
  190. lotteryStatus: false,
  191. lotteryCreateStatus: false,
  192. tableList: [],
  193. groupList: [],
  194. form: {
  195. name: null,
  196. groupId: null,
  197. chances: null,
  198. stock: null,
  199. memo: null,
  200. isDefault: null
  201. },
  202. rules: {
  203. name: [{required: true, message:'请输入活动名称', trigger: 'blur'}],
  204. groupId: [{required: true, message:'请选择所属活动', trigger: 'change'}],
  205. chances: [{required: true, validator: validNumber, trigger: 'blur'}],
  206. stock: [{required: true, validator: validNumber1, trigger: 'blur'}],
  207. enabled: [{required: true, message:'请选择是否启用', trigger: 'change'}],
  208. isDefault: [{required: true, message:'请选择是否默认', trigger: 'change'}]
  209. },
  210. pageInfo: {
  211. // 分页规则
  212. limit: 10, // 限制显示条数
  213. page: 1, // 当前页
  214. total: 1, // 总条数
  215. page_size: [10, 20, 40, 50] // 选择限制显示条数
  216. }
  217. };
  218. },
  219. //生命周期 - 创建完成(可以访问当前this实例)
  220. created () {
  221. // 设置默认为当前周
  222. },
  223. //生命周期 - 挂载完成(可以访问DOM元素)
  224. async mounted () {
  225. await this.__init()
  226. },
  227. methods: {
  228. async __init() {
  229. const query = this.$route.query
  230. await luckDrawGroupFindAll({ page: 1, rows: 9999 }).then(res => {
  231. const result = res.data
  232. if(res.code == 200) {
  233. this.groupList = result?.length > 0 ? result : []
  234. this.searchForm.groupId = query.groupId ? Number(query.groupId) : this.groupList[0]?.id
  235. }
  236. })
  237. this.getList()
  238. },
  239. onOperationTrophy(type, data) {
  240. this.formActionTitle = type
  241. if(type == 'update') {
  242. this.$nextTick(() => {
  243. this.form = {
  244. id: data.id,
  245. name: data.name,
  246. groupId: data.groupId,
  247. chances: data.chances * 100,
  248. stock: data.stock,
  249. isDefault: data.isDefault,
  250. memo: data.memo
  251. }
  252. })
  253. this.lotteryStatus = true
  254. } else if(type == 'create') {
  255. this.lotteryCreateStatus = true
  256. }
  257. },
  258. onSubmit(formName) {
  259. this.$refs[formName].validate(item => {
  260. if(item) {
  261. let form = Object.assign({}, this.form)
  262. let params = {
  263. name: form.name,
  264. groupId: form.groupId,
  265. chances: numeral(form.chances ? form.chances / 100 : 0).format('0.0000'),
  266. stock: form.stock,
  267. memo: form.memo,
  268. isDefault: form.isDefault,
  269. enabled: 1
  270. }
  271. if(this.formActionTitle == 'update') {
  272. params.id = form.id
  273. luckDrawPrizeUpdate(params).then(res => {
  274. this.messageTips('修改', res)
  275. })
  276. }
  277. }
  278. })
  279. },
  280. onPopupClose() {
  281. this.lotteryCreateStatus = false
  282. },
  283. onFormClose(formName) {
  284. this.$refs[formName].resetFields()
  285. },
  286. messageTips (title, res) {
  287. if (res.code == 200) {
  288. this.$message.success(title + '成功')
  289. this.lotteryStatus = false
  290. this.getList()
  291. } else {
  292. this.$message.error(res.msg)
  293. }
  294. },
  295. getList() {
  296. let params = Object.assign({}, this.searchForm)
  297. params.rows = this.pageInfo.limit
  298. params.page = this.pageInfo.page
  299. luckDrawPrizeList(cleanDeep(params)).then(res => {
  300. if (res.code == 200 && res.data) {
  301. this.tableList = res.data.rows
  302. this.pageInfo.total = res.data.total
  303. }
  304. })
  305. }
  306. }
  307. };
  308. </script>