package bo import ( "fmt" "io/fs" "os" "scd_check_tools/logger" "scd_check_tools/models/enum" "scd_check_tools/tools" "strconv" "strings" "github.com/astaxie/beego/orm" ) //检测任务报告模型 type T_data_task_report struct { Id int `orm:"pk"` Name string // '报告名称' , Code string // '报告编号' , TaskId int // '所属检测任务' , State int // '生成状态;1 生成中 2生成结束' , Doc string //'下载路径' , Cr int // '创建人' , Ct string // '创建时间' , Ur int // '更新人' , Ut string // '更新时间' } //检测任务管理对象 type TaskReportMgr struct { Model T_data_task_report DeviceBaseModel } var modelDesc3 = "检测报告" func init() { orm.RegisterModel(new(T_data_task_report)) } //生成报告 func (c *TaskReportMgr) Make() (reprid int, err error) { taskMgr := new(TaskMgr) taskMgr.Model = T_data_task{Id: c.Model.TaskId} taskinfo, e := taskMgr.One() if e != nil { return 0, e } dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_check_task dblog.Logtype = enum.LogType_Insert dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Hight db := orm.NewOrm() c.Model.Name = taskinfo.Name c.Model.Code = taskinfo.Code if c.Model.Id == 0 { c.Model.Cr, _ = strconv.Atoi(c.GetUserId()) newid, err2 := db.Insert(&c.Model) err = err2 c.Model.Id = int(newid) } else { c.Model.Ur, _ = strconv.Atoi(c.GetUserId()) _, err = db.Update(&c.Model) } if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("生成%s失败:%s,操作数据:%+v", modelDesc3, err.Error(), c.Model) dblog.Fail2() } else { //根据模板生成报告 wordpath, err := c.ToWord(taskinfo.ReportId) if err != nil { c.Delete() return 0, err } c.Model.Doc = wordpath c.Model.State = 2 _, err = db.Update(&c.Model) dblog.Description = fmt.Sprintf("生成%s成功,操作数据:%+v", modelDesc3, c.Model) dblog.Success2() } return c.Model.Id, err } func (c *TaskReportMgr) List(pageno, pagesize int) ([]orm.Params, int, error) { o := orm.NewOrm() rowset := []orm.Params{} sqlParams := []interface{}{} sql := "select * from t_data_task_report where 1=1 " if c.Model.TaskId > 0 { sql = sql + " and task_id=?" sqlParams = append(sqlParams, c.Model.TaskId) } if c.Model.Name != "" { sql = sql + " and name like ?" sqlParams = append(sqlParams, "%"+c.Model.Name+"%") } if c.Model.Code != "" { sql = sql + " and code like ?" sqlParams = append(sqlParams, "%"+c.Model.Code+"%") } limit := fmt.Sprintf(" order by ct desc limit %d,%d", (pageno-1)*pagesize, pagesize) _, err := o.Raw(sql+limit, sqlParams).Values(&rowset) total := []orm.Params{} _, err = o.Raw(strings.Replace(sql, "*", "count(1) cnt", 1), sqlParams).Values(&total) if err != nil { logger.Logger.Error(err) return nil, 0, err } totalCnt := 0 if len(total) > 0 { totalCnt, _ = strconv.Atoi(tools.IsEmpty(total[0]["cnt"])) } return rowset, totalCnt, err } func (c *TaskReportMgr) One(taskid int) (T_data_task_report, error) { o := orm.NewOrm() tmp := T_data_task_report{} rowset := []orm.Params{} o.Raw("select * from t_data_task_report where task_id=?", taskid).Values(&rowset) if len(rowset) == 0 { return tmp, nil } tmp.Id, _ = strconv.Atoi(tools.IsEmpty(rowset[0]["id"])) tmp.Code = tools.IsEmpty(rowset[0]["code"]) tmp.Name = tools.IsEmpty(rowset[0]["name"]) tmp.TaskId = taskid tmp.Doc = tools.IsEmpty(rowset[0]["doc"]) tmp.State, _ = strconv.Atoi(tools.IsEmpty(rowset[0]["state"])) return tmp, nil } //根据model中指定的id删除检测任务报告 func (c *TaskReportMgr) Delete() (err error) { dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_check_task dblog.Logtype = enum.LogType_Delete dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Hight db := orm.NewOrm() if c.Model.Id > 0 { db.Read(&c.Model) _, err = db.Delete(&c.Model) } if c.Model.TaskId > 0 { _, err = db.Raw("delete from t_data_task_report where task_id=?", c.Model.TaskId).Exec() } if err != nil { logger.Logger.Error(err) dblog.Description = fmt.Sprintf("删除%s%d失败:%s", modelDesc3, c.Model.TaskId, err.Error()) dblog.Fail2() } else { dblog.Description = fmt.Sprintf("删除%s%d成功", modelDesc3, c.Model.TaskId) dblog.Success2() } return err } func (c *TaskReportMgr) ToWord(tplid int) (path string, err error) { fileMgr := new(AttachmentMgr) fileMgr.Model = T_sys_attachment{Id: int32(tplid)} fileinfo, err := fileMgr.One() if err != nil { return "", err } reportPath := strings.Join([]string{".", "static", "download", "report"}, string(os.PathSeparator)) os.MkdirAll(reportPath, fs.ModePerm) reportFN := reportPath + string(os.PathSeparator) + fmt.Sprintf("%s.%s", c.Model.Code, strings.Split(fileinfo.SavePath, ".")[0]) err = os.Rename(fileinfo.SavePath, reportFN) if err != nil { return "", err } //生成报告数据 return reportFN[1:], err }