sandbox.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. package sandbox
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/company"
  6. "eta/eta_api/models/sandbox"
  7. "eta/eta_api/models/sandbox/request"
  8. "eta/eta_api/models/system"
  9. "eta/eta_api/utils"
  10. "fmt"
  11. "strconv"
  12. "time"
  13. )
  14. // AddSandbox 新增沙盘
  15. //func AddSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string, ignoreVariety bool) (resp *sandbox.SandboxSaveResp, err error) {
  16. // resp = new(sandbox.SandboxSaveResp)
  17. // // 获取产品权限详情
  18. // var permissionName string
  19. // if !ignoreVariety {
  20. // chartPermissionInfo, e := company.GetChartPermissionListById(req.ChartPermissionId)
  21. // if e != nil {
  22. // err = e
  23. // return
  24. // }
  25. // permissionName = chartPermissionInfo.PermissionName
  26. // }
  27. // //沙盘主表信息
  28. // sandboxInfo := &sandbox.Sandbox{
  29. // Name: utils.TrimStr(req.Name),
  30. // ChartPermissionId: req.ChartPermissionId,
  31. // ChartPermissionName: permissionName,
  32. // CurrVersion: 1,
  33. // Code: GenerateCode(),
  34. // Content: req.Content,
  35. // PicUrl: utils.TrimStr(req.PicUrl),
  36. // OpUserId: opUserId,
  37. // OpUserName: opUserName,
  38. // IsDelete: 0,
  39. // ModifyTime: time.Now(),
  40. // CreateTime: time.Now(),
  41. // }
  42. // //沙盘版本表信息
  43. // sandboxVersionInfo := &sandbox.SandboxVersion{
  44. // Name: sandboxInfo.Name,
  45. // ChartPermissionId: sandboxInfo.ChartPermissionId,
  46. // ChartPermissionName: sandboxInfo.ChartPermissionName,
  47. // CurrVersion: sandboxInfo.CurrVersion,
  48. // Content: sandboxInfo.Content,
  49. // PicUrl: sandboxInfo.PicUrl,
  50. // OpUserId: sandboxInfo.OpUserId,
  51. // OpUserName: sandboxInfo.OpUserName,
  52. // VersionCode: GenerateVersionCode(sandboxInfo.SandboxId, sandboxInfo.CurrVersion),
  53. // IsDelete: sandboxInfo.IsDelete,
  54. // CreateTime: sandboxInfo.CreateTime,
  55. // }
  56. // //沙盘草稿表信息
  57. // sandboxDraftInfo := &sandbox.SandboxDraft{
  58. // Name: sandboxInfo.Name,
  59. // ChartPermissionId: sandboxInfo.ChartPermissionId,
  60. // ChartPermissionName: sandboxInfo.ChartPermissionName,
  61. // CurrVersion: sandboxInfo.CurrVersion,
  62. // Content: sandboxInfo.Content,
  63. // OpUserId: sandboxInfo.OpUserId,
  64. // OpUserName: sandboxInfo.OpUserName,
  65. // CreateTime: sandboxInfo.CreateTime,
  66. // }
  67. //
  68. // //新增沙盘
  69. // err = sandbox.AddNewSandbox(sandboxInfo, sandboxVersionInfo, sandboxDraftInfo)
  70. // if err != nil {
  71. // return
  72. // }
  73. // resp.Sandbox = sandboxInfo
  74. // resp.VersionCode = sandboxVersionInfo.VersionCode
  75. // return
  76. //}
  77. // UpdateSandbox 更新沙盘
  78. //func UpdateSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string, ignoreVariety bool) (resp *sandbox.SandboxSaveResp, err error, errMsg string) {
  79. // resp = new(sandbox.SandboxSaveResp)
  80. // // 获取沙盘版本信息
  81. // sandboxVersion, err := sandbox.GetSandboxVersionBySandboxVersionCode(req.SandboxVersionCode)
  82. // if err != nil {
  83. // if err.Error() == utils.ErrNoRow() {
  84. // errMsg = "找不到该版本"
  85. // err = errors.New(errMsg)
  86. // }
  87. // return
  88. // }
  89. // // 获取沙盘主表信息
  90. // sandboxInfo, err := sandbox.GetSandboxById(sandboxVersion.SandboxId)
  91. // if err != nil {
  92. // if err.Error() == utils.ErrNoRow() {
  93. // errMsg = "找不到该沙盘"
  94. // err = errors.New(errMsg)
  95. // }
  96. // return
  97. // }
  98. // //沙盘名称是否更改校验
  99. // var isUpdateName, isUpdateContent bool
  100. // if sandboxInfo.Name != utils.TrimStr(req.Name) {
  101. // isUpdateName = true
  102. // }
  103. //
  104. // // 沙盘内容md5比对,不一致则代表有做更改
  105. // //if utils.MD5(sandboxInfo.Content) != utils.MD5(req.Content) {
  106. // // isUpdateContent = true
  107. // //}
  108. // if checkoutContent(sandboxInfo.Content, req.Content) {
  109. // isUpdateContent = true
  110. // }
  111. //
  112. // //如果沙盘名称和沙盘内容都没有做过修改,那么就不做保存
  113. // if isUpdateName == false && isUpdateContent == false {
  114. // return
  115. // }
  116. //
  117. // // 获取产品权限详情
  118. // var permissionName string
  119. // if !ignoreVariety {
  120. // chartPermissionInfo, e := company.GetChartPermissionListById(req.ChartPermissionId)
  121. // if e != nil {
  122. // err = e
  123. // return
  124. // }
  125. // permissionName = chartPermissionInfo.PermissionName
  126. // }
  127. //
  128. // //如果只更新了沙盘名称,那么只去修改最新版本的沙盘名称,而不去累计版本
  129. // if isUpdateName == true && isUpdateContent == false {
  130. // sandboxInfo.Name = utils.TrimStr(req.Name)
  131. // sandboxInfo.ChartPermissionId = req.ChartPermissionId
  132. // sandboxInfo.ChartPermissionName = permissionName
  133. // sandboxInfo.Content = req.Content
  134. // sandboxInfo.PicUrl = utils.TrimStr(req.PicUrl)
  135. // sandboxInfo.OpUserId = opUserId
  136. // sandboxInfo.OpUserName = opUserName
  137. // sandboxInfo.ModifyTime = time.Now()
  138. // var updateSandboxColumn = []string{"Name", "ChartPermissionId", "ChartPermissionName", "PicUrl", "OpUserId", "OpUserName", "ModifyTime"}
  139. //
  140. // //沙盘版本表信息
  141. // sandboxVersionInfo, tmpErr := sandbox.GetSandboxVersionBySandbox2VersionId(sandboxInfo.SandboxId, sandboxInfo.CurrVersion)
  142. // if tmpErr != nil {
  143. // err = tmpErr
  144. // return
  145. // }
  146. // sandboxVersionInfo.Name = sandboxInfo.Name
  147. // sandboxVersionInfo.ChartPermissionId = sandboxInfo.ChartPermissionId
  148. // sandboxVersionInfo.ChartPermissionName = sandboxInfo.ChartPermissionName
  149. // sandboxVersionInfo.PicUrl = sandboxInfo.PicUrl
  150. // sandboxVersionInfo.OpUserId = sandboxInfo.OpUserId
  151. // sandboxVersionInfo.OpUserName = sandboxInfo.OpUserName
  152. // var updateSandboxVersionColumn = []string{"Name", "ChartPermissionId", "ChartPermissionName", "PicUrl", "OpUserId", "OpUserName"}
  153. //
  154. // //沙盘草稿表信息
  155. // sandboxDraftInfo := &sandbox.SandboxDraft{
  156. // Name: sandboxInfo.Name,
  157. // ChartPermissionId: sandboxInfo.ChartPermissionId,
  158. // ChartPermissionName: sandboxInfo.ChartPermissionName,
  159. // CurrVersion: sandboxInfo.CurrVersion,
  160. // Content: sandboxInfo.Content,
  161. // OpUserId: sandboxInfo.OpUserId,
  162. // OpUserName: sandboxInfo.OpUserName,
  163. // CreateTime: time.Now(),
  164. // }
  165. //
  166. // //修改沙盘
  167. // err = sandbox.UpdateSandboxName(sandboxInfo, sandboxVersionInfo, sandboxDraftInfo, updateSandboxColumn, updateSandboxVersionColumn)
  168. // if err != nil {
  169. // return
  170. // }
  171. // resp.Sandbox = sandboxInfo
  172. // resp.VersionCode = sandboxVersionInfo.VersionCode
  173. // } else {
  174. // sandboxInfo.Name = utils.TrimStr(req.Name)
  175. // sandboxInfo.ChartPermissionId = req.ChartPermissionId
  176. // sandboxInfo.ChartPermissionName = permissionName
  177. // sandboxInfo.CurrVersion = sandboxInfo.CurrVersion + 1
  178. // sandboxInfo.Content = req.Content
  179. // sandboxInfo.PicUrl = utils.TrimStr(req.PicUrl)
  180. // sandboxInfo.OpUserId = opUserId
  181. // sandboxInfo.OpUserName = opUserName
  182. // sandboxInfo.ModifyTime = time.Now()
  183. //
  184. // var updateSandbox = []string{"Name", "ChartPermissionId", "ChartPermissionName", "CurrVersion", "Content", "PicUrl", "OpUserId", "OpUserName", "ModifyTime"}
  185. //
  186. // //沙盘版本表信息
  187. // sandboxVersionInfo := &sandbox.SandboxVersion{
  188. // Name: sandboxInfo.Name,
  189. // ChartPermissionId: sandboxInfo.ChartPermissionId,
  190. // ChartPermissionName: sandboxInfo.ChartPermissionName,
  191. // CurrVersion: sandboxInfo.CurrVersion,
  192. // Content: sandboxInfo.Content,
  193. // SvgData: req.SvgData,
  194. // PicUrl: sandboxInfo.PicUrl,
  195. // OpUserId: sandboxInfo.OpUserId,
  196. // OpUserName: sandboxInfo.OpUserName,
  197. // VersionCode: GenerateVersionCode(sandboxInfo.SandboxId, sandboxInfo.CurrVersion),
  198. // IsDelete: sandboxInfo.IsDelete,
  199. // CreateTime: time.Now(),
  200. // }
  201. // //沙盘草稿表信息
  202. // sandboxDraftInfo := &sandbox.SandboxDraft{
  203. // Name: sandboxInfo.Name,
  204. // ChartPermissionId: sandboxInfo.ChartPermissionId,
  205. // ChartPermissionName: sandboxInfo.ChartPermissionName,
  206. // CurrVersion: sandboxInfo.CurrVersion,
  207. // Content: sandboxInfo.Content,
  208. // OpUserId: sandboxInfo.OpUserId,
  209. // OpUserName: sandboxInfo.OpUserName,
  210. // CreateTime: time.Now(),
  211. // }
  212. //
  213. // //修改沙盘
  214. // err = sandbox.UpdateSandbox(sandboxInfo, updateSandbox, sandboxVersionInfo, sandboxDraftInfo)
  215. // if err != nil {
  216. // return
  217. // }
  218. // resp.Sandbox = sandboxInfo
  219. // resp.VersionCode = sandboxVersionInfo.VersionCode
  220. // }
  221. // return
  222. //}
  223. // AddSandboxDraft 新增沙盘草稿
  224. func AddSandboxDraft(sandboxId int, req request.AddAndEditSandbox, opUserId int, opUserName string) (sandboxDraftInfo *sandbox.SandboxDraft, err error) {
  225. //获取最近一条草稿箱的数据
  226. lastSandboxDraft, err := sandbox.GetLastSandboxDraftById(sandboxId)
  227. if err != nil && err.Error() != utils.ErrNoRow() {
  228. return
  229. }
  230. //如果最近一条沙盘草稿数据不为空的话,那么需要校验下最近一次的图表数据是否与提交的这次一致
  231. if lastSandboxDraft != nil {
  232. //沙盘名称是否更改校验
  233. var isUpdateName, isUpdateContent bool
  234. if lastSandboxDraft.Name != utils.TrimStr(req.Name) {
  235. isUpdateName = true
  236. }
  237. // 沙盘内容md5比对,不一致则代表有做更改
  238. //if utils.MD5(lastSandboxDraft.Content) != utils.MD5(req.Content) {
  239. // isUpdateContent = true
  240. //}
  241. if checkoutContent(lastSandboxDraft.Content, req.Content) {
  242. isUpdateContent = true
  243. }
  244. //如果沙盘名称和沙盘内容都没有做过修改,那么就不做保存
  245. if isUpdateName == false && isUpdateContent == false {
  246. return
  247. }
  248. }
  249. // 获取产品权限详情
  250. chartPermissionInfo, err := company.GetChartPermissionListById(req.ChartPermissionId)
  251. if err != nil {
  252. return
  253. }
  254. //沙盘草稿表信息
  255. sandboxDraftInfo = &sandbox.SandboxDraft{
  256. SandboxId: sandboxId,
  257. Name: utils.TrimStr(req.Name),
  258. ChartPermissionId: req.ChartPermissionId,
  259. ChartPermissionName: chartPermissionInfo.PermissionName,
  260. Content: req.Content,
  261. OpUserId: opUserId,
  262. OpUserName: opUserName,
  263. CreateTime: time.Now(),
  264. }
  265. //新增沙盘草稿
  266. err = sandbox.AddSandboxDraft(sandboxDraftInfo)
  267. return
  268. }
  269. // UpdateSandboxEditMark 更新沙盘当前更新状态
  270. // status 枚举值 1:编辑中,0:完成编辑, 2:只做查询
  271. func UpdateSandboxEditMark(sandboxId, nowUserId, status int, nowUserName string) (ret models.MarkReportResp, err error) {
  272. //更新标记key
  273. key := fmt.Sprint(`crm:sandbox:edit:`, sandboxId)
  274. opUserId, e := utils.Rc.RedisInt(key)
  275. var opUser models.MarkReportItem
  276. if e != nil {
  277. opUserInfoStr, tErr := utils.Rc.RedisString(key)
  278. if tErr == nil {
  279. tErr = json.Unmarshal([]byte(opUserInfoStr), &opUser)
  280. if tErr == nil {
  281. opUserId = opUser.AdminId
  282. }
  283. }
  284. }
  285. if opUserId > 0 && opUserId != nowUserId {
  286. editor := opUser.Editor
  287. if editor == "" {
  288. //查询账号的用户姓名
  289. otherInfo, e := system.GetSysAdminById(opUserId)
  290. if e != nil {
  291. err = fmt.Errorf("查询其他编辑者信息失败")
  292. return
  293. }
  294. editor = otherInfo.RealName
  295. }
  296. ret.Status = 1
  297. ret.Msg = fmt.Sprintf("当前%s正在编辑中", editor)
  298. ret.Editor = editor
  299. return
  300. }
  301. if status == 1 {
  302. nowUser := &models.MarkReportItem{AdminId: nowUserId, Editor: nowUserName}
  303. bt, e := json.Marshal(nowUser)
  304. if e != nil {
  305. err = fmt.Errorf("格式化编辑者信息失败")
  306. return
  307. }
  308. if opUserId > 0 {
  309. utils.Rc.Do("SETEX", key, int64(300), string(bt)) //3分钟缓存
  310. } else {
  311. utils.Rc.SetNX(key, string(bt), time.Second*60*5) //3分钟缓存
  312. }
  313. } else if status == 0 {
  314. //清除编辑缓存
  315. _ = utils.Rc.Delete(key)
  316. }
  317. return
  318. }
  319. // ResetDraftToLastVersion 重置沙盘草稿至最新版本
  320. //func ResetDraftToLastVersion(sandboxId, opUserId int, opUserName string) (sandboxDraftInfo *sandbox.SandboxDraft, err error) {
  321. // // 获取沙盘主表信息
  322. // sandboxInfo, err := sandbox.GetSandboxById(sandboxId)
  323. // if err != nil {
  324. // return
  325. // }
  326. //
  327. // //沙盘草稿表信息
  328. // sandboxDraftInfo = &sandbox.SandboxDraft{
  329. // SandboxId: sandboxInfo.SandboxId,
  330. // Name: sandboxInfo.Name,
  331. // ChartPermissionId: sandboxInfo.ChartPermissionId,
  332. // ChartPermissionName: sandboxInfo.ChartPermissionName,
  333. // Content: sandboxInfo.Content,
  334. // OpUserId: opUserId,
  335. // OpUserName: opUserName,
  336. // CreateTime: time.Now(),
  337. // }
  338. //
  339. // //新增沙盘草稿
  340. // err = sandbox.AddSandboxDraft(sandboxDraftInfo)
  341. // return
  342. //}
  343. // DeleteSandbox 删除沙盘
  344. func DeleteSandbox(sandboxId int) (err error) {
  345. // 获取沙盘主表信息
  346. sandboxInfo, err := sandbox.GetSandboxById(sandboxId)
  347. if err != nil {
  348. return
  349. }
  350. sandboxInfo.IsDelete = 1
  351. var updateSandboxColumn = []string{"IsDelete"}
  352. err = sandboxInfo.Update(updateSandboxColumn)
  353. return
  354. }
  355. // DeleteSandboxVersion 删除沙盘版本
  356. //func DeleteSandboxVersion(sandboxVersionCode string, opUserId int) (err error, errMsg string) {
  357. // // 获取沙盘版本信息
  358. // sandboxVersion, err := sandbox.GetSandboxVersionBySandboxVersionCode(sandboxVersionCode)
  359. // if err != nil {
  360. // if err.Error() == utils.ErrNoRow() {
  361. // errMsg = "找不到该版本"
  362. // err = errors.New(errMsg)
  363. // }
  364. // return
  365. // }
  366. //
  367. // /*key := fmt.Sprint(`crm:sandbox:edit:`, sandboxVersion.SandboxId)
  368. // nowOpUserId, _ := utils.Rc.RedisInt(key)
  369. // //如果当前有人操作,且获取当前操作人不是本人,那么不允许删除
  370. // if nowOpUserId > 0 && nowOpUserId != opUserId {
  371. // errMsg = "当前有其他人正在编辑,不允许删除该沙盘"
  372. // err = errors.New(errMsg)
  373. // return
  374. // }*/
  375. //
  376. // markStatus, err := UpdateSandboxEditMark(sandboxVersion.SandboxId, opUserId, 2, "")
  377. // if err != nil {
  378. // errMsg = "查询标记状态失败"
  379. // err = errors.New("查询标记状态失败,Err:" + err.Error())
  380. // return
  381. // }
  382. // if markStatus.Status == 1 {
  383. // errMsg = fmt.Sprintf("当前%s正在编辑,不允许删除该沙盘", markStatus.Editor)
  384. // err = errors.New(errMsg)
  385. // return
  386. // }
  387. //
  388. // // 获取沙盘主表信息
  389. // sandboxInfo, err := sandbox.GetSandboxById(sandboxVersion.SandboxId)
  390. // if err != nil {
  391. // return
  392. // }
  393. //
  394. // // 删除最新版本,需要将上一个版本的给找出来覆盖
  395. // if sandboxVersion.CurrVersion == sandboxInfo.CurrVersion {
  396. // lastSandboxVersion, tmpErr := sandbox.GetLastSandboxVersionBySandbox2VersionId(sandboxInfo.SandboxId, sandboxVersion.CurrVersion)
  397. // if tmpErr != nil {
  398. // // 如果找不到,说明是删除整个沙盘,不仅仅是某个版本
  399. // if tmpErr.Error() == utils.ErrNoRow() {
  400. // sandboxInfo.IsDelete = 1
  401. // var updateSandboxColumn = []string{"IsDelete"}
  402. // err = sandboxInfo.Update(updateSandboxColumn)
  403. // return
  404. // }
  405. // err = tmpErr
  406. // return
  407. // } else {
  408. // //将当前沙盘信息修复到上一个版本
  409. // sandboxInfo.Content = lastSandboxVersion.Content
  410. // sandboxInfo.CurrVersion = lastSandboxVersion.CurrVersion
  411. // sandboxInfo.PicUrl = lastSandboxVersion.PicUrl
  412. // err = sandboxInfo.Update([]string{"Content", "CurrVersion", "PicUrl"})
  413. // if err != nil {
  414. // return
  415. // }
  416. // }
  417. // }
  418. // //将原来的版本标记删除
  419. // sandboxVersion.IsDelete = 1
  420. // err = sandboxVersion.Update([]string{"IsDelete"})
  421. //
  422. // return
  423. //}
  424. // GetSandboxVersionDetailByCode 获取沙盘的版本数据
  425. func GetSandboxVersionDetailByCode(sandboxVersionCode string) (sandboxVersionInfo *sandbox.SandboxVersion, err error) {
  426. // 获取沙盘版本信息
  427. sandboxVersionInfo, err = sandbox.GetSandboxVersionBySandboxVersionCode(sandboxVersionCode)
  428. return
  429. }
  430. // GetLastSandboxInfo 获取最后一次操作的沙盘数据
  431. func GetLastSandboxInfo(sandboxId int) (sandboxInfo *sandbox.Sandbox, err error) {
  432. // 获取沙盘主表信息
  433. sandboxInfo, err = sandbox.GetSandboxById(sandboxId)
  434. return
  435. //if err != nil {
  436. // return
  437. //}
  438. //
  439. ////获取最近一条草稿箱的数据(写到一半没有保存,然后退出去了)
  440. //lastSandboxDraft, err := sandbox.GetLastSandboxDraftById(sandboxId)
  441. //if err != nil && err.Error() != utils.ErrNoRow() {
  442. // return
  443. //}
  444. ////如果最近一条沙盘草稿数据不为空的话,那么需要校验下最近一次的图表数据是否与提交的这次一致
  445. //if lastSandboxDraft != nil {
  446. // sandboxInfo = &sandbox.Sandbox{
  447. // SandboxId: sandboxId,
  448. // Name: lastSandboxDraft.Name,
  449. // ChartPermissionId: lastSandboxDraft.ChartPermissionId,
  450. // ChartPermissionName: lastSandboxDraft.ChartPermissionName,
  451. // CurrVersion: lastSandboxDraft.CurrVersion,
  452. // Content: lastSandboxDraft.Content,
  453. // OpUserId: lastSandboxDraft.OpUserId,
  454. // OpUserName: lastSandboxDraft.OpUserName,
  455. // IsDelete: 0,
  456. // ModifyTime: lastSandboxDraft.CreateTime,
  457. // CreateTime: lastSandboxDraft.CreateTime,
  458. // }
  459. //}
  460. return
  461. }
  462. // GenerateCode 生成沙盘code
  463. func GenerateCode() string {
  464. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  465. return utils.MD5(fmt.Sprint("sandbox_") + timestamp)
  466. }
  467. // GenerateVersionCode 生成沙盘版本code
  468. func GenerateVersionCode(sandboxId, sandboxVersion int) string {
  469. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  470. return utils.MD5(fmt.Sprint("sandbox_version_", sandboxId, "_", sandboxVersion) + timestamp)
  471. }
  472. // ContentStruct 沙盘内容结构体
  473. type ContentStruct struct {
  474. Cells []struct {
  475. Attrs struct {
  476. Line struct {
  477. SourceMarker bool `json:"sourceMarker"`
  478. Stroke string `json:"stroke"`
  479. StrokeDasharray string `json:"strokeDasharray"`
  480. } `json:"line"`
  481. Rect struct {
  482. Fill string `json:"fill"`
  483. Stroke string `json:"stroke"`
  484. StrokeDasharray interface{} `json:"strokeDasharray"`
  485. StrokeWidth int64 `json:"strokeWidth"`
  486. } `json:"rect"`
  487. Text struct {
  488. Fill string `json:"fill"`
  489. FontSize float64 `json:"fontSize"`
  490. FontWeight string `json:"fontWeight"`
  491. LineHeight float64 `json:"lineHeight"`
  492. Text string `json:"text"`
  493. TextWrap struct {
  494. Text string `json:"text"`
  495. Width int64 `json:"width"`
  496. } `json:"textWrap"`
  497. } `json:"text"`
  498. } `json:"attrs"`
  499. Data struct {
  500. Key string `json:"key"`
  501. } `json:"data"`
  502. ID string `json:"id"`
  503. Ports struct {
  504. Groups struct {
  505. Port_bottom struct {
  506. Attrs struct {
  507. Circle struct {
  508. Fill string `json:"fill"`
  509. Magnet bool `json:"magnet"`
  510. R int64 `json:"r"`
  511. Stroke string `json:"stroke"`
  512. StrokeWidth int64 `json:"strokeWidth"`
  513. } `json:"circle"`
  514. } `json:"attrs"`
  515. Position string `json:"position"`
  516. ZIndex int64 `json:"zIndex"`
  517. } `json:"port-bottom"`
  518. Port_left struct {
  519. Attrs struct {
  520. Circle struct {
  521. Fill string `json:"fill"`
  522. Magnet bool `json:"magnet"`
  523. R int64 `json:"r"`
  524. Stroke string `json:"stroke"`
  525. StrokeWidth int64 `json:"strokeWidth"`
  526. } `json:"circle"`
  527. } `json:"attrs"`
  528. Position string `json:"position"`
  529. ZIndex int64 `json:"zIndex"`
  530. } `json:"port-left"`
  531. Port_right struct {
  532. Attrs struct {
  533. Circle struct {
  534. Fill string `json:"fill"`
  535. Magnet bool `json:"magnet"`
  536. R int64 `json:"r"`
  537. Stroke string `json:"stroke"`
  538. StrokeWidth int64 `json:"strokeWidth"`
  539. } `json:"circle"`
  540. } `json:"attrs"`
  541. Position string `json:"position"`
  542. ZIndex int64 `json:"zIndex"`
  543. } `json:"port-right"`
  544. Port_top struct {
  545. Attrs struct {
  546. Circle struct {
  547. Fill string `json:"fill"`
  548. Magnet bool `json:"magnet"`
  549. R int64 `json:"r"`
  550. Stroke string `json:"stroke"`
  551. StrokeWidth int64 `json:"strokeWidth"`
  552. } `json:"circle"`
  553. } `json:"attrs"`
  554. Position string `json:"position"`
  555. ZIndex int64 `json:"zIndex"`
  556. } `json:"port-top"`
  557. } `json:"groups"`
  558. Items []struct {
  559. Group string `json:"group"`
  560. ID string `json:"id"`
  561. } `json:"items"`
  562. } `json:"ports"`
  563. Position struct {
  564. X float64 `json:"x"`
  565. Y float64 `json:"y"`
  566. } `json:"position"`
  567. Shape string `json:"shape"`
  568. Size struct {
  569. Height float64 `json:"height"`
  570. Width float64 `json:"width"`
  571. } `json:"size"`
  572. Source struct {
  573. Cell string `json:"cell"`
  574. Port string `json:"port"`
  575. } `json:"source"`
  576. Target struct {
  577. Cell string `json:"cell"`
  578. Port string `json:"port"`
  579. } `json:"target"`
  580. ZIndex int64 `json:"zIndex"`
  581. } `json:"cells"`
  582. }
  583. // checkoutContent 校验内容是否变更
  584. func checkoutContent(oldContent, reqContent string) (isUpdate bool) {
  585. defer func() {
  586. // 沙盘内容md5比对,不一致则代表有做更改
  587. if utils.MD5(oldContent) != utils.MD5(reqContent) {
  588. isUpdate = true
  589. }
  590. }()
  591. var oldContentInfo, reqContentInfo ContentStruct
  592. err := json.Unmarshal([]byte(oldContent), &oldContentInfo)
  593. if err != nil {
  594. fmt.Println("old json.Unmarshal err:", err)
  595. return
  596. }
  597. oldContentInfoByte, err := json.Marshal(oldContentInfo)
  598. if err != nil {
  599. fmt.Println("old json.Marshal err:", err)
  600. return
  601. }
  602. oldContent = string(oldContentInfoByte)
  603. err = json.Unmarshal([]byte(reqContent), &reqContentInfo)
  604. if err != nil {
  605. fmt.Println("req json.Unmarshal err:", err)
  606. return
  607. }
  608. reqContentInfoByte, err := json.Marshal(reqContentInfo)
  609. if err != nil {
  610. fmt.Println("req json.Marshal err:", err)
  611. return
  612. }
  613. reqContent = string(reqContentInfoByte)
  614. return
  615. }
  616. func sandboxClassifyHaveChild(allNode []*sandbox.SandboxClassifyItems, node *sandbox.SandboxClassifyItems) (childs []*sandbox.SandboxClassifyItems, yes bool) {
  617. for _, v := range allNode {
  618. if v.ParentId == node.SandboxClassifyId {
  619. childs = append(childs, v)
  620. }
  621. }
  622. if len(childs) > 0 {
  623. yes = true
  624. }
  625. return
  626. }
  627. func SandboxClassifyItemsMakeTree(sysUser *system.Admin, allNode []*sandbox.SandboxClassifyItems, node *sandbox.SandboxClassifyItems) {
  628. childs, _ := sandboxClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
  629. if len(childs) > 0 {
  630. node.Children = append(node.Children, childs[0:]...) //添加子节点
  631. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  632. _, has := sandboxClassifyHaveChild(allNode, v)
  633. if has {
  634. SandboxClassifyItemsMakeTree(sysUser, allNode, v) //递归添加节点
  635. } else {
  636. childrenArr := make([]*sandbox.SandboxClassifyItems, 0)
  637. v.Children = childrenArr
  638. }
  639. }
  640. } else {
  641. childrenArr := make([]*sandbox.SandboxClassifyItems, 0)
  642. node.Children = childrenArr
  643. }
  644. }
  645. // GetSandboxClassifyListForMe 获取我创建的沙盘
  646. func GetSandboxClassifyListForMe(adminInfo system.Admin, resp *sandbox.SandboxClassifyListResp, sandboxClassifyId int) (errMsg string, err error) {
  647. rootList, err := sandbox.GetSandboxClassifyByParentId(sandboxClassifyId)
  648. if err != nil && err.Error() != utils.ErrNoRow() {
  649. errMsg = "获取失败"
  650. return
  651. }
  652. classifyAll, err := sandbox.GetSandboxClassifyByParentId(sandboxClassifyId)
  653. if err != nil && err.Error() != utils.ErrNoRow() {
  654. errMsg = "获取失败"
  655. return
  656. }
  657. sandboxAll, err := sandbox.GetSandboxInfoByAdminId(adminInfo.AdminId)
  658. if err != nil && err.Error() != utils.ErrNoRow() {
  659. errMsg = "获取失败"
  660. return
  661. }
  662. sandListMap := make(map[int][]*sandbox.SandboxClassifyItems)
  663. for _, v := range sandboxAll {
  664. if _, ok := sandListMap[v.SandboxClassifyId]; !ok {
  665. list := make([]*sandbox.SandboxClassifyItems, 0)
  666. list = append(list, v)
  667. sandListMap[v.SandboxClassifyId] = list
  668. } else {
  669. sandListMap[v.SandboxClassifyId] = append(sandListMap[v.SandboxClassifyId], v)
  670. }
  671. }
  672. nodeAll := make([]*sandbox.SandboxClassifyItems, 0)
  673. for k := range rootList {
  674. rootNode := rootList[k]
  675. SandboxClassifyItemsMakeTree(&adminInfo, classifyAll, rootNode)
  676. nodeAll = append(nodeAll, rootNode)
  677. }
  678. //for k := range nodeAll {
  679. //
  680. //}
  681. newAll := SandboxItemsMakeTree(nodeAll, sandListMap, sandboxClassifyId)
  682. resp.AllNodes = newAll
  683. return
  684. }
  685. // HandleNoPermissionSandbox 图表列表返回,将没有权限的图表移除
  686. func HandleNoPermissionSandbox(allNodes []*sandbox.SandboxClassifyItems, noPermissionChartIdMap map[int]bool) (newAllNodes []*sandbox.SandboxClassifyItems) {
  687. // 移除没有权限的图表
  688. newAllNodes = make([]*sandbox.SandboxClassifyItems, 0)
  689. for _, node := range allNodes {
  690. // 二级分类
  691. tmpNodeInfo := *node
  692. tmpNodeList := make([]*sandbox.SandboxClassifyItems, 0)
  693. if node.Children != nil {
  694. for _, chartList := range node.Children {
  695. tmpInfo := *chartList
  696. tmpList := make([]*sandbox.SandboxClassifyItems, 0)
  697. if chartList.Children != nil {
  698. for _, chartInfo := range chartList.Children {
  699. thirdInfo := *chartInfo
  700. thirdList := make([]*sandbox.SandboxClassifyItems, 0)
  701. // 如果指标不可见,那么就不返回该指标
  702. if _, ok := noPermissionChartIdMap[chartInfo.SandboxId]; ok {
  703. continue
  704. }
  705. tmpList = append(tmpList, chartInfo)
  706. if chartInfo.Children != nil {
  707. for _, thirdChart := range chartInfo.Children {
  708. // 如果指标不可见,那么就不返回该指标
  709. if _, ok := noPermissionChartIdMap[chartInfo.SandboxId]; ok {
  710. continue
  711. }
  712. thirdList = append(thirdList, thirdChart)
  713. }
  714. }
  715. thirdInfo.Children = thirdList
  716. tmpList = append(tmpList, &thirdInfo)
  717. }
  718. }
  719. tmpInfo.Children = tmpList
  720. tmpNodeList = append(tmpNodeList, &tmpInfo)
  721. }
  722. }
  723. tmpNodeInfo.Children = tmpNodeList
  724. newAllNodes = append(newAllNodes, &tmpNodeInfo)
  725. }
  726. return
  727. }
  728. // AddSandboxV2 新增沙盘
  729. func AddSandboxV2(req request.AddAndEditSandboxV2, opUserId int, opUserName string) (resp *sandbox.SandboxSaveResp, err error) {
  730. resp = new(sandbox.SandboxSaveResp)
  731. //沙盘主表信息
  732. sandboxInfo := &sandbox.Sandbox{
  733. Name: utils.TrimStr(req.Name),
  734. Code: GenerateCode(),
  735. Content: req.Content,
  736. MindmapData: req.MindmapData,
  737. PicUrl: utils.TrimStr(req.PicUrl),
  738. SysUserId: opUserId,
  739. SysUserName: opUserName,
  740. IsDelete: 0,
  741. ModifyTime: time.Now(),
  742. CreateTime: time.Now(),
  743. SandboxClassifyId: req.SandboxClassifyId,
  744. Sort: 0,
  745. Style: req.Style,
  746. }
  747. //新增沙盘
  748. id, err := sandbox.AddSandbox(sandboxInfo)
  749. if err != nil {
  750. return
  751. }
  752. sandboxInfo.SandboxId = int(id)
  753. resp.Sandbox = sandboxInfo
  754. return
  755. }
  756. func SandboxItemsMakeTree(allNode []*sandbox.SandboxClassifyItems, sandListMap map[int][]*sandbox.SandboxClassifyItems, sandboxClassifyId int) (nodeAll []*sandbox.SandboxClassifyItems) {
  757. for k := range allNode {
  758. if len(allNode[k].Children) > 0 {
  759. SandboxItemsMakeTree(allNode[k].Children, sandListMap, sandboxClassifyId)
  760. allNode = append(allNode, sandListMap[allNode[k].ParentId]...)
  761. nodeAll = allNode
  762. } else if k == len(allNode)-1 {
  763. allNode = append(allNode, sandListMap[allNode[k].ParentId]...)
  764. nodeAll = allNode
  765. }
  766. }
  767. if len(allNode) == 0 {
  768. nodeAll = append(nodeAll, sandListMap[sandboxClassifyId]...)
  769. }
  770. return
  771. }
  772. func SandboxClassifyHaveChild(allNode []*sandbox.SandboxClassifyItems, node *sandbox.SandboxClassifyItems) (childs []*sandbox.SandboxClassifyItems, yes bool) {
  773. for _, v := range allNode {
  774. if v.ParentId == node.SandboxClassifyId {
  775. childs = append(childs, v)
  776. }
  777. }
  778. if len(childs) > 0 {
  779. yes = true
  780. }
  781. return
  782. }
  783. func SandboxClassifyItemsMakeTreeV2(sysUser *system.Admin, allNode []*sandbox.SandboxClassifyItems, node *sandbox.SandboxClassifyItems) {
  784. childs, _ := sandboxClassifyHaveChildV2(allNode, node) //判断节点是否有子节点并返回
  785. if len(childs) > 0 {
  786. node.Children = append(node.Children, childs[0:]...) //添加子节点
  787. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  788. _, has := sandboxClassifyHaveChildV2(allNode, v)
  789. if has {
  790. SandboxClassifyItemsMakeTreeV2(sysUser, allNode, v) //递归添加节点
  791. } else {
  792. //childrenArr := make([]*sandbox.SandboxClassifyItems, 0)
  793. //v.Children = childrenArr
  794. }
  795. }
  796. } else {
  797. //childrenArr := make([]*sandbox.SandboxClassifyItems, 0)
  798. //node.Children = childrenArr
  799. }
  800. }
  801. func sandboxClassifyHaveChildV2(allNode []*sandbox.SandboxClassifyItems, node *sandbox.SandboxClassifyItems) (childs []*sandbox.SandboxClassifyItems, yes bool) {
  802. for _, v := range allNode {
  803. if v.ParentId == node.SandboxClassifyId && node.SandboxId == 0 {
  804. childs = append(childs, v)
  805. }
  806. }
  807. if len(childs) > 0 {
  808. yes = true
  809. }
  810. return
  811. }