attachment.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. package bo
  2. import (
  3. "scd_check_tools/logger"
  4. "scd_check_tools/models/enum"
  5. "scd_check_tools/tools"
  6. "errors"
  7. "fmt"
  8. "log"
  9. "os"
  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() (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. if c.Model.Id == 0 {
  210. _, err = db.Insert(&c.Model)
  211. } else {
  212. _, err = db.Update(&c.Model)
  213. }
  214. if err != nil {
  215. logger.Logger.Error(err, fmt.Sprintf("原始数据:%+v", c.Model))
  216. dblog.Description = fmt.Sprintf("上传附件%s失败:%s", c.Model.FileName, err.Error())
  217. dblog.Fail2()
  218. } else {
  219. dblog.Description = fmt.Sprintf("上传附件%s成功", c.Model.FileName)
  220. dblog.Success2()
  221. }
  222. return err
  223. }
  224. func (c *AttachmentMgr) One() (T_sys_attachment, error) {
  225. o := orm.NewOrm()
  226. err := o.Read(&c.Model)
  227. if err != nil {
  228. logger.Logger.Error(err)
  229. }
  230. return c.Model, err
  231. }
  232. //查询文档列表
  233. //参数:
  234. //station_id:所属变电站ID int32
  235. //iedname:指定IED装置名称
  236. //filename:指定文件名称。模糊匹配
  237. //filetype:指定文件分类ID.
  238. //isCheckIn:是否管控文档。1(是)|0(否)
  239. func (c *AttachmentMgr) List(scd_id string, station_id int32, iedname, filename, filetype, isCheckIn string, pageno, pagesize int32) ([]orm.Params, int, error) {
  240. o := orm.NewOrm()
  241. sqlParamters := []interface{}{}
  242. 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=? "
  243. sqlParamters = append(sqlParamters, station_id)
  244. if iedname != "" {
  245. sql += " and t.ied_name=?"
  246. sqlParamters = append(sqlParamters, iedname)
  247. }
  248. if filename != "" {
  249. sql += " and t.file_name like ?"
  250. sqlParamters = append(sqlParamters, "%"+filename+"%")
  251. }
  252. if filetype != "" {
  253. sql += " and t.file_type=?"
  254. sqlParamters = append(sqlParamters, filetype)
  255. }
  256. if isCheckIn == "1" {
  257. sql += " and t.check_flag=1"
  258. } else if isCheckIn == "0" {
  259. sql += " and t.check_flag=0"
  260. } else if isCheckIn == "2" {
  261. //获取裁剪文件,仅支持ccd\icd\cid
  262. sql += " and t.check_flag=2"
  263. }
  264. limit := fmt.Sprintf(" order by t.file_name desc limit %d,%d", (pageno-1)*pagesize, pagesize)
  265. dblog := new(SystemLog)
  266. dblog.SetUserInfo(c.GetUserInfo())
  267. dblog.Audittype = enum.AuditType_admin_system_attachment
  268. dblog.Logtype = enum.LogType_Query
  269. dblog.Eventtype = enum.OptEventType_Bus
  270. dblog.Eventlevel = enum.OptEventLevel_Low
  271. r := []orm.Params{}
  272. _, err := o.Raw(sql+limit, sqlParamters).Values(&r)
  273. sqllog := fmt.Sprintf("SQL:%s 参数:%+v", sql+limit, sqlParamters)
  274. if err != nil {
  275. logger.Logger.Error(err, sqllog)
  276. dblog.Description = sqllog
  277. dblog.Fail2()
  278. return nil, 0, err
  279. }
  280. dblog.Description = sqllog
  281. dblog.Success2()
  282. total := []orm.Params{}
  283. totalSql := strings.Replace(sql, "t.*,u.name username,c.name type_name", "count(1) cnt", 1)
  284. sqllog = fmt.Sprintf("SQL:%s 参数:%+v", totalSql, sqlParamters)
  285. _, err = o.Raw(totalSql, sqlParamters).Values(&total)
  286. if err != nil {
  287. logger.Logger.Error(err, sqllog)
  288. return nil, 0, err
  289. }
  290. totalCnt := 0
  291. if len(total) > 0 {
  292. totalCnt, _ = strconv.Atoi(tools.IsEmpty(total[0]["cnt"]))
  293. }
  294. return r, totalCnt, err
  295. }
  296. func (c *AttachmentMgr) Delete(isall ...bool) (err error) {
  297. db := orm.NewOrm()
  298. if c.Model.Id == 0 {
  299. return errors.New("无效的ID")
  300. } else {
  301. db.Read(&c.Model)
  302. //判断是否是scd
  303. if c.Model.ScdId > 0 && c.Model.FileSuffix == "scd" {
  304. scd := new(ScdMgr)
  305. scd.SetUserInfo(c.GetUserInfo())
  306. delAll := true
  307. if len(isall) > 0 {
  308. delAll = isall[0]
  309. }
  310. err = scd.DeleteScd(tools.IsEmpty(c.Model.ScdId), delAll)
  311. } else {
  312. _, err = db.Delete(&c.Model)
  313. filepath := c.Model.SavePath
  314. if filepath != "" {
  315. if filepath[0:1] != "." {
  316. filepath = "." + filepath
  317. }
  318. ferr := os.Remove(filepath)
  319. if ferr != nil {
  320. logger.Logger.Error(ferr)
  321. }
  322. }
  323. }
  324. }
  325. dblog := new(SystemLog)
  326. dblog.SetUserInfo(c.GetUserInfo())
  327. dblog.Audittype = enum.AuditType_admin_system_attachment
  328. dblog.Logtype = enum.LogType_Delete
  329. dblog.Eventtype = enum.OptEventType_System
  330. dblog.Eventlevel = enum.OptEventLevel_Hight
  331. if err != nil {
  332. logger.Logger.Error(err)
  333. dblog.Description = fmt.Sprintf("删除附件%s失败:%s", c.Model.FileName, err.Error())
  334. dblog.Fail2()
  335. } else {
  336. dblog.Description = fmt.Sprintf("删除附件%s成功", c.Model.FileName)
  337. dblog.Success2()
  338. }
  339. return err
  340. }
  341. //开始分析指定的scd文件
  342. func (c *AttachmentMgr) StartScdTempParse(stationid int, scdname, scdpath string) error {
  343. if stationid == 0 {
  344. return errors.New("无效的变站电编号")
  345. }
  346. if scdname == "" || scdpath == "" {
  347. return errors.New("无效的SCD文件名称或路径")
  348. }
  349. dblog := new(SystemLog)
  350. dblog.SetUserInfo(c.GetUserInfo())
  351. dblog.Audittype = enum.AuditType_scd_resetparse
  352. dblog.Logtype = enum.LogType_Update
  353. dblog.Eventtype = enum.OptEventType_System
  354. dblog.Eventlevel = enum.OptEventLevel_Hight
  355. sql := "update t_sys_attachment set scd_id=-1 where station_id=? and file_name=? and save_path=?"
  356. sqllog := fmt.Sprintf("SQL:%s 参数:%d,%s,%s", sql, stationid, scdname, scdpath)
  357. _, err := orm.NewOrm().Raw(sql, stationid, scdname, scdpath).Exec()
  358. if err != nil {
  359. logger.Logger.Error(err)
  360. dblog.Description = sqllog
  361. dblog.Fail2()
  362. } else {
  363. dblog.Description = sqllog
  364. dblog.Success2()
  365. }
  366. return err
  367. }
  368. //更新指定变电站的最新管控文件的scdid
  369. func (c *AttachmentMgr) UpdateScdID(stationid int, scdname, scdpath string, scdid int64) {
  370. db := orm.NewOrm()
  371. if scdpath != "" && scdpath[0:1] == "." {
  372. scdpath = scdpath[1:]
  373. }
  374. _, 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()
  375. if err != nil {
  376. log.Println(err)
  377. }
  378. _, 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()
  379. if err != nil {
  380. log.Println(err)
  381. }
  382. }
  383. //清理指定变电站已上传但不使用的指定类型文件
  384. //以避免重复上传时,出现无效文件
  385. func (c *AttachmentMgr) ClearDityFile(stationid int32, fileType string) {
  386. db := orm.NewOrm()
  387. rowset := []orm.Params{}
  388. 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)
  389. db.Raw("delete from t_sys_attachment where station_id=? and file_type=? and scd_id=-1 and check_flag=1", stationid, fileType).Exec()
  390. if rowset != nil && len(rowset) > 0 {
  391. for _, row := range rowset {
  392. fp := tools.IsEmpty(row["save_path"])
  393. if fp == "" {
  394. continue
  395. }
  396. if fp[0:1] != "." {
  397. fp = "." + fp
  398. }
  399. os.Remove(fp)
  400. }
  401. }
  402. }
  403. //清理指定变电站文件
  404. func (c *AttachmentMgr) ClearAllFile(stationid int32) {
  405. db := orm.NewOrm()
  406. rowset := []orm.Params{}
  407. db.Raw("select save_path from t_sys_attachment where station_id=? ", stationid).Values(&rowset)
  408. db.Raw("delete from t_sys_attachment where station_id=? ", stationid).Exec()
  409. if rowset != nil && len(rowset) > 0 {
  410. for _, row := range rowset {
  411. fp := tools.IsEmpty(row["save_path"])
  412. if fp == "" {
  413. continue
  414. }
  415. if fp[0:1] != "." {
  416. fp = "." + fp
  417. }
  418. os.Remove(fp)
  419. }
  420. }
  421. }
  422. func (c *AttachmentMgr) DownloadRec(attamentid int, desc string) error {
  423. o := orm.NewOrm()
  424. dwn := T_sys_attachment_download{}
  425. dwn.AttachmentId = attamentid
  426. dwn.DownloadDate = tools.NowTime()
  427. dwn.DownloadUser, _ = strconv.Atoi(c.GetUserId())
  428. dwn.DownloadDesc = desc
  429. _, err := o.Insert(&dwn)
  430. return err
  431. }