tree_dao.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*
  2. * @description: 树结构数据库操作相关
  3. * @Author: CP
  4. * @Date: 2020-09-11 14:49:27
  5. * @FilePath: \construction_management\dao\tree_dao.go
  6. */
  7. package dao
  8. import (
  9. "errors"
  10. "fmt"
  11. "strconv"
  12. "strings"
  13. "github.com/go-xorm/xorm"
  14. "go.mod/models"
  15. )
  16. //数据库操作引擎
  17. type TreeDao struct {
  18. engine *xorm.Engine
  19. }
  20. //获得一个DAO对象
  21. func NewTreeDao(engine *xorm.Engine) *TreeDao {
  22. return &TreeDao{
  23. engine: engine,
  24. }
  25. }
  26. //id获得数据
  27. func (d *TreeDao) Get(id int) *models.CmTree {
  28. data := &models.CmTree{Id: id, Isdelete: 0}
  29. //Get取到值后,会自动赋值到data中
  30. ok, err := d.engine.Get(data)
  31. if ok && err == nil {
  32. return data
  33. } else {
  34. data.Id = 0
  35. return data
  36. }
  37. }
  38. // 获得该目录下的标段
  39. func (d *TreeDao) GetBidsection(id int) []models.CmTree {
  40. datalist := make([]models.CmTree, 0)
  41. err := d.engine.
  42. Asc("serial").
  43. Where("parent_id=? and isfolder=0 and isdelete=0", id).
  44. Find(&datalist)
  45. if err != nil {
  46. return datalist
  47. } else {
  48. return datalist
  49. }
  50. }
  51. // 获得某一深度的 结构数据(不包含子集) 正序
  52. func (d *TreeDao) GetAllDepth(depth int, projectId int) []models.CmTree {
  53. datalist := make([]models.CmTree, 0)
  54. err := d.engine.
  55. Asc("serial").
  56. Where("depth=? and project_id=? and isdelete=0", depth, projectId).
  57. Find(&datalist)
  58. if err != nil {
  59. return datalist
  60. } else {
  61. return datalist
  62. }
  63. }
  64. // 获得该目录下所有的目录
  65. func (d *TreeDao) GetChildFolder(id int) []models.CmTree {
  66. datalist := make([]models.CmTree, 0)
  67. err := d.engine.
  68. Asc("serial").
  69. Where("parent_id=? and isdelete=0", id).
  70. Find(&datalist)
  71. if err != nil {
  72. return datalist
  73. } else {
  74. return datalist
  75. }
  76. }
  77. // 获得某一深度的某一归属 结构数据(不包含子集) 正序
  78. func (d *TreeDao) GetALLDepthByAttribution(depth int, projectId int, attribution string) []models.CmTree {
  79. datalist := make([]models.CmTree, 0)
  80. err := d.engine.
  81. Asc("serial").
  82. Where("depth=? and project_id=? and attribution like ? and isdelete=0", depth, projectId, attribution+"%").
  83. Find(&datalist)
  84. if err != nil {
  85. return datalist
  86. } else {
  87. return datalist
  88. }
  89. }
  90. // 获得该目录下所有的目录和标段
  91. func (d *TreeDao) GetFolderAndBid(projectId int, attribution string) []models.CmTree {
  92. datalist := make([]models.CmTree, 0)
  93. err := d.engine.
  94. Asc("serial").
  95. Where("project_id=? and attribution like ? and isdelete=0", projectId, attribution+"%").
  96. Find(&datalist)
  97. if err != nil {
  98. return datalist
  99. } else {
  100. return datalist
  101. }
  102. }
  103. // 删除目录以及下属目录所有数据
  104. func (d *TreeDao) DeleteFolderAndBid(id int, projectId int, attribution string) error {
  105. session := d.engine.NewSession()
  106. defer session.Close()
  107. err := session.Begin()
  108. if err != nil {
  109. return errors.New("删除出错-db")
  110. }
  111. // 删除树结构中 目录和资源
  112. data := &models.CmTree{Isdelete: 1}
  113. _, err = session.
  114. Where("id=? or (project_id=? and attribution like ?) and isdelete=0", id, projectId, attribution+"%").
  115. Update(data)
  116. if err != nil {
  117. session.Rollback()
  118. return errors.New("删除目录出错")
  119. }
  120. // 获得已删除不是目录的资源
  121. datalist := make([]models.CmTree, 0)
  122. err = d.engine.
  123. Where("project_id=? and isdelete=1 and isfolder=0", projectId).
  124. Find(&datalist)
  125. // 删除标段
  126. if len(datalist) > 0 {
  127. idList := []string{}
  128. for _, bidData := range datalist {
  129. idList = append(idList, strconv.Itoa(bidData.Id))
  130. }
  131. inId := strings.Join(idList, ",")
  132. _, err = session.Exec("UPDATE cm_tender SET `isdelete` = 1 where id in (?)", inId)
  133. if err != nil {
  134. session.Rollback()
  135. return errors.New("删除标段出错")
  136. }
  137. }
  138. err = session.Commit()
  139. if err != nil {
  140. session.Rollback()
  141. return errors.New("删除出错-db")
  142. }
  143. return nil
  144. }
  145. // 移动目录
  146. func (d *TreeDao) Move(treeNode *models.CmTree, moveFolder *models.CmTree) error {
  147. session := d.engine.NewSession()
  148. defer session.Close()
  149. err := session.Begin()
  150. if err != nil {
  151. return errors.New("移动出错-db")
  152. }
  153. // 被移动跟目录-父亲节点转换
  154. data := &models.CmTree{ParentId: moveFolder.Id}
  155. _, err = session.
  156. Where("id=? and isdelete=0", treeNode.Id).
  157. Update(data)
  158. if err != nil {
  159. session.Rollback()
  160. return errors.New("移动目录出错")
  161. }
  162. // 移动目录的归属和标段的归属关系--TODO 效率问题在修改
  163. // 1-原来目录的归属
  164. attribution := fmt.Sprintf("%s%d-", treeNode.Attribution, treeNode.Serial)
  165. // 2-移动后目录的归属
  166. movrAttribution := fmt.Sprintf("%s%d-", moveFolder.Attribution, moveFolder.Serial)
  167. // 3-获得移动后最大序列号
  168. depth := moveFolder.Depth + 1
  169. datalist := d.GetALLDepthByAttribution(depth, moveFolder.ProjectId, movrAttribution)
  170. maxIndex := len(datalist)
  171. serial := 0
  172. if maxIndex != 0 {
  173. serial = datalist[maxIndex-1].Serial + 1
  174. }
  175. // 4-移动原目录货标段-最大序号
  176. _, err = session.Exec("UPDATE cm_tree SET `attribution` = ?,`serial` = ? where id = ? and isdelete=0", movrAttribution, serial, treeNode.Id)
  177. if err != nil {
  178. session.Rollback()
  179. return errors.New("移动目录或标段出错")
  180. }
  181. // 5-移动原目录下所有子目录和标段
  182. movrAttribution = fmt.Sprintf("%s%d-", movrAttribution, serial)
  183. _, err = session.Exec("UPDATE cm_tree SET `attribution` = replace(`attribution`, '"+attribution+"', '"+movrAttribution+"') where attribution like ? and isdelete=0", attribution+"%")
  184. //_, err = session.Exec("UPDATE from cm_tree SET `attribution` = replace(`attribution`, ?, ?) where attribution like ?", attribution,movrAttribution,attribution+"%")
  185. if err != nil {
  186. session.Rollback()
  187. return errors.New("移动目录或标段出错")
  188. }
  189. err = session.Commit()
  190. if err != nil {
  191. session.Rollback()
  192. return errors.New("移动出错-db")
  193. }
  194. return nil
  195. }
  196. // 获得项目文件夹
  197. func (d *TreeDao) GetAllTree(projectId int) []models.CmTree {
  198. datalist := make([]models.CmTree, 0)
  199. err := d.engine.
  200. Asc("id").
  201. Where("project_id=? and isdelete=0", projectId).
  202. Find(&datalist)
  203. if err != nil {
  204. return datalist
  205. } else {
  206. return datalist
  207. }
  208. }
  209. //创建
  210. func (d *TreeDao) Create(data *models.CmTree) error {
  211. _, err := d.engine.Insert(data)
  212. return err
  213. }
  214. // 更新
  215. func (d *TreeDao) Update(data *models.CmTree, columns []string) error {
  216. _, err := d.engine.Id(data.Id).MustCols(columns...).Update(data)
  217. return err
  218. }