model.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import axios from './instance'
  2. import {
  3. MODEL_LIST,
  4. INSERT_MODEL,
  5. UPDATE_MODEL,
  6. DELETE_MODEL,
  7. UPLOAD_HEADS
  8. } from './constant'
  9. export enum ModelType {
  10. SWKK = 'swkk',
  11. SWKJ = 'swkj',
  12. SWMX = 'glb',
  13. SWSS = 'laser',
  14. }
  15. export const ModelTypeDesc: Record<ModelType, string> = {
  16. [ModelType.SWKK]: '四维看看',
  17. [ModelType.SWKJ]: '四维看见',
  18. [ModelType.SWSS]: '四维深时',
  19. [ModelType.SWMX]: '三维模型',
  20. }
  21. export interface ModelAttrs {
  22. show: boolean,
  23. scale: number,
  24. opacity: number,
  25. bottom: number,
  26. position: SceneLocalPos,
  27. rotation: SceneLocalPos
  28. }
  29. export interface Model extends ModelAttrs {
  30. id: string
  31. url: string
  32. title: string
  33. fusionId?: number,
  34. type: ModelType
  35. size: number,
  36. time: string
  37. }
  38. interface ServiceModel {
  39. createTime: string,
  40. id: number,
  41. hide: number,
  42. modelDateType: string
  43. modelGlbUrl: string
  44. fusionId?: number,
  45. modelSize: number
  46. modelTitle: string
  47. opacity: number
  48. bottom: number
  49. type: number
  50. transform: {
  51. position: SceneLocalPos,
  52. rotation: SceneLocalPos,
  53. scale: [number, number, number]
  54. }
  55. }
  56. const serviceToLocal = (serviceModel: ServiceModel): Model => ({
  57. show: !serviceModel.hide,
  58. scale: serviceModel.transform.scale[0],
  59. opacity: serviceModel.opacity || 1,
  60. bottom: serviceModel.bottom || 0,
  61. position: serviceModel.transform.position,
  62. rotation: serviceModel.transform.rotation,
  63. id: serviceModel.id.toString(),
  64. url: serviceModel.modelGlbUrl,
  65. title: serviceModel.modelTitle,
  66. fusionId: serviceModel.fusionId,
  67. type: serviceModel.type === 2 ? ModelType.SWSS : ModelType.SWMX,
  68. size: serviceModel.modelSize,
  69. time: serviceModel.createTime
  70. })
  71. const localToService = (model: Model): ServiceModel => ({
  72. createTime: model.time,
  73. id: Number(model.id),
  74. hide: Number(!model.show),
  75. fusionId: model.fusionId,
  76. modelDateType: model.type,
  77. modelGlbUrl: model.url,
  78. type: model.type === ModelType.SWSS ? 2 : 3,
  79. modelSize: model.size,
  80. modelTitle: model.title,
  81. opacity: model.opacity,
  82. bottom: model.bottom,
  83. transform: {
  84. position: model.position,
  85. rotation: model.rotation,
  86. scale: [model.scale, model.scale, model.scale]
  87. }
  88. })
  89. export type Models = Model[]
  90. export const fetchModels = async () => {
  91. const serviceModels = await axios.post<ServiceModel[]>(MODEL_LIST)
  92. return serviceModels.map(serviceToLocal)
  93. }
  94. export const postAddModel = async (file: File) => {
  95. const form = new FormData()
  96. form.append('file', file)
  97. const serviceModel = await axios<ServiceModel>({
  98. url: INSERT_MODEL,
  99. method: 'POST',
  100. headers: { ...UPLOAD_HEADS },
  101. data: form
  102. })
  103. return serviceToLocal(serviceModel)
  104. }
  105. export const postUpdateModels = (model: Model) => {
  106. console.log('update', model)
  107. return axios.post<undefined>(UPDATE_MODEL, localToService(model))
  108. }
  109. export const postDeleteModel = (id: Model['id']) => {
  110. console.log('delete')
  111. return axios.post<undefined>(DELETE_MODEL, {ids: [id]})
  112. }