Merge remote-tracking branch 'origin/mark' into don
This commit is contained in:
@@ -203,7 +203,7 @@ func Login(authType, authID, authIDType, authSecret string) (authInfo *AuthInfo,
|
||||
realAuthID = user.GetID()
|
||||
}
|
||||
if authBindEx, err = handler.VerifySecret(realAuthID, authSecret); err == nil {
|
||||
globals.SugarLogger.Debugf("auth2 Login authBindEx:%s", utils.Format4Output(authBindEx, false))
|
||||
// globals.SugarLogger.Debugf("auth2 Login authBindEx:%s", utils.Format4Output(authBindEx, false))
|
||||
if authBindEx == nil { // mobile, email会返回nil(表示不会新建AuthBind实体)
|
||||
user = userProvider.GetUser(authID, authIDType)
|
||||
authBindEx = &AuthBindEx{
|
||||
@@ -258,8 +258,8 @@ func BindUser(inauthInfo *AuthInfo, user IUser) (outauthInfo *AuthInfo, err erro
|
||||
}
|
||||
|
||||
// 添加新绑定
|
||||
func AddAuthBind(authInfo *AuthInfo, newAuthInfo *AuthInfo) (err error) {
|
||||
if authInfo == nil || newAuthInfo == nil {
|
||||
func AddAuthBind(user IUser, newAuthInfo *AuthInfo) (err error) {
|
||||
if user == nil || newAuthInfo == nil {
|
||||
return ErrInternalErrror
|
||||
}
|
||||
if !newAuthInfo.IsUserEmpty() {
|
||||
@@ -267,12 +267,12 @@ func AddAuthBind(authInfo *AuthInfo, newAuthInfo *AuthInfo) (err error) {
|
||||
}
|
||||
RemoveUserInfo(newAuthInfo.Token)
|
||||
if newAuthInfo.AuthBindInfo.Type == AuthTypeMobile {
|
||||
err = userProvider.UpdateUserMobile(authInfo.GetID(), newAuthInfo.AuthBindInfo.AuthID)
|
||||
err = userProvider.UpdateUserMobile(user.GetID(), newAuthInfo.AuthBindInfo.AuthID)
|
||||
} else if newAuthInfo.AuthBindInfo.Type == AuthTypeEmail {
|
||||
err = userProvider.UpdateUserEmail(authInfo.GetID(), newAuthInfo.AuthBindInfo.AuthID)
|
||||
err = userProvider.UpdateUserEmail(user.GetID(), newAuthInfo.AuthBindInfo.AuthID)
|
||||
} else {
|
||||
newAuthInfo.AuthBindInfo.UserID = authInfo.GetID()
|
||||
err = authers[newAuthInfo.AuthBindInfo.Type].AddAuthBind(newAuthInfo.AuthBindInfo, authInfo.GetName())
|
||||
newAuthInfo.AuthBindInfo.UserID = user.GetID()
|
||||
err = authers[newAuthInfo.AuthBindInfo.Type].AddAuthBind(newAuthInfo.AuthBindInfo, user.GetName())
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ func (a *Auther) VerifySecret(state, code string) (authBindEx *auth2.AuthBindEx,
|
||||
if err = err2; err == nil {
|
||||
wxUserinfo, err2 := api.WeixinPageAPI.SNSGetUserInfo(token.AccessToken, token.OpenID)
|
||||
if err = err2; err == nil {
|
||||
if authBindEx, err = a.UnionFindAuthBind(a.authType, []string{AuthTypeWeixin, AuthTypeMini, AuthTypeMini}, wxUserinfo.OpenID, wxUserinfo.UnionID, wxUserinfo); err == nil {
|
||||
if authBindEx, err = a.UnionFindAuthBind(a.authType, []string{AuthTypeWeixin, AuthTypeMP, AuthTypeMini}, wxUserinfo.OpenID, wxUserinfo.UnionID, wxUserinfo); err == nil {
|
||||
authBindEx.UserHint = &auth2.UserBasic{
|
||||
Name: wxUserinfo.NickName,
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ func (a *MiniAuther) VerifySecret(dummy, jsCode string) (authBindEx *auth2.AuthB
|
||||
if err == nil {
|
||||
sessionKey := sessionInfo.SessionKey
|
||||
sessionInfo.SessionKey = ""
|
||||
if authBindEx, err = a.UnionFindAuthBind(AuthTypeMini, []string{AuthTypeWeixin, AuthTypeMini, AuthTypeMini}, sessionInfo.OpenID, sessionInfo.UnionID, sessionInfo); err == nil {
|
||||
if authBindEx, err = a.UnionFindAuthBind(AuthTypeMini, []string{AuthTypeWeixin, AuthTypeMP, AuthTypeMini}, sessionInfo.OpenID, sessionInfo.UnionID, sessionInfo); err == nil {
|
||||
authBindEx.UserData = sessionKey
|
||||
}
|
||||
}
|
||||
|
||||
10
business/authz/authz.go
Normal file
10
business/authz/authz.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package authz
|
||||
|
||||
type IAuthz interface {
|
||||
AddStoreRole4User(userID string, storeID int) (err error)
|
||||
DelStoreRole4User(userID string, storeID int) (err error)
|
||||
AddRole4User(userID, roleName string) (err error)
|
||||
DelRole4User(userID, roleName string) (err error)
|
||||
GetUserRoleList(userID string) (roleList []string, err error)
|
||||
GetRoleUserList(roleName string) (userIDList []string, err error)
|
||||
}
|
||||
29
business/authz/authz_utils.go
Normal file
29
business/authz/authz_utils.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package authz
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
RoleNameSep = "/"
|
||||
RolePrefix = "role"
|
||||
StoreRolePrefix = "store"
|
||||
)
|
||||
|
||||
func GenStoreRoleName(storeID int) (roleName string) {
|
||||
return strings.Join([]string{
|
||||
RolePrefix,
|
||||
StoreRolePrefix,
|
||||
utils.Int2Str(storeID),
|
||||
}, RoleNameSep)
|
||||
}
|
||||
|
||||
func GetStoreIDFromRole(roleName string) (storeID int) {
|
||||
list := strings.Split(roleName, RoleNameSep)
|
||||
if len(list) == 3 {
|
||||
storeID = int(utils.Str2Int64WithDefault(list[2], 0))
|
||||
}
|
||||
return storeID
|
||||
}
|
||||
185
business/authz/casbinauth/adapter.go
Normal file
185
business/authz/casbinauth/adapter.go
Normal file
@@ -0,0 +1,185 @@
|
||||
package casbinauth
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"github.com/astaxie/beego/orm"
|
||||
"github.com/casbin/casbin/model"
|
||||
"github.com/casbin/casbin/persist"
|
||||
)
|
||||
|
||||
type CasbinRule struct {
|
||||
ID int `orm:"column(id)" json:"id"`
|
||||
PType string
|
||||
V0 string
|
||||
V1 string
|
||||
V2 string
|
||||
V3 string
|
||||
V4 string
|
||||
V5 string
|
||||
}
|
||||
|
||||
type Adapter struct {
|
||||
}
|
||||
|
||||
func RegisterModel() {
|
||||
orm.RegisterModel(new(CasbinRule))
|
||||
}
|
||||
|
||||
// finalizer is the destructor for Adapter.
|
||||
func finalizer(a *Adapter) {
|
||||
}
|
||||
|
||||
func NewAdapter() *Adapter {
|
||||
return &Adapter{}
|
||||
}
|
||||
|
||||
func loadPolicyLine(line CasbinRule, model model.Model) {
|
||||
lineText := line.PType
|
||||
if line.V0 != "" {
|
||||
lineText += ", " + line.V0
|
||||
}
|
||||
if line.V1 != "" {
|
||||
lineText += ", " + line.V1
|
||||
}
|
||||
if line.V2 != "" {
|
||||
lineText += ", " + line.V2
|
||||
}
|
||||
if line.V3 != "" {
|
||||
lineText += ", " + line.V3
|
||||
}
|
||||
if line.V4 != "" {
|
||||
lineText += ", " + line.V4
|
||||
}
|
||||
if line.V5 != "" {
|
||||
lineText += ", " + line.V5
|
||||
}
|
||||
|
||||
persist.LoadPolicyLine(lineText, model)
|
||||
}
|
||||
|
||||
func (a *Adapter) LoadPolicy(model model.Model) error {
|
||||
var lines []CasbinRule
|
||||
o := orm.NewOrm()
|
||||
_, err := o.QueryTable("casbin_rule").Limit(-1).All(&lines)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, line := range lines {
|
||||
loadPolicyLine(line, model)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func savePolicyLine(ptype string, rule []string) CasbinRule {
|
||||
line := CasbinRule{}
|
||||
|
||||
line.PType = ptype
|
||||
if len(rule) > 0 {
|
||||
line.V0 = rule[0]
|
||||
}
|
||||
if len(rule) > 1 {
|
||||
line.V1 = rule[1]
|
||||
}
|
||||
if len(rule) > 2 {
|
||||
line.V2 = rule[2]
|
||||
}
|
||||
if len(rule) > 3 {
|
||||
line.V3 = rule[3]
|
||||
}
|
||||
if len(rule) > 4 {
|
||||
line.V4 = rule[4]
|
||||
}
|
||||
if len(rule) > 5 {
|
||||
line.V5 = rule[5]
|
||||
}
|
||||
|
||||
return line
|
||||
}
|
||||
|
||||
func (a *Adapter) clearAll(o orm.Ormer) (err error) {
|
||||
_, err = o.Raw(`
|
||||
DELETE t1
|
||||
FROM casbin_rule t1
|
||||
`).Exec()
|
||||
return err
|
||||
}
|
||||
|
||||
// SavePolicy saves policy to database.
|
||||
func (a *Adapter) SavePolicy(model model.Model) error {
|
||||
globals.SugarLogger.Debugf("SavePolicy")
|
||||
o := orm.NewOrm()
|
||||
|
||||
a.clearAll(o)
|
||||
var lines []CasbinRule
|
||||
|
||||
for ptype, ast := range model["p"] {
|
||||
for _, rule := range ast.Policy {
|
||||
line := savePolicyLine(ptype, rule)
|
||||
lines = append(lines, line)
|
||||
}
|
||||
}
|
||||
|
||||
for ptype, ast := range model["g"] {
|
||||
for _, rule := range ast.Policy {
|
||||
line := savePolicyLine(ptype, rule)
|
||||
lines = append(lines, line)
|
||||
}
|
||||
}
|
||||
|
||||
_, err := o.InsertMulti(len(lines), lines)
|
||||
return err
|
||||
}
|
||||
|
||||
// AddPolicy adds a policy rule to the storage.
|
||||
func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error {
|
||||
o := orm.NewOrm()
|
||||
line := savePolicyLine(ptype, rule)
|
||||
_, err := o.Insert(&line)
|
||||
return err
|
||||
}
|
||||
|
||||
// RemovePolicy removes a policy rule from the storage.
|
||||
func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
|
||||
o := orm.NewOrm()
|
||||
line := savePolicyLine(ptype, rule)
|
||||
_, err := o.Delete(&line, "p_type", "v0", "v1", "v2", "v3", "v4", "v5")
|
||||
return err
|
||||
}
|
||||
|
||||
// RemoveFilteredPolicy removes policy rules that match the filter from the storage.
|
||||
func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error {
|
||||
line := CasbinRule{}
|
||||
|
||||
line.PType = ptype
|
||||
filter := []string{}
|
||||
filter = append(filter, "p_type")
|
||||
if fieldIndex <= 0 && 0 < fieldIndex+len(fieldValues) {
|
||||
line.V0 = fieldValues[0-fieldIndex]
|
||||
filter = append(filter, "v0")
|
||||
}
|
||||
if fieldIndex <= 1 && 1 < fieldIndex+len(fieldValues) {
|
||||
line.V1 = fieldValues[1-fieldIndex]
|
||||
filter = append(filter, "v1")
|
||||
}
|
||||
if fieldIndex <= 2 && 2 < fieldIndex+len(fieldValues) {
|
||||
line.V2 = fieldValues[2-fieldIndex]
|
||||
filter = append(filter, "v2")
|
||||
}
|
||||
if fieldIndex <= 3 && 3 < fieldIndex+len(fieldValues) {
|
||||
line.V3 = fieldValues[3-fieldIndex]
|
||||
filter = append(filter, "v3")
|
||||
}
|
||||
if fieldIndex <= 4 && 4 < fieldIndex+len(fieldValues) {
|
||||
line.V4 = fieldValues[4-fieldIndex]
|
||||
filter = append(filter, "v4")
|
||||
}
|
||||
if fieldIndex <= 5 && 5 < fieldIndex+len(fieldValues) {
|
||||
line.V5 = fieldValues[5-fieldIndex]
|
||||
filter = append(filter, "v5")
|
||||
}
|
||||
|
||||
o := orm.NewOrm()
|
||||
_, err := o.Delete(&line, filter...)
|
||||
return err
|
||||
}
|
||||
44
business/authz/casbinauth/casbinauth.go
Normal file
44
business/authz/casbinauth/casbinauth.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package casbinauth
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/authz"
|
||||
"github.com/casbin/casbin"
|
||||
)
|
||||
|
||||
type CasbinAuthz struct {
|
||||
enforcer *casbin.SyncedEnforcer
|
||||
}
|
||||
|
||||
func New(modelFile string) (authObj authz.IAuthz, err error) {
|
||||
obj := &CasbinAuthz{}
|
||||
obj.enforcer, err = casbin.NewSyncedEnforcer(modelFile, NewAdapter())
|
||||
return obj, err
|
||||
}
|
||||
|
||||
func (c *CasbinAuthz) AddStoreRole4User(userID string, storeID int) (err error) {
|
||||
return c.AddRole4User(userID, authz.GenStoreRoleName(storeID))
|
||||
}
|
||||
|
||||
func (c *CasbinAuthz) DelStoreRole4User(userID string, storeID int) (err error) {
|
||||
return c.DelRole4User(userID, authz.GenStoreRoleName(storeID))
|
||||
}
|
||||
|
||||
func (c *CasbinAuthz) AddRole4User(userID, roleName string) (err error) {
|
||||
_, err = c.enforcer.AddRoleForUser(userID, roleName)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *CasbinAuthz) DelRole4User(userID, roleName string) (err error) {
|
||||
_, err = c.enforcer.DeleteRoleForUser(userID, roleName)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *CasbinAuthz) GetUserRoleList(userID string) (roleList []string, err error) {
|
||||
roleList, err = c.enforcer.GetRolesForUser(userID)
|
||||
return roleList, err
|
||||
}
|
||||
|
||||
func (c *CasbinAuthz) GetRoleUserList(roleName string) (userIDList []string, err error) {
|
||||
userIDList, err = c.enforcer.GetUsersForRole(roleName)
|
||||
return userIDList, err
|
||||
}
|
||||
14
business/authz/casbinauth/rbac_model.conf
Normal file
14
business/authz/casbinauth/rbac_model.conf
Normal file
@@ -0,0 +1,14 @@
|
||||
[request_definition]
|
||||
r = sub, obj, act
|
||||
|
||||
[policy_definition]
|
||||
p = sub, obj, act
|
||||
|
||||
[role_definition]
|
||||
g = _, _
|
||||
|
||||
[policy_effect]
|
||||
e = some(where (p.eft == allow))
|
||||
|
||||
[matchers]
|
||||
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
|
||||
97
business/jxstore/cms/authz.go
Normal file
97
business/jxstore/cms/authz.go
Normal file
@@ -0,0 +1,97 @@
|
||||
package cms
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/auth2"
|
||||
"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/business/model/legacymodel"
|
||||
"git.rosy.net.cn/jx-callback/globals/api2"
|
||||
)
|
||||
|
||||
func TransferLegacyWeixins() (err error) {
|
||||
const remark4Transfer = "transfer"
|
||||
// DELETE t1
|
||||
// FROM auth_bind t1
|
||||
// WHERE t1.remark = 'transfer';
|
||||
|
||||
// DELETE t1
|
||||
// FROM user t1
|
||||
// WHERE t1.remark = 'transfer';
|
||||
|
||||
// TRUNCATE TABLE casbin_rule;
|
||||
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM weixins
|
||||
ORDER BY parentid`
|
||||
var weixinList []*legacymodel.WeiXins
|
||||
db := dao.GetDB()
|
||||
err = dao.GetRows(db, &weixinList, sql)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
parentMap := make(map[int]*legacymodel.WeiXins)
|
||||
for _, v := range weixinList {
|
||||
if v.ParentID == -1 {
|
||||
parentMap[v.ID] = v
|
||||
} else {
|
||||
if parentMap[v.ParentID] != nil {
|
||||
v.JxStoreID = parentMap[v.ParentID].JxStoreID
|
||||
}
|
||||
}
|
||||
if v.Tel != "" {
|
||||
user := &model.User{
|
||||
UserID2: v.Tel,
|
||||
Name: v.NickName,
|
||||
Mobile: v.Tel,
|
||||
Type: model.UserTypeStoreBoss,
|
||||
Remark: remark4Transfer,
|
||||
}
|
||||
if user.Name == "" {
|
||||
user.Name = user.Mobile
|
||||
}
|
||||
userList, err2 := dao.GetUsers(db, 0, "", nil, "", v.Tel)
|
||||
if err = err2; err != nil {
|
||||
return err
|
||||
}
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(user, false))
|
||||
if len(userList) == 0 {
|
||||
err = CreateUser(user, v.LastOperator)
|
||||
} else {
|
||||
user = userList[0]
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if v.OpenID != "" {
|
||||
auth2.AddAuthBind(user, &auth2.AuthInfo{
|
||||
AuthBindInfo: &auth2.AuthBindEx{
|
||||
AuthBind: model.AuthBind{
|
||||
Type: weixin.AuthTypeMP,
|
||||
AuthID: v.OpenID,
|
||||
AuthID2: v.OpenIDUnion,
|
||||
Remark: remark4Transfer,
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
if v.OpenIDMini != "" {
|
||||
auth2.AddAuthBind(user, &auth2.AuthInfo{
|
||||
AuthBindInfo: &auth2.AuthBindEx{
|
||||
AuthBind: model.AuthBind{
|
||||
Type: weixin.AuthTypeMini,
|
||||
AuthID: v.OpenIDMini,
|
||||
AuthID2: v.OpenIDUnion,
|
||||
Remark: remark4Transfer,
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
if v.JxStoreID > 0 {
|
||||
api2.RoleMan.AddStoreRole4User(user.GetID(), v.JxStoreID)
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
29
business/jxstore/cms/authz_test.go
Normal file
29
business/jxstore/cms/authz_test.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package cms
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/globals/api2"
|
||||
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/elm"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/weimob/wsc"
|
||||
)
|
||||
|
||||
func TestTransferLegacyWeixins(t *testing.T) {
|
||||
err := TransferLegacyWeixins()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCasbin(t *testing.T) {
|
||||
userList, err := api2.RoleMan.GetRoleUserList("role/store/100324")
|
||||
t.Log(utils.Format4Output(userList, false))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,6 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/msg"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
|
||||
"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"
|
||||
@@ -521,7 +520,7 @@ func checkCreateStore(store *model.Store) (err error) {
|
||||
}
|
||||
|
||||
func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interface{}, userName string) (num int64, err error) {
|
||||
globals.SugarLogger.Debugf("UpdateStore storeID:%d, payload:%s", storeID, utils.Format4Output(payload, false))
|
||||
globals.SugarLogger.Debugf("UpdateStore storeID:%d, payload:%s", storeID, utils.Format4Output(payload, true))
|
||||
if err = checkBankBranch(utils.Interface2String(payload["payeeBankBranchName"])); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -544,27 +543,23 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa
|
||||
store.Name = valid["name"].(string)
|
||||
syncStatus |= model.SyncFlagStoreName
|
||||
}
|
||||
globals.SugarLogger.Debug(utils.Format4Output(valid, false))
|
||||
// 网络打印机处理
|
||||
if valid["printerVendorID"] != nil || valid["printerSN"] != nil || valid["printerKey"] != nil {
|
||||
if handler := partner.GetPrinterPlatformFromVendorID(store.PrinterVendorID); handler != nil {
|
||||
handler.UnregisterPrinter(ctx, store.PrinterSN, store.PrinterKey)
|
||||
}
|
||||
if valid["printerVendorID"] == nil {
|
||||
valid["printerVendorID"] = store.PrinterVendorID
|
||||
} else {
|
||||
store.PrinterVendorID = int(utils.Interface2Int64WithDefault(valid["printerVendorID"], 0))
|
||||
}
|
||||
if store.PrinterVendorID > 0 {
|
||||
if printerVendorID := int(utils.Interface2Int64WithDefault(valid["printerVendorID"], 0)); printerVendorID > 0 {
|
||||
handler := partner.GetPrinterPlatformFromVendorID(printerVendorID)
|
||||
if handler == nil {
|
||||
return 0, fmt.Errorf("不支持的打印机厂商ID:%d", printerVendorID)
|
||||
}
|
||||
if valid["printerSN"] == nil {
|
||||
valid["printerSN"] = store.PrinterSN
|
||||
}
|
||||
if valid["printerKey"] == nil {
|
||||
valid["printerKey"] = store.PrinterKey
|
||||
}
|
||||
var handler partner.IPrinterHandler
|
||||
if handler, err = netprinter.GetHandlerFromStore(store); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
newID1, newID2, err2 := handler.RegisterPrinter(ctx, valid["printerSN"].(string), valid["printerKey"].(string), store.Name)
|
||||
if err = err2; err != nil {
|
||||
return 0, err
|
||||
@@ -576,8 +571,14 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa
|
||||
if newID2 != "" {
|
||||
valid["printerKey"] = newID2
|
||||
}
|
||||
|
||||
valid["printerBindInfo"] = ""
|
||||
} else {
|
||||
valid["printerVendorID"] = 0
|
||||
valid["printerSN"] = ""
|
||||
valid["printerKey"] = ""
|
||||
}
|
||||
valid["printerBindInfo"] = ""
|
||||
if handler := partner.GetPrinterPlatformFromVendorID(store.PrinterVendorID); handler != nil {
|
||||
handler.UnregisterPrinter(ctx, store.PrinterSN, store.PrinterKey)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -614,7 +615,7 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa
|
||||
// }
|
||||
// valid["districtCode"] = api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat)
|
||||
// }
|
||||
globals.SugarLogger.Debugf("UpdateStore track:%s, valid:%s", ctx.GetTrackInfo(), utils.Format4Output(valid, true))
|
||||
globals.SugarLogger.Debugf("UpdateStore track:%s, storeID:%d, valid:%s", ctx.GetTrackInfo(), storeID, utils.Format4Output(valid, true))
|
||||
if len(valid) > 0 {
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
@@ -708,10 +709,9 @@ func CreateStore(ctx *jxcontext.Context, storeExt *StoreExt, userName string) (i
|
||||
store.Name = jxutils.FormalizeName(store.Name)
|
||||
store.DeliveryRange = strings.Trim(store.DeliveryRange, ";")
|
||||
if store.PrinterSN != "" {
|
||||
var handler partner.IPrinterHandler
|
||||
handler, err = netprinter.GetHandlerFromStore(store)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
handler := partner.GetPrinterPlatformFromVendorID(store.PrinterVendorID)
|
||||
if handler == nil {
|
||||
return 0, fmt.Errorf("不支持的打印机厂商ID:%d", store.PrinterVendorID)
|
||||
}
|
||||
newID1, newID2, err2 := handler.RegisterPrinter(ctx, store.PrinterSN, store.PrinterKey, store.Name)
|
||||
if err = err2; err != nil {
|
||||
|
||||
@@ -41,7 +41,7 @@ type StoreSkuExt struct {
|
||||
SkuSpecQuality float32 `json:"specQuality"`
|
||||
SkuSpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量
|
||||
Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality
|
||||
JdID int64 `orm:"column(sku_jd_id);null;index" json:"jdID"`
|
||||
JdID string `orm:"column(sku_jd_id);null;index" json:"jdID"`
|
||||
SkuStatus int `json:"status"`
|
||||
|
||||
BindCreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"`
|
||||
@@ -53,10 +53,10 @@ type StoreSkuExt struct {
|
||||
UnitPrice int `json:"unitPrice"` // 这个是一斤的门店商品价,放在这里的原因是避免额外增加一张store sku_name表,逻辑上要保证同一SKU NAME中的所有SKU这个字段的数据一致
|
||||
StoreSkuStatus int `json:"storeSkuStatus"`
|
||||
|
||||
EbaiID int64 `orm:"column(ebai_id);index" json:"ebaiID"`
|
||||
MtwmID int64 `orm:"column(mtwm_id)" json:"mtwmID"` // 这个也不是必须的,只是为了DAO取数据语句一致
|
||||
WscID int64 `orm:"column(wsc_id);index" json:"wscID"` // 表示微盟skuId
|
||||
WscID2 int64 `orm:"column(wsc_id2);index" json:"wscID2"` // 表示微盟goodsId
|
||||
EbaiID string `orm:"column(ebai_id);index" json:"ebaiID"`
|
||||
MtwmID string `orm:"column(mtwm_id)" json:"mtwmID"` // 这个也不是必须的,只是为了DAO取数据语句一致
|
||||
WscID string `orm:"column(wsc_id);index" json:"wscID"` // 表示微盟skuId
|
||||
WscID2 string `orm:"column(wsc_id2);index" json:"wscID2"` // 表示微盟goodsId
|
||||
|
||||
JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
||||
|
||||
@@ -503,20 +503,16 @@ func updateActPrice4StoreSkuNameNew(db *dao.DaoDB, storeIDs, skuIDs []int, skuNa
|
||||
globals.SugarLogger.Errorf("updateActPrice4StoreSkuNameNew can not get sku promotion info for error:%v", err)
|
||||
return err
|
||||
}
|
||||
actStoreSkuMap := jxutils.NewActStoreSkuMap(actStoreSkuList, true)
|
||||
actStoreSkuMap4Act := jxutils.NewActStoreSkuMap(actStoreSkuList, true)
|
||||
actStoreSkuMap4EarningPrice := jxutils.NewActStoreSkuMap(actStoreSkuList, false)
|
||||
|
||||
for _, skuName := range skuNamesInfo.SkuNames {
|
||||
if len(skuName.Skus2) > 0 {
|
||||
for _, v := range skuName.Skus2 {
|
||||
actStoreSku := actStoreSkuMap.GetActStoreSku(skuName.StoreID, v.SkuID, -1)
|
||||
if actStoreSku != nil {
|
||||
if actStoreSku := actStoreSkuMap4Act.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil {
|
||||
v.ActPrice = int(actStoreSku.ActualActPrice)
|
||||
}
|
||||
// index := dao.GenSkuPriceMapKey(skuName.StoreID, v.SkuID)
|
||||
// if jxSkuPriceMap[index] != nil {
|
||||
// v.EarningPrice = jxSkuPriceMap[index].EarningPrice
|
||||
// } else
|
||||
if actStoreSku != nil {
|
||||
if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil {
|
||||
v.EarningPrice = int(actStoreSku.EarningPrice)
|
||||
}
|
||||
|
||||
|
||||
@@ -349,7 +349,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
switch step {
|
||||
case 0:
|
||||
if len(deleteList) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
var successList []*partner.StoreSkuInfo
|
||||
if successList, err = singleStoreHandler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); singleStoreHandler.IsErrSkuNotExist(err) {
|
||||
err = nil
|
||||
@@ -360,12 +360,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
if len(successList) > 0 {
|
||||
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagDeletedMask)
|
||||
}
|
||||
return nil, err
|
||||
return nil, len(successList), err
|
||||
}, ctx, task, deleteList, 1 /*singleStoreHandler.GetStoreSkusBatchSize(partner.FuncDeleteStoreSkus)*/, isContinueWhenError)
|
||||
}
|
||||
case 1:
|
||||
if len(createList) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuSyncInfo(func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuSyncInfo(func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, successCount int, err error) {
|
||||
var successList []*dao.StoreSkuSyncInfo
|
||||
if successList, err = singleStoreHandler.CreateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); singleStoreHandler.IsErrSkuExist(err) {
|
||||
if skuNameList, err2 := singleStoreHandler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, []*partner.StoreSkuInfo{
|
||||
@@ -387,12 +387,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
if len(successList) > 0 {
|
||||
updateStoreSku(dao.GetDB(), vendorID, successList, model.SyncFlagNewMask)
|
||||
}
|
||||
return nil, err
|
||||
return nil, len(successList), err
|
||||
}, ctx, task, createList, 1 /*singleStoreHandler.GetStoreSkusBatchSize(partner.FuncCreateStoreSkus)*/, isContinueWhenError)
|
||||
}
|
||||
case 2:
|
||||
if len(updateList) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuSyncInfo(func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuSyncInfo(func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, successCount int, err error) {
|
||||
var successList []*dao.StoreSkuSyncInfo
|
||||
if successList, err = singleStoreHandler.UpdateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); err == nil {
|
||||
successList = batchedStoreSkuList
|
||||
@@ -400,13 +400,13 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
if len(successList) > 0 {
|
||||
updateStoreSku(dao.GetDB(), vendorID, successList, model.SyncFlagModifiedMask)
|
||||
}
|
||||
return nil, err
|
||||
return nil, len(successList), err
|
||||
}, ctx, task, updateList, singleStoreHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkus), isContinueWhenError)
|
||||
}
|
||||
case 3:
|
||||
for k, list := range [][]*partner.StoreSkuInfo{stockList /*, onlineList*/} {
|
||||
if len(list) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
var successList []*partner.StoreSkuInfo
|
||||
if successList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeID, vendorStoreID, batchedStoreSkuList); err == nil {
|
||||
successList = batchedStoreSkuList
|
||||
@@ -414,7 +414,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
if k == 0 && len(successList) > 0 {
|
||||
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagModifiedMask) // ?
|
||||
}
|
||||
return nil, err
|
||||
return nil, len(successList), err
|
||||
}, ctx, task, list, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStock), isContinueWhenError)
|
||||
}
|
||||
}
|
||||
@@ -426,7 +426,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
status = model.SkuStatusDontSale
|
||||
}
|
||||
if len(statusList) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
var successList []*partner.StoreSkuInfo
|
||||
if successList, err = storeSkuHandler.UpdateStoreSkusStatus(ctx, storeID, vendorStoreID, batchedStoreSkuList, status); err == nil {
|
||||
successList = batchedStoreSkuList
|
||||
@@ -434,12 +434,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
if len(successList) > 0 {
|
||||
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagSaleMask)
|
||||
}
|
||||
return nil, err
|
||||
return nil, len(successList), err
|
||||
}, ctx, task, statusList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStatus), isContinueWhenError)
|
||||
}
|
||||
case 6:
|
||||
if len(priceList) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
var successList []*partner.StoreSkuInfo
|
||||
if successList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeID, vendorStoreID, batchedStoreSkuList); err == nil {
|
||||
successList = batchedStoreSkuList
|
||||
@@ -447,7 +447,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
if len(successList) > 0 {
|
||||
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagPriceMask)
|
||||
}
|
||||
return nil, err
|
||||
return nil, len(successList), err
|
||||
}, ctx, task, priceList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusPrice), isContinueWhenError)
|
||||
}
|
||||
}
|
||||
@@ -490,9 +490,9 @@ func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, ven
|
||||
}
|
||||
case 1:
|
||||
if len(sku2Delete) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
_, err = handler.DeleteStoreSkus(ctx, storeID, vendorStoreID, sku2Delete)
|
||||
return nil, err
|
||||
return nil, 0, err
|
||||
}, ctx, parentTask, sku2Delete, handler.GetStoreSkusBatchSize(partner.FuncDeleteStoreSkus), isContinueWhenError)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,9 +86,9 @@ func RegisterUser(user *model.User, mobileVerifyCode string, inAuthInfo *auth2.A
|
||||
if inAuthInfo.AuthBindInfo.Type == dingding.AuthTypeStaff {
|
||||
user.Type |= model.UserTypeOperator
|
||||
}
|
||||
if err = CreateUser(user); err == nil {
|
||||
if err = CreateUser(user, "RegisterUser"); err == nil {
|
||||
if outAuthInfo, err = auth2.BindUser(mobileAuth, user); err == nil && inAuthInfo != nil {
|
||||
err = auth2.AddAuthBind(outAuthInfo, inAuthInfo)
|
||||
err = auth2.AddAuthBind(&outAuthInfo.UserBasic, inAuthInfo)
|
||||
}
|
||||
} else if dao.IsDuplicateError(err) {
|
||||
errCode = model.ErrCodeUserAlreadyExist
|
||||
@@ -109,11 +109,11 @@ func GetUserBindAuthInfo(ctx *jxcontext.Context) (authList []*model.AuthBind, er
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func CreateUser(user *model.User) (err error) {
|
||||
func CreateUser(user *model.User, creatorName string) (err error) {
|
||||
if user == nil || user.UserID2 == "" || user.Name == "" || user.Mobile == "" {
|
||||
return ErrUserIDAndNameMustGiven
|
||||
}
|
||||
dao.WrapAddIDCULDEntity(user, "RegisterUser")
|
||||
dao.WrapAddIDCULDEntity(user, creatorName)
|
||||
user.UserID = utils.GetUUID()
|
||||
user.Status = model.UserStatusNormal
|
||||
return dao.CreateEntity(nil, user)
|
||||
@@ -153,6 +153,6 @@ func OnDingDingMsg(msg map[string]interface{}) (callbackResponse *dingdingapi.Ca
|
||||
return api.DingDingAPI.Err2CallbackResponse(nil)
|
||||
}
|
||||
|
||||
func GetUsers(ctx *jxcontext.Context, userType int, userID2, mobile, userName string) (userList []*model.User, err error) {
|
||||
return dao.GetUsers(dao.GetDB(), userType, userID2, mobile, userName)
|
||||
func GetUsers(ctx *jxcontext.Context, userType int, keyword string, userIDs []string, userID2, mobile string) (userList []*model.User, err error) {
|
||||
return dao.GetUsers(dao.GetDB(), userType, keyword, userIDs, userID2, mobile)
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ func StartOrEndOpStore(isStart bool, startTime, endTime int16, isAsync, isContin
|
||||
AddOrDelExtraStoreOptime(vendorID, storeID, vendorStoreID, &storeListValue.Store, startOpStoreTime, endOpStoreTime, false)
|
||||
}
|
||||
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
_, err = putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
for _, skuValue := range batchedStoreSkuList {
|
||||
skuValue.Stock = GetStockValue(isStart)
|
||||
}
|
||||
@@ -125,7 +125,7 @@ func StartOrEndOpStore(isStart bool, startTime, endTime int16, isAsync, isContin
|
||||
//successList = batchedStoreSkuList
|
||||
//baseapi.SugarLogger.Debugf("StartOrEndOpStore successList:%v error:%v", successList, err)
|
||||
}
|
||||
return nil, err
|
||||
return nil, 0, err
|
||||
}, ctx, task, storeSkuList, singleStoreHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStock), true)
|
||||
|
||||
if isStart {
|
||||
|
||||
@@ -57,11 +57,7 @@ func PrintOrderByOrder(ctx *jxcontext.Context, order *model.GoodsOrder) (printRe
|
||||
PrintResult: partner.PrintResultNoPrinter,
|
||||
}, nil
|
||||
}
|
||||
if globals.EnableStoreWrite {
|
||||
printResult, err = handler.PrintOrder(ctx, store, order)
|
||||
} else {
|
||||
err = fmt.Errorf("当前环境不支持打印")
|
||||
}
|
||||
printResult, err = handler.PrintOrder(ctx, store, order)
|
||||
if err == nil {
|
||||
dao.SetOrderPrintFlag(db, ctx.GetUserName(), order.VendorOrderID, order.VendorID, true)
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ const (
|
||||
)
|
||||
|
||||
type WorkFunc func(task *ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error)
|
||||
type WorkFunc2 func(task *ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error)
|
||||
type ResultHandlerFunc func(taskName string, result []interface{}, err error)
|
||||
|
||||
type ParallelConfig struct {
|
||||
@@ -28,7 +29,7 @@ type ParallelConfig struct {
|
||||
type ParallelTask struct {
|
||||
BaseTask
|
||||
|
||||
worker WorkFunc
|
||||
worker WorkFunc2
|
||||
jobList [][]interface{}
|
||||
taskChan chan []interface{}
|
||||
subFinishChan chan interface{}
|
||||
@@ -69,7 +70,7 @@ func (c *ParallelConfig) SetIsContinueWhenError(isContinueWhenError bool) *Paral
|
||||
// return c
|
||||
// }
|
||||
|
||||
func NewParallelTask(taskName string, config *ParallelConfig, ctx *jxcontext.Context, worker WorkFunc, itemList interface{}, params ...interface{}) *ParallelTask {
|
||||
func NewParallelTask2(taskName string, config *ParallelConfig, ctx *jxcontext.Context, worker WorkFunc2, itemList interface{}, params ...interface{}) *ParallelTask {
|
||||
if config == nil {
|
||||
config = NewParallelConfig()
|
||||
}
|
||||
@@ -95,6 +96,14 @@ func NewParallelTask(taskName string, config *ParallelConfig, ctx *jxcontext.Con
|
||||
return task
|
||||
}
|
||||
|
||||
func NewParallelTask(taskName string, config *ParallelConfig, ctx *jxcontext.Context, worker WorkFunc, itemList interface{}, params ...interface{}) *ParallelTask {
|
||||
return NewParallelTask2(taskName, config, ctx,
|
||||
func(task *ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
|
||||
retVal, err = worker(task, batchItemList, params...)
|
||||
return retVal, 0, err
|
||||
}, itemList, params...)
|
||||
}
|
||||
|
||||
func (task *ParallelTask) Run() {
|
||||
task.run(func() {
|
||||
globals.SugarLogger.Debugf("ParallelTask.Run %s", task.Name)
|
||||
@@ -113,11 +122,11 @@ func (task *ParallelTask) Run() {
|
||||
chanRetVal = retVal
|
||||
goto end
|
||||
} else {
|
||||
result, err := task.callWorker(func() (retVal interface{}, err error) {
|
||||
result, successCount, err := task.callWorker2(func() (retVal interface{}, successCount int, err error) {
|
||||
return task.worker(task, job, task.params...)
|
||||
})
|
||||
// globals.SugarLogger.Debugf("ParallelTask.Run %s, after call worker result:%v, err:%v", task.Name, result, err)
|
||||
task.finishedOneJob(len(job), err)
|
||||
task.finishedOneJob(len(job), successCount, err)
|
||||
if err != nil { // 出错
|
||||
// globals.SugarLogger.Infof("ParallelTask.Run %s, subtask(job:%s, params:%s) result:%v, failed with error:%v", task.Name, utils.Format4Output(job, true), utils.Format4Output(task.params, true), result, err)
|
||||
if task.IsContinueWhenError {
|
||||
|
||||
@@ -40,7 +40,7 @@ func (task *SeqTask) Run() {
|
||||
result, err := task.callWorker(func() (retVal interface{}, err error) {
|
||||
return task.worker(task, i, task.params...)
|
||||
})
|
||||
task.finishedOneJob(1, err)
|
||||
task.finishedOneJob(1, 0, err)
|
||||
if err != nil {
|
||||
// globals.SugarLogger.Infof("SeqTask.Run %s step:%d failed with error:%v", task.Name, i, err)
|
||||
if task.IsContinueWhenError {
|
||||
|
||||
@@ -434,7 +434,8 @@ func (t *BaseTask) run(taskHandler func()) {
|
||||
}
|
||||
}
|
||||
|
||||
func (t *BaseTask) finishedOneJob(itemCount int, err error) {
|
||||
// successCount表示在返回错误的情况下,(部分)成功的个数,如果没有返回错误,则successCount无意义
|
||||
func (t *BaseTask) finishedOneJob(itemCount, successCount int, err error) {
|
||||
t.locker.Lock()
|
||||
defer t.locker.Unlock()
|
||||
|
||||
@@ -443,7 +444,8 @@ func (t *BaseTask) finishedOneJob(itemCount int, err error) {
|
||||
t.FinishedItemCount += itemCount
|
||||
t.FinishedJobCount++
|
||||
} else {
|
||||
t.FailedItemCount += itemCount
|
||||
t.FinishedItemCount += successCount
|
||||
t.FailedItemCount += itemCount - successCount
|
||||
t.FailedJobCount++
|
||||
}
|
||||
}
|
||||
@@ -473,6 +475,15 @@ func (task *BaseTask) callWorker(worker func() (retVal interface{}, err error))
|
||||
err = fmt.Errorf("panic, r:%v", r)
|
||||
}
|
||||
}()
|
||||
retVal, err = worker()
|
||||
return retVal, err
|
||||
return worker()
|
||||
}
|
||||
|
||||
func (task *BaseTask) callWorker2(worker func() (retVal interface{}, successCount int, err error)) (retVal interface{}, successCount int, err error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
globals.SugarLogger.Errorf("callWorker panic:%v", r)
|
||||
err = fmt.Errorf("panic, r:%v", r)
|
||||
}
|
||||
}()
|
||||
return worker()
|
||||
}
|
||||
|
||||
@@ -104,8 +104,8 @@ var (
|
||||
OrderStatusUnknown: "一般事件",
|
||||
|
||||
OrderStatusNew: "新订单",
|
||||
OrderStatusAccepted: "已接单",
|
||||
OrderStatusFinishedPickup: "已拣货",
|
||||
OrderStatusAccepted: "待拣货",
|
||||
OrderStatusFinishedPickup: "待配送",
|
||||
OrderStatusApplyFailedGetGoods: "取货失败待审核",
|
||||
OrderStatusAgreeFailedGetGoods: "取货失败",
|
||||
OrderStatusDelivering: "配送中",
|
||||
|
||||
@@ -330,10 +330,19 @@ func GetEffectiveActStoreSkuInfo(db *DaoDB, actID int, vendorIDs []int, storeIDs
|
||||
t3.actual_act_price, t3.sync_status, t3.vendor_price, t3.vendor_id
|
||||
FROM act t1
|
||||
JOIN act_store_sku t2 ON t2.act_id = t1.id AND t2.deleted_at = ?
|
||||
JOIN act_store_sku_map t3 ON t3.bind_id = t2.id AND t3.act_id = t1.id
|
||||
JOIN act_store_sku_map t3 ON t3.bind_id = t2.id AND t3.act_id = t1.id AND (t3.sync_status & ? = 0 OR t1.type = ?)
|
||||
JOIN act_map t4 ON t4.act_id = t1.id AND t4.vendor_id = t3.vendor_id AND t4.deleted_at = ? AND (t4.sync_status & ? = 0 OR t1.type = ?)
|
||||
WHERE t1.deleted_at = ? AND t1.status = ? AND NOT (t1.begin_at > ? OR t1.end_at < ?)`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
|
||||
model.SyncFlagNewMask,
|
||||
model.ActSkuFake,
|
||||
|
||||
utils.DefaultTimeValue,
|
||||
model.SyncFlagNewMask,
|
||||
model.ActSkuFake,
|
||||
|
||||
utils.DefaultTimeValue,
|
||||
model.ActStatusCreated,
|
||||
endAt,
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
func TestGetEffectiveActStoreSkuInfo(t *testing.T) {
|
||||
@@ -21,32 +20,11 @@ func TestGetEffectiveActStoreSkuInfo(t *testing.T) {
|
||||
}
|
||||
for _, v := range []*testData{
|
||||
&testData{
|
||||
ResultCount: 4,
|
||||
FromTime: time.Now(),
|
||||
ToTime: time.Now(),
|
||||
},
|
||||
&testData{
|
||||
ResultCount: 0,
|
||||
FromTime: time.Now().Add(-48 * time.Hour),
|
||||
ToTime: time.Now().Add(-48 * time.Hour),
|
||||
},
|
||||
&testData{
|
||||
ResultCount: 2,
|
||||
StoreIDs: []int{100884},
|
||||
FromTime: time.Now(),
|
||||
ToTime: time.Now(),
|
||||
},
|
||||
&testData{
|
||||
StoreIDs: []int{100190},
|
||||
SkuIDs: []int{23847},
|
||||
ResultCount: 1,
|
||||
SkuIDs: []int{22714},
|
||||
FromTime: time.Now(),
|
||||
ToTime: time.Now(),
|
||||
},
|
||||
&testData{
|
||||
ResultCount: 0,
|
||||
VendorIDs: []int{model.VendorIDEBAI},
|
||||
FromTime: time.Now(),
|
||||
ToTime: time.Now(),
|
||||
FromTime: utils.Str2Time("2019-08-06 12:34:56"),
|
||||
ToTime: utils.Str2Time("2019-08-06 12:34:56"),
|
||||
},
|
||||
} {
|
||||
result, err := GetEffectiveActStoreSkuInfo(GetDB(), v.ActID, v.VendorIDs, v.StoreIDs, v.SkuIDs, v.FromTime, v.ToTime)
|
||||
@@ -54,6 +32,7 @@ func TestGetEffectiveActStoreSkuInfo(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(result) != v.ResultCount {
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
t.Errorf("cond:%s, len(result):%d, v.ResultCount:%d", utils.Format4Output(v, false), len(result), v.ResultCount)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
|
||||
func GetAuthBind(db *DaoDB, userID, authType, authID string) (authBind *model.AuthBind, err error) {
|
||||
@@ -33,7 +32,7 @@ func GetAuthBind(db *DaoDB, userID, authType, authID string) (authBind *model.Au
|
||||
sql += " AND t1.auth_id = ?"
|
||||
sqlParams = append(sqlParams, authID)
|
||||
}
|
||||
globals.SugarLogger.Debugf("GetAuthBind sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
|
||||
// globals.SugarLogger.Debugf("GetAuthBind sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
|
||||
err = GetRow(db, &authBind, sql, sqlParams...)
|
||||
return authBind, err
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ func GetEntitiesByKV(db *DaoDB, item interface{}, conditions map[string]interfac
|
||||
qs = qs.Filter(model.FieldDeletedAt, utils.DefaultTimeValue)
|
||||
}
|
||||
}
|
||||
_, err = qs.All(item)
|
||||
_, err = qs.Limit(-1).All(item)
|
||||
return err
|
||||
}, reflect.TypeOf(item).Name())
|
||||
return err
|
||||
|
||||
@@ -23,7 +23,10 @@ func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err
|
||||
return user, err
|
||||
}
|
||||
|
||||
func GetUsers(db *DaoDB, userType int, userID2, mobile, userName string) (userList []*model.User, err error) {
|
||||
func GetUsers(db *DaoDB, userType int, keyword string, userIDs []string, userID2, mobile string) (userList []*model.User, err error) {
|
||||
if userType == 0 {
|
||||
userType = 255
|
||||
}
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM user t1
|
||||
@@ -32,6 +35,10 @@ func GetUsers(db *DaoDB, userType int, userID2, mobile, userName string) (userLi
|
||||
utils.DefaultTimeValue,
|
||||
userType,
|
||||
}
|
||||
if len(userIDs) > 0 {
|
||||
sql += " AND t1.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
|
||||
sqlParams = append(sqlParams, userIDs)
|
||||
}
|
||||
if userID2 != "" {
|
||||
sql += " AND t1.user_id2 = ?"
|
||||
sqlParams = append(sqlParams, userID2)
|
||||
@@ -40,9 +47,10 @@ func GetUsers(db *DaoDB, userType int, userID2, mobile, userName string) (userLi
|
||||
sql += " AND t1.mobile = ?"
|
||||
sqlParams = append(sqlParams, mobile)
|
||||
}
|
||||
if userName != "" {
|
||||
sql += " AND t1.name LIKE ?"
|
||||
sqlParams = append(sqlParams, "%"+userName+"%")
|
||||
if keyword != "" {
|
||||
keywordLike := "%" + keyword + "%"
|
||||
sql += " AND (t1.user_id2 LIKE ? OR t1.mobile LIKE ? OR t1.email LIKE ? OR t1.name LIKE ?)"
|
||||
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike)
|
||||
}
|
||||
err = GetRows(db, &userList, sql, sqlParams...)
|
||||
return userList, err
|
||||
|
||||
@@ -31,6 +31,7 @@ type User struct {
|
||||
Status int8 `json:"status"`
|
||||
Type int8 `json:"type"` // 用户类型
|
||||
IDCardNo string `orm:"size(18);column(id_card_no)" json:"idCardNo"` // 身份证号
|
||||
Remark string `orm:"size(255)" json:"remark"`
|
||||
}
|
||||
|
||||
func (*User) TableUnique() [][]string {
|
||||
|
||||
@@ -108,7 +108,10 @@ func (c *PrinterHandler) GetVendorID() int {
|
||||
func (c *PrinterHandler) PrintMsg(ctx *jxcontext.Context, id1, id2, msgTitle, msgContent string) (printerStatus *partner.PrinterStatus, err error) {
|
||||
globals.SugarLogger.Debugf("PrintMsg id1:%s", id1)
|
||||
if id1 != "" {
|
||||
if _, err = api.FeieAPI.PrintMsg(id1, msgContent, 1); err == nil {
|
||||
if globals.EnableStoreWrite {
|
||||
_, err = api.FeieAPI.PrintMsg(id1, msgContent, 1)
|
||||
}
|
||||
if err == nil {
|
||||
printerStatus, err = c.GetPrinterStatus(ctx, id1, id2)
|
||||
}
|
||||
} else {
|
||||
@@ -138,13 +141,18 @@ func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store,
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, printerSN, printerKey, printerName string) (notUsed1, notUsed2 string, err error) {
|
||||
_, no, err := api.FeieAPI.PrinterAddList([]*feieapi.PrinterInfo{
|
||||
&feieapi.PrinterInfo{
|
||||
SN: printerSN,
|
||||
Key: printerKey,
|
||||
Name: printerName,
|
||||
},
|
||||
})
|
||||
var no map[string]string
|
||||
if globals.EnableStoreWrite {
|
||||
_, no, err = api.FeieAPI.PrinterAddList([]*feieapi.PrinterInfo{
|
||||
&feieapi.PrinterInfo{
|
||||
SN: printerSN,
|
||||
Key: printerKey,
|
||||
Name: printerName,
|
||||
},
|
||||
})
|
||||
} else {
|
||||
no = make(map[string]string)
|
||||
}
|
||||
if err == nil {
|
||||
if no[printerSN] != "" {
|
||||
if no[printerSN] == feieapi.ErrMsgAlredyAdded {
|
||||
@@ -158,7 +166,9 @@ func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, printerSN, prin
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) UnregisterPrinter(ctx *jxcontext.Context, printerSN, notUsed string) (err error) {
|
||||
_, _, err = api.FeieAPI.PrinterDelList([]string{printerSN})
|
||||
if globals.EnableStoreWrite {
|
||||
_, _, err = api.FeieAPI.PrinterDelList([]string{printerSN})
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -171,7 +181,9 @@ func (c *PrinterHandler) RebindPrinter(ctx *jxcontext.Context, lastBindResult *p
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) EmptyPrintList(ctx *jxcontext.Context, id1, id2 string) (err error) {
|
||||
err = api.FeieAPI.DelPrinterSqs(id1)
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.FeieAPI.DelPrinterSqs(id1)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -184,7 +184,10 @@ func (c *PrinterHandler) GetVendorID() int {
|
||||
func (c *PrinterHandler) PrintMsg(ctx *jxcontext.Context, printerNumber, printerToken, msgTitle, msgContent string) (printerStatus *partner.PrinterStatus, err error) {
|
||||
globals.SugarLogger.Debugf("PrintMsg printerNumber:%s", printerNumber)
|
||||
if printerNumber != "" {
|
||||
if _, err = api.XiaoWMAPI.SendMsg(printerNumber, printerToken, msgContent); err == nil {
|
||||
if globals.EnableStoreWrite {
|
||||
_, err = api.XiaoWMAPI.SendMsg(printerNumber, printerToken, msgContent)
|
||||
}
|
||||
if err == nil {
|
||||
printerStatus, err = c.GetPrinterStatus(ctx, printerNumber, printerToken)
|
||||
}
|
||||
} else {
|
||||
@@ -235,9 +238,14 @@ func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, printerNumber,
|
||||
if printerNumber == "" { //len(printerNumber) != len("7JizmSyiXNzkggaqU") {
|
||||
err = fmt.Errorf("外卖管家打印机设备编号:%s长度不合法", printerNumber)
|
||||
} else {
|
||||
if printerToken, err = api.XiaoWMAPI.AuthPrinter(printerNumber, "", ""); err == nil {
|
||||
if globals.EnableStoreWrite {
|
||||
printerToken, err = api.XiaoWMAPI.AuthPrinter(printerNumber, "", "")
|
||||
}
|
||||
if err == nil {
|
||||
if _, err = c.GetPrinterStatus(ctx, printerNumber, printerToken); err != nil {
|
||||
c.UnregisterPrinter(ctx, printerNumber, printerToken)
|
||||
if globals.EnableStoreWrite {
|
||||
c.UnregisterPrinter(ctx, printerNumber, printerToken)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,7 +254,9 @@ func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, printerNumber,
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) UnregisterPrinter(ctx *jxcontext.Context, printerNumber, printerToken string) (err error) {
|
||||
err = api.XiaoWMAPI.DelPrinter(printerNumber, printerToken)
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.XiaoWMAPI.DelPrinter(printerNumber, printerToken)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,10 @@ func (c *PrinterHandler) GetVendorID() int {
|
||||
func (c *PrinterHandler) PrintMsg(ctx *jxcontext.Context, machineCode, possibleToken, msgTitle, msgContent string) (printerStatus *partner.PrinterStatus, err error) {
|
||||
globals.SugarLogger.Debugf("PrintMsg machineCode:%s", machineCode)
|
||||
if machineCode != "" {
|
||||
if err = getApiByToken(possibleToken).PrintMsgWithToken(machineCode, msgTitle, msgContent, possibleToken); err == nil {
|
||||
if globals.EnableStoreWrite {
|
||||
err = getApiByToken(possibleToken).PrintMsgWithToken(machineCode, msgTitle, msgContent, possibleToken)
|
||||
}
|
||||
if err == nil {
|
||||
printerStatus, err = c.GetPrinterStatus(ctx, machineCode, possibleToken)
|
||||
}
|
||||
} else {
|
||||
@@ -137,12 +140,16 @@ func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store,
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, machineCode, secret, printerName string) (notUsed1, notUsed2 string, err error) {
|
||||
err = api.YilianyunAPI.AddPrinter(machineCode, secret, printerName)
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.YilianyunAPI.AddPrinter(machineCode, secret, printerName)
|
||||
}
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) UnregisterPrinter(ctx *jxcontext.Context, machineCode, notUsed string) (err error) {
|
||||
err = api.YilianyunAPI.DeletePrinter(machineCode)
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.YilianyunAPI.DeletePrinter(machineCode)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -160,7 +167,12 @@ func (c *PrinterHandler) BindPrinter(ctx *jxcontext.Context, mapData map[string]
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) RebindPrinter(ctx *jxcontext.Context, lastBindResult *partner.BindPrinterResult) (bindResult *partner.BindPrinterResult, err error) {
|
||||
tokenInfo, err := api.YilianyunAPI2.RefreshToken(lastBindResult.PrinterKey2)
|
||||
var tokenInfo *yilianyunapi.TokenInfo
|
||||
if globals.EnableStoreWrite {
|
||||
tokenInfo, err = api.YilianyunAPI2.RefreshToken(lastBindResult.PrinterKey2)
|
||||
} else {
|
||||
tokenInfo = &yilianyunapi.TokenInfo{}
|
||||
}
|
||||
if err == nil {
|
||||
bindResult = yilianyunToken2BindResult(tokenInfo)
|
||||
}
|
||||
@@ -184,11 +196,15 @@ func getApiByToken(possibleToken string) *yilianyunapi.API {
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) EmptyPrintList(ctx *jxcontext.Context, id1, id2 string) (err error) {
|
||||
err = api.YilianyunAPI.CancelAll(id1, id2)
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.YilianyunAPI.CancelAll(id1, id2)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) PlayText(ctx *jxcontext.Context, id1, id2, orderID, text string) (printerStatus *partner.PrinterStatus, err error) {
|
||||
err = api.YilianyunAPI.PlayText(id1, orderID, text, id2)
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.YilianyunAPI.PlayText(id1, orderID, text, id2)
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -104,7 +104,9 @@ func (c *PrinterHandler) PrintMsg(ctx *jxcontext.Context, deviceID, deviceSecret
|
||||
globals.SugarLogger.Debugf("PrintMsg deviceID:%s", deviceID)
|
||||
if deviceID != "" {
|
||||
var status int
|
||||
_, status, err = api.ZhongwuAPI.PrintMsg(deviceID, deviceSecret, msgContent)
|
||||
if globals.EnableStoreWrite {
|
||||
_, status, err = api.ZhongwuAPI.PrintMsg(deviceID, deviceSecret, msgContent)
|
||||
}
|
||||
if err == nil {
|
||||
printerStatus = c.translateStatus(status)
|
||||
}
|
||||
@@ -166,7 +168,9 @@ func (c *PrinterHandler) RebindPrinter(ctx *jxcontext.Context, lastBindResult *p
|
||||
}
|
||||
|
||||
func (c *PrinterHandler) EmptyPrintList(ctx *jxcontext.Context, id1, id2 string) (err error) {
|
||||
_, err = api.ZhongwuAPI.EmptyPrintQueue(id1, id2)
|
||||
if globals.EnableStoreWrite {
|
||||
_, err = api.ZhongwuAPI.EmptyPrintQueue(id1, id2)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -65,12 +65,12 @@ func (p *PurchaseHandler) getStoreSkusBareInfoLimitSize(ctx *jxcontext.Context,
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetStoreSkusBareInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, inStoreSkuList []*partner.StoreSkuInfo) (outStoreSkuList []*partner.StoreSkuInfo, err error) {
|
||||
result, err := putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
result, err := putils.FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
list, err := p.getStoreSkusBareInfoLimitSize(ctx, task, storeID, vendorStoreID, batchedStoreSkuList)
|
||||
if err == nil {
|
||||
result = list
|
||||
}
|
||||
return result, err
|
||||
return result, len(list), err
|
||||
}, ctx, parentTask, inStoreSkuList, jdapi.MaxStoreSkuBatchSize, true)
|
||||
for _, v := range result {
|
||||
outStoreSkuList = append(outStoreSkuList, v.(*partner.StoreSkuInfo))
|
||||
|
||||
@@ -29,9 +29,9 @@ func (p *DefSingleStorePlatform) DeleteStoreAllSkus(ctx *jxcontext.Context, pare
|
||||
VendorSkuID: v.SkuList[0].VendorSkuID,
|
||||
}
|
||||
}
|
||||
_, err = FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
_, err = FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
_, err = p.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList)
|
||||
return nil, err
|
||||
return nil, 0, err
|
||||
}, ctx, parentTask, storeStoreList, p.GetStoreSkusBatchSize(partner.FuncDeleteStoreSkus), isContinueWhenError)
|
||||
return err
|
||||
}
|
||||
@@ -76,8 +76,9 @@ func flatCatList(catList []*partner.BareCategoryInfo) (flattedCatList []*partner
|
||||
}
|
||||
|
||||
func (p *DefSingleStorePlatform) GetStoreSkusBareInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, inStoreSkuList []*partner.StoreSkuInfo) (outStoreSkuList []*partner.StoreSkuInfo, err error) {
|
||||
resultList, err := FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, err error) {
|
||||
return p.GetStoreSkusFullInfo(ctx, parentTask, storeID, vendorStoreID, batchedStoreSkuList)
|
||||
resultList, err := FreeBatchStoreSkuInfo(func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
result, err = p.GetStoreSkusFullInfo(ctx, parentTask, storeID, vendorStoreID, batchedStoreSkuList)
|
||||
return result, successCount, err
|
||||
}, ctx, parentTask, inStoreSkuList, p.GetStoreSkusBatchSize(partner.FuncGetStoreSkusFullInfo), true)
|
||||
if err != nil || len(resultList) == 0 {
|
||||
return nil, err
|
||||
@@ -133,24 +134,24 @@ func (p *DefSingleStorePlatform) GetStoreCategory(ctx *jxcontext.Context, storeI
|
||||
return cat, err
|
||||
}
|
||||
|
||||
func FreeBatchStoreSkuInfo(handler func(tasksch.ITask, []*partner.StoreSkuInfo) (interface{}, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*partner.StoreSkuInfo, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
|
||||
if len(storeSkuList) > batchSize {
|
||||
task := tasksch.NewParallelTask("FreeBatchStoreSkuInfo", tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
func FreeBatchStoreSkuInfo(handler func(tasksch.ITask, []*partner.StoreSkuInfo) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*partner.StoreSkuInfo, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
|
||||
if true { //len(storeSkuList) > batchSize {
|
||||
task := tasksch.NewParallelTask2("FreeBatchStoreSkuInfo", tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
|
||||
batchStoreSkuList := make([]*partner.StoreSkuInfo, len(batchItemList))
|
||||
for k, v := range batchItemList {
|
||||
batchStoreSkuList[k] = v.(*partner.StoreSkuInfo)
|
||||
}
|
||||
retVal, err = handler(task, batchStoreSkuList)
|
||||
retVal, successCount, err = handler(task, batchStoreSkuList)
|
||||
if err != nil {
|
||||
retVal = nil
|
||||
}
|
||||
return retVal, err
|
||||
return retVal, successCount, err
|
||||
}, storeSkuList)
|
||||
tasksch.HandleTask(task, parentTask, false).Run()
|
||||
resultList, err = task.GetResult(0)
|
||||
} else {
|
||||
result, err2 := handler(parentTask, storeSkuList)
|
||||
result, _, err2 := handler(parentTask, storeSkuList)
|
||||
if err = err2; err == nil {
|
||||
resultList = utils.Interface2Slice(result)
|
||||
}
|
||||
@@ -158,24 +159,24 @@ func FreeBatchStoreSkuInfo(handler func(tasksch.ITask, []*partner.StoreSkuInfo)
|
||||
return resultList, err
|
||||
}
|
||||
|
||||
func FreeBatchStoreSkuSyncInfo(handler func(tasksch.ITask, []*dao.StoreSkuSyncInfo) (interface{}, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*dao.StoreSkuSyncInfo, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
|
||||
if len(storeSkuList) > batchSize {
|
||||
task := tasksch.NewParallelTask("FreeBatchStoreSkuSyncInfo", tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
func FreeBatchStoreSkuSyncInfo(handler func(tasksch.ITask, []*dao.StoreSkuSyncInfo) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*dao.StoreSkuSyncInfo, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
|
||||
if true { //len(storeSkuList) > batchSize {
|
||||
task := tasksch.NewParallelTask2("FreeBatchStoreSkuSyncInfo", tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
|
||||
batchStoreSkuList := make([]*dao.StoreSkuSyncInfo, len(batchItemList))
|
||||
for k, v := range batchItemList {
|
||||
batchStoreSkuList[k] = v.(*dao.StoreSkuSyncInfo)
|
||||
}
|
||||
retVal, err = handler(task, batchStoreSkuList)
|
||||
retVal, successCount, err = handler(task, batchStoreSkuList)
|
||||
if err != nil {
|
||||
retVal = nil
|
||||
}
|
||||
return retVal, err
|
||||
return retVal, successCount, err
|
||||
}, storeSkuList)
|
||||
tasksch.HandleTask(task, parentTask, false).Run()
|
||||
resultList, err = task.GetResult(0)
|
||||
} else {
|
||||
result, err2 := handler(parentTask, storeSkuList)
|
||||
result, _, err2 := handler(parentTask, storeSkuList)
|
||||
if err = err2; err == nil {
|
||||
resultList = utils.Interface2Slice(result)
|
||||
}
|
||||
|
||||
@@ -73,9 +73,9 @@ func (c *Auth2Controller) Login() {
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 钉钉认证回调接口
|
||||
// @Description 钉钉认证回调接口,自己不能直接调用
|
||||
// @Param token header string true "认证token"
|
||||
// @Title 得到自己登录token的信息
|
||||
// @Description 得到自己登录token的信息
|
||||
// @Param token header string true "认证token"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetTokenInfo [get]
|
||||
@@ -240,10 +240,10 @@ func (c *Auth2Controller) AddAuthBind() {
|
||||
// @Title 删除认证方式
|
||||
// @Description 删除认证方式
|
||||
// @Param token header string true "认证token"
|
||||
// @Param authType formData string true "登录类型,参见Login的描述"
|
||||
// @Param authType query string true "登录类型,参见Login的描述"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /RemoveAuthBind [post]
|
||||
// @router /RemoveAuthBind [delete]
|
||||
func (c *Auth2Controller) RemoveAuthBind() {
|
||||
c.callRemoveAuthBind(func(params *tAuth2RemoveAuthBindParams) (retVal interface{}, errCode string, err error) {
|
||||
authInfo, err2 := params.Ctx.GetV2AuthInfo()
|
||||
|
||||
@@ -54,16 +54,20 @@ func (c *User2Controller) GetBindAuthInfo() {
|
||||
// @Title 得到用户列表
|
||||
// @Description 得到用户列表
|
||||
// @Param token header string true "认证token"
|
||||
// @Param userType query int true "用户类型"
|
||||
// @Param userID2 query string faslse "用户id2"
|
||||
// @Param userType query int true "用户类型(0表示全部)"
|
||||
// @Param keyword query string faslse "关键字,可以部分匹配"
|
||||
// @Param userIDs query string faslse "用户id列表"
|
||||
// @Param userID2 query string faslse "用户id2,必须全匹配(外部唯一标识)"
|
||||
// @Param mobile query string faslse "用户手机,必须全匹配"
|
||||
// @Param userName query string faslse "用户名,可以部分匹配"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetUsers [get]
|
||||
func (c *User2Controller) GetUsers() {
|
||||
c.callGetUsers(func(params *tUser2GetUsersParams) (retVal interface{}, errCode string, err error) {
|
||||
retVal, err = cms.GetUsers(params.Ctx, params.UserType, params.UserID2, params.Mobile, params.UserName)
|
||||
var userIDs []string
|
||||
if err = jxutils.Strings2Objs(params.UserIDs, &userIDs); err == nil {
|
||||
retVal, err = cms.GetUsers(params.Ctx, params.UserType, params.Keyword, userIDs, params.UserID2, params.Mobile)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
14
globals/api2/api2.go
Normal file
14
globals/api2/api2.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package api2
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/authz"
|
||||
"git.rosy.net.cn/jx-callback/business/authz/casbinauth"
|
||||
)
|
||||
|
||||
var (
|
||||
RoleMan authz.IAuthz
|
||||
)
|
||||
|
||||
func Init() {
|
||||
RoleMan, _ = casbinauth.New("business/authz/casbinauth/rbac_model.conf")
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package beegodb
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/authz/casbinauth"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
@@ -51,6 +52,8 @@ func Init() {
|
||||
orm.RegisterModel(&model.Act{}, &model.ActOrderRule{}, &model.ActStoreSku{})
|
||||
orm.RegisterModel(&model.ActMap{}, &model.ActStoreSkuMap{})
|
||||
orm.RegisterModel(&model.NewConfig{})
|
||||
|
||||
casbinauth.RegisterModel()
|
||||
// create table
|
||||
orm.RunSyncdb("default", false, true)
|
||||
}
|
||||
|
||||
@@ -2,10 +2,12 @@ package testinit
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"git.rosy.net.cn/jx-callback/globals/api2"
|
||||
"git.rosy.net.cn/jx-callback/globals/testinit1"
|
||||
)
|
||||
|
||||
func Init() {
|
||||
testinit1.Init()
|
||||
api.Init()
|
||||
api2.Init()
|
||||
}
|
||||
|
||||
3
main.go
3
main.go
@@ -17,6 +17,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"git.rosy.net.cn/jx-callback/globals/api2"
|
||||
"git.rosy.net.cn/jx-callback/globals/beegodb"
|
||||
_ "git.rosy.net.cn/jx-callback/routers"
|
||||
|
||||
@@ -46,6 +47,8 @@ var (
|
||||
|
||||
func Init() {
|
||||
beegodb.Init()
|
||||
api2.Init()
|
||||
|
||||
defsch.Init()
|
||||
buildTime, err := time.ParseInLocation(time.RFC3339, BuildDate, time.UTC)
|
||||
if err == nil {
|
||||
|
||||
@@ -146,7 +146,7 @@ func init() {
|
||||
beego.ControllerComments{
|
||||
Method: "RemoveAuthBind",
|
||||
Router: `/RemoveAuthBind`,
|
||||
AllowHTTPMethods: []string{"post"},
|
||||
AllowHTTPMethods: []string{"delete"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
Reference in New Issue
Block a user