test 10 月之前
父节点
当前提交
dba6e21eeb

+ 0 - 4
src/modules/dj/controller/admin/channel.ts

@@ -20,8 +20,4 @@ export class OrdertController extends BaseController {
   @Inject()
   dispatchService: DispatchService;
 
-  @Post('/queryChannelBalance', { summary: '获取通道余额' })
-  async queryChannelBalance(@Body(ALL) payload: any) {
-    return this.ok(await this.dispatchService.queryBalance(payload.code));
-  }
 }

+ 21 - 5
src/modules/dj/controller/admin/open.ts

@@ -25,6 +25,7 @@ import { ChannelService } from '../../service/channel';
 import { ILogger } from '@midwayjs/logger';
 import { WithdrawService } from '../../service/withdraw';
 import { KycService } from '../../service/kyc';
+import { RepayService } from '../../service/repay';
 
 @Provide()
 @CoolController()
@@ -51,6 +52,9 @@ export class PayOpenController extends BaseController {
   @Inject()
   kycService: KycService;
 
+  @Inject()
+  repayService: RepayService
+
   @Logger()
   logger: ILogger;
 
@@ -66,6 +70,18 @@ export class PayOpenController extends BaseController {
     return this.ok(await this.payService.query(payload));
   }
 
+  @CoolTag(TagTypes.IGNORE_TOKEN)
+  @Post('/withdraw/create', { summary: '发起代付' })
+  public async withdraw(@Body(ALL) payload: any) {
+    return this.ok(await this.repayService.query(payload));
+  }
+
+  @CoolTag(TagTypes.IGNORE_TOKEN)
+  @Post('/withdraw/query', { summary: '代收查询' })
+  public async withdrawQuery(@Body(ALL) payload: any) {
+    return this.ok(await this.repayService.query(payload));
+  }
+
   @CoolTag(TagTypes.IGNORE_TOKEN)
   @Post('/notifyTest', { summary: '回调通知' })
   public async notifyTest(@Body(ALL) payload: any) {
@@ -79,7 +95,7 @@ export class PayOpenController extends BaseController {
   public async notifySunCardOrderGet(@Body(ALL) payload: any) {
     const headers = this.ctx.headers;
     this.logger.error('SunCard收到交易订单回调数据', JSON.stringify(payload), headers);
-    await this.orderService.handleNotify('SunCard', payload, headers);
+    await this.orderService.handleNotify('SUN_CARD', payload, headers);
     this.ctx.body = {   
       "is_success": "true",
       "message": "success"
@@ -91,7 +107,7 @@ export class PayOpenController extends BaseController {
   public async hambitBraNotifyOrderGet(@Body(ALL) payload: any) {
     const headers = this.ctx.headers;
     this.logger.error('hambit收到交易订单回调数据', JSON.stringify(payload), headers);
-    await this.orderService.handleNotify('HamBitBra', payload, headers);
+    await this.orderService.handleNotify('HB_BRA', payload, headers);
     this.ctx.body = {   
       "code": "200",
       "success": "true"
@@ -99,11 +115,11 @@ export class PayOpenController extends BaseController {
   }
   
   @CoolTag(TagTypes.IGNORE_TOKEN)
-  @Post('/hambit/ind/notifyOrder', { summary: '印度交易订单回调通知' })
-  public async hambitIndNotifyOrderGet(@Body(ALL) payload: any) {
+  @Post('/hambit/inr/notifyOrder', { summary: '印度交易订单回调通知' })
+  public async hambitInrNotifyOrderGet(@Body(ALL) payload: any) {
     const headers = this.ctx.headers;
     this.logger.error('hambit收到交易订单回调数据', JSON.stringify(payload), headers);
-    await this.orderService.handleNotify('HamBitInd', payload, headers);
+    await this.orderService.handleNotify('HB_INR', payload, headers);
     this.ctx.body = {   
       "code": "200",
       "success": "true"

+ 1 - 1
src/modules/dj/controller/admin/withdraw.ts

@@ -18,7 +18,7 @@ export class WithdrawController extends BaseController {
     return this.ok(await this.withdrawService.queryByApi(id));
   }
 
-  @Post('/withdraw', { summary: '查单' })
+  @Post('/withdraw', { summary: '发起代付' })
   async withdraw(@Body(ALL) payload: any) {
     return this.ok(await this.withdrawService.withdraw(payload));
   }

+ 12 - 0
src/modules/dj/entity/merchant.ts

@@ -19,9 +19,21 @@ export class MerchantEntity extends BaseEntity {
   @Column({ comment: '手续费', type: 'decimal', precision: 10, scale: 2 })
   rate: string;
 
+  @Column({ comment: '代付手续费', type: 'decimal', precision: 10, scale: 2 })
+  withdrawRate: string;
+
+  @Column({ comment: '代付单笔固定费用', type: 'decimal', precision: 10, scale: 2 })
+  withdrawBasicFee: string;
+
+  @Column({ comment: '代付单笔最低费用', type: 'decimal', precision: 10, scale: 2 })
+  withdrawFeeMin: number;
+
   @Column({ comment: '状态 0-禁用 1-启用', default: 1 })
   status: number;
 
+  @Column({ comment: '代付状态 0-禁用 1-启用', default: 1 })
+  withdrawStatus: number;
+
   @Column({ comment: 'MD5Key' })
   key: string;
 

+ 20 - 4
src/modules/dj/entity/withdraw.ts

@@ -10,6 +10,10 @@ export class WithdrawEntity extends BaseEntity {
   @Column({ comment: '订单号' })
   orderNo: string;
 
+  @Index({ unique: true })
+  @Column({ comment: '商户订单号' })
+  outOrderNo: string;
+
   @Column({ comment: '交易号', nullable: true })
   traceNo: string;
 
@@ -22,25 +26,37 @@ export class WithdrawEntity extends BaseEntity {
   @Column({ comment: '金额', type: 'decimal', precision: 10, scale: 2 })
   amount: number;
 
-  @Column({ comment: '账户' })
+  @Column({ comment: '货币单位' })
+  currency: string;
+
+  @Column({ comment: '收款账号' })
   accountNo: string;
 
+  @Column({ comment: '收款人姓名' })
+  accountName: string;
+
   @Column({ comment: '银行编码' })
   bankCode: string;
 
   @Column({ comment: '银行名称' })
   bankName: string;
 
-  @Column({ comment: '账户名' })
-  accountName: string;
+  @Column({ comment: '通道手续费', type: 'decimal', precision: 10, scale: 2 })
+  channelCharge: number;
 
+  @Column({ comment: '手续费', type: 'decimal', precision: 10, scale: 2 })
+  charge: number;
+  
   @Column({
-    comment: '订单状态 0-处理中 1-代付成功 2-代付失败',
+    comment: '订单状态 1-已受理 2-银行处理中 3-失败 8-成功',
     type: 'tinyint',
     default: 0,
   })
   status: number;
 
+  @Column({ comment: '通知地址', length: 1000, nullable: true })
+  notifyUrl: string;
+
   @Column({ comment: '备注', nullable: true })
   remark: string;
 }

+ 20 - 2
src/modules/dj/service/channels/dispatch.ts

@@ -3,7 +3,7 @@ import { BaseService } from '@cool-midway/core';
 import { SunPayService } from './sunpay';
 import { ChannelService } from '../channel';
 import { HambitBraService } from './hambitBra';
-import { HambitIndService } from './hambitInd';
+import { HambitInrService } from './hambitInr';
 
 @Provide()
 export class DispatchService extends BaseService {
@@ -17,7 +17,7 @@ export class DispatchService extends BaseService {
   hambitBraService: HambitBraService;
 
   @Inject()
-  hambitIndService: HambitIndService;
+  hambitInrService: HambitInrService;
 
 
   async order(order, channel) {
@@ -46,6 +46,12 @@ export class DispatchService extends BaseService {
     }
     try {
       const channel = await this.channelService.queryByCode(code);
+      if(!this[channel.service]) {
+        return {
+          status: 0,
+          message: "渠道不存在"
+        }
+      }
       return await this[channel.service].queryBalance();
     } catch (e) {
       throw new Error('请求余额查询失败,失败原因:' + e.message);
@@ -55,6 +61,12 @@ export class DispatchService extends BaseService {
   async withdraw(data) {
     try {
       const channel = await this.channelService.queryByCode(data.code);
+      if(!this[channel.service]) {
+        return {
+          status: 2,
+          message: "渠道不存在"
+        }
+      }
       return await this[channel.service].withdraw(data);
     } catch (e) {
       throw new Error('代付申请失败,失败原因:' + e.message);
@@ -64,6 +76,12 @@ export class DispatchService extends BaseService {
   async queryWithdraw(data) {
     try {
       const channel = await this.channelService.queryByCode(data.code);
+      if(!this[channel.service]) {
+        return {
+          status: 2,
+          message: "渠道不存在"
+        }
+      }
       return await this[channel.service].queryWithdraw(data);
     } catch (e) {
       throw new Error('代付查询接口失败,失败原因:' + e.message);

+ 1 - 1
src/modules/dj/service/channels/hambitBra.ts

@@ -140,7 +140,7 @@ export class HambitBraService extends BaseService {
       ...param
     });
     const sign = this.utils.signByHmacSha1(signStr, SECRET_KEY);
-    const res = await this.httpService.post(HOST + BALANCE_URL, param, {
+    const res = await this.httpService.get(HOST + BALANCE_URL, {
       headers: {
         'access_key': ACCESS_KEY,
         'timestamp': timestamp,

+ 5 - 4
src/modules/dj/service/channels/hambitInd.ts → src/modules/dj/service/channels/hambitInr.ts

@@ -14,12 +14,12 @@ const PAY_URL = '/api/v3/ind/createCollectingOrder';
 const QUERY_URL = '/api/v3/ind/query/collectingOrder'
 const BALANCE_URL = '/api/v3/ind/query/balance'
 
-const NOTIFY_HOST = `http://157.175.73.225/api/admin/dj/open/hambit/ind/notifyOrder`;
+const NOTIFY_HOST = `http://157.175.73.225/api/admin/dj/open/hambit/inr/notifyOrder`;
 
 const CHANNEL_TYPE = "BANK";
 
 @Provide()
-export class HambitIndService extends BaseService {
+export class HambitInrService extends BaseService {
   @Inject()
   utils: Utils;
   @Inject()
@@ -138,7 +138,7 @@ export class HambitIndService extends BaseService {
       ...param
     });
     const sign = this.utils.signByHmacSha1(signStr, SECRET_KEY);
-    const res = await this.httpService.post(HOST + BALANCE_URL, param, {
+    const res = await this.httpService.get(HOST + BALANCE_URL, {
       headers: {
         'access_key': ACCESS_KEY,
         'timestamp': timestamp,
@@ -150,7 +150,8 @@ export class HambitIndService extends BaseService {
     const { success, msg, data } = res.data;
     if (success && data[0]) {
       return {
-        balance: data[0]
+        balance: data[0].accountBalance,
+        freeze: data[0].accountFreezeAmount
       }
     } else {
       throw new Error(msg);

+ 6 - 0
src/modules/dj/service/mchBalance.ts

@@ -25,4 +25,10 @@ export class MchBalanceService extends BaseService {
       await this.mchBalanceEntity.save(data);
     }
   }
+
+  async queryByMerchant(mchId) {
+    return this.mchBalanceEntity.findOneBy({
+      mchId
+    })
+  }
 }

+ 16 - 0
src/modules/dj/service/withdraw.ts

@@ -23,6 +23,22 @@ export class WithdrawService extends BaseService {
   @Inject()
   balanceService: BalanceService;
 
+  async create(withdraw: WithdrawEntity) {
+    if (withdraw.id) {
+      withdraw.updateTime = new Date();
+      await this.withdrawEntity.update(withdraw.id, withdraw);
+    } else {
+      withdraw.createTime = new Date();
+      withdraw.updateTime = new Date();
+      await this.withdrawEntity.insert(withdraw);
+    }
+    return withdraw.id;
+  }
+
+  async findByOutOrderNo(outOrderNo: any) {
+    return await this.withdrawEntity.findOneBy({ outOrderNo });
+  }
+
   async handleNotify(code, payload) {
     const data = await this.dispatchService.handleWithdrawNotify(code, payload);
     const withdraw = await this.withdrawEntity.findOneBy({