package bo import ( "scd_check_tools/logger" "scd_check_tools/models/enum" "scd_check_tools/mqtt" "scd_check_tools/tools" "encoding/json" "errors" "fmt" "log" "strconv" "strings" "github.com/astaxie/beego/orm" ) //通知提醒模型 type T_base_notice struct { Id int `orm:"pk"` StationId int //INT NOT NULL COMMENT '所属站' , Caption string NoticeType int //INT NOT NULL DEFAULT 0 COMMENT '通知分类' , SenderName string //VARCHAR(20) COMMENT '发送者名称' , SenderTime string //DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间' , Content string //text(255) NOT NULL COMMENT '正文内容' , RevId int //INT NOT NULL COMMENT '通知对象ID' , ReadFlag int //INT NOT NULL COMMENT '已读标记' , ReadTime string //DATETIME COMMENT '读取时间' , Cr string Ct string } //提醒类型:消息提醒 var NoticeType_Message = 200 //提醒类型:通知提醒 var NoticeType_Notice = 100 //通知提醒管理对象 type NoticeMgr struct { Model T_base_notice DeviceBaseModel } func init() { orm.RegisterModel(new(T_base_notice)) } //发送流程流转通知 func SendFlowNotice(curuser map[string]interface{}, station_id int, nextFlowNodeId int32, desc ...string) error { //获取当前节点的处理人员 db := orm.NewOrm() lst := []orm.Params{} _, err := db.Raw("select t.node_name,t.node_type,t1.staff_id,t2.flow_name from t_sys_flow_node t, t_sys_flow_node_staff_ref t1,t_sys_flow t2 where t.id=t1.node_id and t.flow_id=t2.id and t1.station_id=? and t1.node_id=?", station_id, nextFlowNodeId).Values(&lst) if err != nil { log.Println(err) } for _, row := range lst { uid, _ := strconv.Atoi(tools.IsEmpty(row["staff_id"])) if SendNotice(curuser, int(station_id), NoticeType_Notice, fmt.Sprintf("有新的SCD文件任务【%s】需要您%s。", row["flow_name"], row["node_name"]), "", int32(uid)) != nil { return err } } return err } func SendNotice(curuser map[string]interface{}, station_id, noticetype int, caption, txt string, touser int32) error { dblog := new(SystemLog) dblog.SetUserInfo(map[string]interface{}{"name": "", "ip": "127.0.0.1"}) dblog.Audittype = enum.AuditType_Notice dblog.Logtype = enum.LogType_Insert dblog.Eventtype = enum.OptEventType_System dblog.Eventlevel = enum.OptEventLevel_Mid obj := new(NoticeMgr) obj.Model = T_base_notice{} obj.Model.Caption = caption obj.Model.Content = txt obj.Model.RevId = int(touser) obj.Model.SenderTime = tools.NowTime() obj.Model.SenderName = tools.IsEmpty(curuser["name"]) obj.Model.StationId = int(station_id) obj.Model.NoticeType = noticetype obj.Model.ReadTime = "1970-01-01 00:00:00" obj.Model.ReadFlag = 0 obj.Model.Cr = tools.IsEmpty(curuser["userid"]) obj.Model.Ct = tools.NowTime() db := orm.NewOrm() _, err := db.Insert(&obj.Model) if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("发送新的通知/公告失败:%s,操作数据:%+v", err.Error(), obj.Model) dblog.Fail2() } else { dblog.Description = fmt.Sprintf("发送新的通知/公告成功,操作数据:%+v", obj.Model) dblog.Success2() } msg, _ := json.Marshal(obj.Model) mqtt.PublishMessage(fmt.Sprintf("/jujutong/scd_check_tools/notice/%d", touser), string(msg)) return err } func (c *NoticeMgr) SetRead() (err error) { dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_Notice dblog.Logtype = enum.LogType_Execute dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Mid db := orm.NewOrm() err = db.Read(&c.Model) if err != nil { logger.Logger.Error(err) return err } c.Model.ReadFlag = 1 c.Model.ReadTime = tools.NowTime() _, err = db.Update(&c.Model) if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("设置通知/公告为已读失败:%s,操作数据:%+v", err.Error(), c.Model) dblog.Fail2() } else { dblog.Description = fmt.Sprintf("设置通知/公告为已读,操作数据:%+v", c.Model) dblog.Success2() } return err } func (c *NoticeMgr) Save() (err error) { dblog := new(SystemLog) dblog.SetUserInfo(map[string]interface{}{"name": "", "ip": "127.0.0.1"}) dblog.Audittype = enum.AuditType_Notice dblog.Logtype = enum.LogType_Insert dblog.Eventtype = enum.OptEventType_System dblog.Eventlevel = enum.OptEventLevel_Mid db := orm.NewOrm() c.Model.Cr = c.GetUserId() c.Model.Ct = tools.NowTime() c.Model.ReadFlag = 0 if c.Model.Id == 0 { _, err = db.Insert(&c.Model) } else { _, err = db.Update(&c.Model) } if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("创建新的通知/公告失败:%s,操作数据:%+v", err.Error(), c.Model) dblog.Fail2() } else { dblog.Description = fmt.Sprintf("创建新的通知/公告成功,操作数据:%+v", c.Model) dblog.Success2() } return err } func (c *NoticeMgr) One() (T_base_notice, error) { o := orm.NewOrm() err := o.Read(&c.Model) if err != nil { log.Println(err) } return c.Model, err } func (c *NoticeMgr) Delete() (err error) { dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_Notice dblog.Logtype = enum.LogType_Delete dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Hight db := orm.NewOrm() if c.Model.Id == 0 { return errors.New("无效的ID") } else { db.Read(&c.Model) _, err = db.Delete(&c.Model) } if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("删除通知提醒%s失败:%s", c.Model.Caption, err.Error()) dblog.Fail2() } else { dblog.Description = fmt.Sprintf("删除通知提醒%s成功", c.Model.Caption) dblog.Success2() } return err } func (c *NoticeMgr) List(rev_id, station_id, isread int32, caption, noticetype string, pageno, pagesize int32) ([]orm.Params, int, error) { dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_Notice dblog.Logtype = enum.LogType_Query dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Hight o := orm.NewOrm() sqlParamters := []interface{}{} sql := "select t.*,u.name username,c.name type_name,ts.area_name station_name from t_base_notice t left join t_data_user u on t.cr=u.id left join global_const_code c on t.notice_type=c.id and c.parentcode='notice_types' left join t_data_area ts on t.station_id=ts.ID where 1=1 " if rev_id > 0 { sql += " and t.rev_id=?" sqlParamters = append(sqlParamters, rev_id) } if station_id > 0 { sql += " and t.station_id=?" sqlParamters = append(sqlParamters, station_id) } if caption != "" { sql += " and t.caption like ?" sqlParamters = append(sqlParamters, "%"+caption+"%") } if noticetype != "" { sql += " and t.notice_type=?" sqlParamters = append(sqlParamters, noticetype) } if isread != -1 { sql += " and t.read_flag=?" sqlParamters = append(sqlParamters, isread) } limit := fmt.Sprintf(" order by t.ct desc limit %d,%d", (pageno-1)*pagesize, pagesize) r := []orm.Params{} _, err := o.Raw(sql+limit, sqlParamters).Values(&r) dblog.Description = fmt.Sprintf("SQL:%s 参数:%+v", sql+limit, sqlParamters) if err != nil { logger.Logger.Error(err, dblog.Description) dblog.Fail2() return nil, 0, err } dblog.Success2() total := []orm.Params{} _, err = o.Raw(strings.Replace(sql, "t.*,u.name username,c.name type_name", "count(1) cnt", 1), sqlParamters).Values(&total) if err != nil { log.Println(err) return nil, 0, err } totalCnt := 0 if len(total) > 0 { totalCnt, _ = strconv.Atoi(tools.IsEmpty(total[0]["cnt"])) } return r, totalCnt, err } func (c *NoticeMgr) Clear(stationid int) { o := orm.NewOrm() sql := "delete from t_base_notice where station_id=?" o.Raw(sql, stationid).Exec() }