one.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. <template>
  2. <div class="m-container">
  3. <div class="m-core">
  4. <div @click="chargeOperation('create')" v-permission="'paymentConfig/add'" class="newBand">添加</div>
  5. <!-- 列表 -->
  6. <div class="tableWrap">
  7. <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
  8. <el-table-column align="center" prop="organName" label="分部"></el-table-column>
  9. <el-table-column align="center" label="收款方式">
  10. <template slot-scope="scope">{{ scope.row.payType | paymentChannelStatus }}</template>
  11. </el-table-column>
  12. <el-table-column align="center" prop="hfMerNo" label="汇付商户号"></el-table-column>
  13. <el-table-column align="center" prop="yqMerNo" label="双乾商户号"></el-table-column>
  14. <el-table-column align="center" label="收款比例">
  15. <template slot-scope="scope">
  16. {{ scope.row.type == 1 ? '数比例' : null }}
  17. {{ scope.row.type == 2 ? '金额比例' : null }}
  18. </template>
  19. </el-table-column>
  20. <el-table-column align="center" width="250px" label="操作">
  21. <template slot-scope="scope">
  22. <el-button
  23. @click="chargeOperation('update', scope.row)"
  24. v-permission="'paymentConfig/update'"
  25. type="text"
  26. >修改</el-button>
  27. <!-- <el-button
  28. @click="chargeDel(scope.row)"
  29. v-permission="'paymentConfig/del'"
  30. type="text"
  31. >删除</el-button> -->
  32. </template>
  33. </el-table-column>
  34. </el-table>
  35. <pagination
  36. :total="pageInfo.total"
  37. :page.sync="pageInfo.page"
  38. :limit.sync="pageInfo.limit"
  39. :page-sizes="pageInfo.page_size"
  40. @pagination="getList"
  41. />
  42. </div>
  43. </div>
  44. <el-dialog
  45. :title="formTitle[formActionTitle]"
  46. :visible.sync="chargeStatus"
  47. @close="onFormClose('ruleForm')"
  48. width="700px"
  49. >
  50. <el-form :model="form" :rules="rules" ref="ruleForm">
  51. <el-form-item label="所属分部" prop="organId" :label-width="formLabelWidth">
  52. <el-select v-model.trim="form.organId" placeholder="请选择所属分部">
  53. <el-option
  54. v-for="(item, index) in branchList"
  55. :key="index"
  56. :label="item.label"
  57. :value="item.value"
  58. ></el-option>
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item label="收款方式" prop="payType" :label-width="formLabelWidth">
  62. <el-select v-model.trim="form.payType" @change="onPayTypeChange" placeholder="请选择收款方式">
  63. <el-option value="YQPAY" label="双乾"></el-option>
  64. <el-option value="ADAPAY" label="汇付"></el-option>
  65. </el-select>
  66. </el-form-item>
  67. <!-- prop="yqMerNo" :error="result.yqError" -->
  68. <el-form-item
  69. label="双乾商户号"
  70. :required="form.payType === 'YQPAY'"
  71. :label-width="formLabelWidth"
  72. >
  73. <el-input
  74. type="text"
  75. @blur="onMerNoBlur('YQPAY')"
  76. placeholder="请输入双乾商户号"
  77. v-model.trim="form.yqMerNo"
  78. ></el-input>
  79. </el-form-item>
  80. <!-- prop="hfMerNo" :error="result.hfError" -->
  81. <el-form-item
  82. label="汇付商户号"
  83. :required="form.payType === 'ADAPAY'"
  84. :label-width="formLabelWidth"
  85. >
  86. <el-input
  87. type="text"
  88. @blur="onMerNoBlur('ADAPAY')"
  89. placeholder="请输入汇付商户号"
  90. v-model.trim="form.hfMerNo"
  91. ></el-input>
  92. </el-form-item>
  93. <el-form-item label="收费比例" required :label-width="formLabelWidth">
  94. <el-radio
  95. v-model.trim.number="form.type"
  96. @change="onRadioChange('ruleForm')"
  97. :label="2"
  98. >金额比例</el-radio>
  99. <el-radio
  100. v-model.trim.number="form.type"
  101. @change="onRadioChange('ruleForm')"
  102. :label="1"
  103. >笔数比例</el-radio>
  104. </el-form-item>
  105. <el-form-item class="moreRule" :label-width="formLabelWidth" style="margin-bottom: 0;">
  106. <span class="min">分部</span>
  107. <span class="min">比例</span>
  108. <span class="max">是否承担手续费</span>
  109. </el-form-item>
  110. <div class="moreRule">
  111. <div class="moreRuleIn" v-for="(domain, index) in result.domains" :key="domain.key">
  112. <el-form-item class="setWidth" :label="'第' + (index + 1)" :label-width="formLabelWidth">
  113. <!-- @change="onBranchChange" -->
  114. <el-select
  115. v-model.trim="domain.organId"
  116. :disabled="domain.disabled"
  117. placeholder="请选择分部"
  118. clearable
  119. >
  120. <el-option
  121. v-for="(item, index) in calcBranchList"
  122. :key="index"
  123. :label="item.label"
  124. :value="item.value"
  125. :disabled="item.disabled"
  126. ></el-option>
  127. </el-select>
  128. </el-form-item>
  129. <el-form-item class="setWidth">
  130. <el-input
  131. type="number"
  132. v-number
  133. min="0"
  134. clearable
  135. :max="form.type === 1 ? 10 : 100"
  136. placeholder="请输入比例"
  137. :disabled="domain.disabled"
  138. @mousewheel.native.prevent
  139. v-model.trim="domain.scale"
  140. >
  141. <template v-if="form.type === 2" slot="append">%</template>
  142. </el-input>
  143. </el-form-item>
  144. <el-form-item>
  145. <el-select
  146. v-model.trim="domain.feeFlag"
  147. placeholder="请选择是否承担手续费"
  148. style="width: 150px !important;"
  149. :disabled="domain.disabled"
  150. clearable
  151. >
  152. <el-option value="Y" label="是"></el-option>
  153. <el-option value="N" label="否"></el-option>
  154. </el-select>
  155. <el-button
  156. v-if="index != 0 && !domain.disabled"
  157. @click.prevent="removeDomain(result, domain)"
  158. >删除</el-button>
  159. </el-form-item>
  160. </div>
  161. <div class="el-form-item__error" v-if="result.errorText">{{ result.errorText }}</div>
  162. </div>
  163. <el-form-item class="add" :label-width="formLabelWidth">
  164. <el-button icon="el-icon-plus" @click="addDomain(result)">新增</el-button>
  165. </el-form-item>
  166. </el-form>
  167. <span slot="footer" class="dialog-footer">
  168. <el-button @click="chargeStatus = false">取 消</el-button>
  169. <el-button @click="onChargeSubmit('ruleForm')" type="primary">确 定</el-button>
  170. </span>
  171. </el-dialog>
  172. </div>
  173. </template>
  174. <script>
  175. import pagination from "@/components/Pagination/index";
  176. import {
  177. paymentConfigQueryPage,
  178. paymentConfigAdd,
  179. paymentConfigUpdate,
  180. paymentConfigDel
  181. } from "@/api/systemManage";
  182. import { getPaymentConfigs } from "./api";
  183. import { branchQueryPage } from "@/api/specialSetting";
  184. import store from "@/store";
  185. export default {
  186. name: "chargeProfitManager",
  187. components: { pagination },
  188. data() {
  189. return {
  190. tableList: [],
  191. pageInfo: {
  192. // 分页规则
  193. limit: 10, // 限制显示条数
  194. page: 1, // 当前页
  195. total: 0, // 总条数
  196. page_size: [10, 20, 40, 50] // 选择限制显示条数
  197. },
  198. chargeStatus: false,
  199. branchList: [], // 分部列表
  200. calcBranchList: [], // 可选比例分部
  201. formActionTitle: "create",
  202. formLabelWidth: "100px",
  203. formTitle: {
  204. create: "添加收费比例",
  205. update: "修改收费比例"
  206. },
  207. form: {
  208. organId: null,
  209. hfMerNo: null,
  210. yqMerNo: null,
  211. payType: null, // 支付渠道
  212. type: 2,
  213. routeScale: []
  214. },
  215. rules: {
  216. hfMerNo: [
  217. { required: true, message: "请输入汇付商户号", trigger: "blur" }
  218. ],
  219. yqMerNo: [
  220. { required: true, message: "请输入双乾商户号", trigger: "blur" }
  221. ],
  222. organId: [
  223. { required: true, message: "请选择所属分部", trigger: "change" }
  224. ],
  225. payType: [
  226. { required: true, message: "请选择收款方式", trigger: "change" }
  227. ]
  228. },
  229. result: {
  230. domains: [
  231. {
  232. organId: null,
  233. scale: null,
  234. feeFlag: null,
  235. disabled: false,
  236. key: Date.now()
  237. }
  238. ],
  239. errorText: null,
  240. yqError: null,
  241. hfError: null
  242. }
  243. };
  244. },
  245. mounted() {
  246. this.getList();
  247. this.getRoleList();
  248. },
  249. methods: {
  250. async onPayTypeChange(val) {
  251. if (!val) {
  252. return;
  253. }
  254. this.calcBranchList = [];
  255. this.result.domains = [
  256. {
  257. organId: null,
  258. scale: null,
  259. feeFlag: null,
  260. disabled: false,
  261. key: Date.now()
  262. }
  263. ];
  264. this.result.errorText = null;
  265. await getPaymentConfigs({ payType: val }).then(res => {
  266. if (res.code == 200 && res.data) {
  267. res.data.forEach(item => {
  268. this.calcBranchList.push({
  269. label: item.organName,
  270. value: item.organId
  271. });
  272. });
  273. }
  274. });
  275. },
  276. onRadioChange(formName) {
  277. this.$refs[formName].clearValidate();
  278. },
  279. onMerNoBlur(type) {
  280. let form = this.form;
  281. let result = this.result;
  282. if (type === "YQPAY" && form.payType === "YQPAY") {
  283. if (form.yqMerNo) {
  284. result.yqError = null;
  285. } else {
  286. result.yqError = "请输入双乾商户号";
  287. }
  288. } else if (type === "ADAPAY" && form.payType === "ADAPAY") {
  289. if (form.hfMerNo) {
  290. result.hfError = null;
  291. } else {
  292. result.hfError = "请输入汇付商户号";
  293. }
  294. }
  295. },
  296. onChargeSubmit(formName) {
  297. this.$refs[formName].validate(valid => {
  298. let params = JSON.parse(JSON.stringify(this.form));
  299. let result = this.result;
  300. params.routeScale = null;
  301. // if (params.payType === "YQPAY" && !params.yqMerNo) {
  302. // result.yqError = "请输入双乾商户号";
  303. // return;
  304. // } else if (params.payType === "ADAPAY" && !params.hfMerNo) {
  305. // result.hfError = "请输入汇付商户号";
  306. // return;
  307. // }
  308. this.addDomain(result, true);
  309. if (valid && !result.errorText) {
  310. let tempResult = [];
  311. result.domains.forEach(item => {
  312. if (item.organId) {
  313. tempResult.push({
  314. organId: item.organId,
  315. scale: item.scale,
  316. feeFlag: item.feeFlag
  317. });
  318. }
  319. });
  320. params.routeScale =
  321. tempResult.length > 0 ? JSON.stringify(tempResult) : null;
  322. if (params.payType === "YQPAY" && !params.yqMerNo && !params.routeScale) {
  323. // result.yqError = "请输入双乾商户号";
  324. this.$message.error('请输入双乾商户号或比例')
  325. return;
  326. } else if (params.payType === "ADAPAY" && !params.hfMerNo && !params.routeScale) {
  327. // result.hfError = "请输入汇付商户号";
  328. this.$message.error('请输入汇付商户号或比例')
  329. return;
  330. }
  331. if (this.formActionTitle == "create") {
  332. if (params.id) {
  333. // 判断有没有Id,如果有则删除
  334. delete params.id;
  335. }
  336. paymentConfigAdd(params).then(res => {
  337. this.messageTips("添加", res);
  338. });
  339. } else if (this.formActionTitle == "update") {
  340. paymentConfigUpdate(params).then(res => {
  341. this.messageTips("修改", res);
  342. });
  343. }
  344. } else {
  345. return;
  346. }
  347. });
  348. },
  349. messageTips(title, res) {
  350. if (res.code == 200) {
  351. this.$message.success(title + "成功");
  352. this.chargeStatus = false;
  353. this.getList();
  354. } else {
  355. this.$message.error(res.msg);
  356. }
  357. },
  358. // onBranchChange(val) {
  359. // this.calcBranchList.forEach(item => {
  360. // if (val == item.value) {
  361. // item.disabled = true;
  362. // } else {
  363. // item.disabled = false;
  364. // }
  365. // });
  366. // },
  367. addDomain(form, checked) {
  368. let domains = form.domains,
  369. forms = this.form,
  370. singleLength = domains.length,
  371. lastDate = domains[singleLength - 1]; // 获取倒数一个对象
  372. // 如果三个值都为空,则不用检验
  373. if (!lastDate.organId && !lastDate.scale && !lastDate.feeFlag && checked) {
  374. form.errorText = ''
  375. return;
  376. }
  377. let countScale = 0;
  378. let selectFeeCount = 0,
  379. selectFeeCount2 = 0
  380. domains.forEach(item => {
  381. countScale += Number(item.scale);
  382. if(forms.type == 2) {
  383. if(item.feeFlag == 'Y') {
  384. selectFeeCount++
  385. }
  386. } else if(forms.type == 1) {
  387. if(item.feeFlag == 'N') {
  388. selectFeeCount2++
  389. }
  390. }
  391. });
  392. if(selectFeeCount > 1) {
  393. form.errorText = `承担手续费只能设置一次“是”`;
  394. return
  395. } else if(selectFeeCount2 > 0) {
  396. form.errorText = `承担手续费只能设置“是”`;
  397. return
  398. }
  399. let num = 0;
  400. if (forms.type === 2) {
  401. num = 100;
  402. } else if (forms.type === 1) {
  403. num = 10;
  404. }
  405. if (!lastDate.organId) {
  406. form.errorText = "选择分部不能为空";
  407. return;
  408. }
  409. if (!parseInt(lastDate.scale)) {
  410. form.errorText = "比例不能为空";
  411. return;
  412. } else if (parseInt(lastDate.scale) > num) {
  413. form.errorText = "比例不能超过" + num;
  414. return;
  415. } else if (parseInt(countScale) > num) {
  416. form.errorText = "比例总和应为" + num;
  417. return;
  418. }
  419. if (!lastDate.feeFlag) {
  420. form.errorText = "请选择是否承担手续费";
  421. return;
  422. }
  423. form.errorText = null;
  424. if (!checked) {
  425. lastDate.disabled = true;
  426. domains.push({
  427. organId: null,
  428. scale: null,
  429. feeFlag: null,
  430. disabled: false,
  431. key: Date.now()
  432. });
  433. } else {
  434. if (parseInt(countScale) != num) {
  435. form.errorText = "比例总和应为" + num;
  436. return;
  437. }
  438. }
  439. },
  440. removeDomain(form, item) {
  441. // this.calcBranchList.forEach(organ => {
  442. // if (item.organId == organ.value) {
  443. // console.log(true)
  444. // organ.disabled = false;
  445. // }
  446. // });
  447. var index = form.domains.indexOf(item);
  448. if (index !== -1) {
  449. form.domains.splice(index, 1);
  450. // 取消最后一个数据的禁用状态
  451. form.domains[form.domains.length - 1].disabled = false;
  452. form.errorText = null;
  453. }
  454. },
  455. getList() {
  456. let params = {};
  457. params.rows = this.pageInfo.limit;
  458. params.page = this.pageInfo.page;
  459. paymentConfigQueryPage(params).then(res => {
  460. if (res.code == 200 && res.data) {
  461. this.tableList = res.data.rows;
  462. this.pageInfo.total = res.data.total;
  463. }
  464. });
  465. },
  466. getRoleList() {
  467. //
  468. branchQueryPage({
  469. // 获取分部
  470. delFlag: 0,
  471. rows: 9999
  472. }).then(res => {
  473. if (res.code == 200 && res.data && res.data.rows) {
  474. res.data.rows.forEach(item => {
  475. this.branchList.push({
  476. label: item.name,
  477. value: item.id
  478. });
  479. });
  480. }
  481. });
  482. },
  483. chargeOperation(type, data) {
  484. this.formActionTitle = type;
  485. this.chargeStatus = true;
  486. // 修改的时候
  487. if (type == "update") {
  488. this.onPayTypeChange(data.payType);
  489. this.form = {
  490. id: data.id,
  491. type: Number(data.type),
  492. hfMerNo: data.hfMerNo,
  493. yqMerNo: data.yqMerNo,
  494. payType: data.payType,
  495. organId: data.organId
  496. };
  497. if (data.routeScale) {
  498. this.result.domains = [];
  499. let scaleJson = JSON.parse(data.routeScale);
  500. let scaleLength = scaleJson.length;
  501. scaleJson.forEach((item, index) => {
  502. let temp = {};
  503. if (scaleLength == index + 1) {
  504. temp.disabled = false;
  505. } else {
  506. temp.disabled = true;
  507. }
  508. temp.organId = item.organId;
  509. temp.scale = item.scale;
  510. temp.feeFlag = item.feeFlag;
  511. this.result.domains.push(temp);
  512. });
  513. }
  514. }
  515. },
  516. chargeDel(row) {
  517. // 删除数据
  518. // paymentConfigDel
  519. this.$confirm("你确定删除?", "提示", {
  520. confirmButtonText: "确定",
  521. cancelButtonText: "取消",
  522. type: "warning"
  523. })
  524. .then(() => {
  525. paymentConfigDel({ id: row.id }).then(res => {
  526. this.messageTips("删除", res);
  527. });
  528. })
  529. .catch();
  530. },
  531. onFormClose(formName) {
  532. // 关闭弹窗重置验证
  533. this.form = {
  534. organId: null,
  535. hfMerNo: null,
  536. yqMerNo: null,
  537. payType: null, // 支付渠道
  538. type: 2,
  539. routeScale: []
  540. };
  541. this.result = {
  542. domains: [
  543. {
  544. organId: null,
  545. scale: null,
  546. feeFlag: null,
  547. disabled: false,
  548. key: Date.now()
  549. }
  550. ],
  551. errorText: null,
  552. yqError: null,
  553. hfError: null
  554. }
  555. this.$refs[formName].resetFields();
  556. }
  557. }
  558. };
  559. </script>
  560. <style lang="scss" scoped>
  561. /deep/.el-button--primary {
  562. background: #14928a;
  563. border-color: #14928a;
  564. color: #fff;
  565. &:hover,
  566. &:active,
  567. &:focus {
  568. background: #14928a;
  569. border-color: #14928a;
  570. color: #fff;
  571. }
  572. }
  573. /deep/.el-dialog__body {
  574. padding: 0 20px;
  575. }
  576. /deep/.el-select,
  577. /deep/.el-date-editor.el-input {
  578. width: 100% !important;
  579. }
  580. .moreRule {
  581. background: #f0f0f0;
  582. position: relative;
  583. .el-form-item__error {
  584. color: #f56c6c;
  585. font-size: 12px;
  586. line-height: 1;
  587. position: absolute;
  588. left: 100px;
  589. top: 100%;
  590. margin-top: -21px;
  591. }
  592. }
  593. .add {
  594. margin-bottom: 22px;
  595. background: #f0f0f0;
  596. padding-bottom: 22px;
  597. }
  598. .moreRuleIn {
  599. .el-form-item {
  600. display: inline-block;
  601. &:first-child {
  602. /deep/.el-form-item__content {
  603. margin-left: 100px !important;
  604. }
  605. }
  606. /deep/.el-form-item__content {
  607. margin-left: 0 !important;
  608. }
  609. }
  610. .setWidth {
  611. /deep/.el-form-item__content {
  612. width: 150px;
  613. }
  614. }
  615. /deep/.el-input-group__append {
  616. padding: 0 8px;
  617. }
  618. }
  619. .min,
  620. .max {
  621. display: inline-block;
  622. width: 150px;
  623. text-align: center;
  624. }
  625. </style>