trophyCreate.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <!-- -->
  2. <template>
  3. <div>
  4. <el-form :model="form" :rules="rules" ref="ruleForm">
  5. <p style="color: red; padding: 0 0 10px 100px">
  6. 注意:活动所有奖品的中奖概率之和必须等于100%;
  7. <br />活动奖品必须选择一个默认奖品,该奖品建议设置为谢谢参与;
  8. </p>
  9. <el-form-item label="所属活动" prop="groupId" label-width="100PX">
  10. <el-select
  11. v-model.trim="form.groupId"
  12. style="width: 100% !important"
  13. placeholder="请选择所属活动"
  14. :disabled="true"
  15. >
  16. <el-option
  17. v-for="item in groupList"
  18. :key="item.id"
  19. :value="item.id"
  20. :label="item.name"
  21. ></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <div v-for="(reword, index) in form.rewordList" :key="index">
  25. <el-row :gutter="10">
  26. <el-col :span="9">
  27. <el-form-item
  28. :label="`奖品${index + 1}`"
  29. label-width="100PX"
  30. :prop="'rewordList.' + index + '.name'"
  31. :rules="[
  32. { required: true, message: '请输入活动名称', trigger: 'blur' },
  33. ]"
  34. >
  35. <el-input
  36. v-model.trim="reword.name"
  37. autocomplete="off"
  38. placeholder="请输入奖品名称"
  39. ></el-input>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="5">
  43. <el-form-item
  44. :prop="'rewordList.' + index + '.chances'"
  45. :rules="[
  46. { required: true, validator: validNumber, trigger: 'blur' },
  47. ]"
  48. >
  49. <el-input
  50. v-model.trim="reword.chances"
  51. type="number"
  52. autocomplete="off"
  53. placeholder="请输入中奖概率"
  54. >
  55. <i
  56. slot="suffix"
  57. class="el-input__icon"
  58. style="padding-right: 5px"
  59. >%</i
  60. >
  61. </el-input>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="4">
  65. <el-form-item
  66. :prop="'rewordList.' + index + '.stock'"
  67. :rules="[
  68. { required: true, validator: validNumber1, trigger: 'blur' },
  69. ]"
  70. >
  71. <el-input
  72. v-model.trim="reword.stock"
  73. type="number"
  74. autocomplete="off"
  75. placeholder="请输入库存"
  76. >
  77. </el-input>
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="5">
  81. <el-form-item
  82. :prop="'rewordList.' + index + '.isDefault'"
  83. :rules="[
  84. {
  85. required: true,
  86. message: '请输入选择是否默认',
  87. trigger: 'blur',
  88. },
  89. ]"
  90. >
  91. <el-select
  92. v-model.trim="reword.isDefault"
  93. style="width: 100% !important"
  94. placeholder="请选择是否默认"
  95. >
  96. <el-option :value="true" label="是"></el-option>
  97. <el-option :value="false" label="否"></el-option>
  98. </el-select>
  99. </el-form-item>
  100. </el-col>
  101. <el-col :span="1">
  102. <i
  103. class="el-icon-delete delete"
  104. v-if="!(form.rewordList.length <= 1)"
  105. @click="deteleRow(reword, index)"
  106. ></i>
  107. </el-col>
  108. </el-row>
  109. <el-row>
  110. <el-form-item
  111. label="备注"
  112. label-width="100px"
  113. :prop="'rewordList.' + index + '.memo'"
  114. >
  115. <el-input
  116. type="textarea"
  117. :rows="2"
  118. v-model.trim="reword.memo"
  119. autocomplete="off"
  120. placeholder="请输入备注"
  121. ></el-input>
  122. </el-form-item>
  123. </el-row>
  124. </div>
  125. <div style="text-align: center">
  126. <el-button
  127. :disabled="form.rewordList.length <= 1"
  128. class="add-reword"
  129. round
  130. icon="el-icon-minus"
  131. @click="onRemoveReword"
  132. >删除奖品</el-button
  133. >
  134. <el-button
  135. class="add-reword"
  136. round
  137. icon="el-icon-plus"
  138. @click="onAddReword"
  139. >添加奖品</el-button
  140. >
  141. </div>
  142. </el-form>
  143. <div class="dialog-footer">
  144. <el-button @click="onClose('ruleForm')">取 消</el-button>
  145. <el-button type="primary" @click="onSubmit('ruleForm')">确 定</el-button>
  146. </div>
  147. </div>
  148. </template>
  149. <script>
  150. import Tooltip from "@/components/Tooltip/index";
  151. import pagination from "@/components/Pagination/index";
  152. import dayjs from "dayjs";
  153. import numeral from "numeral";
  154. import cleanDeep from "clean-deep";
  155. import { luckDrawPrizeBatchAdd } from "./api";
  156. const validNumber1 = (rule, value, callback) => {
  157. const re = /^[0-9]+$/;
  158. if ((value == "" && typeof value == "string") || value == null) {
  159. callback(new Error("请输入库存"));
  160. } else if (!re.test(value) && value < 0) {
  161. callback(new Error("输入库存为正整数"));
  162. } else {
  163. callback();
  164. }
  165. };
  166. const validNumber = (rule, value, callback) => {
  167. if ((value == "" && typeof value == "string") || value == null) {
  168. callback(new Error("请输入中奖概率"));
  169. } else if (value < 0) {
  170. callback(new Error("输入值不能小于0"));
  171. } else {
  172. callback();
  173. }
  174. };
  175. export default {
  176. components: { pagination, Tooltip },
  177. props: ["groupList", "close", "getList", "list"],
  178. data() {
  179. return {
  180. validNumber1: validNumber1,
  181. validNumber: validNumber,
  182. form: {
  183. groupId: Number(this.$route.query.groupId),
  184. rewordList: [
  185. {
  186. name: null,
  187. chances: null,
  188. stock: null,
  189. isDefault: null,
  190. memo: null,
  191. },
  192. ],
  193. },
  194. rules: {
  195. groupId: [
  196. { required: true, message: "请选择所属活动", trigger: "change" },
  197. ],
  198. },
  199. pageInfo: {
  200. // 分页规则
  201. limit: 10, // 限制显示条数
  202. page: 1, // 当前页
  203. total: 1, // 总条数
  204. page_size: [10, 20, 40, 50], // 选择限制显示条数
  205. },
  206. };
  207. },
  208. //生命周期 - 挂载完成(可以访问DOM元素)
  209. mounted() {
  210. if (this.list && Array.isArray(this.list)) {
  211. let arr = this.list.map((item) => {
  212. return {
  213. name: item.name,
  214. stock: item.stock,
  215. isDefault: item.isDefault,
  216. memo: item.memo,
  217. chances: item.chances * 100,
  218. id: item.id,
  219. };
  220. });
  221. console.log(arr);
  222. this.$set(this.form, "rewordList", arr);
  223. this.$forceUpdate();
  224. }
  225. },
  226. methods: {
  227. onRemoveReword() {
  228. // 删除奖品
  229. let form = this.form;
  230. if (form.rewordList.length <= 1) {
  231. return;
  232. }
  233. this.form.rewordList.pop();
  234. },
  235. deteleRow(row, index) {
  236. let form = this.form;
  237. if (form.rewordList.length <= 1) {
  238. return;
  239. }
  240. this.form.rewordList.splice(index,1);
  241. },
  242. onAddReword() {
  243. // 添加奖品
  244. let form = this.form;
  245. form.rewordList.push({
  246. name: null,
  247. chances: null,
  248. stock: null,
  249. isDefault: null,
  250. });
  251. },
  252. onSubmit(formName) {
  253. this.$refs[formName].validate((item) => {
  254. if (item) {
  255. let form = Object.assign({}, this.form);
  256. const rewordList = form.rewordList ? form.rewordList : [];
  257. let params = [];
  258. let chanceCount = 0;
  259. rewordList.forEach((item) => {
  260. chanceCount += Number(item.chances);
  261. params.push({
  262. name: item.name,
  263. groupId: form.groupId,
  264. chances: numeral(item.chances ? item.chances / 100 : 0).format(
  265. "0.0000"
  266. ),
  267. stock: item.stock,
  268. isDefault: item.isDefault,
  269. memo: form.memo,
  270. enabled: 1,
  271. id: item.id || null,
  272. });
  273. });
  274. if (chanceCount != 100) {
  275. this.$message.error("所有奖品的概率之和必须等于100%");
  276. return;
  277. }
  278. luckDrawPrizeBatchAdd(params).then((res) => {
  279. this.messageTips("添加", res, formName);
  280. });
  281. }
  282. });
  283. },
  284. messageTips(title, res, formName) {
  285. if (res.code == 200) {
  286. this.$message.success(title + "成功");
  287. this.onClose(formName);
  288. this.getList();
  289. } else {
  290. this.$message.error(res.msg);
  291. }
  292. },
  293. onClose(formName) {
  294. this.$refs[formName].resetFields();
  295. this.close();
  296. },
  297. },
  298. };
  299. </script>
  300. <style lang="less" scoped>
  301. .dialog-footer {
  302. width: 100%;
  303. text-align: right;
  304. }
  305. .reword-list {
  306. // display: flex;
  307. // .el-form-item {
  308. // flex: 1;
  309. // }
  310. }
  311. .add-reword {
  312. margin-bottom: 22px;
  313. width: 180px;
  314. border-style: dashed;
  315. }
  316. .delete {
  317. font-size: 16px;
  318. line-height: 40px;
  319. cursor: pointer;
  320. }
  321. </style>