sandbox.go 21 KB

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