index.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845
  1. <template>
  2. <div class="app-container personnelMr-table" :style="{'--q-height':qHeight}">
  3. <div class="app-container-query" ref="queryFormBox">
  4. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="120px">
  5. <el-form-item label="分销商名称" label-width="90px">
  6. <el-input
  7. v-model="queryParams.name"
  8. placeholder="请输入分销商名称"
  9. clearable
  10. style="width: 240px;"
  11. @keyup.enter.native="handleQuery"
  12. />
  13. </el-form-item>
  14. <el-form-item label="分销商类型">
  15. <el-select
  16. v-model="queryParams.type"
  17. placeholder="分销商类型"
  18. clearable
  19. style="width: 140px"
  20. >
  21. <el-option
  22. v-for="dict in dict.type.distribution_type"
  23. :key="dict.value"
  24. :label="dict.label"
  25. :value="dict.value"
  26. />
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="分销商标签">
  30. <el-select
  31. v-model="queryParams.personsType"
  32. placeholder="分销商标签"
  33. clearable
  34. style="width: 140px"
  35. >
  36. <el-option
  37. v-for="dict in dict.type.persons_type"
  38. :key="dict.value"
  39. :label="dict.label"
  40. :value="dict.value"
  41. />
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="入驻银联主体名称" label-width="150px">
  45. <el-input
  46. v-model="queryParams.unionName"
  47. placeholder="请输入入驻银联主体名称"
  48. clearable
  49. style="width: 240px;"
  50. @keyup.enter.native="handleQuery"
  51. />
  52. </el-form-item>
  53. <el-form-item>
  54. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  55. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  56. </el-form-item>
  57. </el-form>
  58. </div>
  59. <div class="app-container-table-box">
  60. <el-row :gutter="10" class="mb8">
  61. <el-col :span="1.5">
  62. <el-button
  63. type="primary"
  64. plain
  65. icon="el-icon-plus"
  66. size="mini"
  67. @click="handleAdd"
  68. v-hasPermi="['personnelMr:personnelMr:add']"
  69. >新增</el-button>
  70. </el-col>
  71. <el-col :span="1.5">
  72. <el-button
  73. type="success"
  74. plain
  75. icon="el-icon-setting"
  76. size="mini"
  77. @click="openSet"
  78. v-hasPermi="['personnelMr:personnelMr:set']"
  79. >提现设置</el-button>
  80. </el-col>
  81. <el-col :span="1.5">
  82. <el-button
  83. type="warning"
  84. plain
  85. icon="el-icon-s-tools"
  86. size="mini"
  87. @click="codeSet"
  88. v-hasPermi="['personnelMr:personnelMr:codeSet']"
  89. >推广码海报设置</el-button>
  90. </el-col>
  91. <el-col :span="1.5">
  92. <el-button
  93. type="success"
  94. plain
  95. icon="el-icon-s-tools"
  96. size="mini"
  97. @click="linkSet"
  98. v-hasPermi="['personnelMr:personnelMr:linkSet']"
  99. >推广链接内容设置</el-button>
  100. </el-col>
  101. <el-col :span="1.5">
  102. <el-button
  103. type="danger"
  104. plain
  105. icon="el-icon-s-tools"
  106. size="mini"
  107. @click="openRetailRate"
  108. v-hasPermi="['personnelMr:personnelMr:RetailRate']"
  109. >批量设置佣金税率</el-button>
  110. <el-button
  111. type="primary"
  112. size="mini"
  113. icon="el-icon-download"
  114. v-hasPermi="['personnelMr:personnelMr:downloadExcel']"
  115. @click="handleExport"
  116. v-loading.fullscreen.lock="handleExportLoading"
  117. element-loading-text="正在拼命生成数据中..."
  118. element-loading-spinner="el-icon-loading"
  119. element-loading-background="rgba(0, 0, 0, 0.5)"
  120. >导出excel</el-button>
  121. </el-col>
  122. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  123. </el-row>
  124. <div class="app-container-table-info">
  125. <el-table ref="tables" v-loading="loading" height="100%" :data="dataList" @selection-change="handleSelectionChange" border>
  126. <el-table-column type="selection" width="55">
  127. </el-table-column>
  128. <el-table-column label="序号" align="center" type="index" width="50"></el-table-column>
  129. <el-table-column label="分销商名称" align="center" prop="name" />
  130. <el-table-column label="分销商类型" align="center" prop="type">
  131. <template slot-scope="scope">
  132. <dict-tag :options="dict.type.distribution_type" :value="scope.row.type"/>
  133. </template>
  134. </el-table-column>
  135. <el-table-column label="分销商标签" align="center" prop="type">
  136. <template slot-scope="scope">
  137. <dict-tag :options="dict.type.persons_type" :value="scope.row.personsType"/>
  138. </template>
  139. </el-table-column>
  140. <el-table-column label="入驻银联主体名称" align="center" prop="unionName" />
  141. <el-table-column label="签约状态" align="center" prop="unionFlag">
  142. <template slot-scope="scope">
  143. <dict-tag :options="dict.type.union_flag" :value="scope.row.unionFlag"/>
  144. </template>
  145. </el-table-column>
  146. <el-table-column label="签约商户号" align="center" prop="unionMid" />
  147. <el-table-column label="签约失败原因" align="center" prop="unionErrReason" />
  148. <el-table-column label="佣金税率" align="center" prop="type">
  149. <template slot-scope="scope">
  150. <span>{{ scope.row.retailRate }}%</span>
  151. </template>
  152. </el-table-column>
  153. <!-- <el-table-column label="佣金税率" align="center" prop="retailRate" /> -->
  154. <el-table-column label="负责人" align="center" prop="contact" />
  155. <el-table-column label="账号/联系电话" align="center" prop="mobile" />
  156. <el-table-column label="被扫次数" align="center" prop="scanCounts" />
  157. <el-table-column label="佣金总额" align="center" prop="brokerageTotal">
  158. <template slot-scope="scope">
  159. <span v-if="scope.row.brokerageTotal || scope.row.brokerageTotal==0">¥{{ scope.row.brokerageTotal }}</span>
  160. </template>
  161. </el-table-column>
  162. <el-table-column label="待提现" align="center" prop="withdrawTotal">
  163. <template slot-scope="scope">
  164. <span v-if="scope.row.withdrawTotal || scope.row.withdrawTotal ==0">¥{{ scope.row.withdrawTotal }}</span>
  165. </template>
  166. </el-table-column>
  167. <el-table-column label="是否可提现" align="center" prop="allowWithdraw">
  168. <template slot-scope="scope">
  169. <dict-tag :options="dict.type.user_allow_withdraw" :value="scope.row.allowWithdraw"/>
  170. </template>
  171. </el-table-column>
  172. <el-table-column label="账号状态" align="center">
  173. <template slot-scope="scope">
  174. <el-switch
  175. @change="ionlineApi(scope.row)"
  176. v-model="scope.row.switchValue"
  177. :active-value="1"
  178. active-color="#13ce66"
  179. inactive-color="#ff4949">
  180. </el-switch>
  181. </template>
  182. </el-table-column>
  183. <el-table-column label="推广码状态" align="center">
  184. <template slot-scope="scope">
  185. <el-switch
  186. @change="updateQrStatusFun(scope.row)"
  187. v-model="scope.row.qrcodeStatus"
  188. :active-value="1"
  189. active-color="#13ce66"
  190. inactive-color="#ff4949">
  191. </el-switch>
  192. </template>
  193. </el-table-column>
  194. <el-table-column label="销售人员" align="center" prop="salePerson" />
  195. <el-table-column label="添加时间" align="center" prop="createTime" width="160">
  196. <template slot-scope="scope">
  197. <span>{{ parseTime(scope.row.createTime) }}</span>
  198. </template>
  199. </el-table-column>
  200. <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
  201. <template slot-scope="scope">
  202. <el-button
  203. size="mini"
  204. type="text"
  205. @click="handleUpdate(scope.row)"
  206. v-hasPermi="['personnelMr:personnelMr:edit']"
  207. >修改</el-button>
  208. <el-button
  209. size="mini"
  210. type="text"
  211. @click="resettingApi(scope.row)"
  212. v-hasPermi="['personnelMr:personnelMr:resetting']"
  213. >重置密码</el-button>
  214. <el-button
  215. size="mini"
  216. type="text"
  217. @click="handleCode(scope.row, 'img')"
  218. v-hasPermi="['personnelMr:personnelMr:code']"
  219. >推广码</el-button>
  220. <el-button
  221. size="mini"
  222. type="text"
  223. @click="handleDelete(scope.row,scope.index)"
  224. v-hasPermi="['personnelMr:personnelMr:delete']"
  225. >删除</el-button>
  226. </template>
  227. </el-table-column>
  228. </el-table>
  229. <pagination
  230. v-show="total>0"
  231. :total="total"
  232. :page.sync="queryParams.pageNum"
  233. :limit.sync="queryParams.pageSize"
  234. @pagination="getList"
  235. />
  236. </div>
  237. </div>
  238. <!-- 新增/编辑弹框 -->
  239. <add-and-edit
  240. ref="addAndEdit"
  241. :dict="dict"
  242. @getList="getList"
  243. />
  244. <!-- 海报设置 -->
  245. <promotion-code ref="promotionCode"></promotion-code>
  246. <el-dialog
  247. title="推广码"
  248. :visible.sync="visibleStatus"
  249. width="400px"
  250. :destroy-on-close="true"
  251. :close-on-click-modal="false"
  252. >
  253. <div style="display: flex;justify-content: center;">
  254. <div style="width: 300px; height: 544px; background-size: cover;background-repeat: no-repeat;box-shadow: 0px 0px 20px 2px rgba(221,221,221,0.5);border-radius: 10px;">
  255. <div id="capture" style="width: 100%;height: 100%;position: relative;border-radius: 10px;">
  256. <img style="width: 100%;height: 100%;" :src="newObj.posterImg" alt="">
  257. <el-image
  258. style="width: 80px; height: 80px; position: absolute; bottom: 10px; right: 10px;"
  259. :src="newObj.url"
  260. fit="fill"
  261. />
  262. </div>
  263. </div>
  264. </div>
  265. <div slot="footer" class="dialog-footer">
  266. <el-button @click="visibleStatus = false">取 消</el-button>
  267. <el-button :loading="getShareImgBase64Loading" type="primary" @click="getShareImgBase64(newObj)">
  268. {{ getShareImgBase64Loading ? '下载中':'下 载' }}</el-button>
  269. </div>
  270. </el-dialog>
  271. <el-dialog
  272. title="提现设置"
  273. :visible.sync="setStatus"
  274. width="650px"
  275. :destroy-on-close="true"
  276. :close-on-click-modal="false"
  277. >
  278. <el-form :model="setForm" ref="setForm" :rules="setFormRules" label-width="120px">
  279. <el-form-item label="类型:" prop="type">
  280. <el-radio-group v-model="setForm.type">
  281. <el-radio label="1">按实值</el-radio>
  282. <el-radio label="2">按比例</el-radio>
  283. </el-radio-group>
  284. </el-form-item>
  285. <el-form-item label="提现手续费" prop="serviceCharge">
  286. <el-input
  287. type="number"
  288. v-model="setForm.serviceCharge"
  289. placeholder="请输入提现手续费"
  290. clearable
  291. @change="changePriceAmount('serviceCharge')"
  292. style="width: 260px;"
  293. >
  294. <template slot="append">{{ setForm.type == 2 ? '%' : '元' }}</template>
  295. </el-input>
  296. </el-form-item>
  297. <!-- <el-form-item label="提现门槛" prop="withdrawMinMoney">
  298. <div>
  299. <el-input
  300. type="number"
  301. v-model="setForm.withdrawMinMoney"
  302. placeholder="请输入提现门槛,最低0.3元"
  303. clearable
  304. @change="changePriceAmount('withdrawMinMoney')"
  305. style="width: 260px;"
  306. >
  307. </el-input>
  308. <span style="margin-left: 5px">元以上方可提现</span>
  309. </div>
  310. <span style="font-size: 14px;color: #777;">注: 最低提现为0.3元</span>
  311. </el-form-item> -->
  312. </el-form>
  313. <div slot="footer" class="dialog-footer">
  314. <el-button @click="setStatus = false">取消</el-button>
  315. <el-button
  316. type="primary"
  317. @click="submitForm"
  318. v-loading.fullscreen.lock="setLoading"
  319. element-loading-text="请等待..."
  320. element-loading-spinner="el-icon-loading"
  321. element-loading-background="rgba(0, 0, 0, 0.8)"
  322. >
  323. <span v-if="loading">提交中...</span>
  324. <span v-else>保存</span>
  325. </el-button>
  326. </div>
  327. </el-dialog>
  328. <el-dialog
  329. title="佣金税率设置"
  330. :visible.sync="showRetailRate"
  331. width="650px"
  332. :destroy-on-close="true"
  333. :close-on-click-modal="false"
  334. >
  335. <el-form :model="retailRateForm" ref="retailRateForm" :rules="retailRateFormRules" label-width="120px">
  336. <el-form-item label="佣金税率设置" prop="retailRate">
  337. <el-input
  338. type="number"
  339. v-model="retailRateForm.retailRate"
  340. placeholder="请输入佣金税率"
  341. clearable
  342. @change="retailRateChange"
  343. style="width: 260px;"
  344. >
  345. <template slot="append">%</template>
  346. </el-input>
  347. </el-form-item>
  348. </el-form>
  349. <div slot="footer" class="dialog-footer">
  350. <el-button @click="showRetailRate = false">取消</el-button>
  351. <el-button
  352. type="primary"
  353. @click="submitRetailRateForm"
  354. v-loading.fullscreen.lock="loading"
  355. element-loading-text="请等待..."
  356. element-loading-spinner="el-icon-loading"
  357. element-loading-background="rgba(0, 0, 0, 0.8)"
  358. >
  359. <span v-if="loading">提交中...</span>
  360. <span v-else>保存</span>
  361. </el-button>
  362. </div>
  363. </el-dialog>
  364. <!-- 推广链接内容设置 -->
  365. <linkSetVue ref="linkSetVue" @refresh="getList" />
  366. </div>
  367. </template>
  368. <script>
  369. import {
  370. pageList,
  371. deleteById,
  372. updateStatus,
  373. configUpdate,
  374. getSetInfo,
  375. getRetailQrcode ,
  376. batchUpdateRetailRate,
  377. downOrderListXls,
  378. updateQrStatusApi
  379. } from '@/api/distribution/personnelMr'
  380. import addAndEdit from "./dialog/addAndEdit.vue";
  381. import promotionCode from "./dialog/promotionCode.vue";
  382. import { exportExcel } from '@/utils/exportexcel'
  383. import html2canvas from 'html2canvas'
  384. import linkSetVue from './dialog/linkSet.vue';
  385. export default {
  386. name: "agreement",
  387. computed: {
  388. url() {
  389. return url
  390. }
  391. },
  392. dicts: ['distribution_type','user_allow_withdraw','persons_type','union_flag'],
  393. components: { addAndEdit, promotionCode, linkSetVue },
  394. data() {
  395. let validateNumber = (rule, value, callback) => {
  396. let regNumber=/^(([1-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g;
  397. if (value === '') {
  398. callback(new Error('请输入数值!!!'));
  399. }else if (!regNumber.test(value)) {
  400. callback(new Error('只能输入大于0.3的数值!!!'));
  401. } else if(value < 0.3){
  402. callback(new Error('只能输入大于0.3的数值!!!'));
  403. }else {
  404. callback();
  405. }
  406. };
  407. let validateNumber1 = (rule, value, callback) => {
  408. let regNumber=/^(([1-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g;
  409. if (value === '') {
  410. callback(new Error('请输入数值!!!'));
  411. } else if (value == 0) {
  412. callback();
  413. } else if (!regNumber.test(value)) {
  414. callback(new Error('只能输入>=0的数值!!!'));
  415. }else {
  416. callback();
  417. }
  418. };
  419. return {
  420. qHeight: '0px',
  421. resizeObserver: null,
  422. // 遮罩层
  423. loading: true,
  424. // 选中数组
  425. ids: [],
  426. // 非单个禁用
  427. single: true,
  428. // 非多个禁用
  429. multiple: true,
  430. // 显示搜索条件
  431. showSearch: true,
  432. // 总条数
  433. total: 0,
  434. // 用户表格数据
  435. dataList: null,
  436. // 弹出层标题
  437. title: "",
  438. // 是否显示弹出层
  439. open: false,
  440. // 日期范围
  441. dateRange: [],
  442. // 查询参数
  443. queryParams: {
  444. pageNum: 1,
  445. pageSize: 10,
  446. type: undefined
  447. },
  448. statusList: [
  449. {id: 1, name: '未发布', value: 0},
  450. {id: 2, name: '发布', value: 1},
  451. {id: 3, name: '下架', value: 2},
  452. ],
  453. visibleStatus: false,
  454. newObj: {},
  455. visibleType: '',
  456. setStatus: false,
  457. setForm: {},
  458. setFormRules: {
  459. type: [
  460. { required: true, message: '请选择类型', trigger: ['change','blur'] },
  461. ],
  462. serviceCharge: [
  463. { required: true, message: '请输入提现手续费', trigger: ['change','blur'] },
  464. { validator: validateNumber1, trigger: ["blur","change"]},
  465. ],
  466. withdrawMinMoney: [
  467. { required: true, message: '请输入提现门槛,最低0.3元', trigger: ['change','blur'] },
  468. { validator: validateNumber, trigger: ["blur","change"]},
  469. ],
  470. },
  471. setRules: [],
  472. setLoading: false,
  473. getShareImgBase64Loading: false,
  474. showRetailRate: false,//税率设置弹窗
  475. retailRateForm: {ids:[],retailRate:undefined},
  476. retailRateFormRules: {
  477. retailRate: [
  478. { required: true, message: '请输入佣金税率', trigger: ['change','blur'] },
  479. ],
  480. },
  481. handleExportLoading: false,
  482. };
  483. },
  484. created() {
  485. this.getList();
  486. },
  487. mounted() {
  488. this.resizeObserver = new ResizeObserver(entries => {
  489. for (let entry of entries) {
  490. const { width, height } = entry.contentRect;
  491. this.qHeight = height + 'px'
  492. }
  493. });
  494. this.resizeObserver.observe(this.$refs.queryFormBox);
  495. },
  496. methods: {
  497. /** 查询列表 */
  498. getList() {
  499. this.dataList = []
  500. this.loading = true;
  501. pageList(this.queryParams)
  502. .then(response => {
  503. let list = response.data.rows
  504. list.forEach(item =>{
  505. item.switchValue = item.status;
  506. })
  507. this.dataList = list
  508. this.total = response.data.total;
  509. this.loading = false;
  510. }
  511. ).catch(()=>{
  512. this.dataList = []
  513. this.loading = false;
  514. })
  515. },
  516. // 取消按钮
  517. cancel() {
  518. this.open = false;
  519. },
  520. /** 搜索按钮操作 */
  521. handleQuery() {
  522. this.queryParams.pageNum = 1;
  523. this.getList();
  524. },
  525. /** 重置按钮操作 */
  526. resetQuery() {
  527. this.dateRange = [];
  528. this.$set(this.queryParams, 'name', '');
  529. this.$set(this.queryParams, 'type', '');
  530. this.$set(this.queryParams, 'personsType', '');
  531. this.$set(this.queryParams, 'unionName', '');
  532. this.queryParams.pageNum = 1;
  533. this.handleQuery();
  534. },
  535. /** 价格输入事件 */
  536. changePriceAmount(key) {
  537. if(this.setForm[key] * 1 < 0){
  538. this.$message.error("输入需大于或等于0!");
  539. this.$set(this.setForm, key, '');
  540. return false
  541. }
  542. },
  543. /** 新增按钮操作 */
  544. handleAdd() {
  545. this.$refs["addAndEdit"].openDialog("新增数据", null);
  546. },
  547. /** 提现设置按钮操作 */
  548. openSet() {
  549. this.setStatus = true
  550. this.getSetApi();
  551. },
  552. /** 佣金税率设置 */
  553. openRetailRate() {
  554. if(this.ids.length == 0){
  555. this.$message.warning("请选择分销商");
  556. return;
  557. }
  558. console.log('ids',this.ids)
  559. this.showRetailRate = true;
  560. },
  561. /** 海报设置按钮操作 */
  562. codeSet() {
  563. this.$refs["promotionCode"].openDialog("海报设置", null);
  564. },
  565. /** 海报设置按钮操作 */
  566. linkSet() {
  567. this.$refs["linkSetVue"].initData("推广链接内容设置", null);
  568. },
  569. /** 修改按钮操作 */
  570. handleUpdate(row) {
  571. this.$refs["addAndEdit"].openDialog("修改数据", row);
  572. },
  573. /** 获取提现设置 */
  574. getSetApi(row) {
  575. getSetInfo().then(response => {
  576. const obj = response.data;
  577. this.$nextTick(() => {
  578. this.$set(this.setForm, 'id', obj.id ? obj.id : '');
  579. this.$set(this.setForm, 'withdrawMinMoney', obj.withdrawMinMoney);
  580. this.$set(this.setForm, 'serviceCharge', obj.serviceCharge);
  581. this.$set(this.setForm, 'type', obj.type ? (obj.type + '') : '1');
  582. });
  583. });
  584. },
  585. /** 获取推广码 */
  586. getRetailQrcodeApi(row) {
  587. getRetailQrcode({personsId: row.id}).then(response => {
  588. if(response.code == 200) {
  589. const obj = response.data;
  590. this.newObj = obj;
  591. this.newObj.name = row.name;
  592. this.visibleStatus = true
  593. }
  594. });
  595. },
  596. /**
  597. * 分析提现
  598. * @date 2023-11-22
  599. * @returns {any}
  600. */
  601. submitForm() {
  602. this.$refs["setForm"].validate(async (valid) => {
  603. if (valid) {
  604. try {
  605. this.setLoading = true;
  606. const { code } = await configUpdate({ ...this.setForm });
  607. if (code === 200) {
  608. this.setLoading = false;
  609. this.$message.success("操作成功!");
  610. this.getList();
  611. this.setStatus = false;
  612. }
  613. } catch (error) {
  614. } finally {
  615. this.setLoading = false;
  616. }
  617. }
  618. });
  619. },
  620. /** 佣金税率输入事件 */
  621. retailRateChange(value) {
  622. // 检查输入值是否大于0
  623. if (value <= 0) {
  624. // 如果小于等于0,则将输入值置为0
  625. this.retailRateForm.retailRate = 0;
  626. } else {
  627. // 如果大于0,则保留输入值
  628. this.retailRateForm.retailRate = value;
  629. }
  630. },
  631. // 佣金税率设置
  632. submitRetailRateForm(){
  633. this.retailRateForm.ids = this.ids;
  634. this.$refs["retailRateForm"].validate(async (valid) => {
  635. if (valid) {
  636. try {
  637. this.loading = true;
  638. const { code } = await batchUpdateRetailRate({ ...this.retailRateForm });
  639. if (code === 200) {
  640. this.setLoading = false;
  641. this.$message.success("操作成功!");
  642. this.getList();
  643. this.retailRateForm={ids:[],retailRate:undefined};
  644. this.showRetailRate = false;
  645. }
  646. } catch (error) {
  647. } finally {
  648. this.loading = false;
  649. }
  650. }
  651. });
  652. },
  653. /** 禁用或者启用发布按钮操作 */
  654. ionlineApi(row) {
  655. this.$confirm("是否对分销商名称为" + row.name + "的数据进行" + (row.status == 1 ? '禁用?' : '启用?'), '提示', {
  656. confirmButtonText: '确定',
  657. cancelButtonText: '取消',
  658. type: 'warning'
  659. }).then(() => {
  660. updateStatus({ id: row.id, status: row.status == 1 ? 0 : 1 }).then((res) => {
  661. if (res.code == 200) {
  662. this.$message({
  663. type: 'success',
  664. message: '操作成功!'
  665. });
  666. this.getList();
  667. }
  668. });
  669. }).catch(() => {
  670. this.getList();
  671. });
  672. },
  673. /** 置顶或者取消置顶按钮操作 */
  674. resettingApi(row) {
  675. this.$confirm("是否对分销商名称为" + row.name + "的数据进行密码重置?重置后的密码为123456", '提示', {
  676. confirmButtonText: '确定',
  677. cancelButtonText: '取消',
  678. type: 'warning'
  679. }).then(() => {
  680. updateStatus({ id: row.id, password: '123456' }).then((res) => {
  681. if (res.code == 200) {
  682. this.$message({
  683. type: 'success',
  684. message: '操作成功!'
  685. });
  686. this.getList();
  687. }
  688. });
  689. }).catch(() => {});
  690. },
  691. /** 删除按钮操作 */
  692. handleDelete(row) {
  693. this.$modal.confirm('是否确认删除数据分销商名称为"' + row.name + '"的数据项?').then(function() {
  694. return deleteById(row.id);
  695. }).then(() => {
  696. this.getList();
  697. this.$modal.msgSuccess("删除成功");
  698. }).catch(() => {});
  699. },
  700. /** 推广码按钮操作 */
  701. handleCode(obj, type) {
  702. this.getRetailQrcodeApi(obj);
  703. },
  704. // 推广码下载
  705. codeDownload(row) {
  706. let name = this.newObj.name + '的推广码' || ''
  707. if(row){
  708. let a = document.createElement("a");
  709. a.href = row;
  710. if(name.indexOf(".") > -1){
  711. a.download = name;
  712. } else {
  713. a.download = name + ".jpg";
  714. }
  715. a.style.display = "none";
  716. document.body.appendChild(a);
  717. a.click();
  718. a.remove();
  719. }
  720. },
  721. // 推广码 base64
  722. getShareImgBase64() {
  723. return new Promise((resolve) => {
  724. this.getShareImgBase64Loading = true
  725. setTimeout(() => {
  726. // #capture 就是我们要获取截图对应的 DOM 元素选择器
  727. html2canvas(document.querySelector('#capture'), {
  728. useCORS: true, // 【重要】开启跨域配置
  729. scale: window.devicePixelRatio < 3 ? window.devicePixelRatio : 2,
  730. allowTaint: true, // 允许跨域图片
  731. }).then((canvas) => {
  732. const imgData = canvas.toDataURL('image/jpeg', 1.0);
  733. this.codeDownload(imgData);
  734. resolve(imgData);
  735. this.getShareImgBase64Loading = false
  736. }).catch(()=>{
  737. this.getShareImgBase64Loading = false
  738. })
  739. }, 300); // 这里加上 300ms 的延迟是为了让 DOM 元素完全渲染完成后再进行图片的生成
  740. });
  741. },
  742. // 多选框选中数据
  743. handleSelectionChange(selection) {
  744. this.ids = selection.map(item => item.id)
  745. this.single = selection.length!=1
  746. this.multiple = !selection.length
  747. },
  748. /**
  749. * 导出报表
  750. * @date 2022-10-24
  751. * @returns {any}
  752. */
  753. handleExport() {
  754. this.$confirm('您确定要导出当前查询的数据吗?', '提示', {
  755. confirmButtonText: '确定 ',
  756. cancelButtonText: '取消 ',
  757. type: 'warning'
  758. })
  759. .then(() => {
  760. this.handleExportLoading = true;
  761. // const { pageNum, pageSize} = this.params;
  762. let postMap = {}
  763. let params = JSON.parse(JSON.stringify(this.queryParams))
  764. for (let key in params) {
  765. if(key != 'pageNum' && key != 'pageSize' && key != 'time' && key != 'createTime' && key != 'performDate' && key != 'invoiceTime'){
  766. postMap[key] = params[key]
  767. }
  768. }
  769. downOrderListXls(postMap)
  770. .then((res) => {
  771. exportExcel(res, '分销人员', '.xlsx');
  772. this.handleExportLoading = false;
  773. })
  774. .catch((error) => {
  775. console.log("error===",error)
  776. this.handleExportLoading = false;
  777. });
  778. })
  779. .catch(() => {
  780. this.$message.info('您已取消导出!');
  781. });
  782. },
  783. /** 推广码 */
  784. updateQrStatusFun(row) {
  785. this.$confirm("是否" + (!row.qrcodeStatus ? '禁用' : '启用') + row.name + '的推广码?' , '提示', {
  786. confirmButtonText: '确定',
  787. cancelButtonText: '取消',
  788. type: 'warning'
  789. }).then(() => {
  790. updateQrStatusApi({ id: row.id, qrcodeStatus: !row.qrcodeStatus ? 0 : 1 }).then((res) => {
  791. if (res.code == 200) {
  792. this.$message({
  793. type: 'success',
  794. message: '操作成功!'
  795. });
  796. this.getList();
  797. }
  798. });
  799. }).catch(() => { this.getList()});
  800. }
  801. },
  802. beforeDestroy() {
  803. this.resizeObserver.unobserve(this.$refs.queryFormBox);
  804. this.resizeObserver.disconnect();
  805. },
  806. };
  807. </script>
  808. <style lang="scss" scoped>
  809. .app-container {
  810. height: calc( 100vh - 110px );
  811. box-sizing: border-box;
  812. }
  813. .app-container-query {
  814. }
  815. .app-container-table-box {
  816. height: calc( 100% - var(--q-height) );
  817. .app-container-table-info {
  818. height: calc( 100% - 100px );
  819. }
  820. }
  821. </style>