Browse Source

Merge branch 'master' of https://git.i2edu.net/i2/i2-bill-api into master

 Conflicts:
	go.mod
	i2bill.api
	internal/handler/parttimeuseraddhandler.go
	internal/handler/parttimeuseradhandler.go
	internal/handler/routes.go
	internal/handler/user/parttimeuseradhandler.go
	internal/logic/logic_test.go
	internal/logic/user/parttimeuseradlogic.go
	internal/utils/utils.go
icole 4 years ago
parent
commit
ef2e2d3fd3

+ 0 - 1
go.mod

@@ -7,6 +7,5 @@ require (
 	git.i2edu.net/i2/i2-bill-erp v0.0.0-20210623022310-19bfc0a41451
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/satori/go.uuid v1.2.0
-	github.com/tal-tech/go-zero v1.1.7
 	gopkg.in/yaml.v2 v2.4.0
 )

+ 0 - 3
go.sum

@@ -1,9 +1,6 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-git.i2edu.net/i2/go-zero v1.0.0/go.mod h1:a9idDtfMmMXrZIHyDg6XnYjWuCpKG0I6zv6Vo9Fpncc=
 git.i2edu.net/i2/go-zero v1.0.1-0.20210616091154-7fac117e009f h1:zD6rIG7+PhJwYXuQbHyw1pn/z5oUXzrUg9bo9F9+b5k=
 git.i2edu.net/i2/go-zero v1.0.1-0.20210616091154-7fac117e009f/go.mod h1:a9idDtfMmMXrZIHyDg6XnYjWuCpKG0I6zv6Vo9Fpncc=
-git.i2edu.net/i2/i2-bill-erp v0.0.0-20210622060700-13e3b8900ff0 h1:uP58UiI5mHqh1AaYzl5/SSGFQe2VApGxlMQZwjddmmo=
-git.i2edu.net/i2/i2-bill-erp v0.0.0-20210622060700-13e3b8900ff0/go.mod h1:z41FgmYvzNObeFdF0YekAkJpq7UwvLKfruqjqMLyhTw=
 git.i2edu.net/i2/i2-bill-erp v0.0.0-20210623022310-19bfc0a41451 h1:uDtYmC19dlGyhyfHMSORWUfizSTpf1T/nqg/c5DW0XE=
 git.i2edu.net/i2/i2-bill-erp v0.0.0-20210623022310-19bfc0a41451/go.mod h1:WymRAuTBomfIIWmSxOKOkF/0jPQw8KoQlw4C5W7D2rU=
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=

+ 16 - 1
i2bill.api

@@ -95,21 +95,32 @@ type infoResponse {
 	ErpRoleType int64  `json:"erpRoleType"`
 }
 
+type punchClockRequest {
+	Lat     string `json:"lat"`
+	Address string `json:"address"`
+	Type    int64  `json:"type"`
+}
+
 type Response {
 	Code int         `json:"code"`
 	Msg  string      `json:"msg"`
 	Data interface{} `json:"data"`
 }
 
