attachment.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. package bo
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "os"
  7. "scd_check_tools/logger"
  8. "scd_check_tools/models/enum"
  9. "scd_check_tools/tools"
  10. "strconv"
  11. "strings"
  12. "github.com/astaxie/beego/orm"
  13. )
  14. //数据附件清理模型
  15. type T_data_attachment struct {
  16. Id int `orm:"pk;auto"`
  17. Name string
  18. Skeepday int
  19. Tablename string
  20. Colname string
  21. Filterwhere string
  22. Memo string
  23. Ct string
  24. Cr string
  25. }
  26. //附件模型
  27. type T_sys_attachment struct {
  28. Id int32 `orm:"pk"` // INT NOT NULL AUTO_INCREMENT COMMENT '主键' ,
  29. CreatedBy string //INT DEFAULT 0 COMMENT '创建人' ,
  30. CreatedTime string //DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间' ,
  31. StationId int32 //INT NOT NULL COMMENT '所属站' ,
  32. ScdId int64
  33. IedName string
  34. IedDesc string
  35. FileName string //VARCHAR(100) NOT NULL COMMENT '文件名称' ,
  36. FileSize string //VARCHAR(20) COMMENT '文件大小' ,
  37. SavePath string //VARCHAR(200) COMMENT '保存路径' ,
  38. FileType string //VARCHAR(10) COMMENT '文件类型' ,
  39. FileSuffix string //VARCHAR(10) COMMENT '文件后缀' ,
  40. CrcSign string //VARCHAR(1) COMMENT '认证标记' ,
  41. //文档管控模式 0 非管控 1管控
  42. CheckFlag int
  43. Remark string //VARCHAR(200) COMMENT '备注' ,
  44. }
  45. type T_sys_attachment_download struct {
  46. Id int
  47. AttachmentId int
  48. DownloadUser int
  49. DownloadDate string
  50. DownloadDesc string
  51. }
  52. //数据附件清理对象
  53. type AttachmentClearMgr struct {
  54. Model T_data_attachment
  55. DeviceBaseModel
  56. }
  57. //附件管理对象
  58. type AttachmentMgr struct {
  59. Model T_sys_attachment
  60. DeviceBaseModel
  61. }
  62. func init() {
  63. orm.RegisterModel(new(T_data_attachment))
  64. orm.RegisterModel(new(T_sys_attachment))
  65. orm.RegisterModel(new(T_sys_attachment_download))
  66. }
  67. func (c *AttachmentClearMgr) Save() (err error) {
  68. db := orm.NewOrm()
  69. c.Model.Cr = c.GetUserId() // tools.IsEmpty(c.Userinfo["userid"])
  70. c.Model.Ct = tools.NowTime()
  71. if c.Model.Id == 0 {
  72. _, err = db.Insert(&c.Model)
  73. } else {
  74. _, err = db.Update(&c.Model)
  75. }
  76. dblog := new(SystemLog)
  77. dblog.SetUserInfo(c.GetUserInfo())
  78. dblog.Audittype = enum.AuditType_admin_system_attachment
  79. dblog.Logtype = enum.LogType_Insert
  80. dblog.Eventtype = enum.OptEventType_Bus
  81. dblog.Eventlevel = enum.OptEventLevel_Low
  82. if err != nil {
  83. logger.Logger.Error(err)
  84. dblog.Description = fmt.Sprintf("保存清理名单%s失败:%s", c.Model.Name, err.Error())
  85. dblog.Fail2()
  86. } else {
  87. dblog.Description = fmt.Sprintf("保存清理名单%s成功", c.Model.Name)
  88. dblog.Success2()
  89. }
  90. return err
  91. }
  92. func (c *AttachmentClearMgr) One() (T_data_attachment, error) {
  93. o := orm.NewOrm()
  94. err := o.Read(&c.Model)
  95. if err != nil {
  96. log.Println(err)
  97. }
  98. return c.Model, err
  99. }
  100. func (c *AttachmentClearMgr) List() ([]T_data_attachment, int, error) {
  101. o := orm.NewOrm()
  102. t := o.QueryTable("t_data_attachment")
  103. r := []T_data_attachment{}
  104. dblog := new(SystemLog)
  105. dblog.SetUserInfo(c.GetUserInfo())
  106. dblog.Audittype = enum.AuditType_admin_system_attachment
  107. dblog.Logtype = enum.LogType_Query
  108. dblog.Eventtype = enum.OptEventType_Bus
  109. dblog.Eventlevel = enum.OptEventLevel_Low
  110. dblog.Description = "列表查询"
  111. _, err := t.All(&r)
  112. if err != nil {
  113. logger.Logger.Error(err)
  114. dblog.Fail2()
  115. } else {
  116. dblog.Success2()
  117. }
  118. return r, len(r), err
  119. }
  120. func (c *AttachmentClearMgr) Delete() (err error) {
  121. db := orm.NewOrm()
  122. if c.Model.Id == 0 {
  123. return errors.New("无效的ID")
  124. } else {
  125. db.Read(&c.Model)
  126. _, err = db.Delete(&c.Model)
  127. }
  128. dblog := new(SystemLog)
  129. dblog.SetUserInfo(c.GetUserInfo())
  130. dblog.Audittype = enum.AuditType_admin_system_attachment
  131. dblog.Logtype = enum.LogType_Delete
  132. dblog.Eventtype = enum.OptEventType_Bus
  133. dblog.Eventlevel = enum.OptEventLevel_Low
  134. if err != nil {
  135. logger.Logger.Error(err)
  136. dblog.Description = fmt.Sprintf("删除清理名单%s失败:%s", c.Model.Name, err.Error())
  137. dblog.Fail2()
  138. } else {
  139. dblog.Description = fmt.Sprintf("删除清理名单%s成功", c.Model.Name)
  140. dblog.Success2()
  141. }
  142. return err
  143. }
  144. func (c *AttachmentMgr) TypeStat(param map[string]interface{}) (map[string]interface{}, error) {
  145. var result = map[string]interface{}{}
  146. result["data"] = []orm.Params{}
  147. constCode := new(Global)
  148. list, _ := constCode.GetChildrenGlobalCode("file_types")
  149. result["comments"] = []orm.Params{}
  150. rowset := []orm.Params{}
  151. uaObj := new(UserAreaRelationObject)
  152. uaObj.SetUserInfo(c.GetUserInfo())
  153. areaFilerWhere := uaObj.MakeAreaFilerIds("t.station_id", "and")
  154. db := orm.NewOrm()
  155. for _, row := range list {
  156. typecode := tools.IsEmpty(row["code"])
  157. if typecode == "file_all" {
  158. continue
  159. }
  160. result["comments"] = append(result["comments"].([]orm.Params), row)
  161. sql := ""
  162. sqlParams := []interface{}{}
  163. if typecode == "file_a_scd" {
  164. sql = "select " + tools.IsEmpty(row["id"]) + " file_type,count(0) cnt from t_scd_scl t where enable=1 "
  165. station_id := tools.IsEmpty(param["station_id"])
  166. if station_id != "" {
  167. sql = sql + " and t.station_id=?"
  168. sqlParams = append(sqlParams, station_id)
  169. } else {
  170. if areaFilerWhere != "" {
  171. sql = sql + areaFilerWhere
  172. }
  173. }
  174. } else {
  175. sql = "select t.file_type,count(0) cnt from global_const_code a left join t_sys_attachment t on a.id=t.file_type "
  176. station_id := tools.IsEmpty(param["station_id"])
  177. if station_id != "" {
  178. sql = sql + " and t.station_id=?"
  179. sqlParams = append(sqlParams, station_id)
  180. } else {
  181. if areaFilerWhere != "" {
  182. sql = sql + areaFilerWhere
  183. }
  184. }
  185. sqlParams = append(sqlParams, tools.IsEmpty(row["id"]))
  186. sql = sql + " where a.parentcode='file_types' and a.id=? GROUP BY a.id"
  187. }
  188. tmprowset := []orm.Params{}
  189. _, err := db.Raw(sql, sqlParams).Values(&tmprowset)
  190. if err != nil {
  191. log.Println(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParams))
  192. } else {
  193. rowset = append(rowset, tmprowset...)
  194. }
  195. }
  196. result["data"] = rowset
  197. return result, nil
  198. }
  199. func (c *AttachmentMgr) Save() (id int32, err error) {
  200. db := orm.NewOrm()
  201. c.Model.CreatedBy = c.GetUserId()
  202. c.Model.CreatedTime = tools.NowTime()
  203. dblog := new(SystemLog)
  204. dblog.SetUserInfo(c.GetUserInfo())
  205. dblog.Audittype = enum.AuditType_admin_system_attachment
  206. dblog.Logtype = enum.LogType_Insert
  207. dblog.Eventtype = enum.OptEventType_Bus
  208. dblog.Eventlevel = enum.OptEventLevel_Hight
  209. newid := int64(0)
  210. if c.Model.Id == 0 {
  211. newid, err = db.Insert(&c.Model)
  212. } else {
  213. _, err = db.Update(&c.Model)
  214. newid = int64(c.Model.Id)
  215. }
  216. if err != nil {
  217. logger.Logger.Error(err, fmt.Sprintf("原始数据:%+v", c.Model))
  218. dblog.Description = fmt.Sprintf("上传附件%s失败:%s", c.Model.FileName, err.Error())
  219. dblog.Fail2()
  220. } else {
  221. dblog.Description = fmt.Sprintf("上传附件%s成功", c.Model.FileName)
  222. dblog.Success2()
  223. }
  224. return int32(newid), err
  225. }
  226. func (c *AttachmentMgr) One() (T_sys_attachment, error) {
  227. o := orm.NewOrm()
  228. err := o.Read(&c.Model)
  229. if err != nil {
  230. logger.Logger.Error(err)
  231. }
  232. return c.Model, err
  233. }
  234. //查询文档列表
  235. //参数:
  236. //station_id:所属变电站ID int32
  237. //iedname:指定IED装置名称
  238. //filename:指定文件名称。模糊匹配
  239. //filetype:指定文件分类ID.
  240. //isCheckIn:是否管控文档。1(是)|0(否)
  241. func (c *AttachmentMgr) List(scd_id string, station_id int32, iedname, filename, filetype, isCheckIn string, pageno, pagesize int32) ([]orm.Params, int, error) {
  242. o := orm.NewOrm()
  243. sqlParamters := []interface{}{}
  244. sql := "select t.*,s1.version,s1.is_parse,u.name username,c.name type_name from t_sys_attachment t left join t_scd_scl s1 on t.scd_id=s1.id left join t_data_user u on t.created_by=u.id left join global_const_code c on t.file_type=c.id and c.parentcode='file_types' where t.station_id=? "
  245. sqlParamters = append(sqlParamters, station_id)
  246. if iedname != "" {
  247. sql += " and t.ied_name=?"
  248. sqlParamters = append(sqlParamters, iedname)
  249. }
  250. if filename != "" {
  251. sql += " and t.file_name like ?"
  252. sqlParamters = append(sqlParamters, "%"+filename+"%")
  253. }
  254. if filetype != "" {
  255. sql += " and t.file_type=?"
  256. sqlParamters = append(sqlParamters, filetype)
  257. }
  258. if isCheckIn == "1" {
  259. sql += " and t.check_flag=1"
  260. } else if isCheckIn == "0" {
  261. sql += " and t.check_flag=0"
  262. } else if isCheckIn == "2" {
  263. //获取裁剪文件,仅支持ccd\icd\cid
  264. sql += " and t.check_flag=2"
  265. }
  266. limit := fmt.Sprintf(" order by t.file_name desc limit %d,%d", (pageno-1)*pagesize, pagesize)
  267. dblog := new(SystemLog)
  268. dblog.SetUserInfo(c.GetUserInfo())
  269. dblog.Audittype = enum.AuditType_admin_system_attachment
  270. dblog.Logtype = enum.LogType_Query
  271. dblog.Eventtype = enum.OptEventType_Bus
  272. dblog.Eventlevel = enum.OptEventLevel_Low
  273. r := []orm.Params{}
  274. _, err := o.Raw(sql+limit, sqlParamters).Values(&r)
  275. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql+limit, sqlParamters)
  276. if err != nil {
  277. logger.Logger.Error(err, sqllog)
  278. dblog.Description = sqllog
  279. dblog.Fail2()
  280. return nil, 0, err
  281. }
  282. dblog.Description = sqllog
  283. dblog.Success2()
  284. total := []orm.Params{}
  285. totalSql := strings.Replace(sql, "t.*,u.name username,c.name type_name", "count(1) cnt", 1)
  286. sqllog = fmt.Sprintf("SQL:%s 参数:%+v", totalSql, sqlParamters)
  287. _, err = o.Raw(totalSql, sqlParamters).Values(&total)
  288. if err != nil {
  289. logger.Logger.Error(err, sqllog)
  290. return nil, 0, err
  291. }
  292. totalCnt := 0
  293. if len(total) > 0 {
  294. totalCnt, _ = strconv.Atoi(tools.IsEmpty(total[0]["cnt"]))
  295. }
  296. return r, totalCnt, err
  297. }
  298. func (c *AttachmentMgr) Delete(isall ...bool) (err error) {
  299. db := orm.NewOrm()
  300. if c.Model.Id == 0 {
  301. return errors.New("无效的ID")
  302. } else {
  303. db.Read(&c.Model)
  304. //判断是否是scd
  305. if c.Model.ScdId > 0 && c.Model.FileSuffix == "scd" {
  306. scd := new(ScdMgr)
  307. scd.SetUserInfo(c.GetUserInfo())
  308. delAll := true
  309. if len(isall) > 0 {
  310. delAll = isall[0]
  311. }
  312. err = scd.DeleteScd(tools.IsEmpty(c.Model.ScdId), delAll)
  313. } else {
  314. _, err = db.Delete(&c.Model)
  315. filepath := c.Model.SavePath
  316. if filepath != "" {
  317. if filepath[0:1] != "." {
  318. filepath = "." + filepath
  319. }
  320. ferr := os.Remove(filepath)
  321. if ferr != nil {
  322. logger.Logger.Error(ferr)
  323. }
  324. }
  325. }
  326. }
  327. dblog := new(SystemLog)
  328. dblog.SetUserInfo(c.GetUserInfo())
  329. dblog.Audittype = enum.AuditType_admin_system_attachment
  330. dblog.Logtype = enum.LogType_Delete
  331. dblog.Eventtype = enum.OptEventType_System
  332. dblog.Eventlevel = enum.OptEventLevel_Hight
  333. if err != nil {
  334. logger.Logger.Error(err)
  335. dblog.Description = fmt.Sprintf("删除附件%s失败:%s", c.Model.FileName, err.Error())
  336. dblog.Fail2()
  337. } else {
  338. dblog.Description = fmt.Sprintf("删除附件%s成功", c.Model.FileName)
  339. dblog.Success2()
  340. }
  341. return err
  342. }
  343. //开始分析指定的scd文件
  344. func (c *AttachmentMgr) StartScdTempParse(stationid int, scdname, scdpath string) error {
  345. if stationid == 0 {
  346. return errors.New("无效的变站电编号")
  347. }
  348. if scdname == "" || scdpath == "" {
  349. return errors.New("无效的SCD文件名称或路径")
  350. }
  351. dblog := new(SystemLog)
  352. dblog.SetUserInfo(c.GetUserInfo())
  353. dblog.Audittype = enum.AuditType_scd_resetparse
  354. dblog.Logtype = enum.LogType_Update
  355. dblog.Eventtype = enum.OptEventType_System
  356. dblog.Eventlevel = enum.OptEventLevel_Hight
  357. sql := "update t_sys_attachment set scd_id=-1 where station_id=? and file_name=? and save_path=?"
  358. sqllog := fmt.Sprintf("SQL:%s 参数:%d,%s,%s", sql, stationid, scdname, scdpath)
  359. _, err := orm.NewOrm().Raw(sql, stationid, scdname, scdpath).Exec()
  360. if err != nil {
  361. logger.Logger.Error(err)
  362. dblog.Description = sqllog
  363. dblog.Fail2()
  364. } else {
  365. dblog.Description = sqllog
  366. dblog.Success2()
  367. }
  368. return err
  369. }
  370. //更新指定变电站的最新管控文件的scdid
  371. func (c *AttachmentMgr) UpdateScdID(stationid int, scdname, scdpath string, scdid int64) {
  372. db := orm.NewOrm()
  373. if scdpath != "" && scdpath[0:1] == "." {
  374. scdpath = scdpath[1:]
  375. }
  376. _, err := db.Raw("update t_sys_attachment set scd_id=? where station_id=? and scd_id<=0 and file_name=? and save_path=?", scdid, stationid, scdname, scdpath).Exec()
  377. if err != nil {
  378. log.Println(err)
  379. }
  380. _, err = db.Raw("update t_sys_attachment t set scd_id=? where file_suffix!='scd' and station_id=? and scd_id<=0", scdid, stationid).Exec()
  381. if err != nil {
  382. log.Println(err)
  383. }
  384. }
  385. //清理指定变电站已上传但不使用的指定类型文件
  386. //以避免重复上传时,出现无效文件
  387. func (c *AttachmentMgr) ClearDityFile(stationid int32, fileType string) {
  388. db := orm.NewOrm()
  389. rowset := []orm.Params{}
  390. db.Raw("select save_path from t_sys_attachment where station_id=? and file_type=? and scd_id=-1 and check_flag=1", stationid, fileType).Values(&rowset)
  391. db.Raw("delete from t_sys_attachment where station_id=? and file_type=? and scd_id=-1 and check_flag=1", stationid, fileType).Exec()
  392. if rowset != nil && len(rowset) > 0 {
  393. for _, row := range rowset {
  394. fp := tools.IsEmpty(row["save_path"])
  395. if fp == "" {
  396. continue
  397. }
  398. if fp[0:1] != "." {
  399. fp = "." + fp
  400. }
  401. os.Remove(fp)
  402. }
  403. }
  404. }
  405. //清理指定变电站文件
  406. func (c *AttachmentMgr) ClearAllFile(stationid int32) {
  407. db := orm.NewOrm()
  408. rowset := []orm.Params{}
  409. db.Raw("select save_path from t_sys_attachment where station_id=? ", stationid).Values(&rowset)
  410. db.Raw("delete from t_sys_attachment where station_id=? ", stationid).Exec()
  411. if rowset != nil && len(rowset) > 0 {
  412. for _, row := range rowset {
  413. fp := tools.IsEmpty(row["save_path"])
  414. if fp == "" {
  415. continue
  416. }
  417. if fp[0:1] != "." {
  418. fp = "." + fp
  419. }
  420. os.Remove(fp)
  421. }
  422. }
  423. }
  424. func (c *AttachmentMgr) DownloadRec(attamentid int, desc string) error {
  425. o := orm.NewOrm()
  426. dwn := T_sys_attachment_download{}
  427. dwn.AttachmentId = attamentid
  428. dwn.DownloadDate = tools.NowTime()
  429. dwn.DownloadUser, _ = strconv.Atoi(c.GetUserId())
  430. dwn.DownloadDesc = desc
  431. _, err := o.Insert(&dwn)
  432. return err
  433. }