diff --git a/business/auth2/authprovider/alipay/alipay.go b/business/auth2/authprovider/alipay/alipay.go deleted file mode 100644 index 64c60f144..000000000 --- a/business/auth2/authprovider/alipay/alipay.go +++ /dev/null @@ -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 -} diff --git a/business/auth2/authprovider/dingding/dingding.go b/business/auth2/authprovider/dingding/dingding.go deleted file mode 100644 index 1cf09518e..000000000 --- a/business/auth2/authprovider/dingding/dingding.go +++ /dev/null @@ -1,6 +0,0 @@ -package dingding - -const ( - AuthTypeStaff = "ddstaff" // 钉钉企业登录 - AuthTypeQRCode = "ddqrcode" -) diff --git a/business/auth2/authprovider/dingding/qrcode.go b/business/auth2/authprovider/dingding/qrcode.go deleted file mode 100644 index 8e84d4a35..000000000 --- a/business/auth2/authprovider/dingding/qrcode.go +++ /dev/null @@ -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 -} diff --git a/business/auth2/authprovider/dingding/staff.go b/business/auth2/authprovider/dingding/staff.go deleted file mode 100644 index c1630497b..000000000 --- a/business/auth2/authprovider/dingding/staff.go +++ /dev/null @@ -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 -} diff --git a/business/auth2/authprovider/mobile/mobile.go b/business/auth2/authprovider/mobile/mobile.go deleted file mode 100644 index c4a657c8f..000000000 --- a/business/auth2/authprovider/mobile/mobile.go +++ /dev/null @@ -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 -} diff --git a/business/auth2/authprovider/password/password.go b/business/auth2/authprovider/password/password.go deleted file mode 100644 index 5c5f97d17..000000000 --- a/business/auth2/authprovider/password/password.go +++ /dev/null @@ -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 -} diff --git a/business/auth2/authprovider/weixin/weixin.go b/business/auth2/authprovider/weixin/weixin.go deleted file mode 100644 index 2f4b344a9..000000000 --- a/business/auth2/authprovider/weixin/weixin.go +++ /dev/null @@ -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 -} diff --git a/business/auth2/authprovider/weixin/weixin_mini.go b/business/auth2/authprovider/weixin/weixin_mini.go deleted file mode 100644 index 6c8142201..000000000 --- a/business/auth2/authprovider/weixin/weixin_mini.go +++ /dev/null @@ -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 -// } diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index c932c785e..c610a6e6d 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -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, diff --git a/business/jxstore/cms/job.go b/business/jxstore/cms/job.go deleted file mode 100644 index 8cb3e65cd..000000000 --- a/business/jxstore/cms/job.go +++ /dev/null @@ -1,2138 +0,0 @@ -package cms - -import ( - "encoding/json" - "fmt" - "git.rosy.net.cn/baseapi/platformapi/tbunionapi" - "math" - "strings" - "sync" - "time" - - "git.rosy.net.cn/jx-callback/business/jxstore/event" - "git.rosy.net.cn/jx-callback/business/jxstore/partner" - - "git.rosy.net.cn/baseapi/platformapi/txcloudapi" - - "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" - - "git.rosy.net.cn/baseapi/platformapi/dingdingapi" - "git.rosy.net.cn/baseapi/platformapi/jdeclpapi" - - "git.rosy.net.cn/jx-callback/globals" - - "git.rosy.net.cn/jx-callback/business/auth2" - "git.rosy.net.cn/jx-callback/business/jxstore/financial" - - "git.rosy.net.cn/baseapi/utils" - - "git.rosy.net.cn/jx-callback/business/jxutils" - - "git.rosy.net.cn/jx-callback/globals/api" - - "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" -) - -const ( - AcceptMaxCount = 2 - CancelMaxCount = 5 - - waybillKgPrice = 200 - - mtwmMemberPrice = 1100 -) - -type JobTimer struct { - JobTimerMap map[int64]*time.Timer - JobAuditTimerMap map[int64]*time.Timer - s *sync.RWMutex -} - -var ( - JobTimers = &JobTimer{} -) - -func init() { - JobTimerMap := make(map[int64]*time.Timer) - JobAuditTimerMap := make(map[int64]*time.Timer) - JobTimers.JobTimerMap = JobTimerMap - JobTimers.JobAuditTimerMap = JobAuditTimerMap - JobTimers.s = new(sync.RWMutex) -} - -func PublishJob(ctx *jxcontext.Context, jobExt *model.JobExt) (errCode string, err error) { - var ( - db = dao.GetDB() - job = &model.Job{} - finishedAt time.Time - DayTimeBegin, DayTimeEnd = jxutils.GetDayTime() - ) - if data, err := json.Marshal(jobExt); err == nil { - json.Unmarshal(data, &job) - } - finishedAt = utils.Str2Time(jobExt.FinishedAtStr) - job.FinishedAt = &finishedAt - // 需根据任务类型做一些参数判断,比如门店商品链接,地址 - if job.JobCategoryID != model.JobCategoryIDUnion { - if job.AvgPrice == 0 { - return errCode, fmt.Errorf("请输入单个任务奖励(保证)金额!") - } - } - switch job.JobCategoryID { - case model.JobCategoryIDwmtg: - if job.Address == "" { - return errCode, fmt.Errorf("外卖推广任务请输入门店地址!") - } - case model.JobCategoryIDOther: - case model.JobCategoryIDDropShipping: - if job.DropShippingAt == 0 { - return errCode, fmt.Errorf("一件代发任务请输入承诺x天内发货!") - } - if job.DropShippingSkuPrice == 0 { - return errCode, fmt.Errorf("一件代发任务请输入商品价格!") - } - job.CashbackType = model.JobCashbackPrice - job.LimitCountType = model.JobLimitCountTypeNoLimit - job.JobLimitAt = 0 - job.AuditLimitAt = 0 - case model.JobCategoryIDUnion: - if job.UnionImg == "" || job.UnionQrcodePosition == "" { - return errCode, fmt.Errorf("联盟任务发布请输入分享的背景图和二维码图方位!") - } - default: - return errCode, fmt.Errorf("暂不支持的任务类型! %v", job.JobCategoryID) - } - // 需根据返现类型做一些参数判断 - switch job.CashbackType { - case model.JobCashbackPercentage: - if job.Percentage <= 0 || job.Percentage > 100 { - return errCode, fmt.Errorf("返现比例请输入1-100之间的比例!") - } - case model.JobCashbackPrice: - default: - return errCode, fmt.Errorf("暂不支持的返现类型! %v", job.CashbackType) - } - if job.Count <= 0 { - return errCode, fmt.Errorf("任务数量不能为0!") - } - job.SurplusCount = job.Count - if job.UserID == "" { - return errCode, fmt.Errorf("任务发起人不能为空!") - } - var ( - userBill *model.UserBill - ) - - if ctx.GetToken() != jxcontext.RsmDefultToken { - if ctx.GetUserID() != job.UserID { - return errCode, fmt.Errorf("用户信息已过期,请重新登录!") - } - //验证微信绑定 - if err = auth2.CheckWeixinminiAuthBind(ctx.GetUserID()); err != nil { - return "", err - } - //发布任务要扣除任务总额的保证金,不够扣就要进行充值 - userBill, _ = dao.GetUserBill(db, job.UserID, "") - if userBill == nil { - return errCode, fmt.Errorf("未查询到该用户的账单!") - } - job.TotalPrice = job.Count * job.AvgPrice - if userBill.AccountBalance < job.TotalPrice { - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足!") - } - jobs, _ := dao.GetJobsNoPage(db, []string{job.UserID}, nil, nil, nil, DayTimeBegin, DayTimeEnd, 0, false) - if len(jobs) > 0 { - members, err := dao.GetUserMember(db, job.UserID, model.MemberTypeNormal) - if err != nil { - return errCode, err - } - if len(members) <= 0 { - return errCode, fmt.Errorf("非会员一天只能发布一起任务,请确认!") - } - } - if job.Address != "" && (job.Lng == 0 || job.Lat == 0) { - lng, lat, _ := api.AutonaviAPI.GetCoordinateFromAddressByPage(job.Address, job.JobCityCode) - if lng == 0 || lat == 0 { - return errCode, fmt.Errorf("请填写完整且正确的门店地址!") - } - job.Lng = jxutils.StandardCoordinate2Int(lng) - job.Lat = jxutils.StandardCoordinate2Int(lat) - } - } - if job.FinishedAt.Sub(time.Now()) <= 0 { - return errCode, fmt.Errorf("任务截止日期必须大于今天!") - } - if job2, _ := dao.GetJobWithTitle(db, job.Title); job2 != nil { - return errCode, fmt.Errorf("任务标题重复,请重新输入!") - } - if job.JobCityCode != model.JobCountrywideCode { - _, _, job.JobCityCode, err = getAddressInfoFromCoord(db, job.JobLng, job.JobLat) - } - - dao.WrapAddIDCULDEntity(job, ctx.GetUserName()) - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if err = dao.CreateEntityTx(txDB, job); err != nil { - dao.Rollback(db, txDB) - return - } - for _, v := range jobExt.JobSteps { - dao.WrapAddIDCULDEntity(v, ctx.GetUserName()) - v.JobID = job.ID - err = dao.CreateEntityTx(txDB, v) - } - for _, v := range jobExt.JobImgs { - dao.WrapAddIDCULEntity(v, ctx.GetUserName()) - v.JobID = job.ID - err = dao.CreateEntityTx(txDB, v) - } - if err != nil { - dao.Rollback(db, txDB) - return - } - //发布任务要扣除任务总额的保证金,不够扣就要进行充值 - if err == nil && job.Status != model.JobStatusFailed && ctx.GetToken() != jxcontext.RsmDefultToken { - if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeDeposit, job.TotalPrice, job.ID); err != nil { - dao.Rollback(db, txDB) - return - } - } - dao.Commit(db, txDB) - if ctx.GetToken() != jxcontext.RsmDefultToken { - content := new(strings.Builder) - content.WriteString("您的任务:") - content.WriteString(job.Title) - content.WriteString("。已发布成功,已扣除您的余额:") - content.WriteString(utils.Float64ToStr(jxutils.IntPrice2Standard(int64(job.TotalPrice)))) - content.WriteString("元") - event.SendSysMessageSimple(content.String(), job.UserID) - } - return errCode, err -} - -func CancelPublishJob(ctx *jxcontext.Context, jobID int) (err error) { - var ( - db = dao.GetDB() - ) - job := &model.Job{} - job.ID = jobID - err = dao.GetEntity(db, job) - if job.UserID == "" || job.Status == model.JobStatusFailed || job.Status == model.JobStatusOverdue || job.FinishedAt.Sub(time.Now()) <= 0 || job.SurplusCount <= 0 || job.LimitCountType <= 0 { - return fmt.Errorf("未找到该任务或该任务状态不正常,无法取消!") - } - //取消已发布的任务 - userBill, err := dao.GetUserBill(db, job.UserID, "") - if userBill == nil { - return fmt.Errorf("未查询到该用户的账单!") - } - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - //如果是固定返现,退给任务发起人剩余数量*单价 - //如果是比例返现,推给任务发起人任务总价-接取这个任务的用户实际返现的价格之和 - var price int - if job.CashbackType == model.JobCashbackPrice { - price = job.SurplusCount * job.AvgPrice - } else { - if billIncomes, err := dao.GetBillIncome(db, jobID, 0); err == nil { - for _, v := range billIncomes { - price += v.IncomePrice - } - } - price = job.TotalPrice - price - } - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, price, jobID); err != nil { - dao.Rollback(db, txDB) - return - } - //3、任务状态被取消 - job.Status = model.JobStatusFailed - // job.DeletedAt = time.Now() - if _, err = dao.UpdateEntityTx(txDB, job, "Status"); err != nil { - dao.Rollback(db, txDB) - return - } - dao.Commit(db, txDB) - content := new(strings.Builder) - content.WriteString("您的任务:") - content.WriteString(job.Title) - content.WriteString("。已过期或被取消,") - content.WriteString(utils.Float64ToStr(jxutils.IntPrice2Standard(int64(price)))) - content.WriteString("元已返回您的余额中!") - event.SendSysMessageSimple(content.String(), job.UserID) - return err -} - -func GetJobs(ctx *jxcontext.Context, userIDs []string, categoryIDs, statuss, vendorIDs, cityCodes []int, includeStep bool, fromTime, toTime string, lng, lat float64, span int, keyword string, sortType, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { - var ( - db = dao.GetDB() - userID = ctx.GetUserID() - _, _, cityCode, _ = getAddressInfoFromCoord(db, lng, lat) - ) - if toTime != "" { - toTime = toTime + " 23:59:59" - } - pagedInfo, err = dao.GetJobs(db, userIDs, categoryIDs, statuss, vendorIDs, []int{model.JobTypeNormal}, cityCodes, includeStep, utils.Str2Time(fromTime), utils.Str2Time(toTime), lng, lat, cityCode, span, keyword, sortType, pageSize, offset) - //插入用户搜索关键词 - if keyword != "" && ctx.GetToken() != jxcontext.RsmDefultToken { - if userSearchs, _ := dao.GetUserSearch(db, userID, keyword); len(userSearchs) > 0 { - userSearchs[0].Count++ - userSearchs[0].UpdatedAt = time.Now() - dao.UpdateEntity(db, userSearchs[0], "Count", "UpdatedAt") - } else { - userSearch := &model.UserSearch{ - UserID: userID, - Keyword: keyword, - } - dao.WrapAddIDCULEntity(userSearch, ctx.GetUserName()) - dao.CreateEntity(db, userSearch) - } - } - return pagedInfo, err -} - -func GetJobDetail(ctx *jxcontext.Context, jobID int, lng, lat float64) (job *dao.GetJobsResult, err error) { - var ( - db = dao.GetDB() - ) - job, err = dao.GetJobDetail(db, jobID) - if job.Lng != 0 && job.Lat != 0 { - job.Distance = jxutils.EarthDistance(lng, lat, jxutils.IntCoordinate2Standard(job.Lng), jxutils.IntCoordinate2Standard(job.Lat)) - } - utils.CallFuncAsync(func() { - job2 := &model.Job{} - job2.ID = job.ID - dao.GetEntity(db, job2) - job2.BrowseCount++ - dao.UpdateEntity(db, job2, "BrowseCount") - }) - return job, err -} - -func AcceptJob(ctx *jxcontext.Context, jobID, dropShippingDeliveryID, dropShippingCount int) (jobOrderID int64, errCode string, err error) { - var ( - db = dao.GetDB() - userID = ctx.GetUserID() - num int - DayTimeBegin, DayTimeEnd = jxutils.GetDayTime() - WeekTimeBegin, WeekTimeEnd = jxutils.GetWeekTime() - ) - job := &model.Job{} - job.ID = jobID - err = dao.GetEntity(db, job) - if job.UserID == "" || job.Status == model.JobStatusFailed || job.Status == model.JobStatusOverdue || job.FinishedAt.Sub(time.Now()) <= 0 || job.SurplusCount <= 0 || job.LimitCountType <= 0 { - if job.JobCategoryID == model.JobCategoryIDUnion { - return 0, errCode, fmt.Errorf("活动已结束,请等待下批次活动!") - } else { - return 0, errCode, fmt.Errorf("未找到该任务或该任务状态不正常,无法接单!") - } - } - // num, err = checkJobOrders(db, 0, "<= "+utils.Int2Str(model.JobOrderStatusAccept), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) - // if num >= AcceptMaxCount { - // return 0, errCode, fmt.Errorf("每人最多接取" + utils.Int2Str(AcceptMaxCount) + "个任务,请核实!") - // } - //非快递任务 - if jobID != 2 && job.JobCategoryID != model.JobCategoryIDUnion { - num, err = checkJobOrders(db, jobID, "<= "+utils.Int2Str(model.JobOrderStatusWaitAudit), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) - if num > 0 { - return 0, errCode, fmt.Errorf("您还有此任务未完成,请完成后再接取!") - } - num, err = checkJobOrders(db, jobID, "= "+utils.Int2Str(model.JobOrderStatusAuditUnPass), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) - if num > 0 { - return 0, errCode, fmt.Errorf("您还有此任务未审核通过记录,可直接在未审核中重新提交!") - } - } - - switch job.LimitCountType { - case model.JobLimitCountTypePO: - num, err = checkJobOrders(db, jobID, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) - if num > 0 { - return 0, errCode, fmt.Errorf("此任务只支持每人做一次!") - } - case model.JobLimitCountTypePDO: - num, err = checkJobOrders(db, jobID, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, DayTimeBegin, DayTimeEnd) - if num > 0 { - return 0, errCode, fmt.Errorf("此任务只支持每人每天做一次!") - } - case model.JobLimitCountTypePWO: - num, err = checkJobOrders(db, jobID, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, WeekTimeBegin, WeekTimeEnd) - if num > 0 { - return 0, errCode, fmt.Errorf("此任务只支持每人每周做一次!") - } - case model.JobLimitCountTypeNoLimit: - default: - return 0, errCode, fmt.Errorf("不支持的任务限次类型!%v", job.LimitCountType) - } - jobOrder := &model.JobOrder{ - JobID: jobID, - JobOrderID: jxutils.GenJobOrderNo(), - UserID: ctx.GetUserID(), - } - jobOrder.Status = model.JobOrderStatusAccept - //如果是一件代发任务,用户需要支付订单金额 - var userBill *model.UserBill - if job.JobCategoryID == model.JobCategoryIDDropShipping { - if dropShippingCount == 0 || dropShippingDeliveryID == 0 { - return 0, errCode, fmt.Errorf("一件代发订单请输入商品数量和收件人地址!") - } - //验证微信绑定 - if err = auth2.CheckWeixinminiAuthBind(ctx.GetUserID()); err != nil { - return 0, "", err - } - //发布任务要扣除任务总额的保证金,不够扣就要进行充值 - userBill, err = dao.GetUserBill(db, ctx.GetUserID(), "") - if userBill == nil { - return 0, errCode, fmt.Errorf("未查询到该用户的账单!") - } - jobOrder.UserActualPrice = job.DropShippingSkuPrice * dropShippingCount - if userBill.AccountBalance < jobOrder.UserActualPrice { - return 0, model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足!") - } - if deliveryList, _, err2 := dao.QueryUserDeliveryAddress(db, int64(dropShippingDeliveryID), nil, 0, 0, 0); err2 == nil { - delivery := deliveryList[0] - jobOrder.DropShippingCount = dropShippingCount - jobOrder.DropShippingDeliveryID = dropShippingDeliveryID - jobOrder.DropShippingName = delivery.ConsigneeName - jobOrder.DropShippingMobile = delivery.ConsigneeMobile - jobOrder.DropShippingAddress = delivery.Address - jobOrder.DropShippingDetailAddress = delivery.DetailAddress - jobOrder.DropShippingLng = delivery.Lng - jobOrder.DropShippingLat = delivery.Lat - jobOrder.DropShippingAutoAddress = delivery.AutoAddress - jobOrder.DropShippingCityCode = delivery.CityCode - jobOrder.DropShippingDistrictCode = delivery.DistrictCode - } - // jobOrder.Status = model.JobOrderStatusWaitAudit - } else if job.JobCategoryID == model.JobCategoryIDUnion { - jobOrder.Status = model.JobOrderStatusSpec - } - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - dao.WrapAddIDCULEntity(jobOrder, ctx.GetUserName()) - if err = dao.CreateEntityTx(txDB, jobOrder); err != nil { - dao.Rollback(db, txDB) - return - } - //用户接受任务,任务剩余次数-1 - job.SurplusCount -= 1 - if _, err = dao.UpdateEntityTx(txDB, job, "SurplusCount"); err != nil { - dao.Rollback(db, txDB) - return - } - dao.Commit(db, txDB) - - if job.JobCategoryID == model.JobCategoryIDDropShipping { - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeDropShipping, jobOrder.UserActualPrice, job.ID); err != nil { - dao.Rollback(db, txDB) - return - } - //一件代发 - if err = SubmitJob(ctx, jobOrder); err != nil { - dao.Rollback(db, txDB) - return - } - dao.Commit(db, txDB) - } else if job.JobCategoryID != model.JobCategoryIDUnion { - //任务限时完成 - timer := checkLimitJobOrders(db, job, jobOrder, model.JobTimerTypeAccept) - JobTimers.s.Lock() - JobTimers.JobTimerMap[jobOrder.JobOrderID] = timer - JobTimers.s.Unlock() - } - return jobOrder.JobOrderID, errCode, err -} - -func CancelAcceptJob(ctx *jxcontext.Context, jobID int, jobOrderID int64) (err error) { - var ( - db = dao.GetDB() - ) - jobOrder := &model.JobOrder{} - jobOrder.JobOrderID = jobOrderID - err = dao.GetEntity(db, jobOrder, "JobOrderID") - if jobOrder.ID != 0 && jobOrder.Status == model.JobOrderStatusCancel { - return fmt.Errorf("此任务已被取消了!") - } - job := &model.Job{} - job.ID = jobID - err = dao.GetEntity(db, job) - //系统消息 - content := new(strings.Builder) - content.WriteString("您接取的任务:") - content.WriteString(job.Title) - if ctx.GetUserName() == "jxadmin" { - content.WriteString(",因超时未完成已被系统自动取消。") - } else { - content.WriteString(",已被取消。") - } - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - //如果当前任务状态正常,剩余数量就加1 - if job.Status >= 0 { - job.SurplusCount += 1 - if _, err = dao.UpdateEntityTx(txDB, job, "SurplusCount"); err != nil { - dao.Rollback(db, txDB) - return - } - } else { - userBill, err := dao.GetUserBill(db, job.UserID, "") - if userBill == nil { - return fmt.Errorf("未查询到该用户的账单!") - } - //如果状态不正常(取消或者过期)就要把这一笔退回去 - //2、账户收入 - //是固定返现才会退一笔任务单价 - if job.CashbackType == model.JobCashbackPrice { - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, job.AvgPrice, jobID); err != nil { - dao.Rollback(db, txDB) - return err - } - } - } - //一件代发任务要退钱给用户 - if job.JobCategoryID == model.JobCategoryIDDropShipping { - userBill, err := dao.GetUserBill(db, jobOrder.UserID, "") - if userBill == nil { - return fmt.Errorf("未查询到该用户的账单!") - } - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, jobOrder.UserActualPrice, jobID); err != nil { - dao.Rollback(db, txDB) - return err - } - } - //3、任务订单状态被取消 - jobOrder.Status = model.JobOrderStatusCancel - if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status"); err != nil { - dao.Rollback(db, txDB) - return err - } - dao.Commit(db, txDB) - event.SendSysMessageSimple(content.String(), jobOrder.UserID) - return err -} - -func checkJobOrders(db *dao.DaoDB, jobID int, statusCompareStr, userID string, fromTime, toTime time.Time) (num int, err error) { - jobOrders, err := dao.GetJobOrdersNoPage(db, jobID, 0, userID, statusCompareStr, fromTime, toTime, nil) - return len(jobOrders), err -} - -func checkLimitJobOrders(db *dao.DaoDB, job *model.Job, jobOrder *model.JobOrder, jobTimerType int) (timer *time.Timer) { - //插到定时任务表里,主要是重启项目后的重启定时器用 - //main 里有重启的函数 - jobTimer := &model.JobTimer{ - JobID: job.ID, - JobOrderID: jobOrder.JobOrderID, - Type: jobTimerType, - Status: model.JobTimerStatusWait, - StartAt: jobOrder.CreatedAt, - // LimitAt: job.JobLimitAt, - } - switch jobTimerType { - case model.JobTimerTypeAccept: - timer = time.NewTimer(time.Hour * time.Duration(job.JobLimitAt)) - jobTimer.LimitAt = job.JobLimitAt - case model.JobTimerTypeSubmit: - timer = time.NewTimer(time.Hour * time.Duration(job.AuditLimitAt)) - jobTimer.LimitAt = job.AuditLimitAt - case model.JobTimerTypeDropShipping: - timer = time.NewTimer(time.Hour * time.Duration(job.DropShippingAt)) - jobTimer.LimitAt = job.DropShippingAt - } - dao.WrapAddIDCULEntity(jobTimer, jxcontext.AdminCtx.GetUserName()) - dao.CreateEntity(db, jobTimer) - utils.CallFuncAsync(func() { - select { - case <-timer.C: - switch jobTimerType { - case model.JobTimerTypeAccept: - UpdateLimitJobOrders(db, timer, job.ID, jobOrder.JobOrderID, jobTimer) - case model.JobTimerTypeSubmit: - UpdateLimitAuditJobOrders(db, timer, job.ID, jobOrder.JobOrderID, jobTimer) - case model.JobTimerTypeDropShipping: - UpdateDropShippingJobOrders(db, timer, job.ID, jobOrder.JobOrderID, jobTimer) - } - } - }) - return timer -} - -func UpdateLimitJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrderID int64, jobTimer *model.JobTimer) { - globals.SugarLogger.Debugf("updateLimitJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrderID) - defer timer.Stop() - jobOrder := &model.JobOrder{JobOrderID: jobOrderID} - if err := dao.GetEntity(db, jobOrder, "JobOrderID"); err == nil { - if jobOrder.Status > model.JobOrderStatusAccept { - return - } - if err := CancelAcceptJob(jxcontext.AdminCtx, jobID, jobOrderID); err == nil { - jobTimer.Status = model.JobTimerStatusFinish - dao.UpdateEntity(db, jobTimer, "Status") - } - } -} - -func UpdateLimitAuditJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrderID int64, jobTimer *model.JobTimer) { - globals.SugarLogger.Debugf("checkLimitAuditJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrderID) - defer timer.Stop() - jobOrder := &model.JobOrder{JobOrderID: jobOrderID} - if err := dao.GetEntity(db, jobOrder, "JobOrderID"); err == nil { - if jobOrder.Status == model.JobOrderStatusWaitAudit { - err := AuditJob(jxcontext.AdminCtx, int(jobOrderID), model.JobOrderStatusAuditPass, "超时系统通过", "") - if err != nil { - globals.SugarLogger.Debugf("checkLimitAuditJobOrders err: %v jobID: %v, jobOrderID: %v", err, jobID, jobOrderID) - } else { - jobTimer.Status = model.JobTimerStatusFinish - dao.UpdateEntity(db, jobTimer, "Status") - } - } - } -} - -func UpdateDropShippingJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrderID int64, jobTimer *model.JobTimer) { - globals.SugarLogger.Debugf("UpdateDropShippingJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrderID) - defer timer.Stop() - jobOrder := &model.JobOrder{JobOrderID: jobOrderID} - job := &model.Job{} - job.ID = jobID - if err := dao.GetEntity(db, jobOrder, "JobOrderID"); err == nil { - if err := dao.GetEntity(db, job); err == nil { - //如果限时内还没发货 - if jobOrder.Status < model.JobOrderStatusFinish { - userBill, err := dao.GetUserBill(db, jobOrder.UserID, "") - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeDropShippingDeposit, job.AvgPrice, job.ID); err != nil { - dao.Rollback(db, txDB) - return - } - dao.Commit(db, txDB) - } - } - } - jobTimer.Status = model.JobTimerStatusFinish - dao.UpdateEntity(db, jobTimer, "Status") -} - -func SubmitJob(ctx *jxcontext.Context, jobOrder *model.JobOrder) (err error) { - var ( - db = dao.GetDB() - ) - if jobOrder.JobID == 0 || jobOrder.JobOrderID == 0 { - return fmt.Errorf("传入数据有误!") - } - job := &model.Job{} - job.ID = jobOrder.JobID - err = dao.GetEntity(db, job) - jobOrder2 := &model.JobOrder{} - jobOrder2.JobOrderID = jobOrder.JobOrderID - err = dao.GetEntity(db, jobOrder2, "JobOrderID") - //如果是比例返现 - if job.CashbackType == model.JobCashbackPercentage { - if jobOrder.UserActualPrice == 0 { - return fmt.Errorf("比例返现任务请输入订单实际实付金额,用于任务发起人审核!") - } - } - if jobOrder2.JobID == 0 { - return fmt.Errorf("未查询到相应的任务!") - } - if jobOrder2.Status >= model.JobOrderStatusWaitAudit { - return fmt.Errorf("任务订单状态有误!") - } - if ctx.GetUserID() != jobOrder2.UserID { - return fmt.Errorf("任务订单接收人有误!") - } - jobOrder2.Imgs = jobOrder.Imgs - jobOrder2.Content = jobOrder.Content - jobOrder2.SubmitAuditAt = time.Now() - jobOrder2.UserActualPrice = jobOrder.UserActualPrice - jobOrder2.Status = model.JobOrderStatusWaitAudit - if _, err = dao.UpdateEntity(db, jobOrder2, "Imgs", "Content", "SubmitAuditAt", "Status", "UserActualPrice"); err == nil { - //任务定时器停止 - JobTimers.s.RLock() - if JobTimers.JobTimerMap[jobOrder2.JobOrderID] != nil { - JobTimers.JobTimerMap[jobOrder2.JobOrderID].Stop() - //任务定时表状态完成 - jobTimer := &model.JobTimer{ - JobID: job.ID, - JobOrderID: jobOrder2.JobOrderID, - Type: model.JobTimerTypeAccept, - } - if err = dao.GetEntity(db, jobTimer, "JobID", "JobOrderID", "Type"); err == nil { - jobTimer.Status = model.JobTimerStatusFinish - dao.UpdateEntity(db, jobTimer, "Status") - } - } - JobTimers.s.RUnlock() - //一件代发 - var timerType int - if job.JobCategoryID == model.JobCategoryIDDropShipping { - timerType = model.JobTimerTypeDropShipping - } else { - timerType = model.JobTimerTypeSubmit - } - //审核定时开启 - timer := checkLimitJobOrders(db, job, jobOrder2, timerType) - JobTimers.s.Lock() - JobTimers.JobAuditTimerMap[jobOrder2.JobOrderID] = timer - JobTimers.s.Unlock() - } - content := new(strings.Builder) - content.WriteString("您的任务:") - content.WriteString(job.Title) - content.WriteString("。已有人提交了审核,请及时审核!") - event.SendSysMessageSimple(content.String(), job.UserID) - return err -} - -func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWaybillID string) (err error) { - var ( - db = dao.GetDB() - ) - jobOrder := &model.JobOrder{} - jobOrder.JobOrderID = int64(jobOrderID) - err = dao.GetEntity(db, jobOrder, "JobOrderID") - job := &model.Job{} - job.ID = jobOrder.JobID - err = dao.GetEntity(db, job) - if ctx.GetUserID() != job.UserID && ctx.GetUserName() != "jxadmin" { - return fmt.Errorf("任务发起人才能审核!") - } - if job.JobCategoryID == model.JobCategoryIDDropShipping && vendorWaybillID == "" { - return fmt.Errorf("一件代发任务发货请输入运单号!") - } - if job.JobCategoryID == model.JobCategoryIDDropShipping && status != model.JobOrderStatusAuditPass { - return fmt.Errorf("一件代发任务发货参数有误!") - } - if jobOrder.Status != model.JobOrderStatusWaitAudit { - return fmt.Errorf("审核状态不正确!") - } - //固定返现 - //1、审核时,若此任务已过期或者已取消,不通过则应将此任务保证金退还给发起人,通过则应将单次任务保证金给接受人 - //2、若此任务未过期,不通过则此任务剩余数量将+1,通过则应将单次任务保证金给接受人 - jobOrder.Status = status - jobOrder.Comment = comment - jobOrder.AuditAt = time.Now() - jobOrder.LastOperator = ctx.GetUserName() - userBillJobOrder, err := dao.GetUserBill(db, jobOrder.UserID, "") - //系统消息 - content := new(strings.Builder) - content.WriteString("恭喜您完成了任务:") - content.WriteString(job.Title) - if ctx.GetUserName() == "jxadmin" { - content.WriteString(",因超时未审核已被系统自动审核") - } else { - content.WriteString(",商家已经审核") - } - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status", "Comment", "AuditAt", "LastOperator"); err != nil { - dao.Rollback(db, txDB) - return - } - if status == model.JobOrderStatusAuditPass { - content.WriteString("通过,") - if job.JobCategoryID != model.JobCategoryIDDropShipping { - var price int - if job.CashbackType == model.JobCashbackPrice { - price = job.AvgPrice - } else { - price = jobOrder.UserActualPrice * job.Percentage / 100 - if price > job.AvgPrice { - price = job.AvgPrice - } - } - //若完成任务的人在某个群组中,则要向群主分成 - if messageGroupMembers, err := dao.GetMessageGroupMembers(db, 0, model.GroupTypeMulit, jobOrder.UserID); err == nil { - if len(messageGroupMembers) > 1 { - return fmt.Errorf("审核异常,该任务提交人加入了多个群组!") - } else if len(messageGroupMembers) == 1 { - if messageGroupsResult, err := dao.GetMessageGroups(db, "", messageGroupMembers[0].GroupID, model.GroupTypeMulit, false, ""); err == nil { - if len(messageGroupsResult) == 1 { - if messageGroupsResult[0].DividePercentage != 0 { - if userBillGroupMaster, err := dao.GetUserBill(db, messageGroupsResult[0].UserID, ""); err == nil { - if err = financial.AddIncomeUpdateAccount(txDB, userBillGroupMaster, model.BillTypeDivide, price*messageGroupsResult[0].DividePercentage/100, job.ID); err != nil { - dao.Rollback(db, txDB) - return err - } - } - //接收人账户收入 - if err = financial.AddIncomeUpdateAccount(txDB, userBillJobOrder, model.BillTypeJobDivide, price*(100-messageGroupsResult[0].DividePercentage)/100, job.ID); err != nil { - dao.Rollback(db, txDB) - return err - } - } else { - //接收人账户收入 - if err = financial.AddIncomeUpdateAccount(txDB, userBillJobOrder, model.BillTypeJob, price, job.ID); err != nil { - dao.Rollback(db, txDB) - return err - } - } - } - } - } else if len(messageGroupMembers) == 0 { //若没有在某个群组,则得到全部 - //接收人账户收入 - if err = financial.AddIncomeUpdateAccount(txDB, userBillJobOrder, model.BillTypeJob, price, job.ID); err != nil { - dao.Rollback(db, txDB) - return err - } - } - } - jobOrder.Status = model.JobOrderStatusFinish - if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status"); err != nil { - dao.Rollback(db, txDB) - return err - } - content.WriteString(utils.Float64ToStr(jxutils.IntPrice2Standard(int64(price)))) - content.WriteString("元已存入您的余额中!") - } else { - //一件代发处理,审核相当于发货 - jobOrder.VendorWaybillID = vendorWaybillID - jobOrder.Status = model.JobOrderStatusFinish - if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status", "VendorWaybillID"); err != nil { - dao.Rollback(db, txDB) - return err - } - userBill, err := dao.GetUserBill(db, job.UserID, "") - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeDropShippingDeposit, job.AvgPrice, job.ID); err != nil { - dao.Rollback(db, txDB) - return err - } - } - event.SendSysMessageSimple(content.String(), jobOrder.UserID) - } else { - content2 := new(strings.Builder) - content2.WriteString("非常抱歉,您提交的任务: ") - content2.WriteString(job.Title) - content2.WriteString("未通过审核,请您修改后重新提交!") - if job.Status < 0 { - if job.CashbackType == model.JobCashbackPrice { - userBill, err := dao.GetUserBill(db, job.UserID, "") - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobAuditUnPassWithCancelOverdue, job.AvgPrice, job.ID); err != nil { - dao.Rollback(db, txDB) - return err - } - } - } else { - //审核不通过的话,要重新变成待上传,再重新开个定时器 - jobOrder.Status = model.JobOrderStatusAccept - if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status"); err != nil { - dao.Rollback(db, txDB) - return - } - //之前的定时表删了? - jobTimer := &model.JobTimer{ - JobID: job.ID, - JobOrderID: jobOrder.JobOrderID, - } - if _, err = dao.DeleteEntityTx(txDB, jobTimer, "JobID", "JobOrderID"); err != nil { - dao.Rollback(db, txDB) - return - } - //任务限时完成 - timer := checkLimitJobOrders(db, job, jobOrder, model.JobTimerTypeAccept) - JobTimers.s.Lock() - JobTimers.JobTimerMap[jobOrder.JobOrderID] = timer - JobTimers.s.Unlock() - } - event.SendSysMessageSimple(content2.String(), jobOrder.UserID) - } - dao.Commit(db, txDB) - //任务定时器停止 - JobTimers.s.RLock() - if JobTimers.JobAuditTimerMap[int64(jobOrderID)] != nil { - JobTimers.JobAuditTimerMap[int64(jobOrderID)].Stop() - } - JobTimers.s.RUnlock() - //任务定时表状态完成 - jobTimer := &model.JobTimer{ - JobID: job.ID, - JobOrderID: jobOrder.JobOrderID, - // Type: model.JobTimerTypeSubmit, - } - if job.JobCategoryID != model.JobCategoryIDDropShipping { - jobTimer.Type = model.JobTimerTypeSubmit - } else { - jobTimer.Type = model.JobTimerTypeDropShipping - } - if err = dao.GetEntity(db, jobTimer, "JobID", "JobOrderID", "Type"); err == nil { - jobTimer.Status = model.JobTimerStatusFinish - dao.UpdateEntity(db, jobTimer, "Status") - } - return err -} - -func RefreshJobStatus(ctx *jxcontext.Context) (err error) { - var ( - db = dao.GetDB() - ) - globals.SugarLogger.Debugf("RefreshJobStatus begin...") - jobs, err := dao.GetJobsNoPage(db, nil, nil, []int{model.JobStatusDoing}, nil, utils.ZeroTimeValue, utils.ZeroTimeValue, 0, false) - if err != nil { - globals.SugarLogger.Debugf("RefreshJobStatus err :%v", err) - return - } - for _, job := range jobs { - if time.Now().Sub(*job.FinishedAt) >= 0 { - //取消已发布的任务 - userBill, err := dao.GetUserBill(db, job.UserID, "") - if userBill == nil { - return fmt.Errorf("未查询到该用户的账单!") - } - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - //如果是固定返现,退给任务发起人剩余数量*单价 - //如果是比例返现,推给任务发起人任务总价-接取这个任务的用户实际返现的价格之和 - var price int - if job.CashbackType == model.JobCashbackPrice { - price = job.SurplusCount * job.AvgPrice - } else { - if billIncomes, err := dao.GetBillIncome(db, job.ID, 0); err == nil { - for _, v := range billIncomes { - price += v.IncomePrice - } - } - price = job.TotalPrice - price - } - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, price, job.ID); err != nil { - dao.Rollback(db, txDB) - return err - } - //3、任务状态被取消 - job2 := &model.Job{} - job2.ID = job.ID - dao.GetEntity(db, job2) - if job2 != nil { - job2.Status = model.JobStatusOverdue - // job.DeletedAt = time.Now() - if _, err = dao.UpdateEntityTx(txDB, job2, "Status"); err != nil { - dao.Rollback(db, txDB) - return err - } - } - dao.Commit(db, txDB) - } - } - globals.SugarLogger.Debugf("RefreshJobStatus end...") - return err -} - -func ImprotMtMembers(ctx *jxcontext.Context, mtMembers []*model.MtMember) (err error) { - var ( - db = dao.GetDB() - ) - for _, v := range mtMembers { - v.ShortLink = v.URL[strings.LastIndex(v.URL, "/")+1 : len(v.URL)] - dao.WrapAddIDCULDEntity(v, ctx.GetUserName()) - } - if err = dao.CreateMultiEntities(db, mtMembers); err == nil { - job, err := dao.GetJob(db, nil, nil, nil, []int{model.JobTypeMtMember}, utils.ZeroTimeValue, utils.ZeroTimeValue, false) - if job != nil && err == nil { - job.Count += len(mtMembers) - job.SurplusCount += len(mtMembers) - dao.UpdateEntity(db, job, "Count", "SurplusCount") - } - } - return err -} - -func RechargeMtMembers(ctx *jxcontext.Context, phone int) (errCode string, err error) { - var ( - db = dao.GetDB() - db2 = dao.GetDB() - userID = ctx.GetUserID() - ) - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - nums, err := dao.GetMtMembers(db) - if nums < 10 { - utils.CallFuncAsync(func() { - ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "F4836F9238F611EB9101525400C36BDA", "美团会员券", "美团会员券仅剩"+utils.Int2Str(nums)+"张了!") - ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "EFA9876238FC11EB9101525400C36BDA", "美团会员券", "美团会员券仅剩"+utils.Int2Str(nums)+"张了!") - }) - } - if err != nil { - dao.Rollback(db, txDB) - return errCode, err - } - //验证微信绑定 - if err = auth2.CheckWeixinminiAuthBind(userID); err != nil { - dao.Rollback(db, txDB) - return "", err - } - //特殊任务,如美团会员,是直接要支付 - userBill, err := dao.GetUserBill(db, userID, "") - if err != nil { - return errCode, err - } - if userBill.AccountBalance < mtwmMemberPrice { - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足,请充值!") - } - //账户支出 - if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeSpJob, mtwmMemberPrice, 1); err != nil { - dao.Rollback(db, txDB) - return errCode, err - } - dao.Commit(db, txDB) - for { - txDB, _ := dao.Begin(db2) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db2, txDB) - panic(r) - } - }() - mtMember, err := dao.GetMtMember(db2) - if mtMember == nil { - return errCode, fmt.Errorf("补券中,请稍后再试!") - } - err = api.MtMemberAPI.RechargeExchange(phone, mtMember.ShortLink) - mtMember.DeletedAt = time.Now() - dao.UpdateEntity(db2, mtMember, "DeletedAt") - dao.Commit(db2, txDB) - if err == nil { - job, err := dao.GetJob(db2, nil, nil, nil, []int{model.JobTypeMtMember}, utils.ZeroTimeValue, utils.ZeroTimeValue, false) - _, errCode, err = AcceptJob(ctx, job.ID, 0, 0) - if errCode != "" { - return errCode, err - } - if err != nil { - return errCode, err - } - break - } - } - return errCode, err -} - -func SendJdDelivery(ctx *jxcontext.Context, dOrder *model.DeliveryOrder) (errCode string, err error) { - var ( - db = dao.GetDB() - ) - if dOrder.Weight == 0 { - return errCode, fmt.Errorf("重量必须填写!") - } - if dOrder.PayPrice == 0 { - if dOrder.Weight <= 3 { - dOrder.PayPrice = 1000 - } else { - dOrder.PayPrice = 1000 + int(float64(waybillKgPrice)*math.Ceil(dOrder.Weight-3)) - } - } - var ( - sendDelivery *dao.UserDeliveryAddressEx - receiveDelivery *dao.UserDeliveryAddressEx - ) - sendDeliveryList, _, err := dao.QueryUserDeliveryAddress(db, int64(dOrder.DeliverySendID), nil, 0, 0, 0) - receiveDeliveryList, _, err := dao.QueryUserDeliveryAddress(db, int64(dOrder.DeliveryReceiveID), nil, 0, 0, 0) - userBill, err := dao.GetUserBill(db, ctx.GetUserID(), "") - if err != nil { - return errCode, err - } - //验证微信绑定 - if err = auth2.CheckWeixinminiAuthBind(ctx.GetUserID()); err != nil { - return "", err - } - if userBill.AccountBalance < dOrder.PayPrice { - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足,请充值!") - } - if len(sendDeliveryList) == 0 { - return errCode, fmt.Errorf("未找到寄件人地址!") - } else { - sendDelivery = sendDeliveryList[0] - } - if len(receiveDeliveryList) == 0 { - return errCode, fmt.Errorf("未找到取件人地址!") - } else { - receiveDelivery = receiveDeliveryList[0] - } - //内蒙古海南统一35 - //新疆西藏统一45 - if receiveDelivery.ParentCode == 150000 || receiveDelivery.ParentCode == 460000 || - receiveDelivery.ParentCode == 650000 || receiveDelivery.ParentCode == 540000 || - sendDelivery.ParentCode == 150000 || sendDelivery.ParentCode == 460000 || - sendDelivery.ParentCode == 650000 || sendDelivery.ParentCode == 540000 { - return errCode, fmt.Errorf("暂不支持该地区的快递业务!") - } - sendProvinceName := "" - receiveProvinceName := "" - if place1, err := dao.GetPlaceByCode(db, sendDelivery.CityCode); err == nil { - if place2, err2 := dao.GetPlaceByCode(db, place1.ParentCode); err2 == nil { - sendProvinceName = place2.Name - } - } - if place1, err := dao.GetPlaceByCode(db, receiveDelivery.CityCode); err == nil { - if place2, err2 := dao.GetPlaceByCode(db, place1.ParentCode); err2 == nil { - receiveProvinceName = place2.Name - } - } - dao.WrapAddIDCULEntity(dOrder, ctx.GetUserName()) - if vendorWaybillID, err := api.JdEclpAPI.WaybillReceive(&jdeclpapi.WaybillReceiveParam{ - SalePlat: jdeclpapi.SalePlatSourceDelivery, - CustomerCode: jdeclpapi.CustomerCode, - OrderID: utils.Int64ToStr(jxutils.GenOrderNo()), - SenderName: sendDelivery.ConsigneeName, - SenderAddress: sendProvinceName + sendDelivery.CityName + sendDelivery.DistrictName + sendDelivery.Address + sendDelivery.DetailAddress, - SenderTel: sendDelivery.ConsigneeMobile, - ReceiveName: receiveDelivery.ConsigneeName, - ReceiveAddress: receiveProvinceName + receiveDelivery.CityName + receiveDelivery.DistrictName + receiveDelivery.Address + receiveDelivery.DetailAddress, - ReceiveTel: receiveDelivery.ConsigneeMobile, - Weight: dOrder.Weight, - Vloumn: dOrder.Vloumn, - PackageCount: dOrder.PackageCount, - Description: dOrder.Description, - Aging: 5, - PromiseTimeType: 1, //特惠送 - }); err == nil { - dOrder.VendorWaybillID = vendorWaybillID - } else { - return errCode, err - } - dOrder.Status = model.OrderStatusNew - dOrder.UserID = ctx.GetUserID() - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - //账户支出明细 - if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeSpJob, dOrder.PayPrice, 2); err != nil { - dao.Rollback(db, txDB) - return - } - dOrder.SendName = sendDelivery.ConsigneeName - dOrder.SendMobile = sendDelivery.ConsigneeMobile - dOrder.SendAddress = sendDelivery.Address - dOrder.SendAutoAddress = sendDelivery.AutoAddress - dOrder.SendCityCode = sendDelivery.CityCode - dOrder.SendDetailAddress = sendDelivery.DetailAddress - dOrder.SendLng = sendDelivery.Lng - dOrder.SendLat = sendDelivery.Lat - dOrder.ReceiveName = receiveDelivery.ConsigneeName - dOrder.ReceiveMobile = receiveDelivery.ConsigneeMobile - dOrder.ReceiveAddress = receiveDelivery.Address - dOrder.ReceiveAutoAddress = receiveDelivery.AutoAddress - dOrder.ReceiveCityCode = receiveDelivery.CityCode - dOrder.ReceiveDetailAddress = receiveDelivery.DetailAddress - dOrder.ReceiveLng = receiveDelivery.Lng - dOrder.ReceiveLat = receiveDelivery.Lat - if err = dao.CreateEntity(db, dOrder); err != nil { - dao.Rollback(db, txDB) - return - } - dao.Commit(db, txDB) - utils.CallFuncAsync(func() { - job, _ := dao.GetJob(db, nil, nil, nil, []int{model.JobTypeJdDelivery}, utils.ZeroTimeValue, utils.ZeroTimeValue, false) - if jobOrderID, _, err := AcceptJob(ctx, job.ID, 0, 0); err == nil { - dOrder.JobOrderID = utils.Int64ToStr(jobOrderID) - dao.UpdateEntity(db, dOrder, "JobOrderID") - } - }) - return errCode, err -} - -func CancelJdDelivery(ctx *jxcontext.Context, vendorWaybillID, reason string) (err error) { - var ( - db = dao.GetDB() - dOrder = &model.DeliveryOrder{ - VendorWaybillID: vendorWaybillID, - } - // DayTimeBegin, DayTimeEnd = jxutils.GetDayTime() - ) - err = dao.GetEntity(db, dOrder, "VendorWaybillID") - userBill, err := dao.GetUserBill(db, ctx.GetUserID(), "") - // dOrders, err := dao.GetDeliveryOrdersNoPage(db, []string{ctx.GetUserID()}, []int{model.OrderStatusCanceled}, DayTimeBegin, DayTimeEnd, nil) - // if err != nil { - // return err - // } - // if len(dOrders) > 0 { - // return fmt.Errorf("抱歉,您已经在今天取消过京东物流订单!") - // } - if dOrder.ID == 0 { - return fmt.Errorf("未找到该运单!") - } - if err = api.JdEclpAPI.CancelWayBill(&jdeclpapi.CancelWayBillParam{ - WaybillCode: vendorWaybillID, - CustomerCode: jdeclpapi.CustomerCode, - Source: "JOS", - CancelReason: reason, - OperatorName: ctx.GetUserName(), - }); err != nil { - return err - } - dOrder.Status = model.OrderStatusCanceled - dOrder.OrderFinishedAt = time.Now() - dOrder.Comment = reason - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if _, err = dao.UpdateEntity(db, dOrder, "Status", "OrderFinishedAt", "Comment"); err != nil { - dao.Rollback(db, txDB) - return - } - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeSpJob, dOrder.PayPrice, 2); err != nil { - dao.Rollback(db, txDB) - return - } - if err = CancelAcceptJob(ctx, 2, utils.Str2Int64(dOrder.JobOrderID)); err != nil { - dao.Rollback(db, txDB) - } - dao.Commit(db, txDB) - return err -} - -func GetJdDelivery(ctx *jxcontext.Context, status int, fromTime, toTime string, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { - var ( - db = dao.GetDB() - statuss []int - ) - if status != 0 { - statuss = append(statuss, status) - } - RefreshJdDelivery(ctx) - return dao.GetDeliveryOrders(db, []string{ctx.GetUserID()}, statuss, utils.Str2Time(fromTime), utils.Str2Time(toTime), pageSize, offset) -} - -func RefreshJdDelivery(ctx *jxcontext.Context) (err error) { - var ( - db = dao.GetDB() - userID string - userIDs []string - ) - if ctx.GetUserName() == "jxadmin" { - userID = "" - userIDs = nil - } else { - userID = ctx.GetUserID() - userIDs = append(userIDs, userID) - } - pages, _ := dao.GetDeliveryOrders(db, userIDs, []int{model.OrderStatusNew, model.OrderStatusDelivering}, utils.ZeroTimeValue, utils.ZeroTimeValue, 9999, 0) - list := pages.Data.([]*dao.GetDeliveryOrdersResult) - task := tasksch.NewParallelTask("RefreshJdDelivery", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), jxcontext.AdminCtx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*dao.GetDeliveryOrdersResult) - if v != nil && v.VendorWaybillID != "" { - var ( - isDeliverying, isFinished, isCancel bool - ) - if results, err := api.JdEclpAPI.QueryDynamicTraceInfo(v.VendorWaybillID); err == nil { - for _, result := range results { - if result.State == jdeclpapi.TraceInfoStateM640 { - isDeliverying = true - } - if result.State == jdeclpapi.TraceInfoStateM650 || result.State == jdeclpapi.TraceInfoStateM790 { - isCancel = true - break - } - if result.State == jdeclpapi.TraceInfoState150 { - isFinished = true - break - } - } - } - dOrder := &model.DeliveryOrder{} - dOrder.VendorWaybillID = v.VendorWaybillID - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if err = dao.GetEntity(db, dOrder, "VendorWaybillID"); err == nil { - if isCancel { - //退钱给发快递的 - dOrder.Status = model.OrderStatusCanceled - userBill, _ := dao.GetUserBill(db, v.UserID, "") - err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeSpJob, v.PayPrice+v.DiffPrice, 2) - } else if isFinished { - //快递任务要完成 - dOrder.Status = model.OrderStatusFinished - err = AuditJob(ctx, utils.Str2Int(dOrder.JobOrderID), model.JobOrderStatusAuditPass, "快递完成,自动审核通过", "") - } else if isDeliverying { - dOrder.Status = model.OrderStatusDelivering - } else { - return retVal, err - } - if err == nil { - dao.UpdateEntityTx(txDB, dOrder, "Status") - } else { - if strings.Contains(err.Error(), "审核状态不正确") { - dao.UpdateEntityTx(txDB, dOrder, "Status") - } - } - } - dao.Commit(db, txDB) - } - return retVal, err - }, list) - tasksch.HandleTask(task, nil, true).Run() - task.GetID() - return err -} - -func GetDeliveryDetail(ctx *jxcontext.Context, vendorWaybillID string) (queryDynamicTraceInfo []*jdeclpapi.QueryDynamicTraceInfoResult, err error) { - return api.JdEclpAPI.QueryDynamicTraceInfo(vendorWaybillID) -} - -func GetAllDeliveryDetail(ctx *jxcontext.Context, vendorWaybillID, comType string) (result *txcloudapi.GetWaybillDetailInfoResult, err error) { - var ( - db = dao.GetDB() - getWaybillDetailInfoResult = &txcloudapi.GetWaybillDetailInfoResult{} - ) - jobOrder := &model.JobOrder{ - VendorWaybillID: vendorWaybillID, - } - err = dao.GetEntity(db, jobOrder, "VendorWaybillID") - if jobOrder == nil { - return result, fmt.Errorf("运单号有误,无法查询!") - } - if jobOrder.WaybillStatus >= model.OrderStatusFinished { - json.Unmarshal([]byte(jobOrder.WaybillInfo), &getWaybillDetailInfoResult) - return getWaybillDetailInfoResult, err - } - //距上次查询时间要大于12小时的,才去真正查 - if jobOrder.WaybillQueryTime != utils.ZeroTimeValue { - if time.Now().Sub(jobOrder.WaybillQueryTime) <= time.Hour*12 { - json.Unmarshal([]byte(jobOrder.WaybillInfo), &getWaybillDetailInfoResult) - return getWaybillDetailInfoResult, err - } - } - if getWaybillDetailInfoResult, err = api.TxAPI.GetWaybillDetailInfo(vendorWaybillID, comType); err != nil { - return nil, err - } - jobOrder.WaybillQueryTime = time.Now() - if waybillInfo, err := json.Marshal(getWaybillDetailInfoResult); err == nil { - jobOrder.WaybillInfo = string(waybillInfo) - } - if getWaybillDetailInfoResult.State == utils.Int2Str(txcloudapi.StatusFinished) && jobOrder.WaybillStatus < model.OrderStatusFinished { - jobOrder.WaybillStatus = model.OrderStatusFinished - } - dao.UpdateEntity(db, jobOrder, "WaybillQueryTime", "WaybillInfo", "WaybillStatus") - return getWaybillDetailInfoResult, err -} - -func CheckJdDeliveryWeight(ctx *jxcontext.Context) (err error) { - var ( - db = dao.GetDB() - ) - userBill, err := dao.GetUserBill(db, ctx.GetUserID(), "") - if userBill.AccountBalance < 0 { - return fmt.Errorf("您有京东物流订单实际超重,请支付欠款!") - } - deliveryOrders, err := dao.GetDeliveryOrdersNoPage(db, []string{ctx.GetUserID()}, nil, utils.ZeroTimeValue, utils.ZeroTimeValue, []int{0}) - if err != nil { - return err - } - task := tasksch.NewParallelTask("CheckJdDeliveryWeight", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), jxcontext.AdminCtx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - deliveryOrder := batchItemList[0].(*model.DeliveryOrder) - waybill, err := api.JdEclpAPI.WaybillQuery(deliveryOrder.VendorWaybillID) - if err == nil { - return retVal, err - } - if waybill.DeliveryID == "" { - return retVal, err - } - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if waybill.DeliveryID == deliveryOrder.VendorWaybillID { - deliveryOrder.IsWeight = 1 //合格 - if waybill.Weight > 3 && math.Floor(deliveryOrder.Weight) < math.Floor(waybill.Weight) { - diffPrice := (math.Floor(waybill.Weight) - math.Floor(deliveryOrder.Weight)) * waybillKgPrice - if err != nil { - return retVal, err - } - if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeJdWaybillOverWeight, utils.Float64TwoInt(diffPrice), 2); err != nil { - txDB.Rollback() - return retVal, err - } - deliveryOrder.IsWeight = 2 //超重 - deliveryOrder.DiffPrice = utils.Float64TwoInt(diffPrice) - } - } - deliveryOrder.ActualWeight = waybill.Weight - dao.UpdateEntityTx(txDB, deliveryOrder, "IsWeight", "ActualWeight", "DiffPrice") - dao.Commit(db, txDB) - return retVal, err - }, deliveryOrders) - tasksch.HandleTask(task, nil, true).Run() - task.GetID() - return err -} - -func ResetJobTimers() { - var ( - db = dao.GetDB() - ) - jobTimers, err := dao.GetJobTimers(db, model.JobTimerStatusWait) - if err != nil { - return - } - task := tasksch.NewParallelTask("ResetJobTimers", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), jxcontext.AdminCtx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - jobTimer := batchItemList[0].(*model.JobTimer) - timer := time.NewTimer(jobTimer.StartAt.Add(time.Duration(jobTimer.LimitAt) * time.Hour).Sub(time.Now())) - jobOrders, err := dao.GetJobOrdersNoPage(db, jobTimer.JobID, jobTimer.JobOrderID, "", "", utils.ZeroTimeValue, utils.ZeroTimeValue, nil) - if err != nil { - return retVal, err - } - utils.CallFuncAsync(func() { - select { - case <-timer.C: - switch jobTimer.Type { - case model.JobTimerTypeAccept: - UpdateLimitJobOrders(db, timer, jobTimer.JobID, jobOrders[0].JobOrderID, jobTimer) - case model.JobTimerTypeSubmit: - UpdateLimitAuditJobOrders(db, timer, jobTimer.JobID, jobOrders[0].JobOrderID, jobTimer) - case model.JobTimerTypeDropShipping: - UpdateDropShippingJobOrders(db, timer, jobTimer.JobID, jobOrders[0].JobOrderID, jobTimer) - } - } - }) - return retVal, err - }, jobTimers) - tasksch.HandleTask(task, nil, true).Run() - task.GetID() -} - -func CreateJobSpan(ctx *jxcontext.Context, jobIDs []int, endAt string, span int) (err error) { - var ( - db = dao.GetDB() - maxSeq = 0 - ) - if span == model.JobSpanTop { - maxSeq, err = dao.GetMaxJobTopSeq(db) - } else { - maxSeq, err = dao.GetMaxJobRecmdSeq(db) - } - for k, jobID := range jobIDs { - endAt2 := utils.Str2Time(endAt) - jonSpan := &model.JobSpan{ - JobID: jobID, - EndAt: &endAt2, - SpanType: span, - } - if err = dao.CreateEntity(db, jonSpan); err == nil { - job := &model.Job{} - job.ID = jobID - if err = dao.GetEntity(db, job); err == nil { - if span == model.JobSpanTop { - job.TopSeq = k + 1 + maxSeq - job.JobSpanTop = 1 - dao.UpdateEntity(db, job, "TopSeq", "JobSpanTop") - } else { - job.RecmdSeq = k + 1 + maxSeq - job.JobSpanRecmd = 1 - dao.UpdateEntity(db, job, "RecmdSeq", "JobSpanRecmd") - } - } - } - } - return err -} - -func RefreshJobSpan(ctx *jxcontext.Context) (err error) { - var ( - db = dao.GetDB() - ) - jobSpans, err := dao.GetJobSpans(db) - task := tasksch.NewParallelTask("RefreshJobSpan", tasksch.NewParallelConfig().SetIsContinueWhenError(true), jxcontext.AdminCtx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - jobSpan := batchItemList[0].(*model.JobSpan) - if time.Now().Sub(*jobSpan.EndAt) >= 0 { - job := &model.Job{} - job.ID = jobSpan.JobID - if err = dao.GetEntity(db, job); err == nil { - if jobSpan.SpanType == model.JobSpanTop { - job.TopSeq = 0 - job.JobSpanTop = 0 - dao.UpdateEntity(db, job, "TopSeq", "JobSpanTop") - } else { - job.RecmdSeq = 0 - job.JobSpanRecmd = 0 - dao.UpdateEntity(db, job, "RecmdSeq", "JobSpanRecmd") - } - } - jobSpan.DeletedAt = time.Now() - dao.UpdateEntity(db, jobSpan, "DeletedAt") - } - return retVal, err - }, jobSpans) - tasksch.HandleTask(task, nil, true).Run() - task.GetID() - return err -} - -func ReloadJobSpan(ctx *jxcontext.Context, jobIDs []int, span int) (err error) { - var ( - db = dao.GetDB() - ) - for k, v := range jobIDs { - job := &model.Job{} - job.ID = v - if err = dao.GetEntity(db, job); err == nil { - if span == model.JobSpanTop { - if job.JobSpanTop == model.JobSpanTop { - job.TopSeq = k + 1 - dao.UpdateEntity(db, job, "TopSeq") - } else { - continue - } - } else { - if job.JobSpanRecmd == 1 { - job.RecmdSeq = k + 1 - dao.UpdateEntity(db, job, "RecmdSeq") - } else { - continue - } - } - } - } - return err -} - -func ConfirmDropShippingJob(ctx *jxcontext.Context, jobOrderID int) (err error) { - var ( - db = dao.GetDB() - ) - jobOrder := &model.JobOrder{ - JobOrderID: int64(jobOrderID), - } - if err = dao.GetEntity(db, jobOrder, "JobOrderID"); err != nil { - return err - } - job := &model.Job{} - job.ID = jobOrder.JobID - if err = dao.GetEntity(db, job); err != nil { - return err - } - if ctx.GetUserID() != jobOrder.UserID && ctx.GetUserName() != "jxadmin" { - return fmt.Errorf("只有任务接取人才能确认收货!") - } - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - //确认收货更新时间和收货人 - jobOrder.DropShippingConfirmTime = time.Now() - jobOrder.DropShippingConfirmUser = ctx.GetUserName() - jobOrder.Status = model.OrderStatusConfirm - if _, err = dao.UpdateEntity(db, jobOrder, "DropShippingConfirmTime", "DropShippingConfirmUser", "Status"); err != nil { - dao.Rollback(db, txDB) - return - } - userBill, err := dao.GetUserBill(db, job.UserID, "") - if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeDropShipping, jobOrder.UserActualPrice, job.ID); err != nil { - dao.Rollback(db, txDB) - return - } - dao.Commit(db, txDB) - return err -} - -func RefreshDropShippingJob(ctx *jxcontext.Context) (err error) { - var ( - db = dao.GetDB() - jobOrders []*model.JobOrder - ) - if time.Now().Weekday() != 5 && time.Now().Weekday() != 1 { - return - } - //找出没有完成的,顺便刷成完成 - sql := ` - SELECT a.* - FROM job_order a - JOIN job b ON a.job_id = b.id AND b.job_category_id = ? - WHERE a.waybill_status <= ? - AND a.drop_shipping_confirm_user = '' - AND a.status = ? - AND a.vendor_waybill_id <> '' - ` - sqlParams := []interface{}{ - model.JobCategoryIDDropShipping, - model.OrderStatusFinished, - model.OrderStatusFinished, - } - err = dao.GetRows(db, &jobOrders, sql, sqlParams) - task := tasksch.NewParallelTask("RefreshDropShippingJob", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - jobOrder := batchItemList[0].(*model.JobOrder) - result, err := GetAllDeliveryDetail(ctx, jobOrder.VendorWaybillID, "") - //完成了的,现在判断是如果收货时间已经过了3天了就自动确认收货 - if result.State == utils.Int2Str(txcloudapi.StatusFinished) && time.Now().Sub(utils.Str2Time(result.UpdateTime)) > time.Hour*72 { - err = ConfirmDropShippingJob(ctx, int(jobOrder.JobOrderID)) - } - return retVal, err - }, jobOrders) - tasksch.HandleTask(task, nil, true).Run() - task.GetID() - return err -} - -func AddressDistinguish(ctx *jxcontext.Context, address string) (result *txcloudapi.AddressDistinguishResult, err error) { - var ( - db = dao.GetDB() - addressDistinguish = &model.AddressDistinguish{Address: address} - ) - if len(address) <= 11 { - return result, fmt.Errorf("地址长度过短,请确认后再进行识别!") - } - //建了个表,有查过的记录就存一下吧 - if err = dao.GetEntity(db, addressDistinguish, "Address"); err == nil && addressDistinguish.ID != 0 { - if err = json.Unmarshal([]byte(addressDistinguish.Info), &result); err == nil { - return result, err - } - } - result, err = api.TxAPI.AddressDistinguish(address) - result.Lng, result.Lat, err = api.AutonaviAPI.GetCoordinateFromAddressByPage(result.AddressDetail, result.CityCode) - if data, err := json.Marshal(result); err == nil { - addressDistinguish.Info = string(data) - dao.CreateEntity(db, addressDistinguish) - } - return result, err -} - -func UpdateJob(ctx *jxcontext.Context, payload map[string]interface{}) (err error) { - var ( - db = dao.GetDB() - jobExt = &model.JobExt{} - job2 = &model.Job{} - ) - utils.Map2StructByJson(payload, &jobExt, false) - job2.ID = int(utils.MustInterface2Int64(payload["id"])) - dao.GetEntity(db, job2) - valid := dao.StrictMakeMapByStructObject(payload, job2, ctx.GetUserName()) - if len(valid) > 0 { - txDB, _ := dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db, txDB) - panic(r) - } - }() - if _, err = dao.UpdateEntityByKV(db, job2, valid, nil); err != nil { - dao.Rollback(db, txDB) - return err - } - if len(jobExt.JobSteps) > 0 { - steps, _ := dao.GetJobSteps(db, job2.ID) - for _, v := range steps { - v.DeletedAt = time.Now() - dao.UpdateEntity(db, v, "DeletedAt") - } - for _, v := range jobExt.JobSteps { - v.DeletedAt = utils.DefaultTimeValue - v.LastOperator = ctx.GetUserName() - v.JobID = job2.ID - dao.CreateEntity(db, v) - } - } - if len(jobExt.JobImgs) > 0 { - imgs, _ := dao.GetJobImgs(db, job2.ID) - for _, v := range imgs { - dao.DeleteEntity(db, v) - } - for _, v := range jobExt.JobImgs { - v.LastOperator = ctx.GetUserName() - v.JobID = job2.ID - dao.CreateEntity(db, v) - } - } - dao.Commit(db, txDB) - } - return err -} - -type Store struct { - model.ModelIDCULD - - OriginalName string `orm:"-" json:"originalName"` - Name string `orm:"size(255)" json:"name"` - CityCode int `orm:"default(0);null" json:"cityCode"` // todo ? - DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ? - Address string `orm:"size(255)" json:"address"` - Tel1 string `orm:"size(32);index" json:"tel1"` - Tel2 string `orm:"size(32);index" json:"tel2"` - OpenTime1 int16 `json:"openTime1" validate:"max=2359,min=1,ltfield=CloseTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 - CloseTime1 int16 `json:"closeTime1" validate:"max=2359,min=1` // 格式同上 - OpenTime2 int16 `json:"openTime2" validate:"max=2359,min=1,ltfield=CloseTime2"` // 格式同上 - CloseTime2 int16 `json:"closeTime2" validate:"max=2359,min=1` // 格式同上 - Lng int `json:"-"` // 乘了10的6次方 - Lat int `json:"-"` // 乘了10的6次方 - DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 - DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 - Status int `json:"status"` - AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用) - ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 - SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息(每天只推一条) - SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息 - AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型 - LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID - StoreLevel string `orm:"default(C);size(32)" json:"storeLevel"` // 门店等级(筛选用,京西的) - Comment string `orm:"size(255)" json:"comment"` //门店备注 - - PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机 - PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-1:小,0:正常,1:大 - PrinterVendorID int `orm:"column(printer_vendor_id);" json:"printerVendorID"` - PrinterSN string `orm:"size(32);column(printer_sn);index" json:"printerSN"` - PrinterKey string `orm:"size(64)" json:"printerKey"` - PrinterBindInfo string `orm:"size(1024)" json:"-"` - - IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"` - IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"` - IDCardHand string `orm:"size(255);column(id_card_hand)" json:"idCardHand"` - Licence string `orm:"size(255)" json:"licence"` // 营业执照图片 - LicenceCode string `orm:"size(32)" json:"licenceCode"` - - LicenceType int8 `json:"licenceType"` // 营业执照类型,0:个人,1:公司 - LicenceCorpName string `orm:"size(64)" json:"licenceCorpName"` // 营业执照公司名称 - LicenceOwnerName string `orm:"size(8)" json:"licenceOwnerName"` // 法人姓名 - LicenceAddress string `orm:"size(255)" json:"licenceAddress"` // 地址 - LicenceValid string `orm:"size(32)" json:"licenceValid"` // 有效期开始 - LicenceExpire string `orm:"size(32)" json:"licenceExpire"` // 有效期结束 - - IDName string `orm:"size(8);column(id_name)" json:"idName"` // 身份证姓名 - IDCode string `orm:"size(32);column(id_code)" json:"idCode"` // 身份证号 - IDValid string `orm:"column(id_valid);size(32)" json:"idValid"` // 有效期开始 - IDExpire string `orm:"column(id_expire);size(32)" json:"idExpire"` // 有效期结束 - - Licence2Image string `orm:"size(255)" json:"licence2Image"` // 食品经营许可证 - Licence2Code string `orm:"size(32)" json:"licence2Code"` // 食品经营许可证编号 - Licence2Valid string `orm:"size(32)" json:"licence2Valid"` // 有效期开始 - Licence2Expire string `orm:"size(32)" json:"licence2Expire"` // 有效期结束 - - // MarketManName string `orm:"size(8)" json:"marketManName"` // 市场负责人姓名 - MarketManPhone string `orm:"size(16)" json:"marketManPhone"` // 市场负责人电话 - MarketManRole string `orm:"size(32)" json:"marketManRole"` // 市场负责人组(角色,单人) - - JxBrandFeeFactor int `json:"jxBrandFeeFactor"` // 京西品牌费因子 - MarketAddFeeFactor int `json:"marketAddFeeFactor"` // 市场附加费因子 - - PayeeName string `orm:"size(8)" json:"payeeName"` // 收款人姓名 - PayeeAccountNo string `orm:"size(255)" json:"payeeAccountNo"` // 收款账号 - PayeeBankBranchName string `orm:"size(255)" json:"payeeBankBranchName"` // 开户支行 - PayeeBankCode string `orm:"size(8)" json:"payeeBankCode"` // 开户行代码 - PayPercentage int `json:"payPercentage"` - OldPayPercentage int `json:"oldPayPercentage"` - - StoreFrontPic string `orm:"size(255)" json:"storeFrontPic"` //门面照 - StoreInPic string `orm:"size(255)" json:"storeInPic"` //门店内照片 - - // OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名 - OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 京东运营人电话 - OperatorRole string `orm:"size(32)" json:"operatorRole"` // 京东运营人组(角色) - - OperatorPhone2 string `orm:"size(16)" json:"operatorPhone2"` // 美团运营人电话 - OperatorRole2 string `orm:"size(32)" json:"operatorRole2"` // 美团运营人组(角色) - - OperatorPhone3 string `orm:"size(16)" json:"operatorPhone3"` // 饿百运营人电话 - OperatorRole3 string `orm:"size(32)" json:"operatorRole3"` // 饿百运营人组(角色) - - PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告) - IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料 - SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例 - Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图 - BrandID int `orm:"column(brand_id)" json:"brandID"` //品牌ID - VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"` -} - -func TempJob() (err error) { - //var ( - // db = dao.GetDB() - // ctx = jxcontext.AdminCtx - // storesJD []*Store - // storesMT []*Store - //) - //db.Db.Using("c4") - //sql := ` - // SELECT a.*, b.vendor_store_id - // FROM store a - // JOIN store_map b ON a.id = b.store_id AND b.vendor_id = 0 AND b.deleted_at = ? AND b.vendor_store_id <> '' - // WHERE a.deleted_at = ? - // AND a.id <> 667281 - // AND a.id <> 667278 - // AND a.status IN (1,0) - //` - //sqlParams := []interface{}{utils.DefaultTimeValue, utils.DefaultTimeValue} - //if err = dao.GetRows(db, &storesJD, sql, sqlParams); err != nil { - // return err - //} - //sql2 := ` - // SELECT a.*, b.vendor_store_id - // FROM store a - // JOIN store_map b ON a.id = b.store_id AND b.vendor_id = 1 AND b.deleted_at = ? AND b.vendor_store_id <> '' - // WHERE a.deleted_at = ? - // AND a.id <> 667281 - // AND a.id <> 667278 - // AND a.status IN (1,0) - //` - //sqlParams2 := []interface{}{utils.DefaultTimeValue, utils.DefaultTimeValue} - //if err = dao.GetRows(db, &storesMT, sql2, sqlParams2); err != nil { - // return err - //} - //db.Db.Using("default") - //task := tasksch.NewParallelTask("TempJob", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, - // func(task2 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // step := batchItemList[0].(int) - // switch step { - // case 0: - // task := tasksch.NewParallelTask("TempJob1", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, - // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // store := batchItemList[0].(*Store) - // job := &model.Job{ - // UserID: "906380C7390E11EB8831525400C36BDA", - // JobCategoryID: 3, - // Title: "京东(" + store.Name + ")", - // Content: "领取任务后,需要尽快去完成,并提交截图。如超时未完成,任务会被取消", - // Count: 1000, - // AvgPrice: 300, - // TotalPrice: 300000, - // Status: 0, - // Address: store.Address, - // StoreURL: store.VendorStoreID, - // SurplusCount: 1000, - // JobLimitAt: 72, - // AuditLimitAt: 168, - // LimitCountType: 3, - // VendorID: 0, - // CashbackType: 1, - // JobLat: jxutils.IntCoordinate2Standard(store.Lat), - // JobLng: jxutils.IntCoordinate2Standard(store.Lng), - // Lng: store.Lng, - // Lat: store.Lat, - // JobCityCode: store.CityCode, - // } - // finishAt := utils.Str2Time("2021-12-31 00:00:00") - // job.FinishedAt = &finishAt - // dao.WrapAddIDCULDEntity(job, ctx.GetUserName()) - // if err = dao.CreateEntity(db, job); err == nil { - // jobsteps, _ := dao.GetJobSteps(db, 171) - // for _, v := range jobsteps { - // jobStep := &model.JobStep{ - // JobID: job.ID, - // StepCount: v.StepCount, - // Content: v.Content, - // Img: v.Img, - // Type: v.Type, - // } - // dao.WrapAddIDCULDEntity(jobStep, ctx.GetUserName()) - // err = dao.CreateEntity(db, jobStep) - // } - // jobImgs, _ := dao.GetJobImgs(db, 171) - // for _, v := range jobImgs { - // jobImg := &model.JobImg{ - // JobID: job.ID, - // Img: v.Img, - // } - // dao.WrapAddIDCULEntity(jobImg, ctx.GetUserName()) - // err = dao.CreateEntity(db, jobImg) - // } - // } - // return retVal, err - // }, storesJD) - // tasksch.HandleTask(task, task2, true).Run() - // task.GetResult(0) - // case 1: - // task := tasksch.NewParallelTask("TempJob2", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, - // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // store := batchItemList[0].(*Store) - // job := &model.Job{ - // UserID: "906380C7390E11EB8831525400C36BDA", - // JobCategoryID: 3, - // Title: "美团(" + store.Name + ")", - // Content: "领取任务后,需要尽快去完成,并提交截图。如超时未完成,任务会被取消", - // Count: 1000, - // AvgPrice: 300, - // TotalPrice: 300000, - // Status: 0, - // Address: store.Address, - // StoreURL: store.VendorStoreID, - // SurplusCount: 1000, - // JobLimitAt: 72, - // AuditLimitAt: 168, - // LimitCountType: 3, - // VendorID: 1, - // CashbackType: 1, - // JobLat: jxutils.IntCoordinate2Standard(store.Lat), - // JobLng: jxutils.IntCoordinate2Standard(store.Lng), - // Lng: store.Lng, - // Lat: store.Lat, - // JobCityCode: store.CityCode, - // } - // finishAt := utils.Str2Time("2021-12-31 00:00:00") - // job.FinishedAt = &finishAt - // dao.WrapAddIDCULDEntity(job, ctx.GetUserName()) - // if err = dao.CreateEntity(db, job); err == nil { - // jobsteps, _ := dao.GetJobSteps(db, 173) - // for _, v := range jobsteps { - // jobStep := &model.JobStep{ - // JobID: job.ID, - // StepCount: v.StepCount, - // Content: v.Content, - // Img: v.Img, - // Type: v.Type, - // } - // dao.WrapAddIDCULDEntity(jobStep, ctx.GetUserName()) - // err = dao.CreateEntity(db, jobStep) - // } - // jobImgs, _ := dao.GetJobImgs(db, 173) - // for _, v := range jobImgs { - // jobImg := &model.JobImg{ - // JobID: job.ID, - // Img: v.Img, - // } - // dao.WrapAddIDCULEntity(jobImg, ctx.GetUserName()) - // err = dao.CreateEntity(db, jobImg) - // } - // } - // return retVal, err - // }, storesMT) - // tasksch.HandleTask(task, task2, true).Run() - // task.GetResult(0) - // } - // return retVal, err - // }, []int{0, 1}) - //tasksch.HandleTask(task, nil, true).Run() - //task.GetID() - return err -} - -type GetUnionActListResult struct { - partner.ActivityList - JobID int `orm:"column(job_id)" json:"jobID"` - Content string `json:"content"` -} - -func GetUnionActList(ctx *jxcontext.Context, vendorID, actType int) (results []*GetUnionActListResult, err error) { - if handler := partner.GetHandler(vendorID); handler != nil { - actList, err2 := handler.GetUnionActList(ctx, actType) - if err2 == nil { - for _, v := range actList { - result := &GetUnionActListResult{} - result.ActID = v.ActID - result.Img = v.Img - result.DateEnd = v.DateEnd - result.DateBegin = v.DateBegin - result.ActDes = v.ActDes - result.ActName = v.ActName - result.ActSrc = v.ActSrc - result.Ratio = v.Ratio - var job *model.Job - sql := ` - SELECT * FROM job WHERE vendor_id = ? AND union_act_id = ? AND type = ? - ` - sqlParams := []interface{}{vendorID, v.ActID, model.JobTypeOther} - dao.GetRow(dao.GetDB(), &job, sql, sqlParams) - if job != nil { - result.JobID = job.ID - result.Content = job.Content - } - results = append(results, result) - } - } - } - return results, err -} - -func ShareUnionLink(ctx *jxcontext.Context, jobID, shareType, linkType, resourceType int, goodsID string) (link string, err error) { - var ( - job = &model.Job{} - db = dao.GetDB() - sid string //推广位ID,美团为userID,淘宝饿了么本地化暂时是固定的京西推广位ID,pdd为表中推广位ID - mobile, userID = ctx.GetMobileAndUserID() - userBinds []*model.UserUnionBind - userBind *model.UserUnionBind - ) - if jobID == 0 { - return "", fmt.Errorf("该活动已结束,请选择其他活动!") - } - job.ID = jobID - if err = dao.GetEntity(db, job); err != nil { - return "", err - } - vendorID := job.VendorID - unionID := mobile + utils.Int2Str(jobID) - isImg := (vendorID == model.VendorIDMTWM || vendorID == model.VendorIDTB) && linkType == partner.LinkTypeWeiXinMini - handler := partner.GetHandler(vendorID) - //1、建推广位(本地和平台) - if userBinds, err = dao.GetUserUnionBind(db, userID, vendorID, ""); err != nil { - return "", err - } - //本地已有推广位 - if len(userBinds) > 0 { - sid = userBinds[0].UnionID - userBind = userBinds[0] - } else { - userBind = &model.UserUnionBind{ - UserID: userID, - VendorID: vendorID, - } - dao.WrapAddIDCULDEntity(userBind, ctx.GetUserName()) - if handler != nil { - if sid, err = handler.CreateUnionPosition(ctx, unionID); err == nil { - if sid == "" { - sid = unionID - if vendorID == model.VendorIDTB { - sid = utils.Int2Str(tbunionapi.JxAdzoneID) - } - } - } - } - userBind.UnionID = sid - dao.CreateEntity(db, userBind) - } - //2、分享链接 - if handler != nil { - var bindImg *model.UserUnionBindImg - if isImg { - bindImg, _ = dao.GetUserUnionBindImg(db, userBind.UnionID, job.UnionActID) - if bindImg != nil { - if bindImg.UnionImg != "" { - return bindImg.UnionImg, err - } - } - } - if link, err = handler.ShareUnionLink(ctx, linkType, utils.Str2Int(job.UnionActID), sid, userID, resourceType, goodsID); err == nil { - if isImg { - if resBinary, _, err := jxutils.DownloadFileByURL(link); err == nil { - if downloadURL, err := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix())+link[strings.LastIndex(link, "/")+1:len(link)]); err == nil { - if err == nil { - link = jxutils.MixWatermarkImg(downloadURL+"?imageView2/1/w/120/h/120/q/75", job.UnionImg, job.UnionQrcodePosition) - link += "?imageslim" - //id为0表示要新增 - if bindImg == nil { - bindImgAdd := &model.UserUnionBindImg{ - UnionID: sid, - ActID: job.UnionActID, - UnionImg: link, - } - dao.WrapAddIDCULDEntity(bindImgAdd, ctx.GetUserName()) - dao.CreateEntity(db, bindImgAdd) - } else { - bindImg.UnionImg = link - dao.UpdateEntity(db, bindImg, "UnionImg") - } - } - } - } - } - } - } - return link, err -} - -type GetUnionJobOrderInfoResult struct { - AcceptCouponCount int `json:"acceptCouponCount"` //领取优惠券数量 - FinishedOrderCount int `json:"finishedOrderCount"` //完成订单量 - IncomePrice int `json:"incomePrice"` //收入 -} - -func GetUnionJobOrderInfo(ctx *jxcontext.Context, jobOrderID int) (getUnionJobOrderInfoResult *GetUnionJobOrderInfoResult, err error) { - var ( - jobOrder = &model.JobOrder{} - job = &model.Job{} - db = dao.GetDB() - ) - jobOrder.ID = int64(jobOrderID) - if err = dao.GetEntity(db, jobOrder); err != nil { - return nil, err - } - job.ID = jobOrder.JobID - if err = dao.GetEntity(db, job); err != nil { - return nil, err - } - if job.JobCategoryID != model.JobCategoryIDUnion { - return nil, fmt.Errorf("只允许联盟任务才能查看!") - } - userBill, err := dao.GetUserBill(db, jobOrder.UserID, "") - if err != nil { - return nil, err - } - incomes, err := dao.GetBillIncome(db, job.ID, userBill.BillID) - if err != nil { - return nil, err - } - incomeTotal := 0 - for _, v := range incomes { - incomeTotal += v.IncomePrice - } - getUnionJobOrderInfoResult.IncomePrice = incomeTotal - return getUnionJobOrderInfoResult, err -} - -func GetVendorMatters(ctx *jxcontext.Context, vendorID int, vendorCatID, keyword string, offset, pageSize, sortType int, listID string) (result *partner.MatterList, err error) { - handler := partner.GetHandler(vendorID) - return handler.GetUnionMatterList(ctx, vendorCatID, keyword, offset, pageSize, sortType, listID) -} - -func GetVendorMatterDetail(ctx *jxcontext.Context, vendorID int, goodsID string) (goodsDetail *partner.GoodsDetail, err error) { - handler := partner.GetHandler(vendorID) - return handler.GetUnionMatterDetail(ctx, goodsID) -} - -func GetVendorMatterRcmmd(ctx *jxcontext.Context, vendorID int, goodsID string, rcmmdType, offset, pageSize int) (result *partner.MatterList, err error) { - handler := partner.GetHandler(vendorID) - return handler.GetUnionMatterListRcmmd(ctx, goodsID, rcmmdType, offset, pageSize) -} diff --git a/business/jxstore/cms/order.go b/business/jxstore/cms/order.go deleted file mode 100644 index edeef4d5c..000000000 --- a/business/jxstore/cms/order.go +++ /dev/null @@ -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) -} diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 858857592..be978c26a 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -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 { diff --git a/business/jxstore/financial/financial.go b/business/jxstore/financial/financial.go deleted file mode 100644 index 07c10d2ec..000000000 --- a/business/jxstore/financial/financial.go +++ /dev/null @@ -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 -// } diff --git a/business/jxstore/partner/jds/jds.go b/business/jxstore/partner/jds/jds.go deleted file mode 100644 index 17ee29a09..000000000 --- a/business/jxstore/partner/jds/jds.go +++ /dev/null @@ -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 -} diff --git a/business/jxstore/partner/jds/union.go b/business/jxstore/partner/jds/union.go deleted file mode 100644 index 888b80c1d..000000000 --- a/business/jxstore/partner/jds/union.go +++ /dev/null @@ -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 -} diff --git a/business/jxstore/partner/mt/mt.go b/business/jxstore/partner/mt/mt.go deleted file mode 100644 index 9f4cf9aa1..000000000 --- a/business/jxstore/partner/mt/mt.go +++ /dev/null @@ -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 -} diff --git a/business/jxstore/partner/mt/union.go b/business/jxstore/partner/mt/union.go deleted file mode 100644 index bd2b9dc8f..000000000 --- a/business/jxstore/partner/mt/union.go +++ /dev/null @@ -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] -} diff --git a/business/jxstore/partner/partner.go b/business/jxstore/partner/partner.go deleted file mode 100644 index 2935dc80c..000000000 --- a/business/jxstore/partner/partner.go +++ /dev/null @@ -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] -} diff --git a/business/jxstore/partner/pdd/pdd.go b/business/jxstore/partner/pdd/pdd.go deleted file mode 100644 index d28aeed39..000000000 --- a/business/jxstore/partner/pdd/pdd.go +++ /dev/null @@ -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 -} diff --git a/business/jxstore/partner/pdd/union.go b/business/jxstore/partner/pdd/union.go deleted file mode 100644 index c8c67c35c..000000000 --- a/business/jxstore/partner/pdd/union.go +++ /dev/null @@ -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] -} diff --git a/business/jxstore/partner/taobao/taobao.go b/business/jxstore/partner/taobao/taobao.go deleted file mode 100644 index 925f3757b..000000000 --- a/business/jxstore/partner/taobao/taobao.go +++ /dev/null @@ -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 -} diff --git a/business/jxstore/partner/taobao/union.go b/business/jxstore/partner/taobao/union.go deleted file mode 100644 index 3a2d4bec0..000000000 --- a/business/jxstore/partner/taobao/union.go +++ /dev/null @@ -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] -} diff --git a/business/jxutils/ddmsg/ddmsg.go b/business/jxutils/ddmsg/ddmsg.go deleted file mode 100644 index 9ab3da3e0..000000000 --- a/business/jxutils/ddmsg/ddmsg.go +++ /dev/null @@ -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 -} diff --git a/business/jxutils/jxcontext/jxcontext.go b/business/jxutils/jxcontext/jxcontext.go index 0cbea845f..602c406ca 100644 --- a/business/jxutils/jxcontext/jxcontext.go +++ b/business/jxutils/jxcontext/jxcontext.go @@ -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 diff --git a/business/jxutils/tasksch/task.go b/business/jxutils/tasksch/task.go index 89f407e4a..f00b6e840 100644 --- a/business/jxutils/tasksch/task.go +++ b/business/jxutils/tasksch/task.go @@ -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) + //} } } diff --git a/main.go b/main.go index c84379371..a08826f2c 100644 --- a/main.go +++ b/main.go @@ -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" diff --git a/routers/router.go b/routers/router.go index f7c06b9b6..8d355b540 100644 --- a/routers/router.go +++ b/routers/router.go @@ -21,6 +21,11 @@ func init() { &controllers.PrintController{}, ), ), + web.NSNamespace("/task", + web.NSInclude( + &controllers.TaskController{}, + ), + ), ) web.AddNamespace(ns)