+@server(
+	group: auth
+)
 service i2bill-api {
 	@handler Hello
 	get /api/hello
+
 	@handler LoginByWeixin
 	post /api/auth/loginByWeixin(loginByWeixinRequest) returns(loginByWeixinResponse)
 }
 
 @server(
 	jwt: JwtAuth
+	group: user
 )
 service i2bill-api {
 	@handler JzQrCode
@@ -121,9 +132,13 @@ service i2bill-api {
 	@handler GetUser
 	get /api/user/info returns(infoResponse)
 	
+	@handler PunchClock
+	post /api/user/punchClock(punchClockRequest) returns(Response)
+
+	@handler  PartTimeUserAd
 	@handler  PartTimeUserAdd
 	post /api/v1/part_time_user/add (partTimeUserAddRequest) returns(Response)
-	
+
 	@handler  PartTimeUserUpdate
 	post /api/v1/part_time_user/update (partTimeUserAddRequest) returns(Response)
 }

+ 3 - 3
internal/handler/hellohandler.go → internal/handler/auth/hellohandler.go

@@ -1,16 +1,16 @@
-package handler
+package auth
 
 import (
 	"net/http"
 
 	"git.i2edu.net/i2/go-zero/rest/httpx"
-	"git.i2edu.net/i2/i2-bill-api/internal/logic"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/auth"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 )
 
 func HelloHandler(ctx *svc.ServiceContext) http.HandlerFunc {
 	return func(w http.ResponseWriter, r *http.Request) {
-		l := logic.NewHelloLogic(r.Context(), ctx)
+		l := auth.NewHelloLogic(r.Context(), ctx)
 		err := l.Hello()
 		if err != nil {
 			httpx.Error(w, err)

+ 3 - 3
internal/handler/loginbyweixinhandler.go → internal/handler/auth/loginbyweixinhandler.go

@@ -1,10 +1,10 @@
-package handler
+package auth
 
 import (
 	"net/http"
 
 	"git.i2edu.net/i2/go-zero/rest/httpx"
-	"git.i2edu.net/i2/i2-bill-api/internal/logic"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/auth"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/types"
 	"git.i2edu.net/i2/i2-bill-api/internal/utils"
@@ -17,7 +17,7 @@ func LoginByWeixinHandler(ctx *svc.ServiceContext) http.HandlerFunc {
 			httpx.OkJson(w, utils.ReturnHTTPFail(err))
 			return
 		}
-		l := logic.NewLoginByWeixinLogic(r.Context(), ctx)
+		l := auth.NewLoginByWeixinLogic(r.Context(), ctx)
 		resp, err := l.LoginByWeixin(req)
 		if err != nil {
 			httpx.OkJson(w, utils.ReturnHTTPFail(err))

+ 12 - 5
internal/handler/routes.go

@@ -4,6 +4,8 @@ package handler
 import (
 	"net/http"
 
+	auth "git.i2edu.net/i2/i2-bill-api/internal/handler/auth"
+	user "git.i2edu.net/i2/i2-bill-api/internal/handler/user"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 
 	"git.i2edu.net/i2/go-zero/rest"
@@ -15,12 +17,12 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 			{
 				Method:  http.MethodGet,
 				Path:    "/api/hello",
-				Handler: HelloHandler(serverCtx),
+				Handler: auth.HelloHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
 				Path:    "/api/auth/loginByWeixin",
-				Handler: LoginByWeixinHandler(serverCtx),
+				Handler: auth.LoginByWeixinHandler(serverCtx),
 			},
 		},
 	)
@@ -30,17 +32,22 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 			{
 				Method:  http.MethodGet,
 				Path:    "/api/user/share/jzQrcode",
-				Handler: JzQrCodeHandler(serverCtx),
+				Handler: user.JzQrCodeHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
 				Path:    "/api/user/bindMobile",
-				Handler: BindMobileHandler(serverCtx),
+				Handler: user.BindMobileHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodGet,
 				Path:    "/api/user/info",
-				Handler: GetUserHandler(serverCtx),
+				Handler: user.GetUserHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/user/punchClock",
+				Handler: user.PunchClockHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,

+ 3 - 3
internal/handler/bindmobilehandler.go → internal/handler/user/bindmobilehandler.go

@@ -1,9 +1,9 @@
-package handler
+package user
 
 import (
 	"net/http"
 
-	"git.i2edu.net/i2/i2-bill-api/internal/logic"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/user"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/types"
 	"git.i2edu.net/i2/i2-bill-api/internal/utils"
@@ -23,7 +23,7 @@ func BindMobileHandler(ctx *svc.ServiceContext) http.HandlerFunc {
 			httpx.OkJson(w, utils.ReturnHTTPFail(err))
 			return
 		}
-		l := logic.NewBindMobileLogic(r.Context(), ctx)
+		l := user.NewBindMobileLogic(r.Context(), ctx)
 		l.UserId = uid
 		l.SessionKey = skey
 		resp, err := l.BindMobile(req)

+ 4 - 5
internal/handler/getuserhandler.go → internal/handler/user/getuserhandler.go

@@ -1,13 +1,12 @@
-package handler
+package user
 
 import (
 	"net/http"
 
-	"git.i2edu.net/i2/i2-bill-api/internal/logic"
+	"git.i2edu.net/i2/go-zero/rest/httpx"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/user"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/utils"
-
-	"git.i2edu.net/i2/go-zero/rest/httpx"
 )
 
 func GetUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
@@ -17,7 +16,7 @@ func GetUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
 			httpx.OkJson(w, utils.ReturnHTTPFail(err))
 			return
 		}
-		l := logic.NewGetUserLogic(r.Context(), ctx)
+		l := user.NewGetUserLogic(r.Context(), ctx)
 		l.UserId = uid
 		l.SessionKey = skey
 		resp, err := l.GetUser()

+ 3 - 3
internal/handler/jzqrcodehandler.go → internal/handler/user/jzqrcodehandler.go

@@ -1,10 +1,10 @@
-package handler
+package user
 
 import (
 	"net/http"
 
 	"git.i2edu.net/i2/go-zero/rest/httpx"
-	"git.i2edu.net/i2/i2-bill-api/internal/logic"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/user"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/utils"
 )
@@ -16,7 +16,7 @@ func JzQrCodeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
 			httpx.OkJson(w, utils.ReturnHTTPFail(err))
 			return
 		}
-		l := logic.NewJzQrCodeLogic(r.Context(), ctx)
+		l := user.NewJzQrCodeLogic(r.Context(), ctx)
 		l.UserId = uid
 		l.SessionKey = skey
 		resp, err := l.JzQrCode()

+ 35 - 0
internal/handler/user/punchclockhandler.go

@@ -0,0 +1,35 @@
+package user
+
+import (
+	"net/http"
+
+	"git.i2edu.net/i2/go-zero/rest/httpx"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/user"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/types"
+	"git.i2edu.net/i2/i2-bill-api/internal/utils"
+)
+
+func PunchClockHandler(ctx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		uid, skey, err := ctx.GetClaims(r)
+		if err != nil {
+			httpx.OkJson(w, utils.ReturnHTTPFail(err))
+			return
+		}
+		var req types.PunchClockRequest
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.OkJson(w, utils.ReturnHTTPFail(err))
+			return
+		}
+		l := user.NewPunchClockLogic(r.Context(), ctx)
+		l.UserId = uid
+		l.SessionKey = skey
+		resp, err := l.PunchClock(req)
+		if err != nil {
+			httpx.OkJson(w, utils.ReturnHTTPFail(err))
+		} else {
+			httpx.OkJson(w, utils.ReturnHTTPSuccess(resp))
+		}
+	}
+}

+ 2 - 1
internal/logic/hellologic.go → internal/logic/auth/hellologic.go

@@ -1,4 +1,4 @@
-package logic
+package auth
 
 import (
 	"context"
@@ -28,5 +28,6 @@ func (l *HelloLogic) Hello() error {
 	// if err != nil {
 	// 	logx.Error(err)
 	// }
+	l.svcCtx.Wechat.GenQrCode("1234", "pages/stuInput/stuInput")
 	return nil
 }

+ 13 - 7
internal/logic/loginbyweixinlogic.go → internal/logic/auth/loginbyweixinlogic.go

@@ -1,7 +1,8 @@
-package logic
+package auth
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"time"
 
@@ -38,7 +39,7 @@ func (l *LoginByWeixinLogic) LoginByWeixin(req types.LoginByWeixinRequest) (*typ
 	}
 	err = l.svcCtx.SqlConn.Transact(func(session sqlx.Session) error {
 		var user model.User
-		err := session.QueryRowPartial(&user, fmt.Sprintf("select %s from user where `weixin_openid` = ? limit 1", model.UserRows), userInfo.OpenID)
+		err := session.QueryRowPartial(&user, fmt.Sprintf("select %s from i2bill_user where `weixin_openid` = ? limit 1", model.UserRows), userInfo.OpenID)
 		if err == sqlc.ErrNotFound {
 			user.Username = utils.GetUUID()
 			user.Password = ""
@@ -49,15 +50,16 @@ func (l *LoginByWeixinLogic) LoginByWeixin(req types.LoginByWeixinRequest) (*typ
 			user.Avatar = userInfo.AvatarUrl
 			user.Gender = userInfo.Gender
 			user.Nickname = userInfo.NickName
-			_, err = session.Exec(`insert into user (%s) values (
-				mobile, avatar, weixin_openid, password, birthday, register_time, last_login_time, nickname, erp_id, username, gender, user_level_id, register_ip, last_login_ip
+			_, err = session.Exec(`insert into i2bill_user (%s) values (
+				mobile, avatar, weixin_openid, password, birthday, register_time, last_login_time, nickname, 
+				erp_id, username, gender, user_level_id, register_ip, last_login_ip
 			)`,
 				user.Mobile, user.Avatar, user.WeixinOpenid, user.Password, user.Birthday, user.RegisterTime, user.LastLoginTime, user.Nickname, user.ErpId, user.Username, user.Gender, user.UserLevelId, user.RegisterIp, user.LastLoginIp)
 			if err != nil {
 				logx.Error(err)
 				return err
 			}
-			err = session.QueryRowPartial(&user, fmt.Sprintf("select %s from user where `weixin_openid` = ? limit 1", model.UserRows), userInfo.OpenID)
+			err = session.QueryRowPartial(&user, fmt.Sprintf("select %s from i2bill_user where `weixin_openid` = ? limit 1", model.UserRows), userInfo.OpenID)
 			if err != nil {
 				logx.Error(err)
 				return err
@@ -74,8 +76,9 @@ func (l *LoginByWeixinLogic) LoginByWeixin(req types.LoginByWeixinRequest) (*typ
 
 		user.LastLoginIp = ""
 		user.LastLoginTime = utils.GetTimestamp()
-		_, err = session.Exec(`update user set 
-		mobile = ?, avatar = ?, weixin_openid = ?, password = ?, birthday = ?, register_time = ?, last_login_time = ?, nickname = ?, erp_id = ?, username = ?, gender = ?, user_level_id = ?, register_ip = ?, last_login_ip = ? where id = ?`, user.Mobile, user.Avatar, user.WeixinOpenid, user.Password, user.Birthday, user.RegisterTime, user.LastLoginTime, user.Nickname, user.ErpId, user.Username, user.Gender, user.UserLevelId, user.RegisterIp, user.LastLoginIp, user.Id)
+		_, err = session.Exec(`update i2bill_user set 
+		mobile = ?, avatar = ?, weixin_openid = ?, password = ?, birthday = ?, register_time = ?, last_login_time = ?, 
+		nickname = ?, erp_id = ?, username = ?, gender = ?, user_level_id = ?, register_ip = ?, last_login_ip = ? where id = ?`, user.Mobile, user.Avatar, user.WeixinOpenid, user.Password, user.Birthday, user.RegisterTime, user.LastLoginTime, user.Nickname, user.ErpId, user.Username, user.Gender, user.UserLevelId, user.RegisterIp, user.LastLoginIp, user.Id)
 		if err != nil {
 			logx.Error(err)
 			return err
@@ -123,6 +126,9 @@ func (l *LoginByWeixinLogic) Login(code string) (*types.WXUserInfo, error) {
 
 	var res types.WXLoginResponse
 	req.ToJSON(&res)
+	if res.ErrCode != 0 {
+		return nil, errors.New(res.ErrMsg)
+	}
 	userinfo, err := l.DecryptUserInfoData(res.SessionKey)
 	userinfo.OpenID = res.OpenID
 	userinfo.SessionKey = res.SessionKey

+ 2 - 2
internal/logic/bindmobilelogic.go → internal/logic/user/bindmobilelogic.go

@@ -1,4 +1,4 @@
-package logic
+package user
 
 import (
 	"context"
@@ -31,7 +31,7 @@ func (l *BindMobileLogic) BindMobile(req types.BindMobileRequest) (*types.BindMo
 		logx.Error(err)
 		return nil, err
 	}
-	_, err = l.svcCtx.SqlConn.Exec(`update user set mobile = ? where id = ?`, mobile, l.UserId)
+	_, err = l.svcCtx.SqlConn.Exec(`update i2bill_user set mobile = ? where id = ?`, mobile, l.UserId)
 	if err != nil {
 		logx.Error(err)
 		return nil, err

+ 3 - 2
internal/logic/getuserlogic.go → internal/logic/user/getuserlogic.go

@@ -1,4 +1,4 @@
-package logic
+package user
 
 import (
 	"context"
@@ -29,7 +29,7 @@ func NewGetUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) GetUserLog
 
 func (l *GetUserLogic) GetUser() (*types.InfoResponse, error) {
 	var user model.User
-	err := l.svcCtx.SqlConn.QueryRowPartial(&user, "select id, erp_id, avatar, birthday, username, nickname, gender, mobile from user where `id` = ? limit 1", l.UserId)
+	err := l.svcCtx.SqlConn.QueryRowPartial(&user, "select id, erp_id, avatar, birthday, username, nickname, gender, mobile from i2bill_user where `id` = ? limit 1", l.UserId)
 	if err != nil {
 		logx.Error(err)
 		return nil, err
@@ -48,6 +48,7 @@ func (l *GetUserLogic) GetUser() (*types.InfoResponse, error) {
 	info.UserName = user.Username
 	info.NickName = user.Nickname
 	info.Gender = user.Gender
+	info.Mobile = user.Mobile
 	info.ErpRoleType = resp.ErpRoleType
 	return info, nil
 }

+ 8 - 4
internal/logic/jzqrcodelogic.go → internal/logic/user/jzqrcodelogic.go

@@ -1,7 +1,8 @@
-package logic
+package user
 
 import (
 	"context"
+	"time"
 
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/types"
@@ -28,13 +29,16 @@ func NewJzQrCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) JzQrCodeL
 }
 
 func (l *JzQrCodeLogic) JzQrCode() (*types.JzQrcodeResponse, error) {
-	uid, err := l.svcCtx.Wechat.GenQrId(qrcodeJzPrefix, map[string]interface{}{
-		"userId": l.UserId,
+	uid, err := l.svcCtx.Wechat.GenUserQrId(qrcodeJzPrefix, l.UserId, map[string]interface{}{
+		"userId":    l.UserId,
+		"timestamp": time.Now().Unix(),
+		"type":      "JzQrCode",
 	})
+	// l.svcCtx.Wechat.GetQrParams(qrcodeJzPrefix, uid, map[string]interface{}{})
 	if err != nil {
 		return nil, err
 	}
-	uri, err := l.svcCtx.Wechat.GenQrCode(uid, "index/user")
+	uri, err := l.svcCtx.Wechat.GenQrCode(uid, "pages/stuInput/stuInput")
 	return &types.JzQrcodeResponse{
 		FileId: uri,
 	}, err

+ 14 - 0
internal/logic/user/logic_test.go

@@ -0,0 +1,14 @@
+package user
+
+import (
+	"context"
+	"fmt"
+	"testing"
+
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/auth"
+)
+
+func TestCreateJWT(t *testing.T) {
+	l := auth.NewLoginByWeixinLogic(context.TODO(), ctx)
+	fmt.Println(l.CreateJWT(1624415746, c.JwtAuth.AccessSecret, nil, 1000))
+}

+ 19 - 0
internal/logic/user/main_test.go

@@ -0,0 +1,19 @@
+package user
+
+import (
+	"flag"
+	"testing"
+
+	"git.i2edu.net/i2/go-zero/core/conf"
+	"git.i2edu.net/i2/i2-bill-api/internal/config"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+)
+
+var configFile = flag.String("f", "etc/i2bill-api.yaml", "the config file")
+var c config.Config
+var ctx *svc.ServiceContext
+
+func TestMain(m *testing.M) {
+	conf.MustLoad(*configFile, &c)
+	ctx = svc.NewServiceContext(c)
+}

+ 73 - 0
internal/logic/user/punchclocklogic.go

@@ -0,0 +1,73 @@
+package user
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"time"
+
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/types"
+	"git.i2edu.net/i2/i2-bill-api/internal/utils"
+	"git.i2edu.net/i2/i2-bill-api/model"
+
+	"git.i2edu.net/i2/go-zero/core/logx"
+	"git.i2edu.net/i2/go-zero/core/stores/sqlc"
+)
+
+type PunchClockLogic struct {
+	logx.Logger
+	ctx        context.Context
+	svcCtx     *svc.ServiceContext
+	UserId     int64
+	SessionKey string
+}
+
+func NewPunchClockLogic(ctx context.Context, svcCtx *svc.ServiceContext) PunchClockLogic {
+	return PunchClockLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PunchClockLogic) PunchClock(req types.PunchClockRequest) (*types.Response, error) {
+	var aar model.I2billAcquirerAttendanceRecord
+	err := l.svcCtx.SqlConn.QueryRowPartial(&aar, fmt.Sprintf("select %s from i2bill_acquirer_attendance_record where `user_id` = ? and TO_DAYS(create_time)=TO_DAYS(NOW()  limit 1", model.I2billAcquirerAttendanceRecordRows), l.UserId)
+	if err == sqlc.ErrNotFound {
+		aar.DelFlag = sql.NullInt64{Int64: 0, Valid: true}
+		aar.UserId = sql.NullInt64{Int64: l.UserId, Valid: true}
+		aar.CreateTime = sql.NullTime{Time: time.Now(), Valid: true}
+	}
+	// 上班卡
+	if req.Type == 1 && !utils.ValidTime(aar.StartTime.Time) {
+		aar.StartTime = sql.NullTime{Time: time.Now(), Valid: true}
+		aar.StartLat = sql.NullString{String: req.Lat, Valid: true}
+		aar.StartAddress = sql.NullString{String: req.Address, Valid: true}
+	} else if req.Type == 2 && !utils.ValidTime(aar.EndTime.Time) {
+		// 下班卡
+		aar.EndTime = sql.NullTime{Time: time.Now(), Valid: true}
+		aar.EndLat = sql.NullString{String: req.Lat, Valid: true}
+		aar.EndAddress = sql.NullString{String: req.Address, Valid: true}
+	}
+	if aar.Id == 0 {
+		_, err = l.svcCtx.SqlConn.Exec(`
+		INSERT INTO i2bill_acquirer_attendance_record
+		(user_id,start_lat,start_address,end_lat,end_address,start_time,end_time,create_time,del_flag)
+		VALUES
+		(?,?,?,?,?,?,?,?,?)`,
+			aar.UserId, aar.StartLat, aar.StartAddress, aar.EndLat, aar.EndAddress, aar.StartTime, aar.EndTime, aar.CreateTime, aar.DelFlag)
+		if err != nil {
+			logx.Error(err)
+			return nil, err
+		}
+	}
+	_, err = l.svcCtx.SqlConn.Exec(`update i2bill_acquirer_attendance_record set 
+	user_id = ?, start_lat = ?, start_address = ?, end_lat = ?, end_address = ?, start_time = ?, end_time = ?, create_time = ?, del_flag = ? where id = ?`,
+		aar.UserId, aar.StartLat, aar.StartAddress, aar.EndLat, aar.EndAddress, aar.StartTime, aar.EndTime, aar.CreateTime, aar.DelFlag, l.UserId)
+	if err != nil {
+		logx.Error(err)
+		return nil, err
+	}
+	return utils.ReturnHTTPSuccess("ok"), nil
+}

+ 18 - 6
internal/svc/servicecontext.go

@@ -75,19 +75,31 @@ func (wc *Wechat) GetAccessToken() (string, error) {
 
 // GenQrId defined TODO
 func (wc *Wechat) GenQrId(prefix string, params interface{}) (string, error) {
-	uuid := utils.GetUUID()
+	timestamp := utils.GetTimestamp()
 	ube, err := json.Marshal(params)
 	if err != nil {
 		return "", err
 	}
-	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, uuid), string(ube), time.Duration(1)*time.Hour)
-	return uuid, err
+	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, timestamp), string(ube), time.Duration(1)*time.Hour)
+	return fmt.Sprintf("%v", timestamp), err
+}
+
+// GenUserQrId defined TODO
+func (wc *Wechat) GenUserQrId(prefix string, userId int64, params interface{}) (string, error) {
+	timestamp := utils.GetTimestamp()
+	ube, err := json.Marshal(params)
+	if err != nil {
+		return "", err
+	}
+	qrId := fmt.Sprintf("u%v-%v", userId, timestamp)
+	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, qrId), string(ube), time.Duration(1)*time.Hour)
+	return qrId, err
 }
 
 // GetQrParams defined TODO
-func (wc *Wechat) GetQrParams(prefix string, uuid string, params interface{}) error {
+func (wc *Wechat) GetQrParams(prefix string, id string, params interface{}) error {
 	ube := ""
-	err := wc.RdCli.GetCache(fmt.Sprintf(prefix, uuid), &ube)
+	err := wc.RdCli.GetCache(fmt.Sprintf(prefix, id), &ube)
 	if err != nil {
 		return err
 	}
@@ -138,7 +150,7 @@ func (wc *Wechat) GenQrCode(scene, page string) (string, error) {
 		return "", err
 	}
 	req := utils.Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token)
-	req.JSONBody(map[string]interface{}{"scene": scene})
+	req.JSONBody(map[string]interface{}{"scene": scene, "page": page})
 	ph := path.Join("asserts", "qrcode", scene+".png")
 	err = req.ToFile(ph)
 	if err != nil {

+ 6 - 0
internal/types/types.go

@@ -88,6 +88,12 @@ type InfoResponse struct {
 	ErpRoleType int64  `json:"erpRoleType"`
 }
 
+type PunchClockRequest struct {
+	Lat     string `json:"lat"`
+	Address string `json:"address"`
+	Type    int64  `json:"type"`
+}
+
 type Response struct {
 	Code int         `json:"code"`
 	Msg  string      `json:"msg"`

+ 11 - 16
internal/utils/resp.go

@@ -1,32 +1,27 @@
 package utils
 
-type HTTPData struct {
-	Code int         `json:"code"`
-	Msg  string      `json:"msg"`
-	Data interface{} `json:"data"`
-}
+import "git.i2edu.net/i2/i2-bill-api/internal/types"
 
-func ReturnHTTPSuccess(val interface{}) HTTPData {
-	rtndata := HTTPData{
-		Code: 0,
-		Msg:  "",
+func ReturnHTTPSuccess(val interface{}) *types.Response {
+	rtndata := types.Response{
+		Code: 200,
 		Data: val,
 	}
-	return rtndata
+	return &rtndata
 }
 
-func ReturnHTTPFail(err error) HTTPData {
-	rtndata := HTTPData{
+func ReturnHTTPFail(err error) *types.Response {
+	rtndata := types.Response{
 		Code: 500,
 		Msg:  err.Error(),
 	}
-	return rtndata
+	return &rtndata
 }
 
-func ReturnHTTPUnauthorized(err error) HTTPData {
-	rtndata := HTTPData{
+func ReturnHTTPUnauthorized(err error) *types.Response {
+	rtndata := types.Response{
 		Code: 401,
 		Msg:  err.Error(),
 	}
-	return rtndata
+	return &rtndata
 }

+ 5 - 0
internal/utils/utils.go

@@ -22,6 +22,11 @@ func Int2String(val int64) string {
 	return strconv.Itoa(int(val))
 }
 
+func ValidTime(t time.Time) bool {
+	t1970, _ := time.Parse("2006-01-02", "1970-01-01")
+	return t.After(t1970)
+}
+
 func String2Int64(str string) int64 {
 	number, _ := strconv.ParseInt(str, 10, 64)
 	return number

+ 2 - 0
model/i2bill_acquirer_attendance_record.sql

@@ -3,7 +3,9 @@ DROP TABLE IF EXISTS `i2bill_acquirer_attendance_record`;
 CREATE TABLE `i2bill_acquirer_attendance_record`  (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `user_id` int(11) NULL DEFAULT NULL COMMENT '用户id',
+  `start_lat` varchar(36) NULL DEFAULT NULL,
   `start_address` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '上班地址',
+  `end_lat` varchar(36) NULL DEFAULT NULL,
   `end_address` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '下班地址',
   `start_time` datetime(0) NULL DEFAULT NULL COMMENT '上班时间',
   `end_time` datetime(0) NULL DEFAULT NULL COMMENT '下班时间',

+ 1 - 1
model/user.sql → model/i2bill_user.sql

@@ -1,5 +1,5 @@
 
-DROP TABLE IF EXISTS `user`;
+DROP TABLE IF EXISTS `i2bill_user`;
 CREATE TABLE `i2bill_user` (
   `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
   `erp_id` varchar(36) NOT NULL DEFAULT '',

+ 17 - 15
model/i2billacquirerattendancerecordmodel.go

@@ -13,10 +13,10 @@ import (
 )
 
 var (
-	i2billAcquirerAttendanceRecordFieldNames          = builderx.RawFieldNames(&I2billAcquirerAttendanceRecord{})
-	i2billAcquirerAttendanceRecordRows                = strings.Join(i2billAcquirerAttendanceRecordFieldNames, ",")
-	i2billAcquirerAttendanceRecordRowsExpectAutoSet   = strings.Join(stringx.Remove(i2billAcquirerAttendanceRecordFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
-	i2billAcquirerAttendanceRecordRowsWithPlaceHolder = strings.Join(stringx.Remove(i2billAcquirerAttendanceRecordFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
+	I2billAcquirerAttendanceRecordFieldNames          = builderx.RawFieldNames(&I2billAcquirerAttendanceRecord{})
+	I2billAcquirerAttendanceRecordRows                = strings.Join(I2billAcquirerAttendanceRecordFieldNames, ",")
+	I2billAcquirerAttendanceRecordRowsExpectAutoSet   = strings.Join(stringx.Remove(I2billAcquirerAttendanceRecordFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
+	I2billAcquirerAttendanceRecordRowsWithPlaceHolder = strings.Join(stringx.Remove(I2billAcquirerAttendanceRecordFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
 
 	cacheI2billAcquirerAttendanceRecordIdPrefix = "cache:i2billAcquirerAttendanceRecord:id:"
 )
@@ -35,14 +35,16 @@ type (
 	}
 
 	I2billAcquirerAttendanceRecord struct {
-		Id           int64          `db:"id"`
-		UserId       sql.NullInt64  `db:"user_id"`       // 用户id
+		EndAddress   sql.NullString `db:"end_address"` // 下班地址
+		EndTime      sql.NullTime   `db:"end_time"`    // 下班时间
+		DelFlag      sql.NullInt64  `db:"del_flag"`
+		EndLat       sql.NullString `db:"end_lat"`
+		UserId       sql.NullInt64  `db:"user_id"` // 用户id
+		StartLat     sql.NullString `db:"start_lat"`
 		StartAddress sql.NullString `db:"start_address"` // 上班地址
-		EndAddress   sql.NullString `db:"end_address"`   // 下班地址
 		StartTime    sql.NullTime   `db:"start_time"`    // 上班时间
-		EndTime      sql.NullTime   `db:"end_time"`      // 下班时间
 		CreateTime   sql.NullTime   `db:"create_time"`
-		DelFlag      sql.NullInt64  `db:"del_flag"`
+		Id           int64          `db:"id"`
 	}
 )
 
@@ -54,8 +56,8 @@ func NewI2billAcquirerAttendanceRecordModel(conn sqlx.SqlConn, c cache.CacheConf
 }
 
 func (m *defaultI2billAcquirerAttendanceRecordModel) Insert(data I2billAcquirerAttendanceRecord) (sql.Result, error) {
-	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, i2billAcquirerAttendanceRecordRowsExpectAutoSet)
-	ret, err := m.ExecNoCache(query, data.UserId, data.StartAddress, data.EndAddress, data.StartTime, data.EndTime, data.DelFlag)
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, I2billAcquirerAttendanceRecordRowsExpectAutoSet)
+	ret, err := m.ExecNoCache(query, data.EndAddress, data.EndTime, data.DelFlag, data.EndLat, data.UserId, data.StartLat, data.StartAddress, data.StartTime)
 
 	return ret, err
 }
@@ -64,7 +66,7 @@ func (m *defaultI2billAcquirerAttendanceRecordModel) FindOne(id int64) (*I2billA
 	i2billAcquirerAttendanceRecordIdKey := fmt.Sprintf("%s%v", cacheI2billAcquirerAttendanceRecordIdPrefix, id)
 	var resp I2billAcquirerAttendanceRecord
 	err := m.QueryRow(&resp, i2billAcquirerAttendanceRecordIdKey, func(conn sqlx.SqlConn, v interface{}) error {
-		query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", i2billAcquirerAttendanceRecordRows, m.table)
+		query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", I2billAcquirerAttendanceRecordRows, m.table)
 		return conn.QueryRow(v, query, id)
 	})
 	switch err {
@@ -80,8 +82,8 @@ func (m *defaultI2billAcquirerAttendanceRecordModel) FindOne(id int64) (*I2billA
 func (m *defaultI2billAcquirerAttendanceRecordModel) Update(data I2billAcquirerAttendanceRecord) error {
 	i2billAcquirerAttendanceRecordIdKey := fmt.Sprintf("%s%v", cacheI2billAcquirerAttendanceRecordIdPrefix, data.Id)
 	_, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
-		query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, i2billAcquirerAttendanceRecordRowsWithPlaceHolder)
-		return conn.Exec(query, data.UserId, data.StartAddress, data.EndAddress, data.StartTime, data.EndTime, data.DelFlag, data.Id)
+		query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, I2billAcquirerAttendanceRecordRowsWithPlaceHolder)
+		return conn.Exec(query, data.EndAddress, data.EndTime, data.DelFlag, data.EndLat, data.UserId, data.StartLat, data.StartAddress, data.StartTime, data.Id)
 	}, i2billAcquirerAttendanceRecordIdKey)
 	return err
 }
@@ -101,6 +103,6 @@ func (m *defaultI2billAcquirerAttendanceRecordModel) formatPrimary(primary inter
 }
 
 func (m *defaultI2billAcquirerAttendanceRecordModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
-	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", i2billAcquirerAttendanceRecordRows, m.table)
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", I2billAcquirerAttendanceRecordRows, m.table)
 	return conn.QueryRow(v, query, primary)
 }

+ 1 - 1
model/usermodel.go → model/i2billusermodel.go

@@ -66,7 +66,7 @@ type (
 func NewUserModel(conn sqlx.SqlConn, c cache.CacheConf) UserModel {
 	return &defaultUserModel{
 		CachedConn: sqlc.NewConn(conn, c),
-		table:      "`user`",
+		table:      "`i2bill_user`",
 	}
 }