one.vue 19 KB

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