## 结汇  `CNH`结算成`CNY`
 [结汇是什么意思？](./结汇概念.md)

### 流程
#### 流程图
![](./../结汇流程图.png)
### 1. 发起结汇
> 商户从前端选择 系统账户（币种CNH）发起结汇,

```js
// 提交结汇的账户 ，金额，等
http.post("",{
    amount:10000.00,
    //currencyID:88,  // 币种 CNY
    paymentChannel:"CNH",  //"alipay" unionpay
    fromAccountID:"66688",  //来自到的账户
    toAccountID:"2332",  //转到的账户
    TradeType:"settlement"
})
```
<br>
<hr>

### 2. 收款系统生成结汇订单号 ，记录到交易日志  
### 3. 关联操作的账户
```go
orderSN:="charge".util.PayTool.GenOrderSn()    //生成结汇单号  settlement202204221059590001
order := &entity.PaymentOoder{
    MerchantID:mid,
    FromCurrencyID:CurrencyID, // 币种
    ToCurrencyID:22325222 ,//转到的账户 
    Amount:1000.00 ,   //金额
    FromAccountID:22325222 ,//来自到的账户
    ToAccountID:22325222 ,//转到的账户 
    OrderSN:orderSN,
    TradeType:"settlement", //交易类型 结汇	
    TradeOrg:"settlement", //交易 机构指银行	
    OrderSN:orderSN,
    //  ......
}
accountID,err:=repo.PaymentOrderDao.Save(order)  //保存订单

//日志
payLog:=&entity.PaymentOoderLog{
    OrderSN:orderSN,
    StepR:0    ,        //步骤
    StepName:"order_create", //步骤 init
    TradeType:"settlement", //交易类型 结汇
    notify_msg:""      //回调信息
}
err:=repo.PaymentOrderLogDao.Save(payLog)  //保存订单日志
```

<br>
<hr>

### 4. 向银行机构发起结汇请求 略
##### 4.1  查询实时汇率等，渠道，币种;
##### 4.2  包装请求体,向银行发起结汇请求
##### 4.3  记录请求数据及响应数据


<br>
<hr>


### 5. 收到银行机构结汇成功的通知
##### 5.1   解析通知body, 查询订单，验证签名，回应银行机构 success
##### 5.2   更改订单状态，记录银行通知数据、订单状态等到日志

<br>
<hr>


### 6.结汇成功，更改目标账户金额
##### 6.1   查询订单信息，获取商户外部账户信息(CNY币种），订单金额等
##### 6.2   更改外部账户金额、记录订单状态等到`MerchantAccountOutLog`日志
##### 6.3   记录订单状态等到`PaymentOrderLog`日志
