Point_Rule.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. <template>
  2. <div v-if="pageStatus == 0">配置加载中...</div>
  3. <div v-else-if="pageStatus == 1">此页面不对此账号开放</div>
  4. <div v-else-if="pageStatus == 2">权限已下放到站点,请登录站点账号配置</div>
  5. <div v-else-if="pageStatus == 3">加载发生错误</div>
  6. <div v-else-if="pageStatus == 4">
  7. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  8. <el-form-item
  9. label="是否开启积分"
  10. label-width="160px"
  11. prop="integralFlag"
  12. >
  13. <el-radio-group v-model="form.integralFlag">
  14. <el-radio label="0">关闭</el-radio>
  15. <el-radio label="1">开启</el-radio>
  16. </el-radio-group>
  17. </el-form-item>
  18. <div v-show="form.integralFlag == 1">
  19. <el-form-item
  20. label="积分规则"
  21. prop="itemsDetail"
  22. :required="form.integralFlag == 1"
  23. >
  24. <div
  25. v-for="(item, index) in form.itemsDetail"
  26. :key="index"
  27. style="border: 1px solid"
  28. >
  29. <div>
  30. 适用油品
  31. <el-select
  32. v-model="item.oilName"
  33. placeholder="请选择油品"
  34. clearable
  35. size="small"
  36. @change="oilNameChang(item, index)"
  37. >
  38. <el-option
  39. v-for="ele in oilNameOptions"
  40. :key="ele.oilName"
  41. :label="ele.oilName"
  42. :value="ele.oilName"
  43. ></el-option>
  44. </el-select>
  45. </div>
  46. <div v-if="item.oilType != 3">
  47. 规则类型
  48. <el-select
  49. v-model="item.ruleType"
  50. placeholder="请选择规则"
  51. clearable
  52. size="small"
  53. >
  54. <el-option label="以订单实付累计" value="1"></el-option>
  55. <el-option label="以订单应付累计" value="2"></el-option>
  56. <el-option label="以加油升数累计" value="3"></el-option>
  57. </el-select>
  58. </div>
  59. <div v-if="item.oilType != 3">
  60. 适用等级
  61. <el-select
  62. v-model="item.grade"
  63. placeholder="请选择等级"
  64. clearable
  65. size="small"
  66. @change="gradeChange(item)"
  67. >
  68. <el-option
  69. v-for="ele in item.gradeList || []"
  70. :key="ele.id"
  71. :label="ele.grade"
  72. :value="ele.id.toString()"
  73. ></el-option>
  74. <el-option key="0" label="所有人" value="0"></el-option>
  75. </el-select>
  76. </div>
  77. <div>
  78. <el-input-number
  79. v-model="item.ruleTerms"
  80. :min="0"
  81. size="small"
  82. />元(L) 开始积分
  83. </div>
  84. <div>
  85. 每消费
  86. <el-input-number
  87. v-model="item.saleAmt"
  88. size="small"
  89. :min="0"
  90. />元获得
  91. <el-input-number
  92. v-model="item.integral"
  93. size="small"
  94. :min="0"
  95. />积分
  96. </div>
  97. <div>
  98. <el-button type="danger" @click="delItem(index)" size="small"
  99. >删除</el-button
  100. >
  101. <el-button
  102. v-show="index == form.itemsDetail.length - 1"
  103. type="success"
  104. @click="addItem()"
  105. size="small"
  106. >新增</el-button
  107. >
  108. </div>
  109. </div>
  110. </el-form-item>
  111. <el-form-item
  112. label="积分有效期"
  113. prop="integralTermSetting"
  114. :required="form.integralFlag == 1"
  115. >
  116. <el-radio-group v-model="form.integralTermSetting">
  117. <el-radio label="1">永久有效</el-radio>
  118. <el-radio label="2">指定清空积分时间</el-radio>
  119. </el-radio-group>
  120. <div v-show="form.integralTermSetting == 2">
  121. <el-date-picker
  122. clearable
  123. size="small"
  124. style="width: 200px; margin-left: 10px"
  125. v-model="form.integralEmptyTime"
  126. type="datetime"
  127. value-format="yyyy-MM-dd HH:mm:ss"
  128. >
  129. </el-date-picker>
  130. </div>
  131. </el-form-item>
  132. <el-form-item
  133. label="积分规则时限"
  134. prop="termDateManage"
  135. :required="form.integralFlag == 1"
  136. >
  137. <el-radio-group v-model="form.termDateManage">
  138. <el-radio label="1">永久有效</el-radio>
  139. <el-radio label="2">指定活动结束时间</el-radio>
  140. </el-radio-group>
  141. <div v-show="form.termDateManage == 2">
  142. <el-date-picker
  143. clearable
  144. size="small"
  145. style="width: 200px; margin-left: 10px"
  146. v-model="form.emptyDate"
  147. type="datetime"
  148. value-format="yyyy-MM-dd HH:mm:ss"
  149. >
  150. </el-date-picker>
  151. </div>
  152. </el-form-item>
  153. <el-form-item
  154. label="多倍积分"
  155. prop="integralActivity"
  156. :required="form.integralFlag == 1"
  157. >
  158. <el-radio-group v-model="form.integralActivity">
  159. <el-radio label="0">关闭</el-radio>
  160. <el-radio label="1">开启</el-radio>
  161. </el-radio-group>
  162. </el-form-item>
  163. <el-form-item
  164. label="周期类型"
  165. prop="datePicker"
  166. :required="form.integralActivity == 1"
  167. v-show="form.integralActivity == 1"
  168. >
  169. <el-select
  170. v-model="form.datePicker"
  171. clearable
  172. size="small"
  173. @change="timeClear"
  174. >
  175. <el-option label="每周指定日" value="1"></el-option>
  176. <el-option label="每月指定日" value="2"></el-option>
  177. <el-option label="固定活动日" value="3"></el-option>
  178. </el-select>
  179. <div
  180. v-show="form.datePicker != 3"
  181. style="
  182. display: flex;
  183. flex-wrap: wrap;
  184. border-style: solid;
  185. border-color: #f5f7fa;
  186. "
  187. >
  188. <div
  189. v-for="(item, index) in timeSelect[form.datePicker]"
  190. :key="index"
  191. style="margin: 3px"
  192. >
  193. <div
  194. class="hover-style"
  195. style="
  196. border-radius: 5px;
  197. font-weight: bold;
  198. font-size: 12px;
  199. cursor: pointer;
  200. "
  201. @click="clickCalendar(index)"
  202. >
  203. <div>{{ item }}</div>
  204. <div
  205. v-if="form.collectClickCalendar.indexOf(index) > -1"
  206. style="
  207. width: 4px;
  208. height: 4px;
  209. border-radius: 50%;
  210. background-color: red;
  211. position: relative;
  212. left: calc(50% - 2px);
  213. "
  214. ></div>
  215. <div v-else style="width: 4px; height: 4px"></div>
  216. </div>
  217. </div>
  218. </div>
  219. <div v-show="form.datePicker == 3">
  220. <el-date-picker
  221. clearable
  222. size="small"
  223. style="margin-left: 10px; width: 200px"
  224. v-model="form.collectClickDay"
  225. type="dates"
  226. value-format="yyyy-MM-dd"
  227. placeholder="选择提醒时间设置"
  228. >
  229. </el-date-picker>
  230. </div>
  231. </el-form-item>
  232. <el-form-item
  233. label="积分比例"
  234. prop="integralProportion"
  235. v-show="form.integralActivity == 1"
  236. :required="form.integralActivity == 1"
  237. >
  238. <el-input-number
  239. v-model="form.integralProportion"
  240. :min="1"
  241. placeholder="请输入加倍比例"
  242. size="small"
  243. />
  244. <span>倍</span>
  245. </el-form-item>
  246. <el-form-item> </el-form-item>
  247. <el-row v-show="form.integralActivity == 1">
  248. <el-col :span="8" style=""> </el-col>
  249. <el-col :span="8"> </el-col>
  250. </el-row>
  251. <el-form-item label="积分轮播图" prop="imgFileList">
  252. <el-upload
  253. class="avatar-uploader"
  254. :action="addressUrl"
  255. :headers="headers"
  256. multiple
  257. list-type="picture-card"
  258. :limit="5"
  259. :file-list="form.imgFileList"
  260. accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"
  261. :before-upload="beforeAvatarUpload"
  262. :on-remove="handleRemove"
  263. :on-success="handlepaymentSuccess"
  264. >
  265. <i class="el-icon-plus"></i>
  266. <div class="el-upload__tip" slot="tip">
  267. 只能上传jpg/png文件,最多上传5张且单张图片不超过1M
  268. </div>
  269. </el-upload>
  270. <el-dialog :visible.sync="dialogVisible" append-to-body>
  271. <img width="100%" :src="dialogImageUrl" alt="" />
  272. </el-dialog>
  273. </el-form-item>
  274. </div>
  275. </el-form>
  276. <div slot="footer" class="dialog-footer">
  277. <el-button type="primary" @click="submitForm" :disabled="false"
  278. >确 定</el-button
  279. >
  280. </div>
  281. </div>
  282. </template>
  283. <script>
  284. import { getToken } from "@/utils/auth";
  285. // import { queryPageStatus } from "@/utils/pageStatus";
  286. import {
  287. addRule,
  288. updateRule,
  289. oilNameList,
  290. gradeList,
  291. listRuleOne,
  292. } from "@/api/integral/rule";
  293. import { getStationPay, updatePay } from "@/api/station/pay";
  294. import { queryOilType } from "@/utils/oil";
  295. export default {
  296. name: "Point_Rule",
  297. data() {
  298. let validateItemsDetail = (rule, value, callback) => {
  299. if (this.form.itemsDetail.length <= 0) {
  300. callback(new Error("请先配置设置规则"));
  301. return;
  302. }
  303. this.form.itemsDetail.forEach((ele) => {
  304. if (!ele.oilName || !ele.ruleTerms || !ele.saleAmt || !ele.integral) {
  305. callback(new Error("请检查规则完整性"));
  306. return;
  307. }
  308. if (ele.oilType != 3) {
  309. if (!ele.ruleType || ele.grade === undefined || ele.grade === "") {
  310. callback(new Error("请检查规则完整性"));
  311. return;
  312. }
  313. }
  314. });
  315. callback();
  316. };
  317. let validateIntegralTermSetting = (rule, value, callback) => {
  318. if (!this.form.integralTermSetting) {
  319. callback(new Error("请选择积分有效期"));
  320. return;
  321. }
  322. if (this.form.integralTermSetting == 2) {
  323. if (!this.form.integralEmptyTime) {
  324. callback(new Error("请填写积分指定的到期时间"));
  325. return;
  326. }
  327. }
  328. callback();
  329. };
  330. let validateTermDateManage = (rule, value, callback) => {
  331. if (!this.form.termDateManage) {
  332. callback(new Error("请选择积分活动的结束时间"));
  333. return;
  334. }
  335. if (this.form.termDateManage == 2) {
  336. if (!this.form.emptyDate) {
  337. callback(new Error("请填写积分活动的结束时间"));
  338. return;
  339. }
  340. }
  341. callback();
  342. };
  343. let validateDatePicker = (rule, value, callback) => {
  344. if (this.form.integralActivity == 0) {
  345. callback();
  346. return;
  347. }
  348. if (!this.form.datePicker) {
  349. callback(new Error("请选择多倍积分的周期类型"));
  350. return;
  351. }
  352. if (this.form.datePicker == 1 || this.form.datePicker == 2) {
  353. if (this.form.collectClickCalendar.length <= 0) {
  354. callback(new Error("请选择多倍积分的时间"));
  355. return;
  356. }
  357. }
  358. if (this.form.datePicker == 3) {
  359. if (
  360. this.form.collectClickDay == null ||
  361. this.form.collectClickDay.length <= 0
  362. ) {
  363. callback(new Error("请填写指定的多倍积分日"));
  364. return;
  365. }
  366. }
  367. callback();
  368. };
  369. return {
  370. oilNameOptions: [],
  371. dialogImageUrl: "",
  372. num: 0,
  373. dialogVisible: false,
  374. // 表单参数
  375. form: {
  376. itemsDetail: [{}],
  377. imgFileList: [],
  378. collectClickCalendar: [], // 收集固定日期选择的日子
  379. collectClickDay: [],
  380. },
  381. rules: {
  382. integralFlag: [
  383. { required: true, message: "请选择是否开启积分", trigger: "change" },
  384. ],
  385. integralTermSetting: [
  386. { validator: validateIntegralTermSetting, trigger: "change" },
  387. ],
  388. // termDateManage:[{ required: true, message: "请选择是否开启积分", trigger: "change" }],
  389. // integralActivity:[{ required: true, message: "请选择是否开启积分", trigger: "change" }],
  390. imgFileList: [{ required: true, message: "", trigger: "change" }],
  391. itemsDetail: [{ validator: validateItemsDetail, trigger: "change" }],
  392. termDateManage: [
  393. { validator: validateTermDateManage, trigger: "change" },
  394. ],
  395. datePicker: [{ validator: validateDatePicker, trigger: "change" }],
  396. },
  397. headers: {
  398. Authorization: "Bearer " + getToken(),
  399. },
  400. timeSelect: [
  401. ,
  402. ["周天", "周一", "周二", "周三", "周四", "周五", "周六"],
  403. [
  404. "01",
  405. "02",
  406. "03",
  407. "04",
  408. "05",
  409. "06",
  410. "07",
  411. "08",
  412. "09",
  413. "10",
  414. "11",
  415. "12",
  416. "13",
  417. "14",
  418. "15",
  419. "16",
  420. "17",
  421. "18",
  422. "19",
  423. "20",
  424. "21",
  425. "22",
  426. "23",
  427. "24",
  428. "25",
  429. "26",
  430. "27",
  431. "28",
  432. "29",
  433. "30",
  434. "31",
  435. ],
  436. ],
  437. addressUrl:
  438. location.protocol +
  439. "//" +
  440. location.host +
  441. process.env.VUE_APP_BASE_API +
  442. "/common/upload",
  443. pageStatus: 0,
  444. };
  445. },
  446. created() {
  447. this.init();
  448. this.setPageStatus();
  449. },
  450. methods: {
  451. init() {
  452. this.listRule();
  453. this.listOilName();
  454. },
  455. setPageStatus() {
  456. this.queryPageStatus([1, 2], 1).then((res) => {
  457. this.pageStatus = res;
  458. });
  459. },
  460. listOilName() {
  461. oilNameList({
  462. pageNum: 1,
  463. pageSize: 100,
  464. }).then((response) => {
  465. this.oilNameOptions = response.rows;
  466. });
  467. },
  468. listRule() {
  469. listRuleOne({
  470. pageNum: 1,
  471. pageSize: 100,
  472. }).then((response) => {
  473. this.form = response.data;
  474. this.form.collectClickCalendar = [];
  475. this.form.collectClickDay = "";
  476. if (!this.form.itemsDetail || this.form.itemsDetail.length == 0) {
  477. this.form.itemsDetail = [{}];
  478. }
  479. if (this.form.datePicker == "1" || this.form.datePicker == "2") {
  480. // if( this.form.datePickerTime == ""){
  481. // this.form.collectClickCalendar = [];
  482. // }
  483. this.form.collectClickCalendar = this.form.datePickerTime
  484. .split(",")
  485. .map(parseFloat);
  486. } else if (this.form.datePicker == "3") {
  487. if (this.form.datePickerTime.length == 0) {
  488. this.form.collectClickDay = [];
  489. } else {
  490. this.form.collectClickDay = this.form.datePickerTime.split(",");
  491. }
  492. }
  493. this.form = { ...this.form };
  494. });
  495. },
  496. timeClear() {
  497. this.form.collectClickCalendar = [];
  498. this.form.collectClickDay = [];
  499. },
  500. gradeChange(item) {
  501. setTimeout(() => {
  502. this.form = { ...this.form };
  503. }, 0);
  504. },
  505. //添加行
  506. addItem() {
  507. this.form.itemsDetail.push({});
  508. },
  509. // 删除行
  510. delItem(index) {
  511. this.form.itemsDetail.splice(index, 1);
  512. if (this.form.itemsDetail.length <= 0) {
  513. this.form.itemsDetail = [{}];
  514. }
  515. },
  516. delNoil() {
  517. this.form.notOilList = [{}];
  518. },
  519. oilNameChang(item, index) {
  520. item.grade = "";
  521. item.gradeList = [];
  522. this.form = { ...this.form };
  523. gradeList({
  524. oilName: item.oilName,
  525. }).then((response) => {
  526. item.gradeList = response.rows;
  527. this.form = {
  528. ...this.form,
  529. };
  530. });
  531. queryOilType(item.oilName).then((res) => {
  532. item.oilType = res;
  533. this.form = {
  534. ...this.form,
  535. };
  536. });
  537. },
  538. handleRemove(file, fileList) {
  539. if (fileList != null && fileList.length > 0) {
  540. this.form.imgFileList = [];
  541. for (let i = 0; i < fileList.length; i++) {
  542. let fileName = fileList[i].name;
  543. let imgurl = fileList[i].url;
  544. this.form.imgFileList.push({
  545. name: fileName,
  546. url: imgurl,
  547. });
  548. }
  549. } else {
  550. this.form.imgFileList = fileList;
  551. }
  552. },
  553. beforeAvatarUpload(file) {
  554. const isLt5M = file.size / 1024 / 1024 < 1;
  555. if (!isLt5M) {
  556. this.$message.error("上传头像图片大小不能超过 1MB!");
  557. }
  558. return isLt5M;
  559. },
  560. //上传成功
  561. handlepaymentSuccess(response, file, fileList) {
  562. let imgurl =
  563. location.protocol +
  564. "//" +
  565. location.host +
  566. process.env.VUE_APP_BASE_API +
  567. response.fileName;
  568. this.form.imgFileList.push({
  569. name: file.name,
  570. url: imgurl,
  571. });
  572. },
  573. /** 提交按钮 */
  574. submitForm() {
  575. this.$refs["form"].validate((valid) => {
  576. if (valid) {
  577. if (this.form.datePicker == "1" || this.form.datePicker == "2") {
  578. this.form.datePickerTime = this.form.collectClickCalendar.toString();
  579. } else {
  580. this.form.datePickerTime = this.form.collectClickDay.toString();
  581. }
  582. if (this.form.id != null) {
  583. updateRule(this.form).then((response) => {
  584. this.msgSuccess("更新成功");
  585. });
  586. } else {
  587. addRule(this.form).then((response) => {
  588. this.msgSuccess("新增成功");
  589. });
  590. }
  591. }
  592. });
  593. },
  594. clickCalendar(index) {
  595. if (this.form.collectClickCalendar.indexOf(index) === -1) {
  596. this.form.collectClickCalendar.push(index);
  597. } else if (this.form.collectClickCalendar.indexOf(index) > -1) {
  598. const temp = this.form.collectClickCalendar.findIndex((ele) => {
  599. return ele == index;
  600. });
  601. this.form.collectClickCalendar.splice(temp, 1);
  602. }
  603. this.$refs.form.validateField("datePicker");
  604. this.form = { ...this.form };
  605. },
  606. },
  607. };
  608. </script>
  609. <style scoped>
  610. .hover-style:hover {
  611. color: white;
  612. background-color: blue;
  613. }
  614. </style>