This commit is contained in:
suyl
2021-06-24 16:09:02 +08:00
parent 8993e48ae9
commit bfe94e735a
27 changed files with 54 additions and 4458 deletions

View File

@@ -1,43 +0,0 @@
package alipay
import (
"git.rosy.net.cn/baseapi/platformapi/alipayapi"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
const (
AuthType = "alipaycode"
)
type Auther struct {
authprovider.DefAuther
}
var (
AutherObj *Auther
)
func init() {
AutherObj = new(Auther)
auth2.RegisterAuther(AuthType, AutherObj)
}
func (a *Auther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("VerifySecret dummy:%s, code:%s", dummy, code)
tokenInfo, err := api.AliPayAPI.SystemAuthToken(alipayapi.GrantTypeCode, code, "")
if err == nil {
userInfo, err2 := api.AliPayAPI.UserInfoShare(tokenInfo.AccessToken)
if err = err2; err == nil {
if authBindEx, err = a.UnionFindAuthBind(AuthType, api.AliPayAPI.GetAppID(), nil, userInfo.UserID, "", userInfo); err == nil {
authBindEx.UserHint = &auth2.UserBasic{
Name: userInfo.NickName,
Avatar: userInfo.Avatar,
}
}
}
}
return authBindEx, err
}

View File

@@ -1,6 +0,0 @@
package dingding
const (
AuthTypeStaff = "ddstaff" // 钉钉企业登录
AuthTypeQRCode = "ddqrcode"
)

View File

@@ -1,37 +0,0 @@
package dingding
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
type QRCodeAuther struct {
authprovider.DefAuther
}
var (
AutherObjQRCode *QRCodeAuther
)
func init() {
AutherObjQRCode = new(QRCodeAuther)
auth2.RegisterAuther(AuthTypeQRCode, AutherObjQRCode)
}
func (a *QRCodeAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("dingding qrcode VerifySecret code:%s", code)
userQRInfo, err := api.DingDingQRCodeAPI.GetUserInfoByCode(code)
if err == nil {
globals.SugarLogger.Debugf("dingding qrcode VerifySecret code:%s, userQRInfo:%s", code, utils.Format4Output(userQRInfo, false))
if authBindEx, err = a.UnionFindAuthBind(AuthTypeQRCode, api.DingDingQRCodeAPI.GetAppID(), []string{AuthTypeStaff, AuthTypeQRCode}, userQRInfo.OpenID, userQRInfo.UnionID, userQRInfo); err == nil {
authBindEx.UserHint = &auth2.UserBasic{
Name: userQRInfo.Nickname,
}
}
}
return authBindEx, err
}

View File

@@ -1,47 +0,0 @@
package dingding
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
type StaffAuther struct {
authprovider.DefAuther
}
var (
AutherObjStaff *StaffAuther
)
func init() {
AutherObjStaff = new(StaffAuther)
auth2.RegisterAuther(AuthTypeStaff, AutherObjStaff)
}
func (a *StaffAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("dingding staff VerifySecret code:%s", code)
userID, err := api.DingDingAPI.GetUserID(code)
if err == nil {
userDetail, err2 := api.DingDingAPI.GetUserDetail(userID.UserID)
if err = err2; err == nil {
if authBindEx, err = a.UnionFindAuthBind(AuthTypeStaff, api.DingDingQRCodeAPI.GetAppID(), []string{AuthTypeStaff, AuthTypeQRCode}, userID.UserID, utils.Interface2String(userDetail["unionid"]), userDetail); err == nil {
authBindEx.UserHint = &auth2.UserBasic{
UserID2: userID.UserID,
Mobile: utils.Interface2String(userDetail["mobile"]),
Email: utils.Interface2String(userDetail["email"]),
Name: utils.Interface2String(userDetail["name"]),
}
}
}
}
return authBindEx, err
}
func (a *StaffAuther) GetUserType() (userType int8) {
return model.UserTypeOperator
}

View File

@@ -1,94 +0,0 @@
package mobile
import (
"errors"
"fmt"
"math/rand"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
"git.rosy.net.cn/jx-callback/globals"
aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate"
)
const (
AuthType = auth2.AuthTypeMobile
TestVerifyCode = "123456"
)
var (
warningMap = map[string]int{
"isv.AMOUNT_NOT_ENOUGH": 1,
"isv.ACCOUNT_ABNORMAL": 1,
"isv.OUT_OF_SERVICE": 1,
"isv.DAY_LIMIT_CONTROL": 1,
}
)
var (
ErrVerifyCodeIsWrong = errors.New("验证码错")
)
type Auther struct {
authprovider.DefAuther
}
var (
AutherObj *Auther
)
func init() {
AutherObj = new(Auther)
auth2.RegisterAuther(AuthType, AutherObj)
}
// 特殊接口
func (a *Auther) SendVerifyCode(mobileNumber string) (verifyCode string, err error) {
verifyCode = fmt.Sprintf("%06d", rand.Intn(1000000))
globals.SugarLogger.Debugf("SendVerifyCode code: %v", verifyCode)
// a.GenerateVerifyCode(mobileNumber)
smsClient := aliyunsmsclient.New("http://dysmsapi.aliyuncs.com/")
response, err := smsClient.Execute(globals.AliKey, globals.AliSecret, mobileNumber, globals.SMSSignName, globals.SMSMobileVerifyTemplate, string(utils.MustMarshal(map[string]interface{}{
"code": verifyCode,
})))
a.SaveVerifyCode(mobileNumber, verifyCode)
if err == nil && response.Code == aliyunsmsclient.ResponseCodeOk {
// a.SaveVerifyCode(mobileNumber, verifyCode)
} else {
if err == nil {
if warningMap[response.Code] == 1 {
globals.SugarLogger.Warnf("SendVerifyCode mobileNumber:%s failed with response:%s", mobileNumber, utils.Format4Output(response, false))
} else {
globals.SugarLogger.Infof("SendVerifyCode mobileNumber:%s failed with response:%s", mobileNumber, utils.Format4Output(response, false))
}
err = fmt.Errorf("发送短信出错:%s", response.Message)
} else {
globals.SugarLogger.Warnf("SendVerifyCode mobileNumber:%s failed with error:%v", mobileNumber, err)
}
}
return verifyCode, err
}
func (a *Auther) VerifySecret(mobileNumber, code string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("VerifySecret mobileNumber:%s, code:%s", mobileNumber, code)
def := &authprovider.DefAuther{}
err = ErrVerifyCodeIsWrong
savedVerifyCode := def.LoadVerifyCode(mobileNumber)
if code == auth2.InternalAuthSecret ||
auth2.TestMobileMap[mobileNumber] == 1 && code == TestVerifyCode || (code != "" && savedVerifyCode != "" && code == savedVerifyCode) {
// || a.VerifyCode(mobileNumber, code)
err = nil
}
return nil, err
}
// 此函数为空
func (a *Auther) AddAuthBind(authBindEx *auth2.AuthBindEx, userName string) (err error) {
return err
}
// 此函数为空
func (a *Auther) UnbindAuth(userID, authType, authTypeID, userName string) (err error) {
return err
}

View File

@@ -1,88 +0,0 @@
package password
import (
"crypto/sha1"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
)
const (
AuthType = auth2.AuthTypePassword
)
type Auther struct {
authprovider.DefAuther
}
var (
AutherObj *Auther
)
var (
ErrUserAndPassNotMatch = errors.New("用户名密码不匹配")
)
func init() {
AutherObj = new(Auther)
auth2.RegisterAuther(AuthType, AutherObj)
}
func (a *Auther) VerifySecret(userID, passMD5 string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("localpass VerifySecret userID:%s", userID)
var authBind *model.AuthBind
if authBind, err = dao.GetAuthBind(dao.GetDB(), model.AuthBindTypeAuth, AuthType, userID); err == nil {
if err = a.checkPassword(authBind, passMD5); err == nil {
authBindEx = &auth2.AuthBindEx{
AuthBind: *authBind,
}
}
} else if dao.IsNoRowsError(err) {
err = auth2.ErrUserAuthTypeNotExist
}
return authBindEx, err
}
// 特殊接口
func (a *Auther) ChangePassword(userID, userName, oldPassMD5, newPassMD5 string) (err error) {
var authBind *model.AuthBind
db := dao.GetDB()
salt := utils.GetUUID()
encryptPwd := a.encryptPassword(newPassMD5, salt)
if authBind, err = dao.GetAuthBind(db, model.AuthBindTypeAuth, AuthType, userID); err == nil {
if err = a.checkPassword(authBind, oldPassMD5); err == nil || authBind.AuthSecret == "" { // 如果原密码为空,不判断原密码,代表重置密码
_, err = dao.UpdateEntityLogically(db, authBind, map[string]interface{}{
"AuthSecret": encryptPwd,
"AuthSecret2": salt,
}, userName, nil)
}
} else if dao.IsNoRowsError(err) {
err = a.AddAuthBind(&auth2.AuthBindEx{
AuthBind: model.AuthBind{
UserID: userID,
Type: AuthType,
AuthID: userID,
AuthSecret: encryptPwd,
AuthSecret2: salt,
},
}, userName)
}
return err
}
func (a *Auther) encryptPassword(password, salt string) string {
return fmt.Sprintf("%x", sha1.Sum([]byte(password+salt)))
}
func (a *Auther) checkPassword(authBind *model.AuthBind, passMD5 string) (err error) {
if authBind.AuthSecret != a.encryptPassword(passMD5, authBind.AuthSecret2) {
return ErrUserAndPassNotMatch
}
return nil
}

View File

@@ -1,104 +0,0 @@
package weixin
import (
"errors"
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
const (
AuthTypeWeixin = "wxqrcode" // 微信扫码
AuthTypeMP = "weixinsns" // 公众号
AuthTypeWXNative = "wxnative" // 微信APP
AuthTypeWxApp = "weixinapp" //app微信登录
)
type Auther struct {
authprovider.DefAuther
authType string
}
var (
AutherObjWX *Auther
AutherObjMP *Auther
AutherObjNative *Auther
AutherObjApp *Auther
)
var (
ErrStateIsWrong = errors.New("登录state非法")
)
func init() {
AutherObjWX = &Auther{
authType: AuthTypeWeixin,
}
auth2.RegisterAuther(AuthTypeWeixin, AutherObjWX)
AutherObjMP = &Auther{
authType: AuthTypeMP,
}
auth2.RegisterAuther(AuthTypeMP, AutherObjMP)
AutherObjNative = &Auther{
authType: AuthTypeWXNative,
}
auth2.RegisterAuther(AuthTypeWXNative, AutherObjNative)
AutherObjApp = &Auther{
authType: AuthTypeWxApp,
}
auth2.RegisterAuther(AuthTypeWxApp, AutherObjApp)
}
func (a *Auther) VerifySecret(id, secret string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("weixin VerifySecret id:%s secret:%s", secret, secret)
var openID, accessToken string
if a.authType != AuthTypeWXNative {
state := id
code := secret
if state == "" {
token, err2 := a.getAPI().SNSRetrieveToken(code)
if err = err2; err == nil {
openID = token.OpenID
accessToken = token.AccessToken
}
} else {
err = ErrStateIsWrong
}
} else {
openID = id
accessToken = secret
}
if err == nil {
wxUserinfo, err2 := a.getAPI().SNSGetUserInfo(accessToken, openID)
if err = err2; err == nil {
if authBindEx, err = a.UnionFindAuthBind(a.authType, a.getAPI().GetAppID(), []string{AuthTypeWeixin, AuthTypeMP, AuthTypeMini, AuthTypeWXNative, AuthTypeWxApp}, wxUserinfo.OpenID, wxUserinfo.UnionID, wxUserinfo); err == nil {
authBindEx.UserHint = &auth2.UserBasic{
Name: wxUserinfo.NickName,
Avatar: wxUserinfo.HeadImgURL,
}
}
}
}
return authBindEx, err
}
func (a *Auther) getAPI() *weixinapi.API {
if a.authType == AuthTypeWeixin {
return api.WeixinPageAPI
}
if a.authType == AuthTypeWxApp {
return api.WeixinApp
}
return api.WeixinAPI
}
func (a *Auther) GetUserType() (userType int8) {
return model.UserTypeStoreBoss
}

View File

@@ -1,133 +0,0 @@
package weixin
import (
"errors"
"strings"
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
const (
AuthTypeMini = "weixinmini" // 小程序
)
type MiniAuther struct {
authprovider.DefAuther
}
var (
ErrAuthTypeShouldBeMini = errors.New("当前操作要求是小程序登录方式")
)
var (
AutherObjMini *MiniAuther
)
func init() {
AutherObjMini = new(MiniAuther)
auth2.RegisterAuther(AuthTypeMini, AutherObjMini)
}
func (a *MiniAuther) VerifySecret(dummy, jsCode string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("weixin mini VerifySecret jsCode:%s", jsCode)
appID, jsCode := SplitJsCode(jsCode)
sessionInfo, err := getWxApp(appID).SNSCode2Session(jsCode)
if err == nil {
sessionKey := sessionInfo.SessionKey
sessionInfo.SessionKey = ""
if authBindEx, err = a.UnionFindAuthBind(AuthTypeMini, getWxApp(appID).GetAppID(), []string{AuthTypeWeixin, AuthTypeMP, AuthTypeMini, AuthTypeWXNative}, sessionInfo.OpenID, sessionInfo.UnionID, sessionInfo); err == nil {
authBindEx.UserData = sessionKey
}
}
return authBindEx, err
}
// 特殊接口
func (a *MiniAuther) DecryptData(authInfo *auth2.AuthInfo, jsCode, encryptedData, iv string) (decryptedDataBase64 string, err error) {
globals.SugarLogger.Debugf("weixin mini DecryptData jsCode:%s, encryptedData:%s, iv:%s", jsCode, encryptedData, iv)
var sessionKey string
appID, jsCode := SplitJsCode(jsCode)
if jsCode != "" {
sessionInfo, err := getWxApp(appID).SNSCode2Session(jsCode)
if err == nil {
// if authBindEx, err := a.UnionFindAuthBind(AuthTypeMini, getWxApp(appID).GetAppID(), []string{AuthTypeMini}, sessionInfo.OpenID, "", nil); err == nil {
// if authBindEx.UserID != authInfo.GetID() {
// return "", fmt.Errorf("jsCode与token不匹配")
// }
// } else {
// return "", err
// }
sessionKey = sessionInfo.SessionKey
} else {
return "", err
}
} else {
if authInfo.AuthBindInfo.Type != AuthTypeMini {
return "", ErrAuthTypeShouldBeMini
}
sessionKey = authInfo.AuthBindInfo.UserData.(string)
}
// decryptedData, err := ProxySNSDecodeMiniProgramData(encryptedData, sessionKey, iv)
decryptedData, err := weixinapi.SNSDecodeMiniProgramData(encryptedData, sessionKey, iv)
if err != nil {
return "", err
}
// authInfo.AuthBindInfo.UserData = sessionKey
return string(decryptedData), nil
}
func (a *MiniAuther) GetUserType() (userType int8) {
return model.UserTypeStoreBoss
}
func getWxApp(appID string) (miniApi *weixinapi.API) {
miniApi = api.WeixinMiniAPI
return miniApi
}
func SplitJsCode(jsCode string) (appID, realJsCode string) {
list := strings.Split(jsCode, ",")
if len(list) == 2 {
appID = list[0]
realJsCode = list[1]
} else if len(list) == 1 {
realJsCode = jsCode
} else {
globals.SugarLogger.Warnf("SplitJsCode abnormal jsCode:%s", jsCode)
}
return appID, realJsCode
}
func ComposeJsCode(appID, jsCode string) (composedCode string) {
composedCode = strings.Join([]string{
appID,
jsCode,
}, ",")
return composedCode
}
// func ProxySNSCode2Session(jsCode string) (sessionInfo *weixinapi.SessionInfo, err error) {
// miniApi := api.WeixinMiniAPI
// list := strings.Split(jsCode, ",")
// if len(list) >= 2 && len(list[0]) == len("wx4b5930c13f8b1170") {
// if list[0] == api.WeixinMiniAppID2 {
// miniApi = api.WeixinMiniAPI2
// }
// miniApi = getWxApp(list[0])
// jsCode = strings.Join(list[1:], ",")
// }
// sessionInfo, err = miniApi.SNSCode2Session(jsCode)
// return sessionInfo, err
// }
// func ProxySNSDecodeMiniProgramData(encryptedData, sessionKey, iv string) (decryptedData []byte, err error) {
// globals.SugarLogger.Debugf("ProxySNSDecodeMiniProgramData, encryptedData:%s, sessionKey:%s, iv:%s", encryptedData, sessionKey, iv)
// decryptedData, err = api.WeixinMiniAPI.SNSDecodeMiniProgramData(encryptedData, sessionKey, iv)
// return decryptedData, err
// }

View File

@@ -56,7 +56,6 @@ func InitServiceInfo(version string, buildTime time.Time, gitCommit string) {
"orderTypeName": model.OrderTypeName,
"taskStatusName": tasksch.TaskStatusName,
"storeMsgSendStatusName": model.StoreMsgSendStatusName,
"shopChineseNames": model.ShopChineseNames,
"printerVendorInfo": model.PrinterVendorInfo,
"purchaseVendorInfo": model.PurchaseVendorInfo,
"afsReasonTypeName": model.AfsReasonTypeName,

File diff suppressed because it is too large Load Diff

View File

@@ -1,286 +0,0 @@
package cms
import (
"fmt"
"git.rosy.net.cn/jx-callback/business/jxstore/event"
"strings"
"time"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/financial"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
)
func CreateOrder(ctx *jxcontext.Context, type1, orderType int, way string, price int, lng, lat float64) (orderID, errCode string, err error) {
var (
db = dao.GetDB()
order *model.Order
DayTimeBegin, DayTimeEnd = jxutils.GetDayTime()
)
if err = auth2.CheckWeixinminiAuthBind(ctx.GetUserID()); err != nil {
return "", errCode, err
}
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
if type1 == model.OrderTypeCash {
//如果用户没有对应账单信息就给他生成一条
userBill, err := dao.GetUserBill(db, ctx.GetUserID(), "")
if userBill == nil {
err = financial.AddUserBill(txDB, jxutils.GenBillID(), ctx.GetUserID())
}
if userBill.AccountBalance < price {
return "", model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足!")
}
//用户一天只能提现一次
billExpends, err := dao.GetBillExpend(db, ctx.GetUserID(), model.BillTypeCash, DayTimeBegin, DayTimeEnd)
if err != nil {
return "", "", err
}
if len(billExpends) > 0 {
return "", "", fmt.Errorf("抱歉,一天只能提现一次!")
}
}
address, dCode, cCode, err := getAddressInfoFromCoord(db, lng, lat)
order = &model.Order{
OrderID: utils.Int64ToStr(jxutils.GenOrderNo()),
UserID: ctx.GetUserID(),
Type: type1,
OrderType: orderType,
Way: way,
Status: model.OrderStatusWait4Pay,
PayPrice: price,
Lng: lng,
Lat: lat,
Address: address,
DistrictCode: dCode,
CityCode: cCode,
}
dao.WrapAddIDCULEntity(order, ctx.GetUserName())
if err = dao.CreateEntityTx(txDB, order); err != nil {
dao.Rollback(db, txDB)
}
dao.Commit(db, txDB)
return order.OrderID, errCode, err
}
func Pay(ctx *jxcontext.Context, orderID string, payType int, vendorPayType string) (result *financial.WxPayParam, err error) {
var (
db = dao.GetDB()
order = &model.Order{
OrderID: orderID,
}
payHandler = &financial.PayHandler{
PayType: payType,
Ctx: ctx,
VendorPayType: vendorPayType,
}
)
globals.SugarLogger.Debugf("pay begin……")
err = dao.GetEntity(db, order, "OrderID")
if order.ID == 0 {
return result, fmt.Errorf("未找到此订单!")
}
payHandler.Order = order
//如果用户没有对应账单信息就给他生成一条
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
userBill, err := dao.GetUserBill(db, order.UserID, "")
if userBill == nil {
err = financial.AddUserBill(txDB, jxutils.GenBillID(), order.UserID)
}
err = payHandler.CreatePay(txDB)
dao.Commit(db, txDB)
globals.SugarLogger.Debugf("result : %v", utils.Format4Output(payHandler.WxPayParam, false))
return payHandler.WxPayParam, err
}
func Cash(ctx *jxcontext.Context, orderID string, payType int, vendorPayType string) (errCode string, err error) {
var (
db = dao.GetDB()
order = &model.Order{
OrderID: orderID,
}
payHandler = &financial.PayHandler{
PayType: payType,
Ctx: ctx,
VendorPayType: vendorPayType,
}
)
err = dao.GetEntity(db, order, "OrderID")
if err != nil {
return errCode, err
}
if order.ID == 0 {
return errCode, fmt.Errorf("未找到此订单!")
}
payHandler.Order = order
err = payHandler.CreateRefund()
return errCode, err
}
func GetOrders(ctx *jxcontext.Context, orderID, userID string, orderType int, cityCodes []int, fromTime, toTime, keyword string, offset, pageSize int) (pageInfo *model.PagedInfo, err error) {
return dao.GetOrders(dao.GetDB(), orderID, userID, orderType, cityCodes, utils.Str2Time(fromTime), utils.Str2Time(toTime), keyword, offset, pageSize)
}
func FinishedCashOrders(ctx *jxcontext.Context, orderIDs []string) (err error) {
var (
db = dao.GetDB()
)
for _, orderID := range orderIDs {
order := &model.Order{
OrderID: orderID,
}
dao.GetEntity(db, order, "OrderID")
if order.ID != 0 && order.Status == model.OrderStatusWait4Pay {
order.PayFinishedAt = time.Now()
order.Comment = "手动转账"
order.Status = model.OrderStatusFinished
dao.UpdateEntity(db, order, "PayFinishedAt", "Comment", "Status")
}
}
return err
}
func GetPayStatistics(ctx *jxcontext.Context, userID string, pop int, cityCodes []int, mobile, fromTime, toTime string, consumeTypes []int) (getPayStatisticsResult *dao.GetPayStatisticsResult, err error) {
var (
db = dao.GetDB()
)
return dao.GetPayStatistics(db, userID, pop, cityCodes, mobile, utils.Str2Time(fromTime), utils.Str2Time(toTime), consumeTypes)
}
func GetManageStatisticsImg(ctx *jxcontext.Context, cityCodes []int, fromTime, toTime string, jobIDs []int) (getManageStatistics []*dao.GetManageStatisticsResult, err error) {
var (
db = dao.GetDB()
fromTimeT = utils.Str2Time(fromTime)
toTimeT = utils.Str2Time(toTime)
)
for i := 1; i < utils.Float64TwoInt(toTimeT.Sub(fromTimeT).Hours()/24)+1; i++ {
getManageStatisticsResult, _ := dao.GetManageStatistics(db, cityCodes, fromTimeT.AddDate(0, 0, i-1), jobIDs)
getManageStatistics = append(getManageStatistics, getManageStatisticsResult)
}
return getManageStatistics, err
}
func GetManageStatisticsJob(ctx *jxcontext.Context, cityCodes []int, fromTime, toTime string, jobIDs []int, offset, pageSize int) (paged *model.PagedInfo, err error) {
var (
db = dao.GetDB()
)
return dao.GetManageStatisticsJob(db, cityCodes, utils.Str2Time(fromTime), utils.Str2Time(toTime), jobIDs, offset, pageSize)
}
func NewUnionOrder(unionOrder *model.UnionOrder, orderStatus *model.UnionOrderStatus) (err error) {
var (
db = dao.GetDB()
userID string
)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
userBinds, err := dao.GetUserUnionBind(db, "", unionOrder.VendorID, unionOrder.PID)
if err != nil {
dao.Rollback(db, txDB)
return err
}
if len(userBinds) == 0 {
userID = unionOrder.PID
} else {
userID = userBinds[0].UserID
}
unionOrder.UserID = userID
dao.WrapAddIDCULEntity(unionOrder, jxcontext.AdminCtx.GetUserName())
if err = dao.CreateEntityTx(txDB, unionOrder); err != nil {
dao.Rollback(db, txDB)
return err
}
dao.WrapAddIDCULEntity(orderStatus, jxcontext.AdminCtx.GetUserName())
if err = dao.CreateEntityTx(txDB, orderStatus); err != nil {
dao.Rollback(db, txDB)
return err
}
dao.Commit(db, txDB)
//发消息
if err == nil {
orderMessage(unionOrder)
}
return err
}
func ChangeUnionOrder(unionOrder *model.UnionOrder, orderStatus *model.UnionOrderStatus) (err error) {
var (
db = dao.GetDB()
)
globals.SugarLogger.Debugf("ChangeUnionOrder1, unionorder: %v", utils.Format4Output(unionOrder, true))
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
unionOrder.Status = orderStatus.Status
globals.SugarLogger.Debugf("ChangeUnionOrder2, unionorder: %v", utils.Format4Output(unionOrder, true))
if _, err = dao.UpdateEntityTx(txDB, unionOrder, "Status"); err != nil {
dao.Rollback(db, txDB)
fmt.Println("err1", err)
return err
}
dao.WrapAddIDCULEntity(orderStatus, jxcontext.AdminCtx.GetUserName())
if err = dao.CreateEntityTx(txDB, orderStatus); err != nil {
dao.Rollback(db, txDB)
fmt.Println("err2", err)
return err
}
dao.Commit(db, txDB)
//发消息
if err == nil {
orderMessage(unionOrder)
}
return err
}
func orderMessage(unionOrder *model.UnionOrder) {
content := new(strings.Builder)
content.WriteString("您有[")
content.WriteString(model.VendorChineseNames[unionOrder.VendorID])
content.WriteString("]平台的推广订单:")
content.WriteString(unionOrder.VendorOrderID)
content.WriteString("。")
content.WriteString(model.UnionOrderStatusName[unionOrder.Status])
content.WriteString("。预计返佣:")
content.WriteString(jxutils.IntPrice2StandardString(int64(unionOrder.PromotionAmount)))
content.WriteString("元。")
event.SendSysMessageSimple(content.String(), unionOrder.UserID)
}
func GetMyUnionOrders(ctx *jxcontext.Context, statuss []int, vendorID, offset, pageSize int) (page *model.PagedInfo, err error) {
return dao.GetMyUnionOrders(dao.GetDB(), ctx.GetUserID(), statuss, vendorID, offset, pageSize)
}
func GetUnionOrders(ctx *jxcontext.Context, vendorIDs, statuss []int, beginTime, endTime, keyword string, offset, pageSize int) (page *model.PagedInfo, err error) {
return dao.GetUnionOrdersPage(dao.GetDB(), vendorIDs, statuss, utils.Str2Time(beginTime), utils.Str2Time(endTime), keyword, offset, pageSize)
}

View File

@@ -6,23 +6,18 @@ import (
"sync"
"time"
"git.rosy.net.cn/jx-callback/business/jxutils/smsmsg"
"git.rosy.net.cn/jx-callback/business/jxstore/event"
"git.rosy.net.cn/jx-callback/business/jxstore/financial"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jsonerr"
"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/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
var (
@@ -254,28 +249,6 @@ func DisableUser(ctx *jxcontext.Context, userID string) (err error) {
return err
}
func OnDingDingMsg(msg map[string]interface{}) (callbackResponse *dingdingapi.CallbackResponse) {
eventType := utils.Interface2String(msg[dingdingapi.KeyEventType])
if eventType == dingdingapi.CBTagUserLeaveOrg {
var (
authBind *model.AuthBind
err error
)
db := dao.GetDB()
for _, userID := range msg[dingdingapi.KeyUserID].([]interface{}) {
userIDStr := utils.Interface2String(userID)
globals.SugarLogger.Debugf("OnDingDingMsg dingding user:%s left company", userIDStr)
if authBind, err = dao.GetAuthBind(db, model.AuthBindTypeAuth, dingding.AuthTypeStaff, userIDStr); err == nil { // 直接找到了
globals.SugarLogger.Debugf("OnDingDingMsg dingding user:%s, userID:%s left company", userIDStr, authBind.UserID)
if err = DisableUser(jxcontext.AdminCtx, authBind.UserID); err != nil {
globals.SugarLogger.Errorf("OnDingDingMsg failed with error:%v", err)
}
}
}
}
return api.DingDingAPI.Err2CallbackResponse(nil)
}
func GetUsers(ctx *jxcontext.Context, keyword string, userID string, pop int, mobile string, fromTime, toTime string, timeType int, cityCodes, consumeTypes []int, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
return dao.GetUsers2(dao.GetDB(), keyword, userID, pop, mobile, utils.Str2Time(fromTime), utils.Str2Time(toTime), timeType, cityCodes, consumeTypes, offset, pageSize)
}
@@ -298,29 +271,6 @@ func checkUserType(userID string, userType int8) (err error) {
return nil
}
func getAddressInfoFromCoord(db *dao.DaoDB, lng, lat float64) (formattedAddress string, districtCode, cityCode int, err error) {
regeoInfo, err := api.AutonaviAPI.GeoCodeRegeoSingle(lng, lat, 0, false, nil, 0, 0)
if err == nil {
formattedAddress = regeoInfo.FormattedAddress
districtCode = int(utils.Str2Int64WithDefault(regeoInfo.AddressComponent.Adcode, 0))
if districtCode == 0 {
err = fmt.Errorf("坐标lng:%f,lat:%f找不到位置信息", lng, lat)
} else if districtInfo, err2 := dao.GetPlaceByCode(db, districtCode); err2 == nil {
cityCode = districtInfo.ParentCode
}
}
return formattedAddress, districtCode, cityCode, err
}
func AddMyDeliveryAddress(ctx *jxcontext.Context, address *model.UserDeliveryAddress) (outAddress *dao.UserDeliveryAddressEx, err error) {
globals.SugarLogger.Debugf("AddMyDeliveryAddress address:%s", utils.Format4Output(address, true))
_, address.UserID = ctx.GetMobileAndUserID()
out, err := AddUserDeliveryAddress(ctx, address)
list, _, err := dao.QueryUserDeliveryAddress(dao.GetDB(), int64(out.ID), nil, 0, 0, -1)
globals.SugarLogger.Debugf("AddMyDeliveryAddress2 address:%s, err:%v", utils.Format4Output(address, true), err)
return list[0], err
}
func DeleteUserDeliveryAddress(ctx *jxcontext.Context, userID string, addressID int) (err error) {
num, err := dao.DeleteEntityLogically(dao.GetDB(), &model.UserDeliveryAddress{}, nil, ctx.GetUserName(), map[string]interface{}{
model.FieldID: addressID,
@@ -339,56 +289,6 @@ func DeleteMyDeliveryAddress(ctx *jxcontext.Context, addressID int) (err error)
return DeleteUserDeliveryAddress(ctx, userID, addressID)
}
func UpdateUserDeliveryAddress(ctx *jxcontext.Context, userID string, addressID int, payload map[string]interface{}) (err error) {
if userID == "" {
return fmt.Errorf("操作用户配送地址时必须指定UserID")
}
address := &model.UserDeliveryAddress{
UserID: userID,
}
address.ID = addressID
db := dao.GetDB()
if err = dao.GetEntity(db, address, model.FieldID, "UserID"); err == nil {
var outAddress *model.UserDeliveryAddress
valid := dao.StrictMakeMapByStructObject2(payload, address, &outAddress, ctx.GetUserName())
delete(valid, "autoAddress")
delete(valid, "districtCode")
delete(valid, "cityCode")
if len(valid) > 0 {
if valid["lng"] != nil || valid["lat"] != nil {
valid["autoAddress"], valid["districtCode"], valid["cityCode"], err = getAddressInfoFromCoord(db, outAddress.Lng, outAddress.Lat)
if err != nil {
return err
}
}
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
if utils.ForceInterface2Int64(valid["isDefault"]) == 1 {
if err = dao.ClearUserDeliveryAddressDefault(db, userID, 0); err != nil {
dao.Rollback(db, txDB)
return err
}
}
if _, err = dao.UpdateEntityLogically(db, address, valid, ctx.GetUserName(), nil); err == nil {
dao.Commit(db, txDB)
} else {
dao.Rollback(db, txDB)
}
}
}
return err
}
func UpdateMyDeliveryAddress(ctx *jxcontext.Context, addressID int, payload map[string]interface{}) (err error) {
_, userID := ctx.GetMobileAndUserID()
return UpdateUserDeliveryAddress(ctx, userID, addressID, payload)
}
func QueryUserDeliveryAddress(ctx *jxcontext.Context, userIDs []string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
addressList, totalCount, err := dao.QueryUserDeliveryAddress(dao.GetDB(), 0, userIDs, 0, offset, pageSize)
if err == nil {
@@ -406,42 +306,6 @@ func QueryMyDeliveryAddress(ctx *jxcontext.Context, addType int) (addressList []
return addressList, err
}
func AddUserDeliveryAddress(ctx *jxcontext.Context, address *model.UserDeliveryAddress) (outAddress *model.UserDeliveryAddress, err error) {
globals.SugarLogger.Debugf("AddUserDeliveryAddress1 address:%s", utils.Format4Output(address, true))
if address.UserID == "" {
return nil, fmt.Errorf("操作用户配送地址时必须指定UserID")
}
db := dao.GetDB()
lng := address.Lng
lat := address.Lat
address.AutoAddress, address.DistrictCode, address.CityCode, err = getAddressInfoFromCoord(db, lng, lat)
if err == nil {
globals.SugarLogger.Debugf("AddUserDeliveryAddress2 address:%s", utils.Format4Output(address, true))
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
dao.WrapAddIDCULDEntity(address, ctx.GetUserName())
if address.IsDefault == 1 {
if err = dao.ClearUserDeliveryAddressDefault(db, address.UserID, 0); err != nil {
dao.Rollback(db, txDB)
return nil, err
}
}
if err = dao.CreateEntity(db, address); err == nil {
dao.Commit(db, txDB)
outAddress = address
} else {
dao.Rollback(db, txDB)
}
}
globals.SugarLogger.Debugf("AddUserDeliveryAddress3 address:%s", utils.Format4Output(address, true))
return outAddress, err
}
func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems []*model.UserCartItem) (err error) {
if userID == "" || storeID == 0 {
return fmt.Errorf("用户与门店必须要指定")
@@ -624,17 +488,17 @@ func UpdateUser(ctx *jxcontext.Context, payload map[string]interface{}) (err err
UserID: userID,
}
dao.GetEntity(db, user, "UserID")
if payload["lng"] != nil && payload["lat"] != nil {
if address, districtCode, cityCode, err := getAddressInfoFromCoord(db, utils.MustInterface2Float64(payload["lng"]), utils.MustInterface2Float64(payload["lat"])); err == nil {
delete(payload, "lng")
delete(payload, "lat")
payload["address"] = address
payload["districtCode"] = districtCode
payload["cityCode"] = cityCode
} else {
return err
}
}
//if payload["lng"] != nil && payload["lat"] != nil {
// if address, districtCode, cityCode, err := getAddressInfoFromCoord(db, utils.MustInterface2Float64(payload["lng"]), utils.MustInterface2Float64(payload["lat"])); err == nil {
// delete(payload, "lng")
// delete(payload, "lat")
// payload["address"] = address
// payload["districtCode"] = districtCode
// payload["cityCode"] = cityCode
// } else {
// return err
// }
//}
//暂时用这个字段作为更新他的推广人
if payload["popCode"] != nil {
if user, err := dao.GetUserByID(db, "pop_code", payload["popCode"].(string)); err == nil {
@@ -673,26 +537,26 @@ func UpdateUser(ctx *jxcontext.Context, payload map[string]interface{}) (err err
user2, err2 := dao.GetUserByID(db, "user_id", payload["popUser"].(string))
err = err2
do := func(user *model.User, flag bool) (err error) {
if user.PopCount%4 == 0 && user.PopFlag == model.NO {
if _, err = InvestMember(ctx, 1, user.UserID, true); err == nil {
//发短信,公众号消息通知
smsmsg.SendSMSMsg([]string{*user.Mobile}, globals.SMSSignName, globals.SMSPopSuccessTemplate, nil)
// weixinmsg.SendMsgToUser(userID, templateID, data)
event.SendSysMessageSimple("您好您已成功邀请4人加入我们成功免费获得1个月会员", user.UserID)
}
user.PopFlag = model.YES
dao.UpdateEntity(db, user, "PopFlag")
if flag {
if users, _, err := dao.GetUsers(db, 0, "", user.UserID, nil, nil, nil, 0, 999); err == nil {
for _, v := range users {
v.PopedFlag = model.YES
dao.UpdateEntity(db, v, "PopedFlag")
}
}
_, err = event.CreateMessageGroup(ctx, user.UserID, "", "", 5, 100)
}
}
//if user.PopCount%4 == 0 && user.PopFlag == model.NO {
// if _, err = InvestMember(ctx, 1, user.UserID, true); err == nil {
// //发短信,公众号消息通知
// smsmsg.SendSMSMsg([]string{*user.Mobile}, globals.SMSSignName, globals.SMSPopSuccessTemplate, nil)
// // weixinmsg.SendMsgToUser(userID, templateID, data)
// event.SendSysMessageSimple("您好您已成功邀请4人加入我们成功免费获得1个月会员", user.UserID)
// }
// user.PopFlag = model.YES
// dao.UpdateEntity(db, user, "PopFlag")
//
// if flag {
// if users, _, err := dao.GetUsers(db, 0, "", user.UserID, nil, nil, nil, 0, 999); err == nil {
// for _, v := range users {
// v.PopedFlag = model.YES
// dao.UpdateEntity(db, v, "PopedFlag")
// }
// }
// _, err = event.CreateMessageGroup(ctx, user.UserID, "", "", 5, 100)
// }
//}
return err
}
if user2 != nil {

View File

@@ -1,362 +0,0 @@
package financial
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha256"
"encoding/json"
"fmt"
"github.com/astaxie/beego/client/orm"
"sort"
"strings"
"time"
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
"git.rosy.net.cn/baseapi/platformapi/wxpayapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
const (
sigKey = "sign"
sigTypeMd5 = "MD5"
sigTypeSha256 = "HMAC-SHA256"
)
var (
payMap = map[string]*wxpayapi.API{
"weixinapp": api.WxpayAPI,
"weixinmini": api.WxpayAPI2,
}
)
func (p *PayHandler) CreatePay(txDB orm.TxOrmer) (err error) {
switch p.PayType {
case model.PayTypeTL:
param := &tonglianpayapi.CreateUnitorderOrderParam{
Trxamt: int(p.Order.PayPrice),
NotifyUrl: globals.TLPayNotifyURL,
Reqsn: p.Order.OrderID,
PayType: p.VendorPayType,
}
if p.VendorPayType == tonglianpayapi.PayTypeWxXcx {
if authInfo, err := p.Ctx.GetV2AuthInfo(); err == nil && authInfo.GetAuthType() == weixin.AuthTypeWxApp {
param.Acct = authInfo.GetAuthID()
}
}
result, err := api.TLpayAPI.CreateUnitorderOrder(param)
if err == nil {
var result2 tonglianpayapi.PayInfo
json.Unmarshal([]byte(result.PayInfo), &result2)
p.Order.PrepayID = result2.Package[strings.LastIndex(result2.Package, "=")+1 : len(result2.Package)]
p.Order.TransactionID = result.TrxID
_, err = dao.UpdateEntityTx(txDB, p.Order, "PrepayID", "TransactionID")
}
case model.PayTypeWX:
param := &wxpayapi.CreateOrderParam{
OutTradeNo: p.Order.OrderID,
Body: "冲天猴儿App账户充值",
NotifyURL: globals.WxpayNotifyURL,
SpbillCreateIP: p.Ctx.GetRealRemoteIP(),
TradeType: p.VendorPayType,
TotalFee: p.Order.PayPrice,
TimeStart: wxpayapi.Time2PayTime(time.Now()),
// ProfitSharing: wxpayapi.OptYes,
}
authBinds, err := dao.GetUserBindAuthInfo(dao.GetDB(), p.Ctx.GetUserID(), model.AuthBindTypeAuth, []string{p.Order.Way}, "", "", "")
if err != nil {
return err
}
if len(authBinds) == 0 {
return fmt.Errorf("未绑定微信认证方式!")
}
param.OpenID = authBinds[0].AuthID
result, err2 := payMap[p.Order.Way].CreateUnifiedOrder(param)
if err2 == nil {
param2 := make(map[string]interface{})
param2["prepayid"] = result.PrepayID
param2["noncestr"] = utils.GetUUID()
param2["timestamp"] = time.Now().Unix()
param2["package"] = "Sign=WXPay"
param2["partnerid"] = result.MchID
param2["appid"] = result.AppID
sign := signParam(sigTypeMd5, param2)
wxPay := &WxPayParam{
Prepayid: param2["prepayid"].(string),
Noncestr: param2["noncestr"].(string),
Timestamp: utils.Int64ToStr(utils.MustInterface2Int64(param2["timestamp"])),
Package: param2["package"].(string),
Partnerid: param2["partnerid"].(string),
Appid: param2["appid"].(string),
Sign: sign,
}
p.WxPayParam = wxPay
p.Order.PrepayID = result.PrepayID
p.Order.Comment = result.CodeURL
_, err = dao.UpdateEntityTx(txDB, p.Order, "PrepayID", "Comment")
} else {
return err2
}
default:
err = fmt.Errorf("支付方式:%d当前不支持", p.PayType)
}
return err
}
func signParam(signType string, params map[string]interface{}) (sig string) {
var valueList []string
for k, v := range params {
if k != sigKey {
if str := fmt.Sprint(v); str != "" {
valueList = append(valueList, fmt.Sprintf("%s=%s", k, str))
}
}
}
sort.Sort(sort.StringSlice(valueList))
valueList = append(valueList, fmt.Sprintf("key=%s", globals.WxpayAppKey))
sig = strings.Join(valueList, "&")
var binSig []byte
if signType == sigTypeSha256 {
mac := hmac.New(sha256.New, []byte(globals.WxpayAppKey))
mac.Write([]byte(sig))
binSig = mac.Sum(nil)
} else {
binSig2 := md5.Sum([]byte(sig))
binSig = binSig2[:]
}
sig = fmt.Sprintf("%X", binSig)
// baseapi.SugarLogger.Debug(sig)
return sig
}
func (p *PayHandler) CreateRefund() (err error) {
switch p.PayType {
case model.PayTypeTL:
case model.PayTypeWX:
//企业付款(提现)
if p.VendorPayType == model.VendorPayTypeCompanyPay {
// param := &wxpayapi.TransfersParam{
// PartnerTradeNo: p.Order.OrderID,
// CheckName: wxpayapi.CheckName,
// Desc: "冲天猴儿app提现到账",
// SpbillCreateIP: p.Ctx.GetRealRemoteIP(),
// }
// //1元以下免费以上收取对应城市手续费
// place, err := dao.GetPlaceByCode(dao.GetDB(), p.Order.CityCode)
// if err != nil || place == nil {
// return fmt.Errorf("未找到该城市code%v", p.Order.CityCode)
// }
// if p.Order.PayPrice < 100 {
// param.Amount = p.Order.PayPrice
// } else {
// param.Amount = p.Order.PayPrice * place.DividePercentage / 100 //手续费
// }
// if authInfo, err := p.Ctx.GetV2AuthInfo(); err == nil {
// param.OpenID = authInfo.GetAuthID()
// }
// globals.SugarLogger.Debugf("CreateRefund wx param: %v", utils.Format4Output(param, false))
// result, err2 := payMap[p.Order.Way].Transfers(param)
// if err2 == nil {
// p.Order.PayFinishedAt = utils.Str2Time(result.PaymentTime)
// p.Order.Comment = result.DeviceInfo
// p.Order.OriginalData = utils.Format4Output(result, true)
// if result.ReturnMsg == "" {
// p.Order.Status = model.OrderStatusFinished
// } else {
// p.Order.Status = model.OrderStatusCanceled
// }
// dao.UpdateEntity(dao.GetDB(), p.Order)
// if result.ReturnMsg == "" {
// err = OnCashFinished(p.Order)
// }
// } else {
// return err2
// }
err = OnCashFinished(p.Order)
} else if p.VendorPayType == model.VendorPayTypeTransferAccount {
p.Order.PayFinishedAt = time.Now()
p.Order.Comment = "手动转账"
p.Order.Status = model.OrderStatusFinished
if _, err := dao.UpdateEntity(dao.GetDB(), p.Order); err == nil {
err = OnCashFinished(p.Order)
}
}
}
return err
}
func OnTLPayCallback(call *tonglianpayapi.CallBackResult) (err error) {
globals.SugarLogger.Debugf("OnTLPayCallback msg:%s", utils.Format4Output(call, true))
switch call.TrxCode {
case tonglianpayapi.MsgTypePay:
err = onTLpayFinished(call)
case tonglianpayapi.MsgTypeRefund:
err = onTLpayRefund(call)
}
return err
}
func onTLpayFinished(call *tonglianpayapi.CallBackResult) (err error) {
order := &model.Order{
OrderID: call.CusorderID,
}
db := dao.GetDB()
if err = dao.GetEntity(db, order, "OrderID"); err == nil {
if order.Status != model.OrderStatusWait4Pay {
globals.SugarLogger.Debugf("already pay msg:%s, err:%v", utils.Format4Output(call, true), err)
return err
}
loc, _ := time.LoadLocation("Local")
t1, _ := time.ParseInLocation("20060102150405", call.PayTime, loc)
order.PayFinishedAt = t1
// order.TransactionID = call.ChnlTrxID
order.OriginalData = utils.Format4Output(call, true)
if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
order.Status = model.OrderStatusFinished
} else {
order.Status = model.OrderStatusCanceled
}
dao.UpdateEntity(db, order)
if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
err = OnPayFinished(order)
}
} else {
globals.SugarLogger.Debugf("onTLpayFinished msg:%s, err:%v", utils.Format4Output(call, true), err)
}
return err
}
func onTLpayRefund(call *tonglianpayapi.CallBackResult) (err error) {
// orderPayRefund := &model.OrderPayRefund{
// RefundID: call.CusorderID,
// }
// db := dao.GetDB()
// if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil {
// if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
// orderPayRefund.Status = model.RefundStatusYes
// } else {
// orderPayRefund.Status = model.RefundStatusFailed
// }
// orderPayRefund.OriginalData = utils.Format4Output(call, true)
// dao.UpdateEntity(db, orderPayRefund)
// } else if dao.IsNoRowsError(err) {
// globals.SugarLogger.Warnf("收到异常的退款事件, call:%s", utils.Format4Output(call, true))
// }
// orderPay := &model.OrderPay{
// VendorOrderID: orderPayRefund.VendorOrderID,
// VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(orderPayRefund.VendorOrderID),
// PayType: model.PayTypeWX,
// Status: model.PayStatusYes,
// }
// orderPay.DeletedAt = utils.DefaultTimeValue
// if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "Status", "DeletedAt"); err == nil {
// orderPay.Status = model.PayStatusRefund
// dao.UpdateEntity(db, orderPay)
// }
return err
}
// func RefundOrderByTL(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string, refundFee int, refundDesc string) (orderPayRefund *model.OrderPayRefund, err error) {
// result, err := api.TLpayAPI.PayRefund(&tonglianpayapi.PayRefundParam{
// Trxamt: refundFee,
// Reqsn: utils.GetUUID(),
// Remark: refundDesc,
// OldTrxID: orderPay.TransactionID,
// })
// if err == nil {
// orderPayRefund = &model.OrderPayRefund{
// RefundID: refundID,
// VendorRefundID: result.TrxID,
// VendorOrderID: orderPay.VendorOrderID,
// VendorID: orderPay.VendorID,
// Status: model.RefundStatusNo,
// TransactionID: orderPay.TransactionID,
// RefundFee: refundFee,
// RefundCreatedAt: time.Now(),
// }
// dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
// db := dao.GetDB()
// if result.TrxStatus == tonglianpayapi.TrxStatusSuccess {
// orderPayRefund.Status = model.RefundStatusYes
// } else {
// orderPayRefund.Status = model.RefundStatusFailed
// }
// orderPayRefund.OriginalData = utils.Format4Output(result, true)
// dao.CreateEntity(db, orderPayRefund)
// orderPay.Status = model.PayStatusRefund
// dao.UpdateEntity(db, orderPay)
// }
// return orderPayRefund, err
// }
func OnWxPayCallback(msg *wxpayapi.CallbackMsg) (err error) {
globals.SugarLogger.Debugf("OnWxPayCallback msg:%s", utils.Format4Output(msg, true))
switch msg.MsgType {
case wxpayapi.MsgTypePay:
err = onWxpayFinished(msg.Data.(*wxpayapi.PayResultMsg))
case wxpayapi.MsgTypeRefund:
// err = onWxpayRefund(msg.Data.(*wxpayapi.RefundResultMsg))
}
return err
}
func onWxpayFinished(msg *wxpayapi.PayResultMsg) (err error) {
order := &model.Order{
OrderID: msg.OutTradeNo,
}
db := dao.GetDB()
if err = dao.GetEntity(db, order, "OrderID"); err == nil {
order.PayFinishedAt = wxpayapi.PayTime2Time(msg.TimeEnd)
order.TransactionID = msg.TransactionID
order.OriginalData = utils.Format4Output(msg, true)
if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
order.Status = model.OrderStatusFinished
} else {
order.Status = model.OrderStatusCanceled
}
dao.UpdateEntity(db, order)
if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
err = OnPayFinished(order)
}
} else {
globals.SugarLogger.Debugf("onWxpayFinished msg:%s, err:%v", utils.Format4Output(msg, true), err)
}
return err
}
// func onWxpayRefund(msg *wxpayapi.RefundResultMsg) (err error) {
// orderPayRefund := &model.OrderPayRefund{
// RefundID: msg.ReqInfoObj.OutRefundNo,
// }
// db := dao.GetDB()
// if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil {
// if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
// orderPayRefund.Status = model.RefundStatusYes
// } else {
// orderPayRefund.Status = model.RefundStatusFailed
// }
// orderPayRefund.OriginalData = utils.Format4Output(msg, true)
// dao.UpdateEntity(db, orderPayRefund)
// } else if dao.IsNoRowsError(err) {
// globals.SugarLogger.Warnf("收到异常的退款事件, msg:%s", utils.Format4Output(msg, true))
// }
// orderPay := &model.OrderPay{
// VendorOrderID: orderPayRefund.VendorOrderID,
// VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(orderPayRefund.VendorOrderID),
// PayType: model.PayTypeWX,
// Status: model.PayStatusYes,
// }
// orderPay.DeletedAt = utils.DefaultTimeValue
// if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "Status", "DeletedAt"); err == nil {
// orderPay.Status = model.PayStatusRefund
// dao.UpdateEntity(db, orderPay)
// }
// return err
// }

View File

@@ -1,27 +0,0 @@
package jds
import (
"git.rosy.net.cn/baseapi/platformapi/jdunionapi"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals/api"
)
type UnionHandler struct {
}
var (
unionHandler *UnionHandler
)
func init() {
partner.UnionHandlerMap[model.VendorIDJDShop] = unionHandler
}
func getAPI() (apiobj *jdunionapi.API) {
if configs, err := dao.QueryConfigs(dao.GetDB(), "jdunionCookie", model.ConfigTypeCookie, ""); err == nil {
api.JdUnionAPI.SetCookieWithStr(configs[0].Value)
}
return api.JdUnionAPI
}

View File

@@ -1,48 +0,0 @@
package jds
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
)
func (s *UnionHandler) ShareUnionLink(ctx *jxcontext.Context, linkType, unionActID int, sID, userID string, resourceType int, goodsID string) (link string, err error) {
return "jds", err
}
func (s *UnionHandler) GetUnionActList(ctx *jxcontext.Context, actType int) (actList []*partner.ActivityList, err error) {
if result, err2 := getAPI().ListActivitys(); err2 == nil {
for _, v := range result {
act := &partner.ActivityList{
ActID: v.Activityid,
ActName: v.Activityname,
ActDes: v.Remark,
Ratio: "11%",
Img: v.Imageurl,
}
act.DateBegin = utils.Str2Time(v.Activitystartdate)
act.DateEnd = utils.Str2Time(v.Activityenddate)
actList = append(actList, act)
}
} else {
err = err2
}
return actList, err
}
func (s *UnionHandler) CreateUnionPosition(ctx *jxcontext.Context, userID string) (sID string, err error) {
return sID, err
}
func (s *UnionHandler) GetUnionMatterList(ctx *jxcontext.Context, vendorCatID, keyword string, page, pageSize, sortType int, listID string) (list *partner.MatterList, err error) {
return nil, err
}
func (s *UnionHandler) GetUnionMatterDetail(ctx *jxcontext.Context, goodsID string) (result *partner.GoodsDetail, err error) {
return nil, err
}
func (s *UnionHandler) GetUnionMatterListRcmmd(ctx *jxcontext.Context, goodsID string, rcmmdType, offset, pageSize int) (result *partner.MatterList, err error) {
return nil, err
}

View File

@@ -1,27 +0,0 @@
package mt
import (
"git.rosy.net.cn/baseapi/platformapi/mtunionapi"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals/api"
)
type UnionHandler struct {
}
var (
unionHandler *UnionHandler
)
func init() {
partner.UnionHandlerMap[model.VendorIDMTWM] = unionHandler
}
func getAPI() (apiobj *mtunionapi.API) {
if configs, err := dao.QueryConfigs(dao.GetDB(), "mtunionCookie", model.ConfigTypeCookie, ""); err == nil {
api.MtUnionAPI.SetCookieWithStr(configs[0].Value)
}
return api.MtUnionAPI
}

View File

@@ -1,135 +0,0 @@
package mt
import (
"git.rosy.net.cn/baseapi/platformapi/mtunionapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/jxutils"
"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/globals/api"
"strings"
"time"
)
var (
orderStatusMap = map[int]int{
mtunionapi.MtUnionOrderStatusPay: model.UnionOrderStatusPay,
mtunionapi.MtUnionOrderStatusFinished: model.UnionOrderStatusFinish,
mtunionapi.MtUnionOrderStatusCanceled: model.UnionOrderStatusFail,
}
)
func (s *UnionHandler) ShareUnionLink(ctx *jxcontext.Context, linkType, unionActID int, sID, userID string, resourceType int, goodsID string) (link string, err error) {
if linkType == partner.LinkTypeWeiXinMini {
if qrCode, err := api.MtUnionAPI.MiniCode(unionActID, sID); err == nil {
if qrCode != "" {
return qrCode, err
}
}
return
} else {
return api.MtUnionAPI.GenerateLink(unionActID, linkType, sID)
}
return link, err
}
func (s *UnionHandler) GetUnionActList(ctx *jxcontext.Context, actType int) (actList []*partner.ActivityList, err error) {
if result, err2 := getAPI().ActivityList(actType, 20, 0); err2 == nil {
for _, v := range result {
act := &partner.ActivityList{
ActID: v.ID,
ActName: v.ActName,
ActDes: v.ActDes,
Ratio: v.Ratio,
ActSrc: v.ActSrc,
Img: v.URL,
}
if v.DateBound != "" {
act.DateBegin = utils.Str2Time(v.DateBound[:strings.LastIndex(v.DateBound, "至")-1])
act.DateEnd = utils.Str2Time(v.DateBound[strings.LastIndex(v.DateBound, "至")+4:])
}
actList = append(actList, act)
}
} else {
err = err2
}
return actList, err
}
func (s *UnionHandler) CreateUnionPosition(ctx *jxcontext.Context, userID string) (sID string, err error) {
return sID, err
}
func (s *UnionHandler) GetUnionMatterList(ctx *jxcontext.Context, vendorCatID, keyword string, page, pageSize, sortType int, listID string) (list *partner.MatterList, err error) {
return nil, err
}
func (s *UnionHandler) GetUnionMatterDetail(ctx *jxcontext.Context, goodsID string) (result *partner.GoodsDetail, err error) {
return nil, err
}
func (s *UnionHandler) GetUnionMatterListRcmmd(ctx *jxcontext.Context, goodsID string, rcmmdType, offset, pageSize int) (result *partner.MatterList, err error) {
return nil, err
}
func OnCallback(call *mtunionapi.CallBackResult) (err error) {
var (
db = dao.GetDB()
)
if order, err2 := api.MtUnionAPI.Rtnotify(call.Orderid, call.Type); order != nil && err2 == nil {
unionOrders, err3 := dao.GetUnionOrdersByIDs(db, []string{order.Order.Orderid}, model.VendorIDPDD)
if err2 != nil {
return err2
}
if err3 != nil {
return err3
}
orderStatus := &model.UnionOrderStatus{
VendorOrderID: order.Order.Orderid,
VendorID: model.VendorIDMTWM,
Status: mtunionOrderStatus2Jx(order.Order.Status),
VendorStatus: utils.Int2Str(order.Order.Status),
OrderStatusAt: time.Unix(utils.Str2Int64(order.Order.Modtime), 0),
}
if len(order.Refund) > 0 {
orderStatus.Comment = "售后完成"
}
//change
jxutils.CallMsgHandler(func() {
if len(unionOrders) > 0 {
if unionOrders[0].Status != orderStatus.Status {
cms.ChangeUnionOrder(unionOrders[0], orderStatus)
}
} else {
//new
unionOrder := &model.UnionOrder{
VendorOrderID: order.Order.Orderid,
VendorID: model.VendorIDMTWM,
Status: mtunionOrderStatus2Jx(order.Order.Status),
PID: order.Order.Sid,
PayPrice: int(jxutils.StandardPrice2Int(utils.Str2Float64(order.Order.Direct))),
//PromotionAmount: int(jxutils.StandardPrice2Int(utils.Str2Float64(order.Coupon[0].Profit))),
GoodsName: order.Order.Smstitle,
GoodsID: order.Order.Dealid,
OrderCreateAt: time.Unix(utils.Str2Int64(order.Order.Paytime), 0),
OrderPayAt: time.Unix(utils.Str2Int64(order.Order.Paytime), 0),
OrderReceiveAt: time.Unix(utils.Str2Int64(order.Order.Modtime), 0),
//OrderSettleAt: time.Unix(utils.Str2Int64(order.Coupon[0].Usetime), 0),
}
if len(order.Coupon) > 0 {
unionOrder.PromotionAmount = int(jxutils.StandardPrice2Int(utils.Str2Float64(order.Coupon[0].Profit)))
unionOrder.OrderSettleAt = time.Unix(utils.Str2Int64(order.Coupon[0].Usetime), 0)
}
cms.NewUnionOrder(unionOrder, orderStatus)
}
}, jxutils.ComposeUniversalOrderID(order.Order.Orderid, model.VendorIDMTWM))
}
return err
}
func mtunionOrderStatus2Jx(status int) (jxstatus int) {
return orderStatusMap[status]
}

View File

@@ -1,106 +0,0 @@
package partner
import (
"time"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
)
var (
UnionHandlerMap map[int]UnionInterface
)
const (
LinkTypeWeiXinMini = 5 //微信小程序二维码
LinTypeH5 = 1 //h5链接
LinTypeDeepLink = 2 //deeplink(唤起)链接
LinTypeInto = 3 //中间页唤起链接
LinTypeWx = 4 //微信小程序唤起路径
ShareTypeOther = 1 //分享给别人
ShareTypeOwn = 2 //自己领
MtUnionJxSID = "000000001"
//排序参数,正数升序,负数倒序
JxSortTypeYJ = 1 //佣金比
JxSortTypeXL = 2 //销量
JxSortTypeJG = 3 //价格
)
type UnionOrderInfo struct {
SID string `json:"sid"`
Profit int64 `json:"profit"` //订单实际返佣金额
VendorID int `json:"vendorID"`
}
type ActivityList struct {
ActID int `json:"actID"`
ActName string `json:"actName"`
ActDes string `json:"actDes"`
Ratio string `json:"ratio"` //返现比?
DateBegin time.Time `json:"dateBegin"`
DateEnd time.Time `json:"dateEnd"`
ActSrc string `json:"actSrc"` //物料?
Img string `json:"img"` //活动图
}
type GoodsDetail struct {
GoodsList
MainImg string `json:"mainImg"`
Imgs string `json:"imgs"`
StoreImg string `json:"storeImg"` //店铺图片
StoreName string `json:"storeName"` //店铺名
LgstTxt string `json:"lgstTxt"` //物流分
DescTxt string `json:"descTxt"` //描述分
ServTxt string `json:"servTxt"` //服务分
}
type GoodsDetail2 struct {
MainImg string `json:"mainImg"`
Imgs string `json:"imgs"`
StoreImg string `json:"storeImg"` //店铺图片
StoreName string `json:"storeName"` //店铺名
Tpwd string `json:"tpwd"` //淘口令 非苹果ios14以上版本的设备即其他ios版本、Android系统等可以用此淘口令正常在复制到手淘打开
//针对苹果ios14及以上版本的苹果设备手淘将按照示例值信息格式读取淘口令(需包含:数字+羊角符+url
//识别规则可能根据ios情况变更)。如需更改淘口令内文案、url等内容请务必先验证更改后的淘口令在手淘可被识别打开
TpwdIOS14 string `json:"tpwdIOS14"`
UrlL string `json:"urlL"` //推广地址长链
UrlS string `json:"urlS"` //推广地址短链
}
type GoodsList struct {
GoodsID string `json:"goodsID"`
GoodsName string `json:"goodsName"`
Img string `json:"img"`
CouponDiscount int `json:"couponDiscount"` //优惠券
CouponRemainQuantity int `json:"couponRemainQuantity"` //优惠券剩余数量
MinNormalPrice int `json:"minNormalPrice"` //最小购买价格
SalesCount string `json:"salesCount"` //销量
PromotionRate int `json:"promotionRate"` //佣金比例,千分比
GoodsDetail *GoodsDetail2 `json:"goodsDetail"` //淘宝用
}
type MatterList struct {
GoodsList []*GoodsList
VendorID int `json:"vendorID"`
ListID string `json:"listID"`
TotalCount int `json:"totalCount"`
}
func init() {
UnionHandlerMap = make(map[int]UnionInterface)
}
type UnionInterface interface {
ShareUnionLink(ctx *jxcontext.Context, linkType, unionActID int, sID, userID string, resourceType int, goodsID string) (link string, err error)
GetUnionActList(ctx *jxcontext.Context, actType int) (result []*ActivityList, err error)
CreateUnionPosition(ctx *jxcontext.Context, userID string) (sID string, err error)
GetUnionMatterList(ctx *jxcontext.Context, vendorCatID, keyword string, page, pageSize, sortType int, listID string) (result *MatterList, err error)
GetUnionMatterDetail(ctx *jxcontext.Context, goodsID string) (result *GoodsDetail, err error)
GetUnionMatterListRcmmd(ctx *jxcontext.Context, goodsID string, rcmmdType, offset, pageSize int) (result *MatterList, err error)
}
func GetHandler(vendorID int) UnionInterface {
return UnionHandlerMap[vendorID]
}

View File

@@ -1,27 +0,0 @@
package pdd
import (
"git.rosy.net.cn/baseapi/platformapi/pddapi"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals/api"
)
type UnionHandler struct {
}
var (
unionHandler *UnionHandler
)
func init() {
partner.UnionHandlerMap[model.VendorIDPDD] = unionHandler
}
func getAPI() (apiobj *pddapi.API) {
if configs, err := dao.QueryConfigs(dao.GetDB(), "pddCookie", model.ConfigTypeCookie, ""); err == nil {
api.PddAPI.SetCookieWithStr(configs[0].Value)
}
return api.PddAPI
}

View File

@@ -1,280 +0,0 @@
package pdd
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/pddapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"strings"
"time"
)
var (
sortTypeMap = map[int]int{
0: 0, //综合排序
partner.JxSortTypeYJ: 1, //按佣金比率升序;
-partner.JxSortTypeYJ: 2, //按佣金比例降序;
partner.JxSortTypeJG: 3, //按价格升序;
-partner.JxSortTypeJG: 4, //按价格降序;
partner.JxSortTypeXL: 5, //按销量升序;
-partner.JxSortTypeXL: 6, //按销量降序;
}
orderStatusMap = map[int]int{
pddapi.OrderStatusPay: model.UnionOrderStatusPay,
pddapi.OrderStatus1: model.UnionOrderStatusPay,
pddapi.OrderStatusTakeOver: model.UnionOrderStatusTakeOver,
pddapi.OrderStatusAuditOver: model.UnionOrderStatusAuditOver,
pddapi.OrderStatusAuditFail: model.UnionOrderStatusFail,
pddapi.OrderStatusEaring: model.UnionOrderStatusFinish,
}
)
func (s *UnionHandler) ShareUnionLink(ctx *jxcontext.Context, linkType, unionActID int, sID, userID string, resourceType int, goodsID string) (link string, err error) {
//传了goodsID表示是商品分享
if goodsID != "" {
authBindFlag, err := api.PddAPI.MemberAuthorityQuery(sID)
if err != nil {
return "", err
}
if result, err := api.PddAPI.GoodsPromotionURLGen(sID, goodsID, !authBindFlag); err == nil {
switch linkType {
case partner.LinTypeH5:
return result.MobileURL, err
case partner.LinTypeWx:
return result.WeAppInfo.PagePath, err
default:
return link, fmt.Errorf("暂不支持此链接类型!")
}
}
} else {
if result, err := api.PddAPI.ResourceURLGen(sID, resourceType); err == nil {
switch linkType {
case partner.LinkTypeWeiXinMini:
return "", err
case partner.LinTypeH5:
return result.SingleURLList.URL, err
case partner.LinTypeWx:
return result.WeAppInfo.PagePath, err
default:
return link, fmt.Errorf("暂不支持此链接类型!")
}
}
}
return link, err
}
func (s *UnionHandler) GetUnionActList(ctx *jxcontext.Context, actType int) (actList []*partner.ActivityList, err error) {
if result, err2 := getAPI().ActivityOperationList(); err2 == nil {
for _, v := range result {
act := &partner.ActivityList{
ActID: v.ID,
ActName: v.Name,
ActDes: v.Description,
Ratio: "未知",
ActSrc: v.Fileurl,
Img: v.Bannerimage,
DateBegin: utils.Str2Time(v.Starttime),
DateEnd: utils.Str2Time(v.Endtime),
}
actList = append(actList, act)
}
}
return actList, err
}
func (s *UnionHandler) CreateUnionPosition(ctx *jxcontext.Context, userID string) (sID string, err error) {
if sID, err = api.PddAPI.GoodsOPidGenerate(userID); err != nil {
return "", err
}
return sID, err
}
func jxSortType2PddSortType(jxSortType int) (sortType int) {
return sortTypeMap[jxSortType]
}
func (s *UnionHandler) GetUnionMatterList(ctx *jxcontext.Context, vendorCatID, keyword string, page, pageSize, sortType int, listID string) (list *partner.MatterList, err error) {
var (
goodsList []*partner.GoodsList
)
list = &partner.MatterList{}
params := &pddapi.GoodsSearchParam{
CatID: utils.Str2Int(vendorCatID),
Keyword: keyword,
Page: page,
PageSize: pageSize,
SortType: jxSortType2PddSortType(sortType),
ListID: listID,
}
//-1表示是拼多多的精选
if vendorCatID == "-1" {
params.ActivityTags = []int{pddapi.GoodsActTagBYBT, pddapi.GoodsActTagJXBK, pddapi.GoodsActTagMS, pddapi.GoodsActTagPPGY, pddapi.GoodsActTagPPHB, pddapi.GoodsActTagQWBT, pddapi.GoodsActTagTZTJ}
}
if goods, err2 := api.PddAPI.GoodsSearch(params); err2 != nil {
return nil, err2
} else {
list.ListID = goods.ListID
list.TotalCount = goods.TotalCount
list.VendorID = model.VendorIDPDD
for _, v := range goods.GoodsList {
good := &partner.GoodsList{
GoodsID: v.GoodsSign,
GoodsName: v.GoodsName,
Img: v.GoodsThumbnailURL,
CouponDiscount: v.CouponDiscount,
CouponRemainQuantity: v.CouponRemainQuantity,
MinNormalPrice: v.MinNormalPrice,
SalesCount: v.SalesTip,
PromotionRate: v.PromotionRate,
}
goodsList = append(goodsList, good)
}
list.GoodsList = goodsList
}
return list, err
}
func (s *UnionHandler) GetUnionMatterDetail(ctx *jxcontext.Context, goodsID string) (result *partner.GoodsDetail, err error) {
result = &partner.GoodsDetail{}
if goods, err2 := api.PddAPI.GoodsDetail(goodsID); err2 != nil {
return nil, err2
} else {
result.GoodsID = goods.GoodsSign
result.GoodsName = goods.GoodsName
result.Img = goods.GoodsThumbnailURL
result.CouponDiscount = goods.CouponDiscount
result.MinNormalPrice = goods.MinNormalPrice
result.CouponRemainQuantity = goods.CouponRemainQuantity
result.SalesCount = goods.SalesTip
result.Imgs = strings.Join(goods.GoodsGalleryUrls, ",")
result.MainImg = goods.GoodsImageURL
result.StoreImg = goods.MallImgURL
result.StoreName = goods.MallName
result.LgstTxt = goods.LgstTxt
result.DescTxt = goods.DescTxt
result.ServTxt = goods.ServTxt
result.PromotionRate = goods.PromotionRate
}
return result, err
}
func (s *UnionHandler) GetUnionMatterListRcmmd(ctx *jxcontext.Context, goodsID string, rcmmdType, offset, pageSize int) (list *partner.MatterList, err error) {
var (
goodsList []*partner.GoodsList
)
list = &partner.MatterList{}
if goods, err2 := api.PddAPI.GoodsRecommendGet(goodsID, rcmmdType, offset, pageSize); err2 != nil {
return nil, err2
} else {
list.ListID = goods.ListID
list.TotalCount = goods.Total
list.VendorID = model.VendorIDPDD
for _, v := range goods.List {
good := &partner.GoodsList{
GoodsID: v.GoodsSign,
GoodsName: v.GoodsName,
Img: v.GoodsThumbnailURL,
CouponDiscount: v.CouponDiscount,
CouponRemainQuantity: v.CouponRemainQuantity,
MinNormalPrice: v.MinNormalPrice,
SalesCount: v.SalesTip,
PromotionRate: v.PromotionRate,
}
goodsList = append(goodsList, good)
}
list.GoodsList = goodsList
}
return list, err
}
func GetUnionOrders() {
var (
page = 1
pageSize = 50
db = dao.GetDB()
orderIDs []string
unionOrderIDsMap map[string]*model.UnionOrder
)
orders, err := api.PddAPI.OrderListIncrementGet(time.Now().Add(-time.Minute*5).Unix(), time.Now().Unix(), page, pageSize)
if err != nil {
return
}
for _, v := range orders {
orderIDs = append(orderIDs, v.OrderSn)
}
unionOrders, err := dao.GetUnionOrdersByIDs(db, orderIDs, model.VendorIDPDD)
if err != nil {
return
}
unionOrderIDsMap = make(map[string]*model.UnionOrder)
for _, v := range unionOrders {
unionOrderIDsMap[v.VendorOrderID] = v
}
task := tasksch.NewParallelTask("GetUnionOrders1", tasksch.NewParallelConfig().SetIsContinueWhenError(true), jxcontext.AdminCtx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
order := batchItemList[0].(*pddapi.OrderListIncrementGetResult)
detail, err := api.PddAPI.OrderDetailGet(order.OrderSn)
if err != nil {
return
}
orderStatus := &model.UnionOrderStatus{
VendorOrderID: detail.OrderSn,
VendorID: model.VendorIDPDD,
Status: pddOrderStatus2Jx(detail.OrderStatus),
VendorStatus: utils.Int2Str(detail.OrderStatus),
OrderStatusAt: time.Unix(int64(detail.OrderModifyAt), 0),
}
if detail.ReturnStatus == 1 {
orderStatus.Comment = "售后中"
} else if detail.ReturnStatus == 2 {
orderStatus.Comment = "售后完成"
orderStatus.Status = model.UnionOrderStatusFail
}
//change
jxutils.CallMsgHandler(func() {
globals.SugarLogger.Debugf("GetUnionOrders pdd, orderstatus: %v", utils.Format4Output(orderStatus, true))
if unionOrderIDsMap[order.OrderSn] != nil {
globals.SugarLogger.Debugf("GetUnionOrders pdd, unionorders: %v", utils.Format4Output(unionOrderIDsMap[order.OrderSn], true))
if unionOrderIDsMap[order.OrderSn].Status != orderStatus.Status {
cms.ChangeUnionOrder(unionOrderIDsMap[order.OrderSn], orderStatus)
}
} else {
//new
unionOrder := &model.UnionOrder{
VendorOrderID: detail.OrderSn,
VendorID: model.VendorIDPDD,
Status: pddOrderStatus2Jx(detail.OrderStatus),
PID: detail.Pid,
PayPrice: detail.OrderAmount,
PromotionAmount: detail.PromotionAmount,
GoodsName: detail.GoodsName,
GoodsID: detail.GoodsSign,
GoodsImg: detail.GoodsThumbnailURL,
OrderCreateAt: time.Unix(int64(order.OrderCreateTime), 0),
OrderPayAt: time.Unix(int64(order.OrderPayTime), 0),
OrderReceiveAt: time.Unix(int64(order.OrderReceiveTime), 0),
OrderSettleAt: time.Unix(int64(order.OrderSettleTime), 0),
Comment: order.FailReason,
}
cms.NewUnionOrder(unionOrder, orderStatus)
}
}, jxutils.ComposeUniversalOrderID(order.OrderSn, model.VendorIDPDD))
return retVal, err
}, orders)
tasksch.HandleTask(task, nil, false).Run()
task.GetID()
}
func pddOrderStatus2Jx(status int) (jxstatus int) {
return orderStatusMap[status]
}

View File

@@ -1,27 +0,0 @@
package taobao
import (
"git.rosy.net.cn/baseapi/platformapi/tbunionapi"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals/api"
)
type UnionHandler struct {
}
var (
unionHandler *UnionHandler
)
func init() {
partner.UnionHandlerMap[model.VendorIDTB] = unionHandler
}
func getAPI() (apiobj *tbunionapi.API) {
if configs, err := dao.QueryConfigs(dao.GetDB(), "tbunionCookie", model.ConfigTypeCookie, ""); err == nil {
api.TbUnionAPI.SetCookieWithStr(configs[0].Value)
}
return api.TbUnionAPI
}

View File

@@ -1,189 +0,0 @@
package taobao
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tbunionapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/partner"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals/api"
"strings"
)
var (
sortTypeMap = map[int]string{
0: "", //综合排序
partner.JxSortTypeYJ: "tk_total_commi_asc", //按佣金比率升序;
-partner.JxSortTypeYJ: "tk_total_commi_des", //按佣金比例降序;
partner.JxSortTypeJG: "price_asc", //按价格升序;
-partner.JxSortTypeJG: "price_des", //按价格降序;
partner.JxSortTypeXL: "total_sales_asc", //按销量升序;
-partner.JxSortTypeXL: "total_sales_des", //按销量降序;
}
)
func (s *UnionHandler) ShareUnionLink(ctx *jxcontext.Context, linkType, unionActID int, sID, userID string, resourceType int, goodsID string) (link string, err error) {
if result, err2 := api.TbUnionAPI.ActivityInfoGet(userID, utils.Int2Str(unionActID), utils.Str2Int64(sID)); err2 == nil {
switch linkType {
case partner.LinkTypeWeiXinMini:
return result.Data.WxQrcodeURL, err
case partner.LinTypeH5:
return result.Data.ClickURL, err
case partner.LinTypeWx:
return result.Data.WxMiniprogramPath, err
default:
return link, fmt.Errorf("暂不支持此链接类型!")
}
}
return link, err
}
func (s *UnionHandler) GetUnionActList(ctx *jxcontext.Context, actType int) (actList []*partner.ActivityList, err error) {
if result, err2 := getAPI().GatewayUnionpub(); err2 == nil {
for _, v := range result {
act := &partner.ActivityList{
ActID: utils.Str2Int(v.Pageid),
ActName: v.Pagename,
ActDes: v.Eventenname,
Ratio: "6%",
ActSrc: v.Pageurl,
Img: v.Pagepicturl,
DateBegin: utils.Str2Time(v.Pagestarttime),
DateEnd: utils.Str2Time(v.Pageendtime),
}
actList = append(actList, act)
}
}
return actList, err
}
func (s *UnionHandler) CreateUnionPosition(ctx *jxcontext.Context, userID string) (sID string, err error) {
return sID, err
}
func (s *UnionHandler) GetUnionMatterList(ctx *jxcontext.Context, vendorCatID, keyword string, page, pageSize, sortType int, listID string) (list *partner.MatterList, err error) {
list = &partner.MatterList{
VendorID: model.VendorIDTB,
}
var goodsList []*partner.GoodsList
//传了keyword就是物料搜索
//没传就是物料精选。。
if keyword != "" {
params := &tbunionapi.MaterialOptionalParam{
Q: keyword,
AdzoneID: tbunionapi.JxAdzoneID,
PageNo: page,
PageSize: pageSize,
}
if sortType != 0 {
params.Sort = jxSortType2TbunionSortType(sortType)
}
if materResults, err := api.TbUnionAPI.MaterialOptional(params); err == nil {
list.TotalCount = materResults.TotalResults
for _, v := range materResults.ResultList {
good := &partner.GoodsList{
GoodsID: utils.Int64ToStr(v.ItemID),
GoodsName: v.Title,
Img: v.PictURL,
CouponDiscount: utils.Str2Int(v.CouponAmount),
CouponRemainQuantity: v.CouponRemainCount,
MinNormalPrice: utils.Str2Int(v.ReservePrice),
SalesCount: utils.Int2Str(v.Volume),
PromotionRate: utils.Str2Int(v.CommissionRate),
}
good.GoodsDetail.MainImg = v.WhiteImage
good.GoodsDetail.StoreName = v.ShopTitle
good.GoodsDetail.Imgs = strings.Join(v.SmallImages, ",")
good.GoodsDetail.UrlL = v.CouponShareURL
if urlS, err2 := api.TbUnionAPI.SpreadGet(v.CouponShareURL); err2 == nil {
good.GoodsDetail.UrlS = urlS
}
if tpwdCreateResult, err3 := api.TbUnionAPI.TpwdCreate(good.GoodsDetail.UrlL); err3 == nil {
good.GoodsDetail.Tpwd = tpwdCreateResult.PasswordSimple
good.GoodsDetail.TpwdIOS14 = tpwdCreateResult.Model
}
goodsList = append(goodsList, good)
}
list.GoodsList = goodsList
}
} else {
if materResults, err := api.TbUnionAPI.OptimusMaterial(0, utils.Str2Int(vendorCatID), tbunionapi.JxAdzoneID, page, pageSize); err == nil {
for _, v := range materResults {
good := &partner.GoodsList{
GoodsID: utils.Int64ToStr(v.ItemID),
GoodsName: v.Title,
Img: v.PictURL,
CouponDiscount: v.CouponAmount,
CouponRemainQuantity: v.CouponRemainCount,
MinNormalPrice: utils.Str2Int(v.ReservePrice),
SalesCount: utils.Int2Str(v.Volume),
PromotionRate: utils.Str2Int(v.CommissionRate),
}
goodsDetail := &partner.GoodsDetail2{
MainImg: v.WhiteImage,
StoreName: v.ShopTitle,
Imgs: strings.Join(v.SmallImages, ","),
UrlL: v.CouponShareURL,
}
if urlS, err2 := api.TbUnionAPI.SpreadGet("https:" + v.CouponShareURL); err2 == nil {
goodsDetail.UrlS = urlS
}
if tpwdCreateResult, err3 := api.TbUnionAPI.TpwdCreate("https:" + goodsDetail.UrlL); err3 == nil {
goodsDetail.Tpwd = tpwdCreateResult.PasswordSimple
goodsDetail.TpwdIOS14 = tpwdCreateResult.Model
}
good.GoodsDetail = goodsDetail
goodsList = append(goodsList, good)
}
list.GoodsList = goodsList
}
}
return list, err
}
func (s *UnionHandler) GetUnionMatterDetail(ctx *jxcontext.Context, goodsID string) (result *partner.GoodsDetail, err error) {
return nil, err
}
func (s *UnionHandler) GetUnionMatterListRcmmd(ctx *jxcontext.Context, goodsID string, rcmmdType, offset, pageSize int) (list *partner.MatterList, err error) {
list = &partner.MatterList{
VendorID: model.VendorIDTB,
}
var goodsList []*partner.GoodsList
if materResults, err := api.TbUnionAPI.OptimusMaterial(utils.Str2Int(goodsID), 13256, tbunionapi.JxAdzoneID, offset, pageSize); err == nil {
for _, v := range materResults {
good := &partner.GoodsList{
GoodsID: utils.Int64ToStr(v.ItemID),
GoodsName: v.Title,
Img: v.PictURL,
CouponDiscount: v.CouponAmount,
CouponRemainQuantity: v.CouponRemainCount,
MinNormalPrice: utils.Str2Int(v.ReservePrice),
SalesCount: utils.Int2Str(v.Volume),
PromotionRate: utils.Str2Int(v.CommissionRate),
}
goodsDetail := &partner.GoodsDetail2{
MainImg: v.WhiteImage,
StoreName: v.ShopTitle,
Imgs: strings.Join(v.SmallImages, ","),
UrlL: v.CouponShareURL,
}
if urlS, err2 := api.TbUnionAPI.SpreadGet("https:" + v.CouponShareURL); err2 == nil {
goodsDetail.UrlS = urlS
}
if tpwdCreateResult, err3 := api.TbUnionAPI.TpwdCreate("https:" + goodsDetail.UrlL); err3 == nil {
goodsDetail.Tpwd = tpwdCreateResult.PasswordSimple
goodsDetail.TpwdIOS14 = tpwdCreateResult.Model
}
good.GoodsDetail = goodsDetail
goodsList = append(goodsList, good)
}
list.GoodsList = goodsList
}
return list, err
}
func jxSortType2TbunionSortType(sort int) (tbsort string) {
return sortTypeMap[sort]
}

View File

@@ -1,58 +0,0 @@
package ddmsg
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
func SendDDUserMessage(msgType, ddUserID, title, content string) (err error) {
globals.SugarLogger.Debugf("SendDDUserMessage ddUserID:%s, title:%s", ddUserID, title)
if globals.IsProductEnv() {
if msgType == dingdingapi.MsgTyeText {
err = api.DingDingAPI.CorpAsyncSendSimple(ddUserID, content)
} else if msgType == dingdingapi.MsgTypeMarkdown {
err = api.DingDingAPI.CorpAsyncSendMarkdown([]string{ddUserID}, nil, false, title, content)
}
}
return err
}
func SendUserMessage(msgType, userID, title, content string) (err error) {
globals.SugarLogger.Debugf("SendUserMessage userID:%s, title:%s", userID, title)
authList, err := auth2.GetUserBindAuthInfo(userID)
findOneMethod := false
if err == nil {
for _, auth := range authList {
if auth.Type == dingding.AuthTypeStaff /*|| auth.Type == weixin.AuthTypeMP*/ {
findOneMethod = true
if len(content) > dingdingapi.MaxWorkContentLen {
content = content[:dingdingapi.MaxWorkContentLen-4] + "..."
}
err = SendDDUserMessage(msgType, auth.AuthID, title, content)
break
}
}
}
if !findOneMethod {
err = fmt.Errorf("用户[%s]找不到至少一个有效的通讯方式", userID)
}
if err != nil {
globals.SugarLogger.Infof("SendUserMessage userID:%s, title:%s, content:%s failed with error:%v", userID, title, content, err)
}
return err
}
func SendUsersMessage(msgType string, userIDs []string, title, content string) (err error) {
errList := errlist.New()
for _, userID := range userIDs {
errList.AddErr(SendUserMessage(msgType, userID, title, content))
}
err = errList.GetErrListAsOne()
return err
}

View File

@@ -74,9 +74,10 @@ func New(notUsed interface{}, token string, w http.ResponseWriter, r *http.Reque
// }
}
if err == model.ErrTokenIsInvalid {
if !globals.IsProductEnv() {
err = nil
} else if token == RsmDefultToken {
//if !globals.IsProductEnv() {
// err = nil
//} else
if token == RsmDefultToken {
err = nil
} else {
errCode = model.ErrCodeTokenIsInvalid

View File

@@ -7,9 +7,7 @@ import (
"sync"
"time"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/globals"
)
@@ -486,20 +484,20 @@ func SendMessage(t *BaseTask) {
time.Sleep(10 * time.Millisecond) // 等待GetResult中的isGetResultCalled赋值
globals.SugarLogger.Debugf("BaseTask task ID:%s, name:%s finished, isGetResultCalled:%t", t.ID, t.Name, t.isGetResultCalled)
if !t.isGetResultCalled && t.parent == nil && len(GetTasks(t.ID, TaskStatusBegin, TaskStatusEnd, 24, "")) > 0 {
if authInfo, err := t.ctx.GetV2AuthInfo(); err == nil { // 这里应该是不管登录类型,直接以可能的方式发消息
var content string
taskDesc := fmt.Sprintf("你的异步任务[%s],ID[%s],开始于:%s,结束于:%s,", t.Name, t.ID, utils.Time2Str(t.CreatedAt), utils.Time2Str(t.TerminatedAt))
content = fmt.Sprintf("%s执行%s", taskDesc, TaskStatusName[t.Status])
if t.Error() == "" {
noticeMsg := t.GetNoticeMsg()
if noticeMsg != "" {
content += ",通知消息:" + noticeMsg
}
} else {
content += ",\n" + t.Error()
}
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, authInfo.UserID, "异步任务完成", content)
}
//if authInfo, err := t.ctx.GetV2AuthInfo(); err == nil { // 这里应该是不管登录类型,直接以可能的方式发消息
// var content string
// taskDesc := fmt.Sprintf("你的异步任务[%s],ID[%s],开始于:%s,结束于:%s,", t.Name, t.ID, utils.Time2Str(t.CreatedAt), utils.Time2Str(t.TerminatedAt))
// content = fmt.Sprintf("%s执行%s", taskDesc, TaskStatusName[t.Status])
// if t.Error() == "" {
// noticeMsg := t.GetNoticeMsg()
// if noticeMsg != "" {
// content += ",通知消息:" + noticeMsg
// }
// } else {
// content += ",\n" + t.Error()
// }
// ddmsg.SendUserMessage(dingdingapi.MsgTyeText, authInfo.UserID, "异步任务完成", content)
//}
}
}

View File

@@ -15,15 +15,6 @@ import (
"git.rosy.net.cn/jx-callback/globals/beegodb"
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/alipay"
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding"
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/mobile"
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/password"
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
_ "git.rosy.net.cn/jx-callback/business/jxstore/partner/jds"
_ "git.rosy.net.cn/jx-callback/business/jxstore/partner/mt"
_ "git.rosy.net.cn/jx-callback/business/jxstore/partner/pdd"
_ "git.rosy.net.cn/jx-callback/business/jxstore/partner/taobao"
_ "git.rosy.net.cn/jx-callback/globals/api"
_ "git.rosy.net.cn/jx-callback/routers"

View File

@@ -21,6 +21,11 @@ func init() {
&controllers.PrintController{},
),
),
web.NSNamespace("/task",
web.NSInclude(
&controllers.TaskController{},
),
),
)
web.AddNamespace(ns)