Bläddra i källkod

二维码信息添加,获取

icole 4 år sedan
förälder
incheckning
03e52873d1

+ 3 - 1
etc/i2bill-api.yaml

@@ -16,4 +16,6 @@ Weixin:
   Secret: 95dc14b89d32fe91709bba8916f30f74
 JwtAuth:
   AccessSecret: 6hy789iu87
-  AccessExpire: 604800
+  AccessExpire: 604800
+Domain: http://172.16.11.5:8888
+AesSecret: 95dc14b89d32fe91709bba8916f30f74

+ 5 - 5
i2bill.api

@@ -123,15 +123,13 @@ type enrollRequest {
 }
 
 type enrollAddReq {
-	Name          string `json:"name"`
+	StuName       string `json:"stu_name"`
 	AgeGroup      int    `json:"age_group"`
 	StuLinkPerson string `json:"stu_link_person"`
 	StuPhone      string `json:"stu_phone"`
 	SchId         int    `json:"sch_id"`
 	Address       string `json:"address"`
-	UserId        int    `json:"user_id"`
-	NetworkId     int    `json:"network_id,optional"`
-	ActiveId      int    `json:"active_id,optional"`
+	Sign          string `json:"sign"`
 }
 
 type Response {
@@ -241,7 +239,7 @@ service i2bill-api {
 	post  /api/v1/acquirer_mkt_qr/update returns(Response)
 	
 	@handler AcquirerMktQrGet
-	post  /api/v1/acquirer_mkt_qr/get returns(Response)
+	get  /api/v1/acquirer_mkt_qr/get returns(Response)
 }
 
 // 城市树
@@ -284,6 +282,8 @@ service i2bill-api{
 service i2bill-api{
 	@handler GetErpSchPerm
 	get /api/v1/base_organ_school/get_erp_sch_perm returns(Response)
+	@handler GetErpSchTree
+	get /api/v1/base_organ_school/get_organ_school_tree returns(Response)
 }
 
 //erp 校区活动

+ 2 - 0
internal/config/config.go

@@ -12,6 +12,8 @@ type Weixin struct {
 }
 type Config struct {
 	rest.RestConf
+	Domain     string
+	AesSecret  string
 	DataSource string
 	Table      string
 	Transform  zrpc.RpcClientConf

+ 22 - 0
internal/handler/base_organ_school/get_erp_sch_tree_handler.go

@@ -0,0 +1,22 @@
+package handler
+
+import (
+	"net/http"
+
+	"git.i2edu.net/i2/go-zero/rest/httpx"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/base_organ_school"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+)
+
+func GetErpSchTreeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+
+		l := logic.NewGetErpSchTreeLogic(r.Context(), ctx)
+		resp, err := l.GetErpSchTree()
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 6 - 1
internal/handler/routes.go

@@ -138,7 +138,7 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 				Handler: acquirer_mkt_qr.AcquirerMktQrUpdateHandler(serverCtx),
 			},
 			{
-				Method:  http.MethodPost,
+				Method:  http.MethodGet,
 				Path:    "/api/v1/acquirer_mkt_qr/get",
 				Handler: acquirer_mkt_qr.AcquirerMktQrGetHandler(serverCtx),
 			},
@@ -186,6 +186,11 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 				Path:    "/api/v1/base_organ_school/get_erp_sch_perm",
 				Handler: base_organ_school.GetErpSchPermHandler(serverCtx),
 			},
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/v1/base_organ_school/get_organ_school_tree",
+				Handler: base_organ_school.GetErpSchTreeHandler(serverCtx),
+			},
 		},
 		rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
 	)

+ 3 - 0
internal/logic/acquirer/enroll_logic.go

