ding
This commit is contained in:
parent
ce5253c889
commit
5e88833854
|
@ -0,0 +1,30 @@
|
||||||
|
package dingding
|
||||||
|
|
||||||
|
import (
|
||||||
|
"com.snow.auto_monitor/app/constants/errorcode"
|
||||||
|
common "com.snow.auto_monitor/app/http/controllers"
|
||||||
|
dingEnt "com.snow.auto_monitor/app/http/entities/dingding"
|
||||||
|
dingServ "com.snow.auto_monitor/app/services/dingding"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func DingSend(c *gin.Context) {
|
||||||
|
request := new(dingEnt.DingSendReq)
|
||||||
|
err := common.GenRequest(c, request)
|
||||||
|
if err != nil {
|
||||||
|
common.Error(c, errorcode.ParamError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dingServ.DingSend(request.Title, request.Content, true)
|
||||||
|
if err != nil {
|
||||||
|
common.Error500(c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response := &dingEnt.DingSendResp{
|
||||||
|
Status: "success",
|
||||||
|
}
|
||||||
|
|
||||||
|
common.Success(c, response)
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package dingding
|
||||||
|
|
||||||
|
type DingSendReq struct {
|
||||||
|
Title string `json:"title" validate:"required" example:"标题"`
|
||||||
|
Content string `json:"content" validate:"required" example:"内容"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DingSendResp struct {
|
||||||
|
Status string `json:"status" example:"success"`
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"com.snow.auto_monitor/config"
|
"com.snow.auto_monitor/config"
|
||||||
|
|
||||||
devCon "com.snow.auto_monitor/app/http/controllers/device"
|
devCon "com.snow.auto_monitor/app/http/controllers/device"
|
||||||
|
dingCon "com.snow.auto_monitor/app/http/controllers/dingding"
|
||||||
merCon "com.snow.auto_monitor/app/http/controllers/merchant"
|
merCon "com.snow.auto_monitor/app/http/controllers/merchant"
|
||||||
ordersCon "com.snow.auto_monitor/app/http/controllers/orders"
|
ordersCon "com.snow.auto_monitor/app/http/controllers/orders"
|
||||||
proCon "com.snow.auto_monitor/app/http/controllers/product"
|
proCon "com.snow.auto_monitor/app/http/controllers/product"
|
||||||
|
@ -28,7 +29,7 @@ import (
|
||||||
func RegisterRoute(router *gin.Engine) {
|
func RegisterRoute(router *gin.Engine) {
|
||||||
//middleware: 服务错误处理 => 生成请求id => access log
|
//middleware: 服务错误处理 => 生成请求id => access log
|
||||||
router.Use(middlewares.ServerRecovery(), middleware.GenRequestId,
|
router.Use(middlewares.ServerRecovery(), middleware.GenRequestId,
|
||||||
middleware.GenContextKit, middleware.AccessLog(), middlewares.VerifyIp(),
|
middleware.GenContextKit, middleware.AccessLog(), //middlewares.VerifyIp(),
|
||||||
middlewares.Cors())
|
middlewares.Cors())
|
||||||
|
|
||||||
if config.GetConf().PrometheusCollectEnable && config.IsEnvEqual(config.ProdEnv) {
|
if config.GetConf().PrometheusCollectEnable && config.IsEnvEqual(config.ProdEnv) {
|
||||||
|
@ -131,6 +132,7 @@ func RegisterRoute(router *gin.Engine) {
|
||||||
temp.Use(middlewares.RequestLog())
|
temp.Use(middlewares.RequestLog())
|
||||||
{
|
{
|
||||||
temp.POST("/recharge/order", zlCon.CreateOrder)
|
temp.POST("/recharge/order", zlCon.CreateOrder)
|
||||||
|
temp.POST("/ding/send", dingCon.DingSend)
|
||||||
}
|
}
|
||||||
|
|
||||||
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
package dinglist
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/qit-team/snow-core/db"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
once sync.Once
|
||||||
|
m *dinglistModel
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DingList
|
||||||
|
*/
|
||||||
|
type DingList struct {
|
||||||
|
Id int64 `xorm:"pk autoincr"` //注:使用getOne 或者ID() 需要设置主键
|
||||||
|
DepartmentId int64
|
||||||
|
UserId string
|
||||||
|
CreatedAt time.Time `xorm:"created"`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表名规则
|
||||||
|
* @wiki http://gobook.io/read/github.com/go-xorm/manual-zh-CN/chapter-02/3.tags.html
|
||||||
|
*/
|
||||||
|
func (m *DingList) TableName() string {
|
||||||
|
return "dinglist"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 私有化,防止被外部new
|
||||||
|
*/
|
||||||
|
type dinglistModel struct {
|
||||||
|
db.Model //组合基础Model,集成基础Model的属性和方法
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单例模式
|
||||||
|
func GetInstance() *dinglistModel {
|
||||||
|
once.Do(func() {
|
||||||
|
m = new(dinglistModel)
|
||||||
|
//m.DiName = "" //设置数据库实例连接,默认db.SingletonMain
|
||||||
|
})
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询主键ID的记录
|
||||||
|
* @param id 主键ID
|
||||||
|
* @return has 是否有记录
|
||||||
|
* @return err 错误信息
|
||||||
|
* @return dinglist 查询结果
|
||||||
|
*/
|
||||||
|
func (m *dinglistModel) GetById(id int64) (dinglist *DingList, has bool, err error) {
|
||||||
|
dinglist = &DingList{}
|
||||||
|
has, err = m.GetDb().ID(id).Get(dinglist)
|
||||||
|
if err != nil || !has {
|
||||||
|
dinglist = nil
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *dinglistModel) Search(id int64, departmentId int64, userId string, startTime string, endTime string, limit int, page int) (dinglist []*DingList, err error) {
|
||||||
|
dinglist = make([]*DingList, 0)
|
||||||
|
sql := "1=1"
|
||||||
|
var args []interface{}
|
||||||
|
if id != 0 {
|
||||||
|
sql += " and id = ?"
|
||||||
|
args = append(args, id)
|
||||||
|
}
|
||||||
|
if departmentId != 0 {
|
||||||
|
sql += " and department_id = ?"
|
||||||
|
args = append(args, departmentId)
|
||||||
|
}
|
||||||
|
if userId != "" {
|
||||||
|
sql += " and user_id = ?"
|
||||||
|
args = append(args, userId)
|
||||||
|
}
|
||||||
|
if startTime != "" && endTime != "" {
|
||||||
|
sql += " and created_at >= ? and created_at <= ?"
|
||||||
|
args = append(args, startTime, endTime)
|
||||||
|
}
|
||||||
|
err = m.GetDb().Where(sql, args...).OrderBy("created_at desc").Limit(limit, page).Find(&dinglist)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *dinglistModel) CountAll(id int64, departmentId int64, userId string, startTime string, endTime string, limit int, page int) (res int64, err error) {
|
||||||
|
sql := "1=1"
|
||||||
|
var args []interface{}
|
||||||
|
if id != 0 {
|
||||||
|
sql += " and id = ?"
|
||||||
|
args = append(args, id)
|
||||||
|
}
|
||||||
|
if departmentId != 0 {
|
||||||
|
sql += " and department_id = ?"
|
||||||
|
args = append(args, departmentId)
|
||||||
|
}
|
||||||
|
if userId != "" {
|
||||||
|
sql += " and user_id = ?"
|
||||||
|
args = append(args, userId)
|
||||||
|
}
|
||||||
|
if startTime != "" && endTime != "" {
|
||||||
|
sql += " and created_at >= ? and created_at <= ?"
|
||||||
|
args = append(args, startTime, endTime)
|
||||||
|
}
|
||||||
|
res, err = m.GetDb().Table("dinglist").Where(sql, args...).Count()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *dinglistModel) Create(dinglist *DingList) (affected int64, err error) {
|
||||||
|
dinglist.CreatedAt = time.Now()
|
||||||
|
affected, err = m.GetDb().Insert(dinglist)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *dinglistModel) Update(dinglist *DingList) (affected int64, err error) {
|
||||||
|
affected, err = m.GetDb().ID(dinglist.Id).Update(dinglist)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *dinglistModel) Delete(id int64) (affected int64, err error) {
|
||||||
|
affected, err = m.GetDb().ID(id).Delete(&DingList{})
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,176 @@
|
||||||
|
package dingding
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
dingMod "com.snow.auto_monitor/app/models/dinglist"
|
||||||
|
"github.com/qit-team/snow-core/log/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
var token string = ""
|
||||||
|
|
||||||
|
func AccessToken(client_key string, client_secret string) {
|
||||||
|
targetUrl := "http://121.199.38.107:8000/oauth/v1/accesstoken"
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"client_key": client_key,
|
||||||
|
"client_secret": client_secret,
|
||||||
|
}
|
||||||
|
jsonData, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req, err := http.NewRequest("POST", targetUrl, bytes.NewBuffer(jsonData))
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 设置请求头,指定内容类型为JSON
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
// 发送请求并获取响应
|
||||||
|
client := &http.Client{}
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// fmt.Println("响应状态码:", resp.StatusCode)
|
||||||
|
// fmt.Println("响应内容:", string(body))
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
logger.Error(context.TODO(), "dingding", "钉钉发送公告失败")
|
||||||
|
logger.Error(context.TODO(), "dingding", string(body))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 定义结构体用于解析JSON数据
|
||||||
|
type Data struct {
|
||||||
|
AccessToken string `json:"accessToken"`
|
||||||
|
AccessExpire int64 `json:"accessExpire"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Response struct {
|
||||||
|
Code int `json:"code"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
Data Data `json:"data"`
|
||||||
|
}
|
||||||
|
// 解析JSON数据
|
||||||
|
var res Response
|
||||||
|
err = json.Unmarshal([]byte(body), &res)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("解析JSON失败:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取并打印accessToken
|
||||||
|
accessToken := res.Data.AccessToken
|
||||||
|
// fmt.Println("accessToken:", accessToken)
|
||||||
|
token = accessToken
|
||||||
|
}
|
||||||
|
|
||||||
|
func DingSend(title string, content string, retry bool) (err error) {
|
||||||
|
dlist, err := dingMod.GetInstance().Search(0, 0, "", "", "", 999, 0)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deptid_list := []int64{}
|
||||||
|
userid_list := []string{}
|
||||||
|
for _, v := range dlist {
|
||||||
|
deptid_list = append(deptid_list, v.DepartmentId)
|
||||||
|
userid_list = append(userid_list, v.UserId)
|
||||||
|
}
|
||||||
|
|
||||||
|
targetUrl := "http://121.199.38.107:8000/msg/v1/dingtalk/blackboard/send"
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"base": map[string]string{
|
||||||
|
"server_index": "transfer_msg",
|
||||||
|
"temp_index": "transferding",
|
||||||
|
},
|
||||||
|
"blackboard_receiver": map[string]interface{}{
|
||||||
|
"deptid_list": deptid_list,
|
||||||
|
"userid_list": userid_list,
|
||||||
|
},
|
||||||
|
"title": title,
|
||||||
|
"content": content,
|
||||||
|
}
|
||||||
|
jsonData, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req, err := http.NewRequest("POST", targetUrl, bytes.NewBuffer(jsonData))
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 设置请求头,指定内容类型为JSON
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
req.Header.Set("Authorization", token)
|
||||||
|
|
||||||
|
// 发送请求并获取响应
|
||||||
|
client := &http.Client{}
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(context.TODO(), "dingding", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// fmt.Println("响应状态码:", resp.StatusCode)
|
||||||
|
// fmt.Println("响应内容:", string(body))
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
logger.Error(context.TODO(), "dingding", "钉钉发送公告失败")
|
||||||
|
logger.Error(context.TODO(), "dingding", string(body))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 定义结构体用于解析JSON数据
|
||||||
|
type Data struct {
|
||||||
|
Code int64 `json:"code"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析JSON数据
|
||||||
|
var res Data
|
||||||
|
err = json.Unmarshal([]byte(body), &res)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("解析JSON失败:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.Code == 2 {
|
||||||
|
AccessToken("transfer123", "transfer321")
|
||||||
|
if retry {
|
||||||
|
DingSend(title, content, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
fmt.Println("初始化钉钉接口")
|
||||||
|
AccessToken("transfer123", "transfer321")
|
||||||
|
}
|
|
@ -56,7 +56,7 @@ func CountAll(id int64,
|
||||||
transfer_status int64,
|
transfer_status int64,
|
||||||
startTime string,
|
startTime string,
|
||||||
endTime string) (res int64, err error) {
|
endTime string) (res int64, err error) {
|
||||||
res, err = models.GetInstance().CountAll(id, order_no, merchant_id, product_id,device_no, out_trade_no,
|
res, err = models.GetInstance().CountAll(id, order_no, merchant_id, product_id, device_no, out_trade_no,
|
||||||
recharge_account, account_type, status, transfer_status,
|
recharge_account, account_type, status, transfer_status,
|
||||||
startTime, endTime)
|
startTime, endTime)
|
||||||
return
|
return
|
||||||
|
|
|
@ -2,11 +2,14 @@ package transfersys
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
mermod "com.snow.auto_monitor/app/models/merchant"
|
mermod "com.snow.auto_monitor/app/models/merchant"
|
||||||
models "com.snow.auto_monitor/app/models/orders"
|
models "com.snow.auto_monitor/app/models/orders"
|
||||||
promod "com.snow.auto_monitor/app/models/product"
|
promod "com.snow.auto_monitor/app/models/product"
|
||||||
|
"com.snow.auto_monitor/app/services/device"
|
||||||
|
dingServ "com.snow.auto_monitor/app/services/dingding"
|
||||||
"com.snow.auto_monitor/app/utils/rdbdq"
|
"com.snow.auto_monitor/app/utils/rdbdq"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -39,8 +42,38 @@ func FinishOrder(orders *models.Orders) (affected int64, err error) {
|
||||||
if orders.TransferStatus == 1 {
|
if orders.TransferStatus == 1 {
|
||||||
orders.Status = 1
|
orders.Status = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if orders.TransferStatus == 4 || orders.TransferStatus == 5 {
|
if orders.TransferStatus == 4 || orders.TransferStatus == 5 {
|
||||||
orders.Status = orders.TransferStatus - 1
|
orders.Status = orders.TransferStatus - 1
|
||||||
|
device, err := device.Search(0, orders.DeviceNo, "", 0, "", "", 1, 1)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
orderDetail, _, err := models.GetInstance().GetById(orders.Id)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
var deviceNumber int64 = -1
|
||||||
|
if device != nil {
|
||||||
|
deviceNumber = device[0].Code
|
||||||
|
}
|
||||||
|
dingStr := fmt.Sprintf(
|
||||||
|
`
|
||||||
|
- 异常设备: %d 号机;
|
||||||
|
- 异常单号: %s;
|
||||||
|
- 充值账号: %s;
|
||||||
|
- 产品号: %d;
|
||||||
|
- 失败原因: %s;
|
||||||
|
- 失败时间: %s;
|
||||||
|
`,
|
||||||
|
deviceNumber,
|
||||||
|
orderDetail.OutTradeNo,
|
||||||
|
orderDetail.RechargeAccount,
|
||||||
|
orders.ProductId,
|
||||||
|
orders.FailReason,
|
||||||
|
orderDetail.CreatedAt.Format("2006-01-02 15:04:05"),
|
||||||
|
)
|
||||||
|
dingServ.DingSend("订单异常", dingStr, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
affected, err = models.GetInstance().SetDealingOrder(orders)
|
affected, err = models.GetInstance().SetDealingOrder(orders)
|
||||||
|
|
|
@ -45,6 +45,7 @@ func WriteOrder() {
|
||||||
err := rdbmq.CreateStreamAndGroup("orders", "orders_one")
|
err := rdbmq.CreateStreamAndGroup("orders", "orders_one")
|
||||||
if err != nil && err.Error() != "BUSYGROUP Consumer Group name already exists" {
|
if err != nil && err.Error() != "BUSYGROUP Consumer Group name already exists" {
|
||||||
fmt.Println("分组失败")
|
fmt.Println("分组失败")
|
||||||
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 创建一个新的Ticker,每3秒钟触发一次
|
// 创建一个新的Ticker,每3秒钟触发一次
|
||||||
|
|
|
@ -60,3 +60,10 @@ create table device (
|
||||||
code int,
|
code int,
|
||||||
created_at timestamp default current_timestamp
|
created_at timestamp default current_timestamp
|
||||||
);
|
);
|
||||||
|
|
||||||
|
create table ding_list (
|
||||||
|
id int primary key auto_increment,
|
||||||
|
department_id varchar(64),
|
||||||
|
user_id varchar(64),
|
||||||
|
created_at timestamp default current_timestamp
|
||||||
|
);
|
||||||
|
|
3
main.go
3
main.go
|
@ -68,7 +68,6 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleCmd(opts)
|
handleCmd(opts)
|
||||||
|
|
||||||
err := startServer(opts)
|
err := startServer(opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("server start error, %s\n", err)
|
fmt.Printf("server start error, %s\n", err)
|
||||||
|
@ -76,7 +75,7 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//执行(status|stop|restart)命令
|
// 执行(status|stop|restart)命令
|
||||||
func handleCmd(opts *config.Options) {
|
func handleCmd(opts *config.Options) {
|
||||||
if opts.Cmd != "" {
|
if opts.Cmd != "" {
|
||||||
pidFile := opts.GenPidFile()
|
pidFile := opts.GenPidFile()
|
||||||
|
|
Loading…
Reference in New Issue