sandbox.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. package sandbox
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/company"
  7. "eta/eta_api/models/sandbox"
  8. "eta/eta_api/models/sandbox/request"
  9. "eta/eta_api/models/system"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "strconv"
  13. "time"
  14. )
  15. // AddSandbox 新增沙盘
  16. func AddSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string, ignoreVariety bool) (resp *sandbox.SandboxSaveResp, err error) {
  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. err = sandbox.AddNewSandbox(sandboxInfo, sandboxVersionInfo, sandboxDraftInfo)
  69. if err != nil {
  70. return
  71. }
  72. resp.Sandbox = sandboxInfo
  73. resp.VersionCode = sandboxVersionInfo.VersionCode
  74. return
  75. }
  76. // UpdateSandbox 更新沙盘
  77. func UpdateSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string, ignoreVariety bool) (resp *sandbox.SandboxSaveResp, err error, errMsg string) {
  78. resp = new(sandbox.SandboxSaveResp)
  79. // 获取沙盘版本信息
  80. sandboxVersion, err := sandbox.GetSandboxVersionBySandboxVersionCode(req.SandboxVersionCode)
  81. if err != nil {
  82. if err.Error() == utils.ErrNoRow() {
  83. errMsg = "找不到该版本"
  84. err = errors.New(errMsg)
  85. }
  86. return
  87. }
  88. // 获取沙盘主表信息
  89. sandboxInfo, err := sandbox.GetSandboxById(sandboxVersion.SandboxId)
  90. if err != nil {
  91. if err.Error() == utils.ErrNoRow() {
  92. errMsg = "找不到该沙盘"
  93. err = errors.New(errMsg)
  94. }
  95. return
  96. }
  97. //沙盘名称是否更改校验
  98. var isUpdateName, isUpdateContent bool
  99. if sandboxInfo.Name != utils.TrimStr(req.Name) {
  100. isUpdateName = true
  101. }
  102. // 沙盘内容md5比对,不一致则代表有做更改
  103. //if utils.MD5(sandboxInfo.Content) != utils.MD5(req.Content) {
  104. // isUpdateContent = true
  105. //}
  106. if checkoutContent(sandboxInfo.Content, req.Content) {
  107. isUpdateContent = true
  108. }
  109. //如果沙盘名称和沙盘内容都没有做过修改,那么就不做保存
  110. if isUpdateName == false && isUpdateContent == false {
  111. return
  112. }
  113. // 获取产品权限详情
  114. var permissionName string
  115. if !ignoreVariety {
  116. chartPermissionInfo, e := company.GetChartPermissionListById(req.ChartPermissionId)
  117. if e != nil {
  118. err = e
  119. return
  120. }
  121. permissionName = chartPermissionInfo.PermissionName
  122. }
  123. //如果只更新了沙盘名称,那么只去修改最新版本的沙盘名称,而不去累计版本
  124. if isUpdateName == true && isUpdateContent == false {
  125. sandboxInfo.Name = utils.TrimStr(req.Name)
  126. sandboxInfo.ChartPermissionId = req.ChartPermissionId
  127. sandboxInfo.ChartPermissionName = permissionName
  128. sandboxInfo.Content = req.Content
  129. sandboxInfo.PicUrl = utils.TrimStr(req.PicUrl)
  130. sandboxInfo.OpUserId = opUserId
  131. sandboxInfo.OpUserName = opUserName
  132. sandboxInfo.ModifyTime = time.Now()
  133. var updateSandboxColumn = []string{"Name", "ChartPermissionId", "ChartPermissionName", "PicUrl", "OpUserId", "OpUserName", "ModifyTime"}
  134. //沙盘版本表信息
  135. sandboxVersionInfo, tmpErr := sandbox.GetSandboxVersionBySandbox2VersionId(sandboxInfo.SandboxId, sandboxInfo.CurrVersion)
  136. if tmpErr != nil {
  137. err = tmpErr
  138. return
  139. }
  140. sandboxVersionInfo.Name = sandboxInfo.Name
  141. sandboxVersionInfo.ChartPermissionId = sandboxInfo.ChartPermissionId
  142. sandboxVersionInfo.ChartPermissionName = sandboxInfo.ChartPermissionName
  143. sandboxVersionInfo.PicUrl = sandboxInfo.PicUrl
  144. sandboxVersionInfo.OpUserId = sandboxInfo.OpUserId
  145. sandboxVersionInfo.OpUserName = sandboxInfo.OpUserName
  146. var updateSandboxVersionColumn = []string{"Name", "ChartPermissionId", "ChartPermissionName", "PicUrl", "OpUserId", "OpUserName"}
  147. //沙盘草稿表信息
  148. sandboxDraftInfo := &sandbox.SandboxDraft{
  149. Name: sandboxInfo.Name,
  150. ChartPermissionId: sandboxInfo.ChartPermissionId,
  151. ChartPermissionName: sandboxInfo.ChartPermissionName,
  152. CurrVersion: sandboxInfo.CurrVersion,
  153. Content: sandboxInfo.Content,
  154. OpUserId: sandboxInfo.OpUserId,
  155. OpUserName: sandboxInfo.OpUserName,
  156. CreateTime: time.Now(),
  157. }
  158. //修改沙盘
  159. err = sandbox.UpdateSandboxName(sandboxInfo, sandboxVersionInfo, sandboxDraftInfo, updateSandboxColumn, updateSandboxVersionColumn)
  160. if err != nil {
  161. return
  162. }
  163. resp.Sandbox = sandboxInfo
  164. resp.VersionCode = sandboxVersionInfo.VersionCode
  165. } else {
  166. sandboxInfo.Name = utils.TrimStr(req.Name)
  167. sandboxInfo.ChartPermissionId = req.ChartPermissionId
  168. sandboxInfo.ChartPermissionName = permissionName
  169. sandboxInfo.CurrVersion = sandboxInfo.CurrVersion + 1
  170. sandboxInfo.Content = req.Content
  171. sandboxInfo.PicUrl = utils.TrimStr(req.PicUrl)
  172. sandboxInfo.OpUserId = opUserId
  173. sandboxInfo.OpUserName = opUserName
  174. sandboxInfo.ModifyTime = time.Now()
  175. var updateSandbox = []string{"Name", "ChartPermissionId", "ChartPermissionName", "CurrVersion", "Content", "PicUrl", "OpUserId", "OpUserName", "ModifyTime"}
  176. //沙盘版本表信息
  177. sandboxVersionInfo := &sandbox.SandboxVersion{
  178. Name: sandboxInfo.Name,
  179. ChartPermissionId: sandboxInfo.ChartPermissionId,
  180. ChartPermissionName: sandboxInfo.ChartPermissionName,
  181. CurrVersion: sandboxInfo.CurrVersion,
  182. Content: sandboxInfo.Content,
  183. SvgData: req.SvgData,
  184. PicUrl: sandboxInfo.PicUrl,
  185. OpUserId: sandboxInfo.OpUserId,
  186. OpUserName: sandboxInfo.OpUserName,
  187. VersionCode: GenerateVersionCode(sandboxInfo.SandboxId, sandboxInfo.CurrVersion),
  188. IsDelete: sandboxInfo.IsDelete,
  189. CreateTime: time.Now(),
  190. }
  191. //沙盘草稿表信息
  192. sandboxDraftInfo := &sandbox.SandboxDraft{
  193. Name: sandboxInfo.Name,
  194. ChartPermissionId: sandboxInfo.ChartPermissionId,
  195. ChartPermissionName: sandboxInfo.ChartPermissionName,
  196. CurrVersion: sandboxInfo.CurrVersion,
  197. Content: sandboxInfo.Content,
  198. OpUserId: sandboxInfo.OpUserId,
  199. OpUserName: sandboxInfo.OpUserName,
  200. CreateTime: time.Now(),
  201. }
  202. //修改沙盘
  203. err = sandbox.UpdateSandbox(sandboxInfo, updateSandbox, sandboxVersionInfo, sandboxDraftInfo)
  204. if err != nil {
  205. return
  206. }
  207. resp.Sandbox = sandboxInfo
  208. resp.VersionCode = sandboxVersionInfo.VersionCode
  209. }
  210. return
  211. }
  212. // AddSandboxDraft 新增沙盘草稿
  213. func AddSandboxDraft(sandboxId int, req request.AddAndEditSandbox, opUserId int, opUserName string) (sandboxDraftInfo *sandbox.SandboxDraft, err error) {
  214. //获取最近一条草稿箱的数据
  215. lastSandboxDraft, err := sandbox.GetLastSandboxDraftById(sandboxId)
  216. if err != nil && err.Error() != utils.ErrNoRow() {
  217. return
  218. }
  219. //如果最近一条沙盘草稿数据不为空的话,那么需要校验下最近一次的图表数据是否与提交的这次一致
  220. if lastSandboxDraft != nil {
  221. //沙盘名称是否更改校验
  222. var isUpdateName, isUpdateContent bool
  223. if lastSandboxDraft.Name != utils.TrimStr(req.Name) {
  224. isUpdateName = true
  225. }
  226. // 沙盘内容md5比对,不一致则代表有做更改
  227. //if utils.MD5(lastSandboxDraft.Content) != utils.MD5(req.Content) {
  228. // isUpdateContent = true
  229. //}
  230. if checkoutContent(lastSandboxDraft.Content, req.Content) {
  231. isUpdateContent = true
  232. }
  233. //如果沙盘名称和沙盘内容都没有做过修改,那么就不做保存
  234. if isUpdateName == false && isUpdateContent == false {
  235. return
  236. }
  237. }
  238. // 获取产品权限详情
  239. chartPermissionInfo, err := company.GetChartPermissionListById(req.ChartPermissionId)
  240. if err != nil {
  241. return
  242. }
  243. //沙盘草稿表信息
  244. sandboxDraftInfo = &sandbox.SandboxDraft{
  245. SandboxId: sandboxId,
  246. Name: utils.TrimStr(req.Name),
  247. ChartPermissionId: req.ChartPermissionId,
  248. ChartPermissionName: chartPermissionInfo.PermissionName,
  249. Content: req.Content,
  250. OpUserId: opUserId,
  251. OpUserName: opUserName,
  252. CreateTime: time.Now(),
  253. }
  254. //新增沙盘草稿
  255. err = sandbox.AddSandboxDraft(sandboxDraftInfo)
  256. return
  257. }
  258. // UpdateSandboxEditMark 更新沙盘当前更新状态
  259. // status 枚举值 1:编辑中,0:完成编辑, 2:只做查询
  260. func UpdateSandboxEditMark(sandboxId, nowUserId, status int, nowUserName string) (ret models.MarkReportResp, err error) {
  261. //更新标记key
  262. key := fmt.Sprint(`crm:sandbox:edit:`, sandboxId)
  263. opUserId, e := utils.Rc.RedisInt(key)
  264. var opUser models.MarkReportItem
  265. if e != nil {
  266. opUserInfoStr, tErr := utils.Rc.RedisString(key)
  267. if tErr == nil {
  268. tErr = json.Unmarshal([]byte(opUserInfoStr), &opUser)
  269. if tErr == nil {
  270. opUserId = opUser.AdminId
  271. }
  272. }
  273. }
  274. if opUserId > 0 && opUserId != nowUserId {
  275. editor := opUser.Editor
  276. if editor == "" {
  277. //查询账号的用户姓名
  278. otherInfo, e := system.GetSysAdminById(opUserId)
  279. if e != nil {
  280. err = fmt.Errorf("查询其他编辑者信息失败")
  281. return
  282. }
  283. editor = otherInfo.RealName
  284. }
  285. ret.Status = 1
  286. ret.Msg = fmt.Sprintf("当前%s正在编辑中", editor)
  287. ret.Editor = editor
  288. return
  289. }
  290. if status == 1 {
  291. nowUser := &models.MarkReportItem{AdminId: nowUserId, Editor: nowUserName}
  292. bt, e := json.Marshal(nowUser)
  293. if e != nil {
  294. err = fmt.Errorf("格式化编辑者信息失败")
  295. return
  296. }
  297. if opUserId > 0 {
  298. utils.Rc.Do("SETEX", key, int64(300), string(bt)) //3分钟缓存
  299. } else {
  300. utils.Rc.SetNX(key, string(bt), time.Second*60*5) //3分钟缓存
  301. }
  302. } else if status == 0 {
  303. //清除编辑缓存
  304. _ = utils.Rc.Delete(key)
  305. }
  306. return
  307. }
  308. // ResetDraftToLastVersion 重置沙盘草稿至最新版本
  309. func ResetDraftToLastVersion(sandboxId, opUserId int, opUserName string) (sandboxDraftInfo *sandbox.SandboxDraft, err error) {
  310. // 获取沙盘主表信息
  311. sandboxInfo, err := sandbox.GetSandboxById(sandboxId)
  312. if err != nil {
  313. return
  314. }
  315. //沙盘草稿表信息
  316. sandboxDraftInfo = &sandbox.SandboxDraft{
  317. SandboxId: sandboxInfo.SandboxId,
  318. Name: sandboxInfo.Name,
  319. ChartPermissionId: sandboxInfo.ChartPermissionId,
  320. ChartPermissionName: sandboxInfo.ChartPermissionName,
  321. Content: sandboxInfo.Content,
  322. OpUserId: opUserId,
  323. OpUserName: opUserName,
  324. CreateTime: time.Now(),
  325. }
  326. //新增沙盘草稿
  327. err = sandbox.AddSandboxDraft(sandboxDraftInfo)
  328. return
  329. }
  330. // DeleteSandbox 删除沙盘
  331. func DeleteSandbox(sandboxId int) (err error) {
  332. // 获取沙盘主表信息
  333. sandboxInfo, err := sandbox.GetSandboxById(sandboxId)
  334. if err != nil {
  335. return
  336. }
  337. sandboxInfo.IsDelete = 1
  338. var updateSandboxColumn = []string{"IsDelete"}
  339. err = sandboxInfo.Update(updateSandboxColumn)
  340. return
  341. }
  342. // DeleteSandboxVersion 删除沙盘版本
  343. func DeleteSandboxVersion(sandboxVersionCode string, opUserId int) (err error, errMsg string) {
  344. // 获取沙盘版本信息
  345. sandboxVersion, err := sandbox.GetSandboxVersionBySandboxVersionCode(sandboxVersionCode)
  346. if err != nil {
  347. if err.Error() == utils.ErrNoRow() {
  348. errMsg = "找不到该版本"
  349. err = errors.New(errMsg)
  350. }
  351. return
  352. }
  353. /*key := fmt.Sprint(`crm:sandbox:edit:`, sandboxVersion.SandboxId)
  354. nowOpUserId, _ := utils.Rc.RedisInt(key)
  355. //如果当前有人操作,且获取当前操作人不是本人,那么不允许删除
  356. if nowOpUserId > 0 && nowOpUserId != opUserId {
  357. errMsg = "当前有其他人正在编辑,不允许删除该沙盘"
  358. err = errors.New(errMsg)
  359. return
  360. }*/
  361. markStatus, err := UpdateSandboxEditMark(sandboxVersion.SandboxId, opUserId, 2, "")
  362. if err != nil {
  363. errMsg = "查询标记状态失败"
  364. err = errors.New("查询标记状态失败,Err:" + err.Error())
  365. return
  366. }
  367. if markStatus.Status == 1 {
  368. errMsg = fmt.Sprintf("当前%s正在编辑,不允许删除该沙盘", markStatus.Editor)
  369. err = errors.New(errMsg)
  370. return
  371. }
  372. // 获取沙盘主表信息
  373. sandboxInfo, err := sandbox.GetSandboxById(sandboxVersion.SandboxId)
  374. if err != nil {
  375. return
  376. }
  377. // 删除最新版本,需要将上一个版本的给找出来覆盖
  378. if sandboxVersion.CurrVersion == sandboxInfo.CurrVersion {
  379. lastSandboxVersion, tmpErr := sandbox.GetLastSandboxVersionBySandbox2VersionId(sandboxInfo.SandboxId, sandboxVersion.CurrVersion)
  380. if tmpErr != nil {
  381. // 如果找不到,说明是删除整个沙盘,不仅仅是某个版本
  382. if tmpErr.Error() == utils.ErrNoRow() {
  383. sandboxInfo.IsDelete = 1
  384. var updateSandboxColumn = []string{"IsDelete"}
  385. err = sandboxInfo.Update(updateSandboxColumn)
  386. return
  387. }
  388. err = tmpErr
  389. return
  390. } else {
  391. //将当前沙盘信息修复到上一个版本
  392. sandboxInfo.Content = lastSandboxVersion.Content
  393. sandboxInfo.CurrVersion = lastSandboxVersion.CurrVersion
  394. sandboxInfo.PicUrl = lastSandboxVersion.PicUrl
  395. err = sandboxInfo.Update([]string{"Content", "CurrVersion", "PicUrl"})
  396. if err != nil {
  397. return
  398. }
  399. }
  400. }
  401. //将原来的版本标记删除
  402. sandboxVersion.IsDelete = 1
  403. err = sandboxVersion.Update([]string{"IsDelete"})
  404. return
  405. }
  406. // GetSandboxVersionDetailByCode 获取沙盘的版本数据
  407. func GetSandboxVersionDetailByCode(sandboxVersionCode string) (sandboxVersionInfo *sandbox.SandboxVersion, err error) {
  408. // 获取沙盘版本信息
  409. sandboxVersionInfo, err = sandbox.GetSandboxVersionBySandboxVersionCode(sandboxVersionCode)
  410. return
  411. }
  412. // GetLastSandboxInfo 获取最后一次操作的沙盘数据
  413. func GetLastSandboxInfo(sandboxId int) (sandboxInfo *sandbox.Sandbox, err error) {
  414. // 获取沙盘主表信息
  415. sandboxInfo, err = sandbox.GetSandboxById(sandboxId)
  416. return
  417. //if err != nil {
  418. // return
  419. //}
  420. //
  421. ////获取最近一条草稿箱的数据(写到一半没有保存,然后退出去了)
  422. //lastSandboxDraft, err := sandbox.GetLastSandboxDraftById(sandboxId)
  423. //if err != nil && err.Error() != utils.ErrNoRow() {
  424. // return
  425. //}
  426. ////如果最近一条沙盘草稿数据不为空的话,那么需要校验下最近一次的图表数据是否与提交的这次一致
  427. //if lastSandboxDraft != nil {
  428. // sandboxInfo = &sandbox.Sandbox{
  429. // SandboxId: sandboxId,
  430. // Name: lastSandboxDraft.Name,
  431. // ChartPermissionId: lastSandboxDraft.ChartPermissionId,
  432. // ChartPermissionName: lastSandboxDraft.ChartPermissionName,
  433. // CurrVersion: lastSandboxDraft.CurrVersion,
  434. // Content: lastSandboxDraft.Content,
  435. // OpUserId: lastSandboxDraft.OpUserId,
  436. // OpUserName: lastSandboxDraft.OpUserName,
  437. // IsDelete: 0,
  438. // ModifyTime: lastSandboxDraft.CreateTime,
  439. // CreateTime: lastSandboxDraft.CreateTime,
  440. // }
  441. //}
  442. return
  443. }
  444. // GenerateCode 生成沙盘code
  445. func GenerateCode() string {
  446. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  447. return utils.MD5(fmt.Sprint("sandbox_") + timestamp)
  448. }
  449. // GenerateVersionCode 生成沙盘版本code
  450. func GenerateVersionCode(sandboxId, sandboxVersion int) string {
  451. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  452. return utils.MD5(fmt.Sprint("sandbox_version_", sandboxId, "_", sandboxVersion) + timestamp)
  453. }
  454. // ContentStruct 沙盘内容结构体
  455. type ContentStruct struct {
  456. Cells []struct {
  457. Attrs struct {
  458. Line struct {
  459. SourceMarker bool `json:"sourceMarker"`
  460. Stroke string `json:"stroke"`
  461. StrokeDasharray string `json:"strokeDasharray"`
  462. } `json:"line"`
  463. Rect struct {
  464. Fill string `json:"fill"`
  465. Stroke string `json:"stroke"`
  466. StrokeDasharray interface{} `json:"strokeDasharray"`
  467. StrokeWidth int64 `json:"strokeWidth"`
  468. } `json:"rect"`
  469. Text struct {
  470. Fill string `json:"fill"`
  471. FontSize float64 `json:"fontSize"`
  472. FontWeight string `json:"fontWeight"`
  473. LineHeight float64 `json:"lineHeight"`
  474. Text string `json:"text"`
  475. TextWrap struct {
  476. Text string `json:"text"`
  477. Width int64 `json:"width"`
  478. } `json:"textWrap"`
  479. } `json:"text"`
  480. } `json:"attrs"`
  481. Data struct {
  482. Key string `json:"key"`
  483. } `json:"data"`
  484. ID string `json:"id"`
  485. Ports struct {
  486. Groups struct {
  487. Port_bottom struct {
  488. Attrs struct {
  489. Circle struct {
  490. Fill string `json:"fill"`
  491. Magnet bool `json:"magnet"`
  492. R int64 `json:"r"`
  493. Stroke string `json:"stroke"`
  494. StrokeWidth int64 `json:"strokeWidth"`
  495. } `json:"circle"`
  496. } `json:"attrs"`
  497. Position string `json:"position"`
  498. ZIndex int64 `json:"zIndex"`
  499. } `json:"port-bottom"`
  500. Port_left struct {
  501. Attrs struct {
  502. Circle struct {
  503. Fill string `json:"fill"`
  504. Magnet bool `json:"magnet"`
  505. R int64 `json:"r"`
  506. Stroke string `json:"stroke"`
  507. StrokeWidth int64 `json:"strokeWidth"`
  508. } `json:"circle"`
  509. } `json:"attrs"`
  510. Position string `json:"position"`
  511. ZIndex int64 `json:"zIndex"`
  512. } `json:"port-left"`
  513. Port_right struct {
  514. Attrs struct {
  515. Circle struct {
  516. Fill string `json:"fill"`
  517. Magnet bool `json:"magnet"`
  518. R int64 `json:"r"`
  519. Stroke string `json:"stroke"`
  520. StrokeWidth int64 `json:"strokeWidth"`
  521. } `json:"circle"`
  522. } `json:"attrs"`
  523. Position string `json:"position"`
  524. ZIndex int64 `json:"zIndex"`
  525. } `json:"port-right"`
  526. Port_top struct {
  527. Attrs struct {
  528. Circle struct {
  529. Fill string `json:"fill"`
  530. Magnet bool `json:"magnet"`
  531. R int64 `json:"r"`
  532. Stroke string `json:"stroke"`
  533. StrokeWidth int64 `json:"strokeWidth"`
  534. } `json:"circle"`
  535. } `json:"attrs"`
  536. Position string `json:"position"`
  537. ZIndex int64 `json:"zIndex"`
  538. } `json:"port-top"`
  539. } `json:"groups"`
  540. Items []struct {
  541. Group string `json:"group"`
  542. ID string `json:"id"`
  543. } `json:"items"`
  544. } `json:"ports"`
  545. Position struct {
  546. X float64 `json:"x"`
  547. Y float64 `json:"y"`
  548. } `json:"position"`
  549. Shape string `json:"shape"`
  550. Size struct {
  551. Height float64 `json:"height"`
  552. Width float64 `json:"width"`
  553. } `json:"size"`
  554. Source struct {
  555. Cell string `json:"cell"`
  556. Port string `json:"port"`
  557. } `json:"source"`
  558. Target struct {
  559. Cell string `json:"cell"`
  560. Port string `json:"port"`
  561. } `json:"target"`
  562. ZIndex int64 `json:"zIndex"`
  563. } `json:"cells"`
  564. }
  565. // checkoutContent 校验内容是否变更
  566. func checkoutContent(oldContent, reqContent string) (isUpdate bool) {
  567. defer func() {
  568. // 沙盘内容md5比对,不一致则代表有做更改
  569. if utils.MD5(oldContent) != utils.MD5(reqContent) {
  570. isUpdate = true
  571. }
  572. }()
  573. var oldContentInfo, reqContentInfo ContentStruct
  574. err := json.Unmarshal([]byte(oldContent), &oldContentInfo)
  575. if err != nil {
  576. fmt.Println("old json.Unmarshal err:", err)
  577. return
  578. }
  579. oldContentInfoByte, err := json.Marshal(oldContentInfo)
  580. if err != nil {
  581. fmt.Println("old json.Marshal err:", err)
  582. return
  583. }
  584. oldContent = string(oldContentInfoByte)
  585. err = json.Unmarshal([]byte(reqContent), &reqContentInfo)
  586. if err != nil {
  587. fmt.Println("req json.Unmarshal err:", err)
  588. return
  589. }
  590. reqContentInfoByte, err := json.Marshal(reqContentInfo)
  591. if err != nil {
  592. fmt.Println("req json.Marshal err:", err)
  593. return
  594. }
  595. reqContent = string(reqContentInfoByte)
  596. return
  597. }