sandbox.go 30 KB

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