sandbox.go 20 KB

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