common.ts 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. import { ref } from "vue";
  2. import { useRouter, useRoute } from "vue-router";
  3. import router from "@/router/index";
  4. import { useUser } from "@/services/user";
  5. import {
  6. showNotification,
  7. Meta2dBackData,
  8. dealwithFormatbeforeOpen,
  9. gotoAccount,
  10. checkData,
  11. } from "@/services/utils";
  12. import { NotifyPlugin, MessagePlugin } from "tdesign-vue-next";
  13. import localforage from "localforage";
  14. import { noLoginTip, localMeta2dDataName } from "@/services/utils";
  15. import { readFile, upload, dataURLtoBlob } from "@/services/file";
  16. import {
  17. delImage,
  18. getFolders,
  19. addCollection,
  20. updateCollection,
  21. updateFolders,
  22. cdn,
  23. upCdn,
  24. } from "@/services/api";
  25. import { compareVersion, baseVer, upgrade } from "@/services/upgrade";
  26. const dot = ref(false);
  27. export const useDot = () => {
  28. const getDot = async () => {
  29. return dot;
  30. };
  31. const setDot = async (value: boolean) => {
  32. dot.value = value;
  33. };
  34. return {
  35. dot,
  36. getDot,
  37. setDot,
  38. };
  39. };
  40. // import { noLoginTip } from "@/services/utils";
  41. const { user } = useUser();
  42. // const route = useRoute();
  43. // const router = useRouter();
  44. export enum SaveType {
  45. Save,
  46. SaveAs,
  47. }
  48. export const save = async (
  49. type: SaveType = SaveType.Save,
  50. component?: boolean
  51. ) => {
  52. meta2d.stopAnimate();
  53. const data: Meta2dBackData = meta2d.data();
  54. if (!(user && user.username)) {
  55. MessagePlugin.warning(noLoginTip);
  56. localforage.setItem(localMeta2dDataName, JSON.stringify(data));
  57. return;
  58. }
  59. checkData(data);
  60. if (!data._id && router.currentRoute.value.query.id) {
  61. data._id = router.currentRoute.value.query.id as string;
  62. }
  63. if (
  64. (globalThis as any).beforeSaveMeta2d &&
  65. !(await (globalThis as any).beforeSaveMeta2d(data))
  66. ) {
  67. return;
  68. }
  69. if (type === SaveType.SaveAs) {
  70. //另存为去掉teams信息
  71. delete data.teams;
  72. }
  73. //如果不是自己创建的团队图纸,就不去修改缩略图(没有权限去删除缩略图)
  74. if (!((data as any).teams && data.owner?.id !== user.id)) {
  75. let blob: Blob;
  76. try {
  77. blob = dataURLtoBlob(meta2d.toPng(10) + "");
  78. } catch (e) {
  79. MessagePlugin.error(
  80. "无法下载,宽度不合法,画布可能没有画笔/画布大小超出浏览器最大限制"
  81. );
  82. return;
  83. }
  84. if (data._id && type === SaveType.Save) {
  85. if (data.image && !(await delImage(data.image))) {
  86. return;
  87. }
  88. }
  89. const file = await upload(blob, true);
  90. if (!file) {
  91. return;
  92. }
  93. // 缩略图
  94. data.image = file.url;
  95. (meta2d.store.data as Meta2dBackData).image = data.image;
  96. }
  97. if (component) {
  98. data.component = true;
  99. // pens 存储原数据用于二次编辑 ; componentDatas 组合后的数据,用于复用
  100. data.componentDatas = meta2d.toComponent(
  101. undefined,
  102. (meta2d.store.data as Meta2dBackData).showChild,
  103. false //自定义组合节点生成默认锚点
  104. );
  105. } else {
  106. data.component = false; // 必要值
  107. }
  108. let collection = data.component ? "le5le2d-components" : "le5le2d";
  109. let ret: any;
  110. if (!data.name) {
  111. // 文件名称
  112. data.name = `meta2d.${new Date().toLocaleString()}`;
  113. (meta2d.store.data as Meta2dBackData).name = data.name;
  114. }
  115. !data.version && (data.version = baseVer);
  116. let list = undefined;
  117. let folder: any = undefined;
  118. let folderId = undefined;
  119. if (
  120. !data.component &&
  121. data.folder &&
  122. !(data.teams && data.owner?.id !== user.id)
  123. ) {
  124. //自己的图纸才允许去请求
  125. folder = getFolders({
  126. type: collection,
  127. name: data.folder,
  128. });
  129. if (folder) {
  130. list = folder.list; //团队图纸文件夹
  131. folderId = folder._id;
  132. }
  133. }
  134. if (!list) {
  135. list = [];
  136. }
  137. if (type === SaveType.SaveAs) {
  138. // 另存为一定走 新增 ,由于后端 未控制 userId 等属性,清空一下
  139. const delAttrs = [
  140. "userId",
  141. "id",
  142. "shared",
  143. "star",
  144. "view",
  145. "username",
  146. "editorName",
  147. "editorId",
  148. "createdAt",
  149. "updatedAt",
  150. "recommend",
  151. ];
  152. for (const k of delAttrs) {
  153. delete (data as any)[k];
  154. }
  155. ret = addCollection(collection, data); // 新增
  156. if (!data.component) {
  157. list.push({
  158. id: ret._id,
  159. image: data.image,
  160. name: data.name,
  161. component: data.component,
  162. });
  163. }
  164. } else {
  165. if (data._id && data.teams && data.owner?.id !== user.id) {
  166. // 团队图纸 不允许修改文件夹信息
  167. delete data.folder;
  168. ret = updateCollection(collection, data);
  169. } else if (data._id) {
  170. ret = updateCollection(collection, data);
  171. if (!data.component) {
  172. list.forEach((i: any) => {
  173. if (i.id === data._id) {
  174. i.image = data.image;
  175. }
  176. });
  177. }
  178. //TODO 处理老接口图纸情况
  179. let one = list.find((item: any) => item.id === data._id);
  180. if (!data.component && !one) {
  181. list.push({
  182. id: ret._id,
  183. image: data.image,
  184. name: data.name,
  185. component: data.component,
  186. });
  187. }
  188. } else {
  189. ret = addCollection(collection, data); // 新增
  190. if (!data.component) {
  191. list.push({
  192. id: ret._id,
  193. image: data.image,
  194. name: data.name,
  195. component: data.component,
  196. });
  197. }
  198. }
  199. }
  200. if (ret.error) {
  201. return null;
  202. } else {
  203. if (!data.component && folderId) {
  204. const updateRet: any = updateFolders({
  205. _id: folderId,
  206. list,
  207. });
  208. if (updateRet.error) {
  209. return null;
  210. }
  211. }
  212. // showModelSaveAsPop.value = false;
  213. }
  214. // 保存图纸之后的钩子函数
  215. (window as any).afterSaveMeta2d &&
  216. (await (window as any).afterSaveMeta2d(ret));
  217. if (
  218. !data._id ||
  219. data.owner?.id !== user.id ||
  220. router.currentRoute.value.query.version ||
  221. type === SaveType.SaveAs // 另存为肯定走新增,也会产生新的 id
  222. ) {
  223. data._id = ret._id;
  224. (meta2d.store.data as Meta2dBackData)._id = data._id;
  225. router.replace({
  226. path: "/",
  227. query: {
  228. id: data._id,
  229. r: Date.now() + "",
  230. component: data.component + "",
  231. },
  232. });
  233. }
  234. MessagePlugin.success("保存成功!");
  235. // 保存成功,重新请求文件夹
  236. meta2d.emit("t-save-success", true);
  237. // 已保存,不再是新的,无需提示保存
  238. // setDot(false);
  239. dot.value = false;
  240. localforage.removeItem(localMeta2dDataName);
  241. };
  242. const pen = ref(false);
  243. const drawPen = () => {
  244. meta2d.inactive();
  245. try {
  246. if (!meta2d.canvas.drawingLineName) {
  247. // 开了钢笔,需要关掉铅笔
  248. meta2d.canvas.pencil && drawingPencil();
  249. meta2d.drawLine(meta2d.store.options.drawingLineName);
  250. } else {
  251. meta2d.finishDrawLine();
  252. meta2d.drawLine();
  253. }
  254. //钢笔
  255. pen.value = !!meta2d.canvas.drawingLineName;
  256. } catch (e: any) {
  257. MessagePlugin.warning(e.message);
  258. }
  259. };
  260. const pencil = ref(false);
  261. const drawingPencil = () => {
  262. try {
  263. if (!meta2d.canvas.pencil) {
  264. // 开了铅笔需要关掉钢笔
  265. meta2d.canvas.drawingLineName && drawPen();
  266. meta2d.drawingPencil();
  267. } else {
  268. meta2d.stopPencil();
  269. }
  270. pencil.value = meta2d.canvas.pencil || false;
  271. } catch (e: any) {
  272. MessagePlugin.warning(e.message);
  273. }
  274. };
  275. const magnifier = ref(false);
  276. export const showMagnifier = () => {
  277. if (!meta2d.canvas.magnifierCanvas.magnifier) {
  278. meta2d.showMagnifier();
  279. } else {
  280. meta2d.hideMagnifier();
  281. }
  282. magnifier.value = meta2d.canvas.magnifierCanvas.magnifier;
  283. };
  284. const map = ref(false);
  285. export const showMap = () => {
  286. if (!meta2d.map?.isShow) {
  287. meta2d.showMap();
  288. } else {
  289. meta2d.hideMap();
  290. }
  291. map.value = meta2d.map?.isShow;
  292. };
  293. export const title = "系统可能不会保存您所做的更改,是否继续?";
  294. export const newFile = async () => {
  295. if (dot.value) {
  296. if (await showNotification(title)) {
  297. newfile(false);
  298. }
  299. } else {
  300. newfile(false);
  301. }
  302. };
  303. export const onScaleWindow = () => {
  304. // meta2d.fitView();
  305. meta2d.fitSizeView(true, 32);
  306. };
  307. export const onScaleView = () => {
  308. meta2d.scale(1);
  309. // meta2d.centerView();
  310. const { x, y, origin, center } = meta2d.store.data;
  311. meta2d.translate(-x - origin.x, -y - origin.y);
  312. meta2d.translate(meta2d.store.options.x || 0, meta2d.store.options.y || 0);
  313. };
  314. export const newfile = async (noRouter: boolean = false) => {
  315. meta2d.canvas.drawingLineName && drawPen();
  316. meta2d.canvas.pencil && drawingPencil();
  317. meta2d.canvas.magnifierCanvas.magnifier && showMagnifier();
  318. meta2d.map?.isShow && showMap();
  319. // setDot(false);
  320. dot.value = false;
  321. // await localforage.removeItem(localMeta2dDataName);
  322. // 打开文件操作不跳转
  323. // const router = useRouter();
  324. console.log("router", router);
  325. !noRouter &&
  326. router.replace({
  327. path: "/",
  328. query: { r: Date.now() + "" },
  329. });
  330. };