Files
jx-callback/business/jxstore/secretNumber/secretNum.go
2022-10-24 11:22:38 +08:00

290 lines
9.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package secretNumber
import (
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/alibabacloud-go/dyplsapi-20170525/client"
"github.com/alibabacloud-go/tea/tea"
"strings"
)
//查询线上可购号码余量
func QuerySecretNoRemain(city string) (b bool, err error) {
result, err := api.SecretNumClient.QuerySecretNoRemain(&client.QuerySecretNoRemainRequest{
SpecId: tea.Int64(1), //1虚商号码即170或171。
City: tea.String(city), //城市名
})
if err != nil {
return false, err
}
if tea.StringValue(result.Body.Code) != "OK" {
err = fmt.Errorf(tea.StringValue(result.Body.Message))
return false, err
}
if tea.Int64Value(result.Body.SecretRemainDTO.Amount) > 0 {
return true, nil
}
return false, err
}
//购买号码
func BuySecretNo(ctx *jxcontext.Context, poolKey, city string) (err error) {
if poolKey == "" {
return fmt.Errorf("该品牌未建立号码池,请先在阿里云上建立号码池,再联系技术!")
}
if b, err := QuerySecretNoRemain(city); err != nil || !b {
return fmt.Errorf("所选地区【%s】已经没有号码余量了请联系阿里的人增加", city)
}
result, err := api.SecretNumClient.BuySecretNo(&client.BuySecretNoRequest{
PoolKey: tea.String(poolKey),
SpecId: tea.Int64(1),
City: tea.String(city),
})
if err != nil {
return err
}
if tea.StringValue(result.Body.Code) != "OK" {
err = fmt.Errorf(tea.StringValue(result.Body.Message))
return err
}
if secretNo := tea.StringValue(result.Body.SecretBuyInfoDTO.SecretNo); secretNo != "" {
secretNumber := &model.SecretNumber{
City: city,
Number: secretNo,
PoolKey: poolKey,
}
dao.WrapAddIDCULDEntity(secretNumber, ctx.GetUserName())
err = dao.CreateEntity(dao.GetDB(), secretNumber)
}
return err
}
//绑定号码
func BindAxb(ctx *jxcontext.Context, secretNumber, numberA, numberB, expiration string) (err error) {
result, err := api.SecretNumClient.BindAxb(&client.BindAxbRequest{
PhoneNoA: tea.String(numberA),
PhoneNoB: tea.String(numberB),
PhoneNoX: tea.String(secretNumber),
Expiration: tea.String(expiration),
})
if err != nil {
return err
}
if tea.StringValue(result.Body.Code) != "OK" {
err = fmt.Errorf(tea.StringValue(result.Body.Message))
return err
}
return err
}
//查询绑定唯一标识SubsId
func QuerySubsId(poolKey, secretNumber string) (subIDs string, err error) {
result, err := api.SecretNumClient.QuerySubsId(&client.QuerySubsIdRequest{
PoolKey: tea.String(poolKey),
PhoneNoX: tea.String(secretNumber),
})
if err != nil {
return "", err
}
if tea.StringValue(result.Body.Code) != "OK" {
err = fmt.Errorf(tea.StringValue(result.Body.Message))
return "", err
}
//多个绑定关系是返回的逗号间隔的
if tea.StringValue(result.Body.SubsId) != "" {
return *result.Body.SubsId, nil
}
return "", err
}
type QuerySubscriptionDetailResult struct {
Status int `json:"status"` //该绑定关系的状态。其中0已失效。1生效中。
NumberA string `json:"numberA"`
NumberB string `json:"numberB"`
NumberX string `json:"numberX"`
GmtCreate string `json:"gmtCreate"` //绑定时间
ExpireDate string `json:"expireDate"` //绑定过期时间
SubsID string `json:"subsID"` //绑定ID
PoolKey string `json:"poolKey"`
}
//查询号码的绑定关系
func QuerySubscriptionDetail(poolKey, phoneNoX string) (querySubscriptionDetailResult []*QuerySubscriptionDetailResult, err error) {
subIDs, err := QuerySubsId(poolKey, phoneNoX)
if err != nil {
return querySubscriptionDetailResult, fmt.Errorf("查询号码绑定关系ID错误err: %v", err)
}
errList := errlist.New()
for _, v := range strings.Split(subIDs, ",") {
result, err2 := api.SecretNumClient.QuerySubscriptionDetail(&client.QuerySubscriptionDetailRequest{
PoolKey: tea.String(poolKey),
SubsId: tea.String(v),
PhoneNoX: tea.String(phoneNoX),
})
if err2 != nil {
errList.AddErr(err2)
continue
}
if tea.StringValue(result.Body.Code) != "OK" {
errList.AddErr(fmt.Errorf(tea.StringValue(result.Body.Message)))
continue
}
dto := result.Body.SecretBindDetailDTO
r := &QuerySubscriptionDetailResult{
Status: int(tea.Int64Value(dto.Status)),
NumberA: tea.StringValue(dto.PhoneNoA),
NumberB: tea.StringValue(dto.PhoneNoB),
NumberX: tea.StringValue(dto.PhoneNoX),
GmtCreate: tea.StringValue(dto.GmtCreate),
ExpireDate: tea.StringValue(dto.ExpireDate),
SubsID: v,
PoolKey: poolKey,
}
querySubscriptionDetailResult = append(querySubscriptionDetailResult, r)
}
return querySubscriptionDetailResult, err
}
//查询号码的绑定关系2
func QuerySubscriptionDetail2(poolKey, subsId, phoneNoX string) (querySubscriptionDetailResult *QuerySubscriptionDetailResult, err error) {
result, err2 := api.SecretNumClient.QuerySubscriptionDetail(&client.QuerySubscriptionDetailRequest{
PoolKey: tea.String(poolKey),
SubsId: tea.String(subsId),
PhoneNoX: tea.String(phoneNoX),
})
if err2 != nil {
return nil, err2
}
if tea.StringValue(result.Body.Code) != "OK" {
err = fmt.Errorf(tea.StringValue(result.Body.Message))
}
dto := result.Body.SecretBindDetailDTO
r := &QuerySubscriptionDetailResult{
Status: int(tea.Int64Value(dto.Status)),
NumberA: tea.StringValue(dto.PhoneNoA),
NumberB: tea.StringValue(dto.PhoneNoB),
NumberX: tea.StringValue(dto.PhoneNoX),
GmtCreate: tea.StringValue(dto.GmtCreate),
ExpireDate: tea.StringValue(dto.ExpireDate),
SubsID: subsId,
PoolKey: poolKey,
}
return r, err
}
//修改绑定关系
//修改哪个字段就传哪个字段
//updateNoA修改A号码。
//updateNoB修改B号码。
//updateExpire修改绑定关系有效期。
func UpdateSubscription(poolKey, subsId, phoneNoX, phoneNoA, phoneNoB, expiration string) (err error) {
params := &client.UpdateSubscriptionRequest{
PoolKey: tea.String(poolKey),
SubsId: tea.String(subsId),
PhoneNoX: tea.String(phoneNoX),
}
bindResult, _ := QuerySubscriptionDetail2(poolKey, subsId, phoneNoX)
if bindResult.NumberA != phoneNoA {
params.OperateType = tea.String("updateNoA")
params.PhoneNoA = tea.String(phoneNoA)
}
if bindResult.ExpireDate != expiration {
params.OperateType = tea.String("updateExpire")
params.Expiration = tea.String(expiration)
}
if bindResult.NumberB != phoneNoB {
params.OperateType = tea.String("updateNoB")
params.PhoneNoB = tea.String(phoneNoB)
}
result, err := api.SecretNumClient.UpdateSubscription(params)
if err != nil {
return err
}
if tea.StringValue(result.Body.Code) != "OK" {
err = fmt.Errorf(tea.StringValue(result.Body.Message))
return err
}
return err
}
//解除号码的绑定关系
func UnbindSubscription(poolKey, subsId, phoneNoX string) (err error) {
result, err := api.SecretNumClient.UnbindSubscription(&client.UnbindSubscriptionRequest{
PoolKey: tea.String(poolKey),
SubsId: tea.String(subsId),
SecretNo: tea.String(phoneNoX),
})
if err != nil {
return err
}
if tea.StringValue(result.Body.Code) != "OK" {
err = fmt.Errorf(tea.StringValue(result.Body.Message))
return err
}
return err
}
type SecretNumberMsgRes struct {
PhoneNo string `json:"phone_no"`
PoolKey string `json:"pool_key"`
City string `json:"city"`
SubID int64 `json:"sub_id"`
UnconnectedCause int `json:"unconnected_cause"`
CallTime string `json:"call_time"`
CallOutTime string `json:"call_out_time"`
PeerNo string `json:"peer_no"`
CalledDisplayNo string `json:"called_display_no"`
ReleaseDir int `json:"release_dir"`
RingTime string `json:"ring_time"`
CallID string `json:"call_id"`
StartTime string `json:"start_time"`
CallStatus string `json:"call_status"`
FreeRingTime string `json:"free_ring_time"`
PartnerKey string `json:"partner_key"`
ControlMsg string `json:"control_msg"`
ID int64 `json:"id"`
SecretNo string `json:"secret_no"`
CallType int `json:"call_type"`
ReleaseCause int `json:"release_cause"`
ControlType string `json:"control_type"`
ReleaseTime string `json:"release_time"`
}
func CallbackBrandBill(res *SecretNumberMsgRes) (err error) {
var (
db = dao.GetDB()
errLists = errlist.New()
)
if brands, _ := dao.GetBrands(db, "", 0, res.PoolKey, false, ""); len(brands) > 0 {
if brandID := brands[0].ID; brandID != 0 {
price := utils.Float64TwoInt(utils.Str2Time(res.ReleaseTime).Sub(utils.Str2Time(res.StartTime)).Minutes()+1) * 6
if err = partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, brandID, price, model.BrandBillTypeExpend, model.BrandBillFeeTypeSecretNumber, "", ""); err == nil {
//计算余额小于10就解绑
balance, _ := partner.CurStoreAcctManager.GetBrandBalance(brandID)
if balance < model.BrandBalanceLimit {
//解绑所有的号码关系
if results, err2 := QuerySubscriptionDetail(res.PoolKey, res.SecretNo); err2 == nil && len(results) > 0 {
for _, v := range results {
if err = UnbindSubscription(res.PoolKey, v.SubsID, v.NumberX); err != nil {
errLists.AddErr(err)
}
}
}
}
}
}
}
err = errLists.GetErrListAsOne()
return err
}
func GetBrandSecretNumbers(ctx *jxcontext.Context, brandID int) (results []*model.SecretNumber, err error) {
return dao.GetBrandSecretNumbers(dao.GetDB(), brandID)
}