edb_classify.go 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  1. package data
  2. import (
  3. "errors"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/cross_variety"
  7. "eta/eta_api/models/data_manage/excel"
  8. "eta/eta_api/models/system"
  9. "eta/eta_api/services/alarm_msg"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "strconv"
  13. "time"
  14. )
  15. func EdbClassifyListMakeTree(allNode []*data_manage.EdbClassifyItems, node *data_manage.EdbClassifyItems) {
  16. childs, _ := edbClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
  17. allEdbInfo, _ := GetEdbClassifyEdbInfo()
  18. if len(childs) > 0 {
  19. node.Children = append(node.Children, childs[0:]...) //添加子节点
  20. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  21. _, has := edbClassifyHaveChild(allNode, v)
  22. if has {
  23. EdbClassifyListMakeTree(allNode, v) //递归添加节点
  24. } else {
  25. edbInfoList := allEdbInfo[v.ClassifyId]
  26. v.Children = edbInfoList
  27. if v.Children == nil {
  28. childrenArr := make([]*data_manage.EdbClassifyItems, 0)
  29. v.Children = childrenArr
  30. }
  31. }
  32. }
  33. } else {
  34. childrenArr := make([]*data_manage.EdbClassifyItems, 0)
  35. node.Children = childrenArr
  36. }
  37. }
  38. func edbClassifyHaveChild(allNode []*data_manage.EdbClassifyItems, node *data_manage.EdbClassifyItems) (childs []*data_manage.EdbClassifyItems, yes bool) {
  39. for _, v := range allNode {
  40. if v.ParentId == node.ClassifyId {
  41. childs = append(childs, v)
  42. }
  43. }
  44. if len(childs) > 0 {
  45. yes = true
  46. }
  47. return
  48. }
  49. // GetClassifyTreeRecursive 递归获取分类树形结构
  50. func GetClassifyTreeRecursive(list []*data_manage.EdbClassifyItems, parentId int) []*data_manage.EdbClassifyItems {
  51. res := make([]*data_manage.EdbClassifyItems, 0)
  52. for _, v := range list {
  53. if v.ParentId == parentId {
  54. v.Children = GetClassifyTreeRecursive(list, v.ClassifyId)
  55. res = append(res, v)
  56. }
  57. }
  58. return res
  59. }
  60. func GetFullClassifyByClassifyId(targetClassifyId int) (targetList []*data_manage.EdbClassifyIdItems, err error, errMsg string) {
  61. //判断是否是挂在顶级目录下
  62. targetClassify, err := data_manage.GetEdbClassifyById(targetClassifyId)
  63. if err != nil {
  64. if err.Error() == utils.ErrNoRow() {
  65. errMsg = "当前分类不存在"
  66. err = errors.New(errMsg)
  67. return
  68. }
  69. errMsg = "获取失败"
  70. err = errors.New("获取分类信息失败,Err:" + err.Error())
  71. return
  72. }
  73. if targetClassify.ParentId == 0 {
  74. targetItem := new(data_manage.EdbClassifyIdItems)
  75. targetItem.ClassifyId = targetClassify.ClassifyId
  76. targetItem.ParentId = targetClassify.ParentId
  77. targetItem.RootId = targetClassify.RootId
  78. targetItem.UniqueCode = targetClassify.UniqueCode
  79. targetItem.Level = targetClassify.Level
  80. targetItem.ClassifyName = targetClassify.ClassifyName
  81. targetList = append(targetList, targetItem)
  82. return
  83. }
  84. tmpList, err := data_manage.GetEdbClassifyByRootIdLevel(targetClassify.RootId, targetClassify.ClassifyType, "")
  85. if err != nil && err.Error() != utils.ErrNoRow() {
  86. errMsg = "获取失败"
  87. err = errors.New("获取数据失败,Err:" + err.Error())
  88. return
  89. }
  90. idMap := make(map[int]struct{})
  91. if len(tmpList) > 0 {
  92. for _, v := range tmpList {
  93. if v.ClassifyId == targetClassify.ClassifyId {
  94. idMap[v.ClassifyId] = struct{}{}
  95. idMap[v.ParentId] = struct{}{}
  96. }
  97. }
  98. for _, v := range tmpList {
  99. if _, ok := idMap[v.ClassifyId]; ok {
  100. idMap[v.ParentId] = struct{}{}
  101. }
  102. }
  103. for _, v := range tmpList {
  104. if _, ok := idMap[v.ClassifyId]; ok {
  105. targetItem := new(data_manage.EdbClassifyIdItems)
  106. targetItem.ClassifyId = v.ClassifyId
  107. targetItem.ParentId = v.ParentId
  108. targetItem.RootId = v.RootId
  109. targetItem.UniqueCode = v.UniqueCode
  110. targetItem.Level = v.Level
  111. targetItem.ClassifyName = v.ClassifyName
  112. targetList = append(targetList, targetItem)
  113. }
  114. }
  115. }
  116. return
  117. }
  118. func GetChildClassifyByClassifyId(targetClassifyId int) (targetList []*data_manage.EdbClassifyIdItems, err error, errMsg string) {
  119. //判断是否是挂在顶级目录下
  120. targetClassify, err := data_manage.GetEdbClassifyById(targetClassifyId)
  121. if err != nil {
  122. if err.Error() == utils.ErrNoRow() {
  123. errMsg = "当前分类不存在"
  124. err = errors.New(errMsg)
  125. return
  126. }
  127. errMsg = "获取失败"
  128. err = errors.New("获取分类信息失败,Err:" + err.Error())
  129. return
  130. }
  131. orderStr := ` order by level asc, sort asc, classify_id asc`
  132. tmpList, err := data_manage.GetEdbClassifyByRootIdLevel(targetClassify.RootId, targetClassify.ClassifyType, orderStr)
  133. if err != nil && err.Error() != utils.ErrNoRow() {
  134. errMsg = "获取失败"
  135. err = errors.New("获取数据失败,Err:" + err.Error())
  136. return
  137. }
  138. idMap := make(map[int]struct{})
  139. if len(tmpList) > 0 {
  140. for _, v := range tmpList {
  141. if v.ClassifyId == targetClassify.ClassifyId {
  142. idMap[v.ClassifyId] = struct{}{}
  143. }
  144. }
  145. for _, v := range tmpList {
  146. if _, ok := idMap[v.ParentId]; ok {
  147. idMap[v.ClassifyId] = struct{}{}
  148. }
  149. }
  150. for _, v := range tmpList {
  151. if _, ok := idMap[v.ClassifyId]; ok {
  152. targetItem := new(data_manage.EdbClassifyIdItems)
  153. targetItem.ClassifyId = v.ClassifyId
  154. targetItem.ParentId = v.ParentId
  155. targetItem.RootId = v.RootId
  156. targetItem.UniqueCode = v.UniqueCode
  157. targetItem.Level = v.Level
  158. targetItem.ClassifyName = v.ClassifyName
  159. targetList = append(targetList, targetItem)
  160. }
  161. }
  162. }
  163. return
  164. }
  165. func GetEdbClassifyEdbInfo() (result map[int][]*data_manage.EdbClassifyItems, err error) {
  166. cMap := make(map[int][]*data_manage.EdbClassifyItems)
  167. items, err := data_manage.GetEdbInfoAll(0)
  168. if err != nil {
  169. return
  170. }
  171. for _, v := range items {
  172. childrenArr := make([]*data_manage.EdbClassifyItems, 0)
  173. v.Children = childrenArr
  174. if items, ok := cMap[v.ClassifyId]; ok {
  175. items = append(items, v)
  176. cMap[v.ClassifyId] = items
  177. } else {
  178. infoList := make([]*data_manage.EdbClassifyItems, 0)
  179. infoList = append(infoList, v)
  180. cMap[v.ClassifyId] = infoList
  181. }
  182. }
  183. result = cMap
  184. return
  185. }
  186. func EdbClassifyItemsMakeTree(allNode []*data_manage.EdbClassifyItems, node *data_manage.EdbClassifyItems) {
  187. childs, _ := edbClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
  188. if len(childs) > 0 {
  189. node.Children = append(node.Children, childs[0:]...) //添加子节点
  190. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  191. _, has := edbClassifyHaveChild(allNode, v)
  192. if has {
  193. EdbClassifyItemsMakeTree(allNode, v) //递归添加节点
  194. } else {
  195. childrenArr := make([]*data_manage.EdbClassifyItems, 0)
  196. v.Children = childrenArr
  197. }
  198. }
  199. } else {
  200. childrenArr := make([]*data_manage.EdbClassifyItems, 0)
  201. node.Children = childrenArr
  202. }
  203. }
  204. // GetEdbClassifyListByAdminId 根据账户类型获取分类id集合
  205. func GetEdbClassifyListByAdminId(adminId int64) (classifyIdList []string, err error) {
  206. list, err := models.GetEdbdataClassify(adminId)
  207. if err != nil {
  208. return
  209. }
  210. for _, parent := range list {
  211. if parent.Child != nil {
  212. for _, classify := range parent.Child {
  213. classifyIdList = append(classifyIdList, fmt.Sprint(classify.ClassifyId))
  214. }
  215. }
  216. }
  217. return
  218. }
  219. // GetEdbClassifyNameListByAdminId 根据账户类型获取分类名称集合
  220. func GetEdbClassifyNameListByAdminId(adminId int64) (classifyNameList []string, edbDataClassifyMap map[string]*models.EdbdataClassify, err error) {
  221. list, err := models.GetEdbdataClassify(adminId)
  222. edbDataClassifyMap = make(map[string]*models.EdbdataClassify)
  223. if err != nil {
  224. return
  225. }
  226. for _, parent := range list {
  227. if parent.Child != nil {
  228. for _, classify := range parent.Child {
  229. classifyNameList = append(classifyNameList, classify.ClassifyName)
  230. edbDataClassifyMap[classify.ClassifyName] = classify
  231. }
  232. }
  233. }
  234. return
  235. }
  236. // AddEdbClassify 添加指标分类
  237. func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8, sysUserId int, sysUserName string) (classifyInfo *data_manage.EdbClassify, err error, errMsg string) {
  238. count, err := data_manage.GetEdbClassifyCount(classifyName, parentId, classifyType)
  239. if err != nil {
  240. errMsg = `判断名称是否已存在失败`
  241. return
  242. }
  243. if count > 0 {
  244. errMsg = `分类名称已存在,请重新输入`
  245. return
  246. }
  247. if level > 6 {
  248. errMsg = `最高只支持添加6级分类`
  249. return
  250. }
  251. //获取该层级下最大的排序数
  252. maxSort, err := GetEdbClassifyMaxSort(parentId, classifyType)
  253. if err != nil {
  254. errMsg = "获取失败"
  255. err = errors.New("查询排序信息失败,Err:" + err.Error())
  256. return
  257. }
  258. //查询顶级rootId
  259. rootId := 0
  260. if parentId > 0 {
  261. parentClassify, tErr := data_manage.GetEdbClassifyById(parentId)
  262. if tErr != nil {
  263. if tErr.Error() == utils.ErrNoRow() {
  264. errMsg = "父级分类不存在"
  265. err = errors.New(errMsg)
  266. return
  267. }
  268. errMsg = "获取失败"
  269. err = errors.New("获取分类信息失败,Err:" + tErr.Error())
  270. return
  271. }
  272. rootId = parentClassify.RootId
  273. }
  274. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  275. classifyInfo = &data_manage.EdbClassify{
  276. //ClassifyId: 0,
  277. ClassifyType: classifyType,
  278. ClassifyName: classifyName,
  279. ParentId: parentId,
  280. RootId: rootId,
  281. HasData: 0,
  282. CreateTime: time.Now(),
  283. ModifyTime: time.Now(),
  284. SysUserId: sysUserId,
  285. SysUserRealName: sysUserName,
  286. Level: level + 1,
  287. UniqueCode: utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
  288. Sort: maxSort + 1,
  289. }
  290. newId, err := data_manage.AddEdbClassify(classifyInfo)
  291. if err != nil {
  292. errMsg = "保存分类失败"
  293. return
  294. }
  295. if parentId == 0 { //一级目录的rootId等于自己本身
  296. classifyInfo.ClassifyId = int(newId)
  297. classifyInfo.RootId = int(newId)
  298. err = classifyInfo.Update([]string{"RootId"})
  299. if err != nil {
  300. errMsg = "更新分类失败"
  301. return
  302. }
  303. }
  304. return
  305. }
  306. // EditEdbClassify 编辑指标分类
  307. func EditEdbClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
  308. item, err := data_manage.GetEdbClassifyById(classifyId)
  309. if err != nil {
  310. errMsg = `保存失败`
  311. return
  312. }
  313. // 权限校验
  314. {
  315. if item.ClassifyType == 0 { // 普通指标
  316. button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
  317. if !button.OpButton {
  318. errMsg = "无操作权限"
  319. err = errors.New(errMsg)
  320. return
  321. }
  322. } else if item.ClassifyType == 1 { // 预测指标
  323. button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
  324. if !button.OpButton {
  325. errMsg = "无操作权限"
  326. err = errors.New(errMsg)
  327. return
  328. }
  329. }
  330. }
  331. // 名字相同,那么就直接返回
  332. if item.ClassifyName == classifyName {
  333. return
  334. }
  335. // 判断名称是否已存在
  336. count, err := data_manage.GetEdbClassifyCount(classifyName, item.ParentId, item.ClassifyType)
  337. if err != nil {
  338. errMsg = "判断名称是否已存在失败"
  339. return
  340. }
  341. if count > 0 {
  342. errMsg = "分类名称已存在,请重新输入"
  343. return
  344. }
  345. // 修改数据
  346. err = data_manage.EditEdbClassify(classifyId, classifyName, sysUser.AdminId, sysUser.RealName)
  347. if err != nil {
  348. errMsg = "保存失败"
  349. }
  350. return
  351. }
  352. // DeleteCheck 删除检测
  353. func DeleteCheck(classifyId, edbInfoId int, sysUser *system.Admin) (deleteStatus int, tipsMsg string, err error, errMsg string) {
  354. //删除分类
  355. if classifyId > 0 && edbInfoId == 0 {
  356. // 查找分类
  357. item, tmpErr := data_manage.GetEdbClassifyById(classifyId)
  358. if tmpErr != nil {
  359. errMsg = `查找分类失败`
  360. err = tmpErr
  361. return
  362. }
  363. // 权限校验
  364. {
  365. if item.ClassifyType == 0 { // 普通指标
  366. button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
  367. if !button.DeleteButton {
  368. errMsg = "无操作权限"
  369. err = errors.New(errMsg)
  370. return
  371. }
  372. } else if item.ClassifyType == 1 { // 预测指标
  373. button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
  374. if !button.DeleteButton {
  375. errMsg = "无操作权限"
  376. err = errors.New(errMsg)
  377. return
  378. }
  379. }
  380. }
  381. //判断分类下,是否含有指标
  382. count, tmpErr := data_manage.GetEdbInfoCountByClassifyId(classifyId)
  383. if tmpErr != nil {
  384. errMsg = "删除失败"
  385. err = errors.New("分类下是否含有指标失败,Err:" + tmpErr.Error())
  386. return
  387. }
  388. if count > 0 {
  389. deleteStatus = 1
  390. tipsMsg = "若目录关联指标不可删除"
  391. }
  392. }
  393. if deleteStatus != 1 && edbInfoId == 0 {
  394. classifyCount, tmpErr := data_manage.GetClassifyCountByClassifyId(classifyId)
  395. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  396. errMsg = "删除失败"
  397. err = errors.New("分类下是否含有指标失败,Err:" + tmpErr.Error())
  398. return
  399. }
  400. if classifyCount > 0 {
  401. deleteStatus = 2
  402. tipsMsg = "确认删除当前目录及包含的子目录吗"
  403. }
  404. }
  405. //删除指标
  406. if edbInfoId > 0 {
  407. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  408. if tmpErr != nil {
  409. if tmpErr.Error() == utils.ErrNoRow() {
  410. errMsg = "指标已删除,请刷新页面"
  411. err = errors.New("指标不存在,Err:" + tmpErr.Error())
  412. return
  413. } else {
  414. errMsg = "删除失败"
  415. err = errors.New("删除失败,获取指标信息失败,Err:" + tmpErr.Error())
  416. return
  417. }
  418. }
  419. if edbInfo == nil {
  420. errMsg = "指标已删除,请刷新页面"
  421. return
  422. }
  423. //判断指标是否用于作图,如果用于作图,则不可删除
  424. chartCount, tmpErr := data_manage.GetChartEdbMappingCount(edbInfoId)
  425. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  426. errMsg = "删除失败"
  427. err = errors.New("判断指标是否被用于作图失败,Err:" + tmpErr.Error())
  428. return
  429. }
  430. if chartCount > 0 {
  431. deleteStatus = 3
  432. tipsMsg = "当前指标已用作画图,不可删除"
  433. return
  434. }
  435. //判断指标是否用于计算
  436. {
  437. calculateCount, tmpErr := data_manage.GetEdbInfoCalculateMappingCount(edbInfoId)
  438. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  439. errMsg = "删除失败"
  440. err = errors.New("判断指标是否被用于计算失败,GetEdbInfoCalculateCount Err:" + tmpErr.Error())
  441. return
  442. }
  443. if calculateCount > 0 {
  444. deleteStatus = 4
  445. tipsMsg = "当前指标已用作,指标运算,不可删除"
  446. return
  447. }
  448. }
  449. //如果是普通指标,那么还需要判断是否被预测指标作为源指标
  450. if edbInfo.EdbInfoType == 0 {
  451. predictEdbInfoCount, tmpErr := data_manage.GetPredictEdbConfCount(edbInfoId)
  452. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  453. errMsg = "删除失败"
  454. err = errors.New("判断指标是否被用于预测指标失败,Err:" + tmpErr.Error())
  455. return
  456. }
  457. if predictEdbInfoCount > 0 {
  458. deleteStatus = 3
  459. tipsMsg = "当前指标已用作预测指标,不可删除"
  460. return
  461. }
  462. }
  463. // 判断指标是否用作表格引用
  464. {
  465. calculateCount, tmpErr := excel.GetNoCustomAnalysisExcelEdbMappingCount(edbInfoId)
  466. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  467. errMsg = "删除失败"
  468. err = errors.New("判断指标是否用作表格引用,GetNoCustomAnalysisExcelEdbMappingCount Err:" + tmpErr.Error())
  469. return
  470. }
  471. if calculateCount > 0 {
  472. deleteStatus = 3
  473. tipsMsg = "当前指标已添加到表格,不可删除"
  474. return
  475. }
  476. }
  477. // 判断指标是否用作跨品种图表使用
  478. {
  479. calculateCount, tmpErr := cross_variety.GetCountByEdbInfoId(edbInfoId)
  480. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  481. errMsg = "删除失败"
  482. err = errors.New("判断指标是否用作跨品种图表使用,GetCountByEdbInfoId Err:" + tmpErr.Error())
  483. return
  484. }
  485. if calculateCount > 0 {
  486. deleteStatus = 3
  487. tipsMsg = "当前指标已添加到跨品种分析,不可删除"
  488. return
  489. }
  490. }
  491. }
  492. return
  493. }
  494. // Delete 删除分类/指标
  495. func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, requestUrl string) (nextItem *data_manage.EdbInfo, err error, errMsg string) {
  496. //删除分类
  497. if classifyId > 0 && edbInfoId == 0 {
  498. // 查找分类
  499. item, tmpErr := data_manage.GetEdbClassifyById(classifyId)
  500. if tmpErr != nil {
  501. errMsg = `查找分类失败`
  502. err = tmpErr
  503. return
  504. }
  505. // 权限校验
  506. {
  507. if item.ClassifyType == 0 { // 普通指标
  508. button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
  509. if !button.DeleteButton {
  510. errMsg = "无操作权限"
  511. err = errors.New(errMsg)
  512. return
  513. }
  514. } else if item.ClassifyType == 1 { // 预测指标
  515. button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
  516. if !button.DeleteButton {
  517. errMsg = "无操作权限"
  518. err = errors.New(errMsg)
  519. return
  520. }
  521. }
  522. }
  523. //判断是否含有指标
  524. count, tmpErr := data_manage.GetEdbInfoCountByClassifyId(classifyId)
  525. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  526. errMsg = "删除失败"
  527. err = errors.New("分类下是否含有指标失败,Err:" + tmpErr.Error())
  528. return
  529. }
  530. if count > 0 {
  531. errMsg = "该目录下存在关联指标,不可删除"
  532. return
  533. }
  534. tmpErr = data_manage.DeleteEdbClassify(classifyId)
  535. if tmpErr != nil {
  536. errMsg = "删除失败"
  537. err = errors.New("删除失败,Err:" + tmpErr.Error())
  538. return
  539. }
  540. }
  541. //删除指标
  542. if edbInfoId > 0 {
  543. edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
  544. if tmpErr != nil {
  545. if tmpErr.Error() == utils.ErrNoRow() {
  546. errMsg = "指标已删除,请刷新页面"
  547. err = errors.New("指标不存在,Err:" + tmpErr.Error())
  548. return
  549. } else {
  550. errMsg = "删除失败"
  551. err = errors.New("删除失败,获取指标信息失败,Err:" + tmpErr.Error())
  552. return
  553. }
  554. }
  555. if edbInfo == nil {
  556. errMsg = "指标已删除,请刷新页面"
  557. return
  558. }
  559. //判断指标是否用于作图,如果用于作图,则不可删除
  560. chartCount, tmpErr := data_manage.GetChartEdbMappingCount(edbInfoId)
  561. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  562. errMsg = "删除失败"
  563. err = errors.New("判断指标是否被用于作图失败,Err:" + tmpErr.Error())
  564. return
  565. }
  566. if chartCount > 0 {
  567. errMsg = "当前指标已用作画图,不可删除"
  568. return
  569. }
  570. //如果是普通指标,那么还需要判断是否被预测指标作为源指标
  571. if edbInfo.EdbInfoType == 0 {
  572. predictEdbInfoCount, tmpErr := data_manage.GetPredictEdbConfCount(edbInfoId)
  573. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  574. errMsg = "删除失败"
  575. err = errors.New("判断指标是否被用于预测指标失败,Err:" + tmpErr.Error())
  576. return
  577. }
  578. if predictEdbInfoCount > 0 {
  579. errMsg = "当前指标已用作预测指标,不可删除"
  580. return
  581. }
  582. }
  583. //判断指标是否用作其他指标的计算
  584. {
  585. calculateCount, tmpErr := data_manage.GetEdbInfoCalculateMappingCount(edbInfoId)
  586. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  587. errMsg = "删除失败"
  588. err = errors.New("判断指标是否被用于计算失败,GetEdbInfoCalculateCount Err:" + tmpErr.Error())
  589. return
  590. }
  591. if calculateCount > 0 {
  592. errMsg = "当前指标已用作,指标运算,不可删除"
  593. return
  594. }
  595. }
  596. // 判断指标是否用作表格引用
  597. {
  598. calculateCount, tmpErr := excel.GetNoCustomAnalysisExcelEdbMappingCount(edbInfoId)
  599. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  600. errMsg = "删除失败"
  601. err = errors.New("判断指标是否用作表格引用,GetNoCustomAnalysisExcelEdbMappingCount Err:" + tmpErr.Error())
  602. return
  603. }
  604. if calculateCount > 0 {
  605. errMsg = "当前指标已添加到表格,不可删除"
  606. return
  607. }
  608. }
  609. // 判断指标是否用作跨品种图表使用
  610. {
  611. calculateCount, tmpErr := cross_variety.GetCountByEdbInfoId(edbInfoId)
  612. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  613. errMsg = "删除失败"
  614. err = errors.New("判断指标是否用作跨品种图表使用,GetCountByEdbInfoId Err:" + tmpErr.Error())
  615. return
  616. }
  617. if calculateCount > 0 {
  618. errMsg = "当前指标已添加到跨品种分析,不可删除"
  619. return
  620. }
  621. }
  622. //真实删除
  623. tmpErr = data_manage.DeleteEdbInfoAndData(edbInfo.EdbInfoId, edbInfo.Source)
  624. if tmpErr != nil {
  625. errMsg = "删除失败"
  626. err = errors.New("删除失败,Err:" + tmpErr.Error())
  627. return
  628. }
  629. // 如果删除的指标是自定义分析的来源,那么还需要删除指标与excel的关系
  630. if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_ZDYFX {
  631. tmpErr = excel.DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
  632. if tmpErr != nil {
  633. alarm_msg.SendAlarmMsg(fmt.Sprintf("删除指标时,需要删除与自定义分析的关系失败,指标ID:%d,Err:%s", edbInfo.EdbInfoId, tmpErr.Error()), 3)
  634. }
  635. }
  636. // 返回下一个表格的信息
  637. {
  638. var condition string
  639. var pars []interface{}
  640. condition += " AND edb_info_type=? AND classify_id=? "
  641. pars = append(pars, edbInfo.EdbInfoType, edbInfo.ClassifyId)
  642. condition += " AND (sort>? OR (sort=? AND edb_info_id<?) ) "
  643. pars = append(pars, edbInfo.Sort, edbInfo.Sort, edbInfo.EdbInfoId)
  644. nextItem, tmpErr = data_manage.GetNextEdbInfoByCondition(condition, pars)
  645. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  646. errMsg = "删除失败"
  647. err = errors.New("获取下一级预测指标信息失败,Err:" + tmpErr.Error())
  648. return
  649. }
  650. // 如果没找到,那么查找下一个分类的第一个表格
  651. if nextItem == nil {
  652. currClassifyInfo, tmpErr := data_manage.GetEdbClassifyById(edbInfo.ClassifyId)
  653. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  654. errMsg = "删除失败"
  655. err = errors.New("获取当前预测指标分类信息失败,Err:" + tmpErr.Error())
  656. return
  657. }
  658. nextItem, err = data_manage.GetNextEdbInfo(edbInfo.ClassifyId, currClassifyInfo.Sort, int(currClassifyInfo.ClassifyType), edbInfo.EdbInfoType)
  659. if err != nil && err.Error() != utils.ErrNoRow() {
  660. errMsg = "删除失败"
  661. err = errors.New("获取下一级预测指标信息失败,Err:" + tmpErr.Error())
  662. return
  663. }
  664. }
  665. }
  666. //新增操作日志
  667. {
  668. edbLog := new(data_manage.EdbInfoLog)
  669. edbLog.EdbInfoId = edbInfo.EdbInfoId
  670. edbLog.SourceName = edbInfo.SourceName
  671. edbLog.Source = edbInfo.Source
  672. edbLog.EdbCode = edbInfo.EdbCode
  673. edbLog.EdbName = edbInfo.EdbName
  674. edbLog.ClassifyId = edbInfo.ClassifyId
  675. edbLog.SysUserId = sysUser.AdminId
  676. edbLog.SysUserRealName = sysUser.RealName
  677. edbLog.CreateTime = time.Now()
  678. edbLog.Content = requestBody
  679. edbLog.Status = "删除指标"
  680. edbLog.Method = requestUrl
  681. go data_manage.AddEdbInfoLog(edbLog)
  682. }
  683. // 删除es中的数据
  684. DeleteEdbInfoToEs(edbInfoId)
  685. }
  686. return
  687. }
  688. // MoveEdbClassify 移动指标分类
  689. func MoveEdbClassify(req data_manage.MoveEdbClassifyReq, sysUser *system.Admin, classifyType uint8) (err error, errMsg string) {
  690. // req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId
  691. classifyId := req.ClassifyId
  692. parentClassifyId := req.ParentClassifyId
  693. prevClassifyId := req.PrevClassifyId
  694. nextClassifyId := req.NextClassifyId
  695. edbInfoId := req.EdbInfoId
  696. prevEdbInfoId := req.PrevEdbInfoId
  697. nextEdbInfoId := req.NextEdbInfoId
  698. //首先确定移动的对象是分类还是指标
  699. //判断上一个节点是分类还是指标
  700. //判断下一个节点是分类还是指标
  701. //同时更新分类目录下的分类sort和指标sort
  702. //更新当前移动的分类或者指标sort
  703. var parentEdbClassifyInfo *data_manage.EdbClassify
  704. if parentClassifyId > 0 {
  705. parentEdbClassifyInfo, err = data_manage.GetEdbClassifyById(parentClassifyId)
  706. if err != nil {
  707. errMsg = "移动失败"
  708. err = errors.New("获取上级分类信息失败,Err:" + err.Error())
  709. return
  710. }
  711. }
  712. //如果有传入 上一个兄弟节点分类id
  713. var (
  714. edbClassifyInfo *data_manage.EdbClassify
  715. prevClassify *data_manage.EdbClassify
  716. nextClassify *data_manage.EdbClassify
  717. edbInfo *data_manage.EdbInfo
  718. prevEdbInfo *data_manage.EdbInfo
  719. nextEdbInfo *data_manage.EdbInfo
  720. prevSort int
  721. nextSort int
  722. )
  723. // 移动对象为分类, 判断权限
  724. if edbInfoId == 0 {
  725. edbClassifyInfo, err = data_manage.GetEdbClassifyById(classifyId)
  726. if err != nil {
  727. if err.Error() == utils.ErrNoRow() {
  728. errMsg = "当前分类不存在"
  729. err = errors.New("获取分类信息失败,Err:" + err.Error())
  730. return
  731. }
  732. errMsg = "移动失败"
  733. err = errors.New("获取分类信息失败,Err:" + err.Error())
  734. return
  735. }
  736. if parentClassifyId > 0 && parentEdbClassifyInfo.Level == 6 {
  737. errMsg = "最高只支持添加6级分类"
  738. err = errors.New(errMsg)
  739. return
  740. }
  741. // 权限校验
  742. {
  743. if edbClassifyInfo.ClassifyType == 0 { // 普通指标
  744. button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
  745. if !button.MoveButton {
  746. errMsg = "无操作权限"
  747. err = errors.New(errMsg)
  748. return
  749. }
  750. } else if edbClassifyInfo.ClassifyType == 1 { // 预测指标
  751. button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
  752. if !button.MoveButton {
  753. errMsg = "无操作权限"
  754. err = errors.New(errMsg)
  755. return
  756. }
  757. }
  758. }
  759. } else {
  760. edbInfo, err = data_manage.GetEdbInfoById(req.EdbInfoId)
  761. if err != nil {
  762. if err.Error() == utils.ErrNoRow() {
  763. errMsg = "当前指标不存在"
  764. err = errors.New("获取分类信息失败,Err:" + err.Error())
  765. return
  766. }
  767. errMsg = "移动失败"
  768. err = errors.New("获取分类信息失败,Err:" + err.Error())
  769. return
  770. }
  771. if parentClassifyId == 0 {
  772. errMsg = "移动失败,指标必须挂在分类下"
  773. err = errors.New(errMsg)
  774. return
  775. }
  776. // 移动权限校验
  777. button := GetEdbOpButton(sysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
  778. if !button.MoveButton {
  779. errMsg = "无操作权限"
  780. err = errors.New(errMsg)
  781. return
  782. }
  783. }
  784. if prevClassifyId > 0 {
  785. prevClassify, err = data_manage.GetEdbClassifyById(prevClassifyId)
  786. if err != nil {
  787. errMsg = "移动失败"
  788. err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  789. return
  790. }
  791. prevSort = prevClassify.Sort
  792. } else if prevEdbInfoId > 0 {
  793. prevEdbInfo, err = data_manage.GetEdbInfoById(prevEdbInfoId)
  794. if err != nil {
  795. errMsg = "移动失败"
  796. err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  797. return
  798. }
  799. prevSort = prevEdbInfo.Sort
  800. }
  801. if nextClassifyId > 0 {
  802. //下一个兄弟节点
  803. nextClassify, err = data_manage.GetEdbClassifyById(nextClassifyId)
  804. if err != nil {
  805. errMsg = "移动失败"
  806. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  807. return
  808. }
  809. nextSort = nextClassify.Sort
  810. } else if nextEdbInfoId > 0 {
  811. //下一个兄弟节点
  812. nextEdbInfo, err = data_manage.GetEdbInfoById(nextEdbInfoId)
  813. if err != nil {
  814. errMsg = "移动失败"
  815. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  816. return
  817. }
  818. nextSort = nextEdbInfo.Sort
  819. }
  820. err, errMsg = moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify, edbInfo, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
  821. return
  822. }
  823. // moveEdbClassify 移动指标分类
  824. func moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify *data_manage.EdbClassify, edbInfo, prevEdbInfo, nextEdbInfo *data_manage.EdbInfo, parentClassifyId int, prevSort, nextSort int, classifyType uint8) (err error, errMsg string) {
  825. updateCol := make([]string, 0)
  826. // 移动对象为分类, 判断分类是否存在
  827. if edbClassifyInfo != nil {
  828. oldParentId := edbClassifyInfo.ParentId
  829. oldLevel := edbClassifyInfo.Level
  830. var classifyIds []int
  831. if oldParentId != parentClassifyId {
  832. //更新子分类对应的level
  833. childList, e, m := GetChildClassifyByClassifyId(edbClassifyInfo.ClassifyId)
  834. if e != nil {
  835. errMsg = "移动失败"
  836. err = errors.New("查询子分类失败,Err:" + e.Error() + m)
  837. return
  838. }
  839. if len(childList) > 0 {
  840. for _, v := range childList {
  841. if v.ClassifyId == edbClassifyInfo.ClassifyId {
  842. continue
  843. }
  844. classifyIds = append(classifyIds, v.ClassifyId)
  845. }
  846. }
  847. }
  848. //判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
  849. if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
  850. edbClassifyInfo.ParentId = parentEdbClassifyInfo.ClassifyId
  851. edbClassifyInfo.RootId = parentEdbClassifyInfo.RootId
  852. edbClassifyInfo.Level = parentEdbClassifyInfo.Level + 1
  853. edbClassifyInfo.ModifyTime = time.Now()
  854. updateCol = append(updateCol, "ParentId", "RootId", "Level", "ModifyTime")
  855. } else if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId == 0 {
  856. edbClassifyInfo.ParentId = 0
  857. edbClassifyInfo.RootId = edbClassifyInfo.ClassifyId
  858. edbClassifyInfo.Level = 1
  859. edbClassifyInfo.ModifyTime = time.Now()
  860. updateCol = append(updateCol, "ParentId", "RootId", "Level", "ModifyTime")
  861. }
  862. if prevSort > 0 {
  863. //如果是移动在两个兄弟节点之间
  864. if nextSort > 0 {
  865. //下一个兄弟节点
  866. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  867. if prevSort == nextSort || prevSort == edbClassifyInfo.Sort {
  868. //变更兄弟节点的排序
  869. updateSortStr := `sort + 2`
  870. //变更分类
  871. if prevClassify != nil {
  872. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
  873. } else {
  874. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  875. }
  876. //变更指标
  877. if prevEdbInfo != nil {
  878. //变更兄弟节点的排序
  879. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  880. } else {
  881. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  882. }
  883. } else {
  884. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  885. if nextSort-prevSort == 1 {
  886. //变更兄弟节点的排序
  887. updateSortStr := `sort + 1`
  888. //变更分类
  889. if prevClassify != nil {
  890. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
  891. } else {
  892. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  893. }
  894. //变更指标
  895. if prevEdbInfo != nil {
  896. //变更兄弟节点的排序
  897. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  898. } else {
  899. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  900. }
  901. }
  902. }
  903. }
  904. edbClassifyInfo.Sort = prevSort + 1
  905. edbClassifyInfo.ModifyTime = time.Now()
  906. updateCol = append(updateCol, "Sort", "ModifyTime")
  907. } else if prevClassify == nil && nextClassify == nil && prevEdbInfo == nil && nextEdbInfo == nil && parentClassifyId > 0 {
  908. //处理只拖动到目录里,默认放到目录底部的情况
  909. var maxSort int
  910. maxSort, err = GetEdbClassifyMaxSort(parentClassifyId, classifyType)
  911. if err != nil {
  912. errMsg = "移动失败"
  913. err = errors.New("查询组内排序信息失败,Err:" + err.Error())
  914. return
  915. }
  916. edbClassifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  917. edbClassifyInfo.ModifyTime = time.Now()
  918. updateCol = append(updateCol, "Sort", "ModifyTime")
  919. } else {
  920. // 拖动到父级分类的第一位
  921. firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
  922. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  923. errMsg = "移动失败"
  924. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  925. return
  926. }
  927. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  928. if firstClassify != nil && firstClassify.Sort == 0 {
  929. updateSortStr := ` sort + 1 `
  930. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
  931. //该分类下的所有指标也需要+1
  932. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
  933. } else {
  934. //如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
  935. firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
  936. if tErr != nil && tErr.Error() != utils.ErrNoRow() {
  937. errMsg = "移动失败"
  938. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
  939. return
  940. }
  941. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  942. if firstEdb != nil && firstEdb.Sort == 0 {
  943. updateSortStr := ` sort + 1 `
  944. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, firstEdb.EdbInfoId-1, updateSortStr)
  945. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, classifyType)
  946. }
  947. }
  948. edbClassifyInfo.Sort = 0 //那就是排在第一位
  949. edbClassifyInfo.ModifyTime = time.Now()
  950. updateCol = append(updateCol, "Sort", "ModifyTime")
  951. }
  952. //更新
  953. if len(updateCol) > 0 {
  954. err = edbClassifyInfo.Update(updateCol)
  955. if err != nil {
  956. errMsg = "移动失败"
  957. err = errors.New("修改失败,Err:" + err.Error())
  958. return
  959. }
  960. //更新对应分类的root_id和层级
  961. if oldParentId != parentClassifyId {
  962. if len(classifyIds) > 0 {
  963. levelStep := edbClassifyInfo.Level - oldLevel
  964. err = data_manage.UpdateEdbClassifyChildByParentClassifyId(classifyIds, edbClassifyInfo.RootId, levelStep)
  965. if err != nil {
  966. errMsg = "移动失败"
  967. err = errors.New("更新子分类失败,Err:" + err.Error())
  968. return
  969. }
  970. }
  971. }
  972. }
  973. } else {
  974. if edbInfo == nil {
  975. errMsg = "当前指标不存在"
  976. err = errors.New(errMsg)
  977. return
  978. }
  979. //如果改变了分类,那么移动该指标数据
  980. if edbInfo.ClassifyId != parentClassifyId {
  981. edbInfo.ClassifyId = parentClassifyId
  982. edbInfo.ModifyTime = time.Now()
  983. updateCol = append(updateCol, "ClassifyId", "ModifyTime")
  984. }
  985. if prevSort > 0 {
  986. //如果是移动在两个兄弟节点之间
  987. if nextSort > 0 {
  988. //下一个兄弟节点
  989. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  990. if prevSort == nextSort || prevSort == edbInfo.Sort {
  991. //变更兄弟节点的排序
  992. updateSortStr := `sort + 2`
  993. //变更分类
  994. if prevClassify != nil {
  995. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
  996. } else {
  997. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  998. }
  999. //变更指标
  1000. if prevEdbInfo != nil {
  1001. //变更兄弟节点的排序
  1002. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  1003. } else {
  1004. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  1005. }
  1006. } else {
  1007. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  1008. if nextSort-prevSort == 1 {
  1009. //变更兄弟节点的排序
  1010. updateSortStr := `sort + 1`
  1011. //变更分类
  1012. if prevClassify != nil {
  1013. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
  1014. } else {
  1015. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  1016. }
  1017. //变更指标
  1018. if prevEdbInfo != nil {
  1019. //变更兄弟节点的排序
  1020. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  1021. } else {
  1022. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  1023. }
  1024. }
  1025. }
  1026. }
  1027. edbInfo.Sort = prevSort + 1
  1028. edbInfo.ModifyTime = time.Now()
  1029. updateCol = append(updateCol, "Sort", "ModifyTime")
  1030. } else if prevClassify == nil && nextClassify == nil && prevEdbInfo == nil && nextEdbInfo == nil && parentClassifyId > 0 {
  1031. //处理只拖动到目录里,默认放到目录底部的情况
  1032. var maxSort int
  1033. maxSort, err = GetEdbClassifyMaxSort(parentClassifyId, classifyType)
  1034. if err != nil {
  1035. errMsg = "移动失败"
  1036. err = errors.New("查询组内排序信息失败,Err:" + err.Error())
  1037. return
  1038. }
  1039. edbInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  1040. edbInfo.ModifyTime = time.Now()
  1041. updateCol = append(updateCol, "Sort", "ModifyTime")
  1042. } else {
  1043. // 拖动到父级分类的第一位
  1044. firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
  1045. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  1046. errMsg = "移动失败"
  1047. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  1048. return
  1049. }
  1050. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  1051. if firstClassify != nil && firstClassify.Sort == 0 {
  1052. updateSortStr := ` sort + 1 `
  1053. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
  1054. //该分类下的所有指标也需要+1
  1055. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
  1056. } else {
  1057. //如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
  1058. firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
  1059. if tErr != nil && tErr.Error() != utils.ErrNoRow() {
  1060. errMsg = "移动失败"
  1061. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
  1062. return
  1063. }
  1064. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  1065. if firstEdb != nil && firstEdb.Sort == 0 {
  1066. updateSortStr := ` sort + 1 `
  1067. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, firstEdb.EdbInfoId-1, updateSortStr)
  1068. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, classifyType)
  1069. }
  1070. }
  1071. edbInfo.Sort = 0 //那就是排在第一位
  1072. edbInfo.ModifyTime = time.Now()
  1073. updateCol = append(updateCol, "Sort", "ModifyTime")
  1074. }
  1075. //更新
  1076. if len(updateCol) > 0 {
  1077. err = edbInfo.Update(updateCol)
  1078. if err != nil {
  1079. errMsg = "移动失败"
  1080. err = errors.New("修改失败,Err:" + err.Error())
  1081. return
  1082. }
  1083. }
  1084. }
  1085. return
  1086. }
  1087. // GetEdbOpButton 获取ETA指标的操作权限
  1088. func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType int) (button data_manage.EdbClassifyItemsButton) {
  1089. //2、用户对于自己添加的分类,有权限编辑、移动和删除该分类;
  1090. //3、ficc管理员和超管对所有分类有编辑、移动和删除权限;
  1091. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.EdbPermission == 1 {
  1092. button.AddButton = true
  1093. button.OpButton = true
  1094. button.DeleteButton = true
  1095. button.MoveButton = true
  1096. // ETA指标的基础指标才允许插入值
  1097. if edbInfoType == 0 && edbType == 1 {
  1098. button.InsertNewDataButton = true
  1099. }
  1100. }
  1101. button.ShowEdbRelation = true
  1102. button.ShowChartRelation = true
  1103. return
  1104. }
  1105. // GetEdbClassifyOpButton 获取ETA指标分类的操作权限
  1106. func GetEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
  1107. //ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
  1108. //if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
  1109. button.AddButton = true
  1110. button.OpButton = true
  1111. button.DeleteButton = true
  1112. button.MoveButton = true
  1113. //}
  1114. return
  1115. }
  1116. // GetPredictEdbOpButton 获取ETA预测指标的操作权限
  1117. func GetPredictEdbOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
  1118. //预测指标的添加人对该预测指标有全部操作权限,ficc管理员、超管对所有预测指标有全部操作权限;
  1119. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.PredictEdbPermission == 1 {
  1120. button.AddButton = true
  1121. button.OpButton = true
  1122. button.DeleteButton = true
  1123. button.MoveButton = true
  1124. }
  1125. button.ShowEdbRelation = true
  1126. button.ShowChartRelation = true
  1127. return
  1128. }
  1129. // GetPredictEdbClassifyOpButton 获取ETA预测指标分类的操作权限
  1130. func GetPredictEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
  1131. //ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
  1132. //if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
  1133. button.AddButton = true
  1134. button.OpButton = true
  1135. button.DeleteButton = true
  1136. button.MoveButton = true
  1137. //}
  1138. return
  1139. }
  1140. func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (maxSort int, err error) {
  1141. //获取该层级下最大的排序数
  1142. classifyMaxSort, err := data_manage.GetEdbClassifyMaxSort(parentId, classifyType)
  1143. if err != nil {
  1144. return
  1145. }
  1146. maxSort = classifyMaxSort
  1147. edbMaxSort, err := data_manage.GetEdbInfoMaxSortByClassifyId(parentId)
  1148. if err != nil {
  1149. return
  1150. }
  1151. if maxSort < edbMaxSort {
  1152. maxSort = edbMaxSort
  1153. }
  1154. return
  1155. }