sandbox.go 20 KB

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