Label_AddLabel.vue 13 KB

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