@@ -39,10 +39,12 @@ func (l *EnrollLogic) Enroll(req types.EnrollRequest) (*types.Response, error) {
 	}
 	err := l.svcCtx.Wechat.GetQrParams(svc.QrcodeJzPrefix, req.Scene, &qrScence)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 	}
 	err = l.svcCtx.SqlConn.QueryRowPartial(&stu, fmt.Sprintf("select %s from i2bill_acquirer_student where `user_id`=? and `stu_phone`=? limit 1", model.I2billAcquirerStudentRows), qrScence.UserId, req.ContactPhone)
 	if err != sqlc.ErrNotFound && err != nil {
+		logx.Error(err.Error())
 		return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 	} else if stu.Id > 0 {
 		return &types.Response{Code: 500, Msg: "已录入成功, 请勿重复操作", Data: nil}, nil
@@ -51,6 +53,7 @@ func (l *EnrollLogic) Enroll(req types.EnrollRequest) (*types.Response, error) {
 		stu.StuPhone = sql.NullString{String: req.ContactPhone, Valid: true}
 		_, err := l.svcCtx.I2billAcquirerStudentModel.Insert(stu)
 		if err != nil {
+			logx.Error(err.Error())
 			return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 		}
 	}

+ 36 - 1
internal/logic/acquirer_mkt_qr/acquirer_mkt_qr_get_logic.go

@@ -2,8 +2,11 @@ package acquirer_mkt_qr
 
 import (
 	"context"
+	"encoding/json"
+	"git.i2edu.net/i2/i2-bill-api/internal/utils"
 	"git.i2edu.net/i2/i2-bill-api/model"
 	"net/http"
+	"strings"
 
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/types"
@@ -44,5 +47,37 @@ func (l *AcquirerMktQrGetLogic) AcquirerMktQrGet(r *http.Request) (*types.Respon
 	if qr.Id == 0 {
 		return &types.Response{500, "请先编辑收单二维码信息", nil}, nil
 	}
-	return &types.Response{200, "", qr}, nil
+	qr.Qr = strings.TrimLeft(qr.Qr, "/")
+	domain := strings.TrimRight(l.svcCtx.Config.Domain, "/")
+	qr.Qr = domain + "/" + qr.Qr
+	//渠道
+	networkNodes, err := l.svcCtx.GetErpNetworkDetailTree()
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	var networkId, networkName string
+	utils.TreePath(networkNodes, qr.QudaoId, &networkId, &networkName)
+	qrByte, _ := json.Marshal(qr)
+	var qrMap = make(map[string]interface{})
+	json.Unmarshal(qrByte, &qrMap)
+	qrMap["qudao_name"] = networkName
+	qrMap["qudao_path"] = networkId
+	//活动
+	active, err := l.svcCtx.GetErpActivity()
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	qrMap["activity_name"] = utils.GetErpActiveName(qr.ActivityId, active)
+	//校区
+	schools, err := l.svcCtx.GetErpOrganSchool()
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+
+	qrMap["school_name"] = utils.GetErpSchoolName(qr.SchoolId, schools)
+
+	return &types.Response{200, "", qrMap}, nil
 }

+ 27 - 2
internal/logic/acquirer_mkt_qr/acquirer_mkt_qr_update_logic.go

@@ -2,10 +2,14 @@ package acquirer_mkt_qr
 
 import (
 	"context"
+	"encoding/base64"
 	"encoding/json"
+	"fmt"
+	"git.i2edu.net/i2/i2-bill-api/internal/utils"
 	"git.i2edu.net/i2/i2-bill-api/model"
 	"io/ioutil"
 	"net/http"
+	"strings"
 	"time"
 
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
@@ -47,6 +51,7 @@ func (l *AcquirerMktQrUpdateLogic) AcquirerMktQrUpdate(r *http.Request) (*types.
 		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
+	var ty = "part"
 	//mk
 	if userInfo.ErpId != "" {
 		erpId, err := model.GetErpUser("", userInfo.ErpId, l.svcCtx.Transformer)
@@ -57,6 +62,7 @@ func (l *AcquirerMktQrUpdateLogic) AcquirerMktQrUpdate(r *http.Request) (*types.
 		if erpId == "" {
 			return &types.Response{500, "未找到mk用户", nil}, nil
 		}
+		ty = "mk"
 	} else {
 		//兼职
 		partUser, err := model.GetPartTimeXormByUserId(userId, l.svcCtx.DB)
@@ -67,6 +73,14 @@ func (l *AcquirerMktQrUpdateLogic) AcquirerMktQrUpdate(r *http.Request) (*types.
 		if partUser.Id == 0 {
 			return &types.Response{500, "请先申请成为兼职", nil}, nil
 		}
+		erpId, err := model.GetErpUser("", partUser.MkId, l.svcCtx.Transformer)
+		if err != nil {
+			logx.Error(err.Error())
+			return &types.Response{500, err.Error(), nil}, nil
+		}
+		if erpId == "" {
+			return &types.Response{500, "未找到mk用户", nil}, nil
+		}
 		bean.QudaoId = 1058
 		bean.ActivityId = 0
 	}
@@ -91,11 +105,22 @@ func (l *AcquirerMktQrUpdateLogic) AcquirerMktQrUpdate(r *http.Request) (*types.
 	bean.CreateBy = userId
 	bean.CreateTime = bean.LastUpdateTime
 	bean.DelFlag = 0
+	bean.UserId = userId
 	//生成二维码
-	bean.Qr = "test.jpg"
+	scene, _ := utils.AesEncrypt([]byte(fmt.Sprintf("%d", userId)), []byte(l.svcCtx.Config.AesSecret))
+	sceneStr := fmt.Sprintf("sign=%s&type=%s", base64.StdEncoding.EncodeToString(scene), ty)
+	uri, err := l.svcCtx.Wechat.GenQrCode(sceneStr, "/pages/code/code")
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	bean.Qr = uri
 	_, err = l.svcCtx.DB.Insert(bean)
+	bean.Qr = strings.TrimLeft(bean.Qr, "/")
+	domain := strings.TrimRight(l.svcCtx.Config.Domain, "/")
+	bean.Qr = domain + "/" + bean.Qr
 	if err != nil {
 		return &types.Response{500, err.Error(), nil}, nil
 	}
-	return &types.Response{200, "", nil}, nil
+	return &types.Response{200, "", bean}, nil
 }

+ 49 - 37
internal/logic/acquirer_student/acquirer_student_add_logic.go

@@ -2,10 +2,12 @@ package logic
 
 import (
 	"context"
-	"fmt"
+	"encoding/base64"
 	"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"
+	"strconv"
 	"time"
 
 	"git.i2edu.net/i2/go-zero/core/logx"
@@ -27,57 +29,67 @@ func NewAcquirerStudentAddLogic(ctx context.Context, svcCtx *svc.ServiceContext)
 
 func (l *AcquirerStudentAddLogic) AcquirerStudentAdd(req types.EnrollAddReq) (*types.Response, error) {
 	// todo: add your logic here and delete this line
+	//解析id
+	sign, err := base64.StdEncoding.DecodeString(req.Sign)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, "二维码已失效", nil}, nil
+	}
+	userIdByte, err := utils.AesDecrypt(sign, []byte(l.svcCtx.Config.AesSecret))
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, "二维码已失效", nil}, nil
+	}
+	userId, err := strconv.ParseInt(string(userIdByte), 10, 64)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	//是否有权限收单
+	erpId, err := model.GetAcquirePerm(userId, l.svcCtx.Transformer, l.svcCtx.DB)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	if erpId == "" {
+		return &types.Response{500, "二维码已失效", nil}, nil
+	}
 	//去重
 	stu, err := l.svcCtx.DB.SQL("select * from i2bill_acquirer_student where stu_phone = ?  and DATE_FORMAT(create_time,'%Y-%m-%d') = ? ", req.StuPhone, time.Now().Format("2006-01-02")).Query().List()
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
 	if len(stu) > 0 {
 		return &types.Response{500, "你今天已提交过信息,感谢你的填写", nil}, nil
 	}
-	bean := new(model.I2billAcquirerStudent)
+	bean := new(model.I2billAcquirerStudentXorm)
 	bean.AgeGroup = int64(req.AgeGroup)
-	bean.StuPhone.String = req.StuPhone
-	bean.Address.String = req.Address
-	bean.UserId.Int64 = int64(req.UserId)
-	partUserSql := fmt.Sprintf("select * from %s where user_id = ? and del_flag = 0 and check_state = ?", "i2bill_mkt_part_time_user")
-	res, err := l.svcCtx.DB.SQL(partUserSql, req.UserId, 57).Query().List()
+	bean.StuPhone = req.StuPhone
+	bean.Address = req.Address
+	bean.UserId = userId
+	//获取渠道收单信息
+	acquirerInfo, err := model.GetAcquirerMktQr(userId, l.svcCtx.DB)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
-	if len(res) < 1 {
-		return &types.Response{500, "无效二维码", nil}, nil
-	}
-	bean.MkId.String = res[0]["mk_id"].(string)
-	bean.NetworkDetailId.Int64 = int64(req.NetworkId)
-	bean.ActiveId.Int64 = int64(req.ActiveId)
-	bean.DelFlag = 0
-	bean.CheckState.Int64 = 54
-	bean.StuName.String = req.Name
-	bean.StuLinkPerson.String = req.StuLinkPerson
-	bean.SchId.Int64 = int64(req.SchId)
-	bean.CreateTime.Time = time.Now()
-	sql := `INSERT INTO i2bill_acquirer_student (stu_link_person,stu_phone,create_time,mk_id,user_id,address,
-	check_state,stu_name,age_group,sch_id,del_flag,network_detail_id,active_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)`
-	var args []interface{}
-	args = append(args, sql,
-		bean.StuLinkPerson.String, bean.StuPhone.String,
-		bean.CreateTime.Time, bean.MkId.String, bean.UserId.Int64,
-		bean.Address.String, bean.CheckState.Int64, bean.StuName.String,
-		bean.AgeGroup, bean.SchId.Int64, bean.DelFlag)
-	if req.NetworkId != 0 {
-		args = append(args, req.NetworkId)
-	} else {
-		args = append(args, 1058)
-	}
-	if req.ActiveId != 0 {
-		args = append(args, req.ActiveId)
-	} else {
-		args = append(args, nil)
+	if acquirerInfo.Id == 0 {
+		return &types.Response{500, "二维码已失效", nil}, nil
 	}
 
-	_, err = l.svcCtx.DB.Exec(args...)
+	bean.MkId = erpId
+	bean.NetworkDetailId = acquirerInfo.QudaoId
+	bean.ActiveId = acquirerInfo.ActivityId
+	bean.DelFlag = 0
+	bean.CheckState = 54
+	bean.StuName = req.StuName
+	bean.StuLinkPerson = req.StuLinkPerson
+	bean.SchId = int64(req.SchId)
+	bean.CreateTime = time.Now()
+	_, err = l.svcCtx.DB.Insert(bean)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
 	return &types.Response{200, "", nil}, nil

+ 2 - 0
internal/logic/acquirer_student/acquirer_student_total_logic.go

@@ -49,6 +49,7 @@ func (l *AcquirerStudentTotalLogic) AcquirerStudentTotal() (*types.Response, err
 
 	totalByCheck, err := l.svcCtx.DB.NewSession().SQL(sqlTotalByCheck, userId).Query().List()
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
 	timeNow := time.Now()
@@ -56,6 +57,7 @@ func (l *AcquirerStudentTotalLogic) AcquirerStudentTotal() (*types.Response, err
 	end := start.Add(24*60*60*time.Second - 1*time.Second)
 	totalDay, err := l.svcCtx.DB.NewSession().SQL(sqlTotalByToDay, userId, start, end).Query().List()
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
 	var target int64

+ 1 - 0
internal/logic/base_organ/get_erp_city_tree_logic.go

@@ -30,6 +30,7 @@ func (l *GetErpCityTreeLogic) GetErpCityTree() (*types.Response, error) {
 	in := new(transform.Empty)
 	res, err := l.svcCtx.Transformer.GetErpCityTree(ctx, in)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
 	return &types.Response{200, "", res}, nil

+ 36 - 0
internal/logic/base_organ_school/get_erp_sch_tree_logic.go

@@ -0,0 +1,36 @@
+package logic
+
+import (
+	"context"
+	"git.i2edu.net/i2/i2-bill-erp/transform"
+
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/types"
+
+	"git.i2edu.net/i2/go-zero/core/logx"
+)
+
+type GetErpSchTreeLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetErpSchTreeLogic(ctx context.Context, svcCtx *svc.ServiceContext) GetErpSchTreeLogic {
+	return GetErpSchTreeLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetErpSchTreeLogic) GetErpSchTree() (*types.Response, error) {
+	// todo: add your logic here and delete this line
+	in := new(transform.Empty)
+	res, err := l.svcCtx.Transformer.GetErpOrganSchTree(l.ctx, in)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	return &types.Response{200, "", res}, nil
+}

+ 1 - 1
internal/logic/logic_test.go

@@ -12,7 +12,7 @@ import (
 func TestCreateJWT(t *testing.T) {
 	l := new(auth.LoginByWeixinLogic)
 	payloads := map[string]interface{}{
-		"userId":     3,
+		"userId":     12,
 		"sessionKey": "sessionKey",
 	}
 	fmt.Println(l.CreateJWT(1625045504, "6hy789iu87", payloads, 604800))

+ 1 - 0
internal/logic/mkt_network_detail/get_erp_mkt_network_detail_logic.go

@@ -34,6 +34,7 @@ func (l *GetErpMktNetworkDetailLogic) GetErpMktNetworkDetail() (*types.Response,
 	var data interface{}
 	data = res
 	if err != nil {
+		logx.Error(err.Error())
 		code = 500
 		msg = err.Error()
 		data = nil

+ 2 - 0
internal/logic/mkt_part_time_user/mkt_part_time_user_add_logic.go

@@ -31,6 +31,7 @@ func (l *PartTimeUserAddLogic) PartTimeUserAdd(req types.PartTimeUserAddRequest)
 	var bean = new(model.I2billMktPartTimeUser)
 	_, err := l.svcCtx.DB.Where("user_id = ? and del_flag = 0", userId).Get(bean)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 	}
 	if bean.Id != 0 {
@@ -61,6 +62,7 @@ func (l *PartTimeUserAddLogic) PartTimeUserAdd(req types.PartTimeUserAddRequest)
 	}
 	res, err := model.NewI2billMktPartTimeUserModel(l.svcCtx.SqlConn).Insert(*bean)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 	}
 	id, _ := res.LastInsertId()

+ 1 - 0
internal/logic/mkt_part_time_user/mkt_part_time_user_get_logic.go

@@ -30,6 +30,7 @@ func (l *PartTimeUserGetLogic) PartTimeUserGet() (*types.Response, error) {
 	partTimeUser := new(model.I2billMktPartTimeUser)
 	_, err := l.svcCtx.DB.Where("user_id = ? and del_flag = 0", userId).Get(partTimeUser)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 	}
 	if partTimeUser.Id == 0 {

+ 2 - 0
internal/logic/mkt_part_time_user/mkt_part_time_user_update_logic.go

@@ -30,6 +30,7 @@ func (l *PartTimeUserUpdateLogic) PartTimeUserUpdate(req types.PartTimeUserAddRe
 	var bean = new(model.I2billMktPartTimeUser)
 	_, err := l.svcCtx.DB.Where("user_id = ? and del_flag = 0", userId).Get(bean)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 	}
 	if bean.Id == 0 {
@@ -52,6 +53,7 @@ func (l *PartTimeUserUpdateLogic) PartTimeUserUpdate(req types.PartTimeUserAddRe
 	bean.IponeNumber = req.IponeNumber
 	_, err = l.svcCtx.DB.ID(bean.Id).AllCols().Update(*bean)
 	if err != nil {
+		logx.Error(err.Error())
 		return &types.Response{Code: 500, Msg: err.Error(), Data: nil}, nil
 	}
 	return &types.Response{Code: 200, Msg: "", Data: nil}, nil

+ 3 - 0
internal/logic/user/get_user_logic.go

@@ -50,7 +50,10 @@ func (l *GetUserLogic) GetUser() (*types.InfoResponse, error) {
 		}
 		if len(res) > 0 {
 			resp.ErpRoleType = 2
+		} else {
+			resp.ErpRoleType = 0
 		}
+
 	}
 	info := &types.InfoResponse{}
 	info.ID = user.Id

+ 1 - 1
internal/logic/user/jz_qr_code_logic.go

@@ -39,7 +39,7 @@ func (l *JzQrCodeLogic) JzQrCode() (*types.JzQrcodeResponse, error) {
 	if err != nil {
 		return nil, err
 	}
-	uri, err := l.svcCtx.Wechat.GenQrCode(uid, "pages/stuInput/stuInput")
+	uri, err := l.svcCtx.Wechat.GenQrCode(uid, "/pages/code/code")
 	return &types.JzQrcodeResponse{
 		FileId: uri,
 	}, err

+ 7 - 1
internal/svc/cache.go

@@ -2,7 +2,13 @@ package svc
 
 import "time"
 
-const cacheWechatTokenPrefix = "cache:wechat:token:"
+const (
+	cacheWechatTokenPrefix    = "cache:wechat:token:"
+	cacheErpSchoolTree        = "i2bill:cache:erp:school_tree"
+	cacheErpActivity          = "i2bill:cache:erp:activity"
+	cacheErpSchool            = "i2bill:cache:erp:school"
+	cacheErpNetworkDetailTree = "i2bill:cache:erp:network_detail_tree"
+)
 
 // Cache defined
 type Cache interface {

+ 71 - 0
internal/svc/cache_erp.go

@@ -0,0 +1,71 @@
+package svc
+
+import (
+	"context"
+	"git.i2edu.net/i2/i2-bill-erp/transform"
+	"time"
+)
+
+func (svc *ServiceContext) GetErpOrganSchool() ([]*transform.OrganSchool, error) {
+	var schools []*transform.OrganSchool
+	if err := svc.RdCli.GetCache(cacheErpSchool, schools); err != nil {
+		res, err := svc.Transformer.GetErpSchool(context.Background(), &transform.Empty{})
+		if err != nil {
+			return nil, err
+		}
+		err = svc.RdCli.SetWithExpire(cacheErpSchool, res.School, time.Hour)
+		if err != nil {
+			return nil, err
+		}
+		return res.School, nil
+	}
+	return schools, nil
+}
+
+func (svc *ServiceContext) GetErpOrganSchoolTree() ([]*transform.TreeNode, error) {
+	var nodes []*transform.TreeNode
+	if err := svc.RdCli.GetCache(cacheErpSchoolTree, nodes); err != nil {
+		res, err := svc.Transformer.GetErpOrganSchTree(context.Background(), &transform.Empty{})
+		if err != nil {
+			return nil, err
+		}
+		err = svc.RdCli.SetWithExpire(cacheErpSchoolTree, res.Nodes, time.Hour)
+		if err != nil {
+			return nil, err
+		}
+		return res.Nodes, nil
+	}
+	return nodes, nil
+}
+
+func (svc *ServiceContext) GetErpNetworkDetailTree() ([]*transform.TreeNode, error) {
+	var nodes []*transform.TreeNode
+	if err := svc.RdCli.GetCache(cacheErpNetworkDetailTree, nodes); err != nil {
+		res, err := svc.Transformer.GetErpMktNetWorkDetailTree(context.Background(), &transform.Empty{})
+		if err != nil {
+			return nil, err
+		}
+		err = svc.RdCli.SetWithExpire(cacheErpNetworkDetailTree, res.Nodes, time.Hour)
+		if err != nil {
+			return nil, err
+		}
+		return res.Nodes, nil
+	}
+	return nodes, nil
+}
+
+func (svc *ServiceContext) GetErpActivity() ([]*transform.Active, error) {
+	var actives []*transform.Active
+	if err := svc.RdCli.GetCache(cacheErpActivity, actives); err != nil {
+		res, err := svc.Transformer.GetErpActive(context.Background(), &transform.GetErpActiveReq{})
+		if err != nil {
+			return nil, err
+		}
+		err = svc.RdCli.SetWithExpire(cacheErpSchool, res.Active, time.Hour)
+		if err != nil {
+			return nil, err
+		}
+		return res.Active, nil
+	}
+	return actives, nil
+}

+ 1 - 1
internal/svc/wechat.go

@@ -135,7 +135,7 @@ func (wc *Wechat) GenQrCode(scene, page string) (string, error) {
 	}
 	req := utils.Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token)
 	req.JSONBody(map[string]interface{}{"scene": scene, "page": page})
-	ph := path.Join("asserts", "qrcode", scene+".png")
+	ph := path.Join("asserts", "qrcode", utils.Md5(scene)+".png")
 	err = req.ToFile(ph)
 	if err != nil {
 		return "", err

+ 2 - 4
internal/types/types.go

@@ -116,15 +116,13 @@ type EnrollRequest struct {
 }
 
 type EnrollAddReq struct {
-	Name          string `json:"name"`
+	StuName       string `json:"stu_name"`
 	AgeGroup      int    `json:"age_group"`
 	StuLinkPerson string `json:"stu_link_person"`
 	StuPhone      string `json:"stu_phone"`
 	SchId         int    `json:"sch_id"`
 	Address       string `json:"address"`
-	UserId        int    `json:"user_id"`
-	NetworkId     int    `json:"network_id,optional"`
-	ActiveId      int    `json:"active_id,optional"`
+	Sign          string `json:"sign"`
 }
 
 type Response struct {

+ 35 - 0
internal/utils/crypto.go

@@ -1,6 +1,7 @@
 package utils
 
 import (
+	"bytes"
 	"crypto/aes"
 	"crypto/cipher"
 	"crypto/md5"
@@ -38,6 +39,40 @@ func AesCBCDecrypt(encryptData, key, iv []byte) ([]byte, error) {
 	return decryptedData, nil
 }
 
+func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
+	padding := blockSize - len(ciphertext)%blockSize
+	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
+	return append(ciphertext, padtext...)
+}
+
+//AES加密
+func AesEncrypt(origData, key []byte) ([]byte, error) {
+	block, err := aes.NewCipher(key)
+	if err != nil {
+		return nil, err
+	}
+	blockSize := block.BlockSize()
+	origData = PKCS7Padding(origData, blockSize)
+	blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
+	crypted := make([]byte, len(origData))
+	blockMode.CryptBlocks(crypted, origData)
+	return crypted, nil
+}
+
+//AES解密
+func AesDecrypt(crypted, key []byte) ([]byte, error) {
+	block, err := aes.NewCipher(key)
+	if err != nil {
+		return nil, err
+	}
+	blockSize := block.BlockSize()
+	blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
+	origData := make([]byte, len(crypted))
+	blockMode.CryptBlocks(origData, crypted)
+	origData = PKCS7UnPadding(origData)
+	return origData, nil
+}
+
 func Md5(str string) string {
 	h := md5.New()
 	h.Write([]byte(str))

+ 36 - 21
internal/utils/utils.go

@@ -2,11 +2,9 @@ package utils
 
 import (
 	"database/sql"
-	"github.com/boombuler/barcode"
-	"github.com/boombuler/barcode/qr"
+	"fmt"
+	"git.i2edu.net/i2/i2-bill-erp/transform"
 	"hash/crc32"
-	"image/png"
-	"os"
 	"reflect"
 	"strconv"
 	"time"
@@ -132,24 +130,41 @@ func UnmarshalMysqlRow(row interface{}) map[string]interface{} {
 	return Row
 }
 
-//生成二维码
-func BuildBarcodeQr(url, dir string, width, height int) error {
-	code, err := qr.Encode(url, qr.M, qr.Unicode)
-	if err != nil {
-		return err
-	}
-	code, err = barcode.Scale(code, width, height)
-	if err != nil {
-		return err
+//返回对应tree的路径id,name
+func TreePath(nodes []*transform.TreeNode, tagId int64, idPath, namePath *string) bool {
+	for _, node := range nodes {
+		if node.Id == tagId {
+			*idPath = *idPath + "," + fmt.Sprintf("%d", node.Id)
+			*namePath = *namePath + "," + node.Text
+			return true
+		}
+		if node.Nodes != nil {
+			if ok := TreePath(node.Nodes, tagId, idPath, namePath); ok {
+				*idPath = fmt.Sprintf("%d", node.Id) + "," + *idPath
+				*namePath = node.Text + "," + *namePath
+				return ok
+			}
+		}
 	}
-	file, err := os.Create(dir)
-	if err != nil {
-		return err
+	return false
+}
+
+//活动id对应的name
+func GetErpActiveName(activeId int64, actives []*transform.Active) string {
+	for _, a := range actives {
+		if a.ActiveId == activeId {
+			return a.MaName
+		}
 	}
-	defer file.Close()
-	err = png.Encode(file, code)
-	if err != nil {
-		return err
+	return ""
+}
+
+//校区对应的id
+func GetErpSchoolName(schId int64, schools []*transform.OrganSchool) string {
+	for _, sch := range schools {
+		if sch.Id == schId {
+			return sch.Name
+		}
 	}
-	return nil
+	return ""
 }

+ 25 - 0
model/i2bill_acquirer_student_model.go

@@ -4,6 +4,7 @@ import (
 	"database/sql"
 	"fmt"
 	"strings"
+	"time"
 
 	"git.i2edu.net/i2/go-zero/core/stores/sqlc"
 	"git.i2edu.net/i2/go-zero/core/stores/sqlx"
@@ -51,8 +52,32 @@ type (
 		NetworkDetailId sql.NullInt64  `db:"network_detail_id" json:"network_detail_id"` // 渠道
 		ActiveId        sql.NullInt64  `db:"active_id" json:"active_id"`                 //活动
 	}
+
+	I2billAcquirerStudentXorm struct {
+		StuLinkPerson   string    `db:"stu_link_person" json:"stu_link_person"` // 联系人
+		StuPhone        string    `db:"stu_phone" json:"stu_phone"`             // 联系方式
+		CreateTime      time.Time `db:"create_time" json:"create_time"`
+		CheckTime       time.Time `db:"check_time" json:"check_time"`   // 审核日期
+		CheckBy         string    `db:"check_by" json:"check_by"`       // 审核人
+		MkId            string    `db:"mk_id" json:"mk_id"`             // 所属mk erp id
+		UserId          int64     `db:"user_id" json:"user_id"`         // 收单宝用户id
+		Address         string    `db:"address" json:"address"`         // 当前位置
+		CheckState      int64     `db:"check_state" json:"check_state"` // 收单宝状态
+		Id              int64     `db:"id" json:"id"`                   // 主键
+		PartTimeUserId  int64     `db:"part_time_user_id" json:"part_time_user_id"`
+		StuName         string    `db:"stu_name" json:"stu_name"`   // 学员名称
+		AgeGroup        int64     `db:"age_group" json:"age_group"` // 学员年龄
+		SchId           int64     `db:"sch_id" json:"sch_id"`       // 意向校区
+		DelFlag         int64     `db:"del_flag" json:"del_flag"`
+		NetworkDetailId int64     `db:"network_detail_id" json:"network_detail_id"` // 渠道
+		ActiveId        int64     `db:"active_id" json:"active_id"`                 //活动
+	}
 )
 
+func (t *I2billAcquirerStudentXorm) TableName() string {
+	return "i2bill_acquirer_student"
+}
+
 func NewI2billAcquirerStudentModel(conn sqlx.SqlConn) I2billAcquirerStudentModel {
 	return &defaultI2billAcquirerStudentModel{
 		conn:  conn,

+ 2 - 3
model/i2bill_user_model.go

@@ -216,7 +216,7 @@ func (m *defaultUserModel) CacheStorage() Cache {
 //获取用户信息
 func GetI2bilUserInfo(userId int64, engine *xorm.Engine) (*UserXorm, error) {
 	user := new(UserXorm)
-	_, err := engine.SQL("select * from i2bill_user where id = ? and del_flag = 0", userId).Get(user)
+	_, err := engine.SQL("select * from i2bill_user where id = ?", userId).Get(user)
 	if err != nil {
 		return nil, err
 	}
@@ -229,7 +229,7 @@ func GetAcquirePerm(userId int64, rpcClient transformclient.Transform, engine *x
 	if err != nil {
 		return "", err
 	}
-	if partUser.Id != 0 {
+	if partUser.Id != 0 && partUser.MkId != "" {
 		return GetErpUser("", partUser.MkId, rpcClient)
 	}
 
@@ -250,7 +250,6 @@ func GetErpUser(mobile string, erpUserId string, rpcClient transformclient.Trans
 	if err != nil {
 		return "", err
 	}
-	//判定是不是 mk 还是 兼职
 	if erpRoles.UserId != "" {
 		roles := strings.Split(erpRoles.Role, ",")
 		for _, r := range roles {