Label_AddLabel.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. <template>
  2. <PermissionContainer
  3. :jiBieArr="[2]"
  4. :isFlag="true"
  5. :tipArr="[, '标签配置只对站点级别开放', '', , '您没有开启标签功能']"
  6. >
  7. <div>
  8. <div
  9. style="
  10. width: 450px;
  11. margin: 0 auto;
  12. margin-top: 20px;
  13. margin-bottom: 60px;
  14. border: 1px solid red;
  15. box-sizing: border-box;
  16. padding: 20px;
  17. "
  18. >
  19. <div style="color: red; font-size: 12px">
  20. <span style="display: inline-block; width: 20px"> </span>
  21. 1、标签用于对不同用户群体进行区别定价。
  22. </div>
  23. <div style="color: red; font-size: 12px">
  24. <span style="display: inline-block; width: 20px"> </span>
  25. 2、标签的优先级高于营销方案。所以将用户加入标签后,此用户将优先执行标签的优惠规则,不会再执行营销方案。
  26. </div>
  27. <div style="color: red; font-size: 12px">
  28. <span style="display: inline-block; width: 20px"> </span>
  29. 3、标签码用于给用户扫码使用,从而让用户享受对应的标签优惠,实现灵活处理,方便快捷。您还可以配置是否强制拉用户进入标签,实现用户长期留在此标签。
  30. </div>
  31. </div>
  32. <el-form
  33. :model="labelForm"
  34. ref="labelForm"
  35. label-width="90px"
  36. style="width: 400px; margin: 0 auto"
  37. label-position="left"
  38. >
  39. <el-form-item
  40. label="启用标签"
  41. prop="labelFlag"
  42. :rules="{
  43. required: true,
  44. message: '请选择是否开启标签',
  45. trigger: 'change',
  46. }"
  47. >
  48. <el-radio-group v-model="labelForm.labelFlag" :disabled="editable">
  49. <el-radio label="0">关闭</el-radio>
  50. <el-radio label="1">开启</el-radio>
  51. </el-radio-group>
  52. </el-form-item>
  53. <div
  54. v-if="
  55. labelForm.labelFlag == 1 && (labelForm.labelArr || []).length == 0
  56. "
  57. >
  58. <el-form-item label=" ">
  59. 您没有添加标签,所以标签功能尚未生效
  60. </el-form-item>
  61. </div>
  62. <div v-if="labelForm.labelFlag == 1">
  63. <el-form-item
  64. v-for="(label, index) in labelForm.labelArr"
  65. :label="'标签' + (index + 1)"
  66. :key="index"
  67. :prop="'labelArr.' + index + '.labelName'"
  68. :rules="{
  69. required: true,
  70. message: '标签不能为空,不需要请删除此项',
  71. trigger: 'blur',
  72. }"
  73. >
  74. <el-input v-model="label.labelName" :disabled="editable"></el-input>
  75. <el-popconfirm
  76. title="此标签在用,删除后之前导出的支付码将失效,删除前请仔细检查,是否删除?"
  77. confirm-button-text="删除"
  78. @onConfirm="removeLabel(label)"
  79. v-if="!!label.id"
  80. >
  81. <el-button
  82. slot="reference"
  83. :disabled="editable"
  84. :loading="label.loading"
  85. class="mt-2"
  86. >删除</el-button
  87. >
  88. </el-popconfirm>
  89. <el-button
  90. @click="removeLabel(label)"
  91. :disabled="editable"
  92. :loading="label.loading"
  93. class="mt-2"
  94. v-else
  95. >删除</el-button
  96. >
  97. <el-button
  98. @click="exportPayCode(label)"
  99. v-show="editable"
  100. :loading="label.loading"
  101. class="mt-2 ml-3"
  102. >导出标签码</el-button
  103. >
  104. </el-form-item>
  105. </div>
  106. <el-form-item>
  107. <el-button
  108. @click="addLabel"
  109. :disabled="editable"
  110. v-show="labelForm.labelFlag == 1"
  111. >新增</el-button
  112. >
  113. <el-button type="danger" @click="editLabel">{{
  114. editable ? "修改标签" : "取消"
  115. }}</el-button>
  116. <el-button
  117. type="primary"
  118. @click="submitForm('labelForm')"
  119. :disabled="editable"
  120. v-show="!editable"
  121. >提交</el-button
  122. >
  123. </el-form-item>
  124. </el-form>
  125. <el-dialog
  126. :visible.sync="selectQrDialog"
  127. width="700px"
  128. append-to-body
  129. title="选择导出标签"
  130. >
  131. <div
  132. class="d-block mx-auto"
  133. style="width: 600px; text-align: center"
  134. id="qrDiv"
  135. >
  136. <h5>标签码设置</h5>
  137. 用户扫码支付后,是否<b>强制将用户拉入此标签</b>?
  138. <el-switch
  139. v-model="exportLabelQr.isAddLabel"
  140. active-value="1"
  141. inactive-value="0"
  142. @change="handleStatusChange"
  143. ></el-switch
  144. ><br />
  145. 当前设置:{{
  146. exportLabelQr.isAddLabel == "1"
  147. ? "支付后强拉至此标签,下次扫员工码和站点码都可以实现此标签优惠~"
  148. : "支付后不强拉到此标签,下次想再享受此标签优惠需要再次扫此标签码~"
  149. }}
  150. <hr />
  151. <div v-if="personnelList.length != 1">
  152. <h5>总标签码</h5>
  153. <div>
  154. 用户可以先扫描<span style="color: red; font-weight: bold">
  155. 总标签码</span
  156. >,再让用户扫描
  157. <span style="color: red; font-weight: bold">{{
  158. personnelList.length == 1 ? "站点码" : "员工码"
  159. }}</span>
  160. ,即可实现标签优惠。
  161. </div>
  162. <div>此码<b>适用所有的加油员</b>,不过需要<b>用户扫码两次</b>~</div>
  163. <div class="btn btn-success mt-3" @click="exportSumLabel">
  164. 导出【总标签码】
  165. </div>
  166. <hr />
  167. </div>
  168. <div>
  169. <h5>员工标签码</h5>
  170. <div>
  171. 用户可以一次性扫描<span style="color: red; font-weight: bold">
  172. 员工标签码</span
  173. >,实现标签优惠。
  174. </div>
  175. <div>
  176. 此码是<b>一个加油员一个标签码</b>,用户只需要<b>扫码一次</b>。
  177. </div>
  178. <div v-if="personnelList.length == 1">
  179. <h5 style="color: red">
  180. 您的站点目前<b>仅有一个加油员</b>,请优先使用此码~
  181. </h5>
  182. </div>
  183. <div v-for="emp in personnelList" :key="emp.personnelId">
  184. <div
  185. class="btn btn-primary mt-3"
  186. @click="exportEmployeeLabel(emp)"
  187. >
  188. 导出{{ emp.personnelName }}的【员工标签码】
  189. </div>
  190. </div>
  191. <br />
  192. </div>
  193. </div>
  194. </el-dialog>
  195. <el-dialog
  196. :visible.sync="exportQrDialog"
  197. width="600px"
  198. append-to-body
  199. title="导出标签"
  200. >
  201. <div>
  202. <qr
  203. :text="currentExport.text"
  204. @downloadImg="downloadImg"
  205. :name="currentExport.type == 1 ? '员工标签码' : '总标签码'"
  206. >
  207. <div v-if="currentExport.type == 1">
  208. 员工标签码:{{ this.$store.state.user.deptName }}-{{
  209. currentExport.name
  210. }}-{{ currentExport.labelName }}
  211. </div>
  212. <div v-if="currentExport.type == 0">
  213. 总标签码:{{ this.$store.state.user.deptName }}-{{
  214. currentExport.labelName
  215. }}
  216. </div>
  217. </qr>
  218. </div>
  219. </el-dialog>
  220. </div>
  221. </PermissionContainer>
  222. </template>
  223. <script>
  224. import {
  225. sysDeptDemoList,
  226. addlabel,
  227. selectLabel,
  228. updateLabelRule,
  229. } from "@/api/label/label";
  230. import qr from "@/components/QrCode";
  231. import { listPersonnel } from "@/api/station/personnel";
  232. import Base64 from "@/utils/base64";
  233. export default {
  234. name: "Label_AddLabel",
  235. data() {
  236. return {
  237. labelForm: {
  238. labelFlag: "0",
  239. labelArr: [
  240. {
  241. id: "",
  242. labelName: "hah",
  243. },
  244. ],
  245. delArr: [],
  246. },
  247. editable: true,
  248. tempForm: undefined,
  249. pageStatus: 0,
  250. selectQrDialog: false,
  251. exportQrDialog: false,
  252. exportLabelQr: {},
  253. exportEmployeeQr: {},
  254. personnelList: [],
  255. currentExport: {
  256. name: "",
  257. type: 1, // 0 总标签码 1 员工标签码
  258. text: "",
  259. labelName: "",
  260. labelId: "",
  261. },
  262. base: null,
  263. };
  264. },
  265. created() {
  266. this.init();
  267. },
  268. components: {
  269. qr,
  270. },
  271. methods: {
  272. init() {
  273. this.setPageStatus();
  274. this.getList();
  275. this.getEmployeeList();
  276. this.base = Base64.getInstance();
  277. },
  278. getEmployeeList() {
  279. listPersonnel({
  280. pageNum: 1,
  281. pageSize: 1000,
  282. })
  283. .then((res) => {
  284. if (res.code == 200) {
  285. this.personnelList = res.rows;
  286. } else {
  287. throw new Error("");
  288. }
  289. })
  290. .catch((err) => {
  291. this.msgError("加载员工列表出错了~");
  292. });
  293. },
  294. setPageStatus() {
  295. this.queryPageStatus([2]).then((res) => {
  296. this.pageStatus = res;
  297. });
  298. },
  299. test() {},
  300. getList() {
  301. return sysDeptDemoList().then((res) => {
  302. if (res.code == 200) {
  303. this.labelForm = res.data;
  304. this.labelForm.delArr = [];
  305. } else {
  306. this.msgError("初始化数据失败");
  307. }
  308. });
  309. },
  310. submitForm(labelForm) {
  311. this.$refs[labelForm].validate((valid) => {
  312. if (valid) {
  313. addlabel(this.labelForm).then((res) => {
  314. if (res.code == 200) {
  315. this.getList().then((res) => {
  316. this.editable = true;
  317. this.msgSuccess("标签提交成功!");
  318. });
  319. } else {
  320. this.msgError("标签提交时出现错误,请刷新重试!");
  321. }
  322. });
  323. }
  324. });
  325. },
  326. resetForm(labelForm) {
  327. this.$refs[labelForm].resetFields();
  328. },
  329. removeLabel(item) {
  330. item.loading = true;
  331. this.labelForm = { ...this.labelForm };
  332. if (!item.id) {
  333. var index = this.labelForm.labelArr.indexOf(item);
  334. if (index !== -1) {
  335. this.labelForm.labelArr.splice(index, 1);
  336. }
  337. item.loading = false;
  338. this.labelForm = { ...this.labelForm };
  339. return;
  340. }
  341. selectLabel({
  342. labelId: item.id,
  343. }).then((res) => {
  344. if (res.code == 200) {
  345. if (res.data) {
  346. this.labelForm.delArr.push(item.id);
  347. var index = this.labelForm.labelArr.indexOf(item);
  348. if (index !== -1) {
  349. this.labelForm.labelArr.splice(index, 1);
  350. }
  351. item.loading = false;
  352. this.labelForm = { ...this.labelForm };
  353. } else {
  354. this.msgError("请先清空标签下的成员之后,再来删除标签操作");
  355. item.loading = false;
  356. this.labelForm = { ...this.labelForm };
  357. }
  358. } else {
  359. this.msgError("查询标签状态失败,请重试");
  360. item.loading = false;
  361. this.labelForm = { ...this.labelForm };
  362. }
  363. });
  364. },
  365. addLabel() {
  366. this.labelForm.labelArr.push({
  367. labelName: "",
  368. key: Date.now(),
  369. });
  370. },
  371. editLabel() {
  372. if (!this.editable) {
  373. if (this.tempForm !== undefined) {
  374. this.labelForm = JSON.parse(this.tempForm);
  375. this.labelForm.delArr = [];
  376. }
  377. } else {
  378. this.tempForm = JSON.stringify({ ...this.labelForm });
  379. }
  380. this.editable = !this.editable;
  381. },
  382. exportPayCode(label) {
  383. this.exportLabelQr = label;
  384. this.currentExport.labelName = label.labelName;
  385. this.currentExport.labelId = label.id;
  386. this.selectQrDialog = true;
  387. },
  388. downloadImg() {
  389. html2canvas(document.getElementById("qrDiv"), { allowTaint: true }).then(
  390. (canvas) => {
  391. const a = document.createElement("a");
  392. const event = new MouseEvent("click");
  393. a.download = "标签支付码";
  394. a.href = canvas.toDataURL();
  395. a.dispatchEvent(event);
  396. }
  397. );
  398. // // const iconUrl = this.$refs['Qrcode'].$el.src
  399. // const a = document.createElement('a')
  400. // const event = new MouseEvent('click')
  401. // a.download = '标签支付码'
  402. // a.href = iconUrl
  403. // a.dispatchEvent(event)
  404. },
  405. handleStatusChange(e) {
  406. const old = this.exportLabelQr.isAddLabel;
  407. updateLabelRule({
  408. id: this.exportLabelQr.id,
  409. isAddLabel: e,
  410. })
  411. .then((res) => {
  412. if (res.code == 200) {
  413. this.msgSuccess("恭喜你,修改成功了~");
  414. } else {
  415. throw new Error("");
  416. }
  417. })
  418. .catch((err) => {
  419. this.exportLabelQr.isAddLabel = old;
  420. this.msgError("抱歉,修改失败了,请刷新网页重试~");
  421. });
  422. },
  423. downloadImg() {
  424. this.msgSuccess("亲,导出成功了~");
  425. },
  426. exportEmployeeLabel(emp) {
  427. this.currentExport.name = emp.personnelName;
  428. this.currentExport.type = 1;
  429. const encodeStr =
  430. "e" + emp.personnelId + "/l" + this.currentExport.labelId + "/";
  431. const encodedStr = this.base.encode(encodeStr);
  432. const trimEqualStr = encodedStr.replace(/={1,}$/g, "");
  433. this.currentExport.text =
  434. "https://goto.huijy.net/" + this.deptId + "/" + trimEqualStr;
  435. this.exportQrDialog = true;
  436. },
  437. exportSumLabel() {
  438. const encodeStr = "l" + this.currentExport.labelId + "/";
  439. const encodedStr = this.base.encode(encodeStr);
  440. const trimEqualStr = encodedStr.replace(/={1,}$/g, "");
  441. this.currentExport.text =
  442. "https://goto.huijy.net/" + this.deptId + "/" + trimEqualStr;
  443. this.currentExport.type = 0;
  444. this.exportQrDialog = true;
  445. },
  446. },
  447. };
  448. </script>
  449. <style scoped lang="scss">
  450. </style>