diff --git a/controllers/controller.go b/controllers/controller.go index 3afdd4a..982a479 100644 --- a/controllers/controller.go +++ b/controllers/controller.go @@ -106,3 +106,11 @@ func captchaVerify(c *gin.Context, code string) bool { return false } } + +func buildErrJson(c *gin.Context, err error) { + c.JSON(http.StatusOK, &CallBack{ + Code: model.ErrCodeNormal, + Desc: err.Error(), + }) + globals.SugarLogger.Debugf("End API :%s error:%v:", c.Request.URL, err) +} diff --git a/controllers/print_controller.go b/controllers/print_controller.go new file mode 100644 index 0000000..9120282 --- /dev/null +++ b/controllers/print_controller.go @@ -0,0 +1,73 @@ +package controllers + +import ( + "git.rosy.net.cn/jx-print/globals" + "git.rosy.net.cn/jx-print/model" + "git.rosy.net.cn/jx-print/services" + "git.rosy.net.cn/jx-print/utils" + "github.com/gin-gonic/gin" +) + +//添加打印机 POST +func AddPrinters(c *gin.Context) { + var ( + err error + tokenInfo *model.TokenInfo + param = &struct { + AppID int `json:"app_id" form:"app_id" binding:"required"` + Prints string `json:"prints" form:"prints" binding:"required"` + }{} + printInfos []*model.PrintInfo + ) + globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP()) + if err = c.Bind(¶m); err != nil { + buildErrJson(c, err) + return + } + if tokenInfo = checkToken(c); tokenInfo == nil { + return + } + if err = utils.UnmarshalUseNumber([]byte(param.Prints), &printInfos); err != nil { + buildErrJson(c, err) + return + } + if !callFunc(c, func() (retVal interface{}, errCode string, err error) { + err = services.AddPrinters(c, tokenInfo.User.UserID, param.AppID, printInfos) + return retVal, "", err + }) { + return + } + return +} + +//查询打印机 GET +func GetPrinters(c *gin.Context) { + var ( + err error + tokenInfo *model.TokenInfo + param = &struct { + AppID int `json:"app_id" form:"app_id" binding:"required"` + PrintNo string `json:"print_no" form:"print_no"` //打印机编号 + Name string `json:"name" form:"name"` //打印机备注,模糊 + Status int `json:"status" form:"status"` //打印机状态。正常还是缺纸 + IsOnline int `json:"is_online" form:"is_online"` //在线状态。1在线,0离线 + Offset int `json:"offset" form:"offset" binding:"required"` + PageSize int `json:"page_size" form:"page_size" binding:"required"` + }{} + ) + globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP()) + if err = c.Bind(¶m); err != nil { + buildErrJson(c, err) + return + } + if tokenInfo = checkToken(c); tokenInfo == nil { + return + } + if !callFunc(c, func() (retVal interface{}, errCode string, err error) { + retVal, err = services.GetPrinters(c, param.AppID, param.PrintNo, param.Name, param.Status, param.IsOnline, param.Offset, param.PageSize) + return retVal, "", err + }) { + return + } + return +} diff --git a/dao/print_dao.go b/dao/print_dao.go new file mode 100644 index 0000000..5c1babb --- /dev/null +++ b/dao/print_dao.go @@ -0,0 +1,82 @@ +package dao + +import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-print/model" + "github.com/jmoiron/sqlx" +) + +func GetPrinters(db *sqlx.DB, appID int, printNo string) (printers []*model.Printer, err error) { + sql := ` + SELECT * + FROM printer + WHERE 1 = 1 AND deleted_at = ? + ` + sqlParams := []interface{}{utils.DefaultTimeValue} + if appID != 0 { + sql += " AND app_id = ?" + sqlParams = append(sqlParams, appID) + } + if printNo != "" { + sql += " AND print_no = ?" + sqlParams = append(sqlParams, printNo) + } + if err = db.Select(&printers, sql, sqlParams...); err == nil { + return printers, err + } + return printers, err +} + +func GetPrintersPage(db *sqlx.DB, appID int, printNo, name string, status, isOnline, offset, pageSize int) (page *model.PagedInfo, err error) { + var ( + printers []*model.Printer + count = &struct { + Count int `json:"count"` + }{} + ) + sqlCount := ` + SELECT COUNT(*) count + ` + sql := ` + SELECT * + ` + sqlOhter := ` + FROM printer + WHERE 1 = 1 AND deleted_at = ? + ` + sqlParams := []interface{}{utils.DefaultTimeValue} + if appID != 0 { + sqlOhter += " AND app_id = ?" + sqlParams = append(sqlParams, appID) + } + if printNo != "" { + sqlOhter += " AND print_no = ?" + sqlParams = append(sqlParams, printNo) + } + if name != "" { + sqlOhter += " AND name LIKE ?" + sqlParams = append(sqlParams, "%"+name+"%") + } + if status != model.StatusAll { + sqlOhter += " AND status = ?" + sqlParams = append(sqlParams, status) + } + if isOnline != model.StatusAll { + sqlOhter += " AND is_online = ?" + sqlParams = append(sqlParams, isOnline) + } + //查总数 + row := db.DB.QueryRow(sqlCount+sqlOhter, sqlParams...) + if err = row.Scan(count.Count); err != nil { + return page, err + } + sqlOhter += " LIMIT ? OFFSET ?" + sqlParams = append(sqlParams, pageSize, offset) + if err = db.Select(&printers, sql+sqlOhter, sqlParams...); err == nil { + return &model.PagedInfo{ + TotalCount: count.Count, + Data: printers, + }, err + } + return page, err +} diff --git a/model/model.go b/model/model.go index d63304e..5e98b18 100644 --- a/model/model.go +++ b/model/model.go @@ -7,6 +7,14 @@ import ( const ( SessionKey = "jxCode" RegisterKey = "jxRegister" + + PrinterStatusNormal = 0 //打印机状态正常 + PrinterStatusWithouPaper = 1 //缺纸 + + PrinterOnline = 1 //在线 + PrinterOffline = 0 //离线 + + StatusAll = -9 ) const ( @@ -39,6 +47,17 @@ type TokenInfo struct { Token string `json:"token"` } +type PrintInfo struct { + PrintNo string `json:"print_no" form:"print_no" binding:"required"` //打印机编号 + Name string `json:"name" form:"name"` //打印机备注 + SIM string `json:"sim" form:"sim"` //流量卡号码 +} + +type PagedInfo struct { + TotalCount int `json:"totalCount"` + Data interface{} `json:"data"` +} + type ModelIDCULD struct { ID int `json:"id" db:"id"` CreatedAt *time.Time `json:"created_at" db:"created_at"` @@ -102,3 +121,18 @@ type Menu struct { Color string `json:"color"` //颜色 Content string `json:"content"` //菜单内容 } + +type Printer struct { + ID int `json:"id" db:"id"` + CreatedAt *time.Time `json:"created_at" db:"created_at"` + UpdatedAt *time.Time `json:"updated_at" db:"updated_at"` + LastOperator string `json:"last_operator" db:"last_operator"` + DeletedAt *time.Time `json:"deleted_at" db:"deleted_at"` + AppID int `json:"app_id" db:"app_id"` //应用编号 + PrintNo string `json:"print_no" db:"print_no"` //打印机编号 + PrintKey string `json:"print_key" db:"print_key"` //打印机识别码 + Name string `json:"name"` //打印机备注名 + Status int `json:"status"` //打印机状态 + IsOnline int `json:"is_online" db:"is_online"` //1在线,0离线 + SIM string `json:"sim" db:"sim"` //sim卡号 +} diff --git a/routers/router.go b/routers/router.go index 7977894..a255b71 100644 --- a/routers/router.go +++ b/routers/router.go @@ -18,6 +18,10 @@ func Init(r *gin.Engine) { app.GET("/getApps", controllers.GetApps) app.GET("/addApp", controllers.AddApp) app.GET("/delApp", controllers.DelApp) + //print + print := v2.Group("/print") + print.GET("/addPrinters", controllers.AddPrinters) + print.GET("/getPrinters", controllers.GetPrinters) //v1是不需要token的 v1 := r.Group("v1") diff --git a/services/print.go b/services/print.go new file mode 100644 index 0000000..cf82167 --- /dev/null +++ b/services/print.go @@ -0,0 +1,55 @@ +package services + +import ( + "fmt" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-print/dao" + "git.rosy.net.cn/jx-print/globals" + "git.rosy.net.cn/jx-print/model" + putils "git.rosy.net.cn/jx-print/utils" + "github.com/gin-gonic/gin" + "time" +) + +func AddPrinters(c *gin.Context, userID string, appID int, printInfos []*model.PrintInfo) (err error) { + var ( + db = globals.GetDB() + errs []error + now = time.Now() + ) + if len(printInfos) > 50 { + return fmt.Errorf("每次最多添加50台!") + } + if apps, _ := dao.GetApps(db, appID, userID, ""); len(apps) == 0 { + return fmt.Errorf("未查询到此应用!app_id:%d", appID) + } + for _, v := range printInfos { + printers, _ := dao.GetPrinters(db, appID, v.PrintNo) + if len(printers) > 0 { + errs = append(errs, fmt.Errorf("此打印机已被其他应用绑定!print_no :%s 。", v.PrintNo)) + continue + } + printer := &model.Printer{ + CreatedAt: &now, + UpdatedAt: &now, + DeletedAt: &utils.DefaultTimeValue, + AppID: appID, + PrintNo: v.PrintNo, + Name: v.Name, + SIM: v.SIM, + Status: model.PrinterStatusNormal, + IsOnline: model.PrinterOffline, + } + if err = dao.Insert(db, printer); err != nil { + errs = append(errs, err) + } + } + if len(errs) > 0 { + err = putils.BuildErr(errs) + } + return err +} + +func GetPrinters(c *gin.Context, appID int, printNo, name string, status, isOnline, offset, pageSize int) (page *model.PagedInfo, err error) { + return dao.GetPrintersPage(globals.GetDB(), appID, printNo, name, status, isOnline, offset, pageSize) +} diff --git a/utils/utils.go b/utils/utils.go index 4c24e1a..7a3dce5 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -3,6 +3,7 @@ package utils import ( "bytes" "encoding/json" + "fmt" "git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/model" "github.com/dchest/captcha" @@ -148,3 +149,11 @@ func TryUnmarshalUseNumber(data []byte, result interface{}) error { d.UseNumber() return d.Decode(result) } + +func BuildErr(errs []error) (err error) { + var errStr = strings.Builder{} + for _, v := range errs { + errStr.WriteString(v.Error()) + } + return fmt.Errorf(errStr.String()) +}