cross-add.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <template>
  2. <hc-new-dialog
  3. v-model="editModal"
  4. is-table
  5. :title="editModalTitle"
  6. widths="85rem"
  7. :loading="confirmLoad"
  8. @close="closeModal"
  9. @save="confirmLink"
  10. >
  11. <el-form
  12. ref="formRef"
  13. :model="formData"
  14. :disabled="formDisabled"
  15. >
  16. <!-- 测量者信息 -->
  17. <div class="section-title">
  18. <!-- 左侧蓝色圆点标识 -->
  19. <div class="title-dot" />
  20. <!-- 标题文本 -->
  21. <div class="title-text">测量者信息</div>
  22. </div>
  23. <el-row :gutter="20">
  24. <el-col :span="8">
  25. <el-form-item label="隧道名称" prop="channelName">
  26. <el-input v-model="formData.channelName" placeholder="请输入" />
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="8">
  30. <el-form-item label="测量时间" prop="date">
  31. <el-date-picker
  32. v-model="formData.date"
  33. style="width: 100%;"
  34. type="date"
  35. placeholder="请选择"
  36. value-format="YYYY-MM-DD HH:mm:ss"
  37. />
  38. </el-form-item>
  39. </el-col>
  40. <el-col :span="8">
  41. <el-form-item label="测量者" prop="userName">
  42. <el-input v-model="formData.userName" placeholder="请输入" />
  43. </el-form-item>
  44. </el-col>
  45. </el-row>
  46. <!-- 基础数据 -->
  47. <div class="section-title">
  48. <!-- 左侧蓝色圆点标识 -->
  49. <div class="title-dot" />
  50. <!-- 标题文本 -->
  51. <div class="title-text">基础数据</div>
  52. </div>
  53. <el-row :gutter="20">
  54. <el-col :span="8">
  55. <el-form-item label="仪器高度" prop="deviceHeight">
  56. <ElInput v-model="formData.deviceHeight" placeholder="请输入" />
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="8">
  60. <el-form-item label="方向偏移量(X)" prop="x0">
  61. <ElInput v-model="formData.x0" placeholder="请输入" />
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="8">
  65. <el-form-item label="方向偏移量(Y)" prop="z0">
  66. <ElInput v-model="formData.z0" placeholder="请输入" />
  67. </el-form-item>
  68. </el-col>
  69. </el-row>
  70. <!-- 标准断面 -->
  71. <div class="section-title">
  72. <!-- 左侧蓝色圆点标识 -->
  73. <div class="title-dot" />
  74. <!-- 标题文本 -->
  75. <div class="title-text">标准断面</div>
  76. </div>
  77. <el-row v-for="(eleItem, eleIndex) in formData.sectionBeans" :key="eleIndex" :gutter="20">
  78. <el-col :span="4">
  79. <el-form-item label="方向" prop="direction">
  80. <!-- <ElInput v-model="eleItem.direction" placeholder="请输入" /> -->
  81. <el-select
  82. v-model="eleItem.direction"
  83. size="small"
  84. style="width: 100%"
  85. >
  86. <el-option label="顺时针" value="true" />
  87. <el-option label="逆时针" value="false" />
  88. </el-select>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="4">
  92. <el-form-item label="起角" prop="startAngle">
  93. <ElInput v-model="eleItem.startAngle" placeholder="请输入" />
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="4">
  97. <el-form-item label="终角" prop="endAngle">
  98. <ElInput v-model="eleItem.endAngle" placeholder="请输入" />
  99. </el-form-item>
  100. </el-col>
  101. <el-col :span="4">
  102. <el-form-item label="半径" prop="radius">
  103. <ElInput v-model="eleItem.radius" placeholder="请输入" />
  104. </el-form-item>
  105. </el-col>
  106. <el-col :span="4">
  107. <el-form-item label="圆心(X)" prop="x">
  108. <ElInput v-model="eleItem.x" placeholder="请输入" />
  109. </el-form-item>
  110. </el-col>
  111. <el-col :span="4">
  112. <el-form-item label="圆心(Z)" prop="y">
  113. <ElInput v-model="eleItem.y" placeholder="请输入" />
  114. </el-form-item>
  115. </el-col>
  116. </el-row>
  117. <!-- 测量点数组 -->
  118. <div class="section-title">
  119. <!-- 左侧蓝色圆点标识 -->
  120. <div class="title-dot" />
  121. <!-- 标题文本 -->
  122. <div class="title-text">测量点数组</div>
  123. </div>
  124. <HcTable is-new :column="tableColumn" :datas="formData.data">
  125. <template #angle="{ row }">
  126. <el-input v-model="row.angle" size="small" />
  127. </template>
  128. <template #dist="{ row }">
  129. <el-input v-model="row.dist" size="small" />
  130. </template>
  131. <template #x="{ row }">
  132. <el-input v-model="row.x" size="small" />
  133. </template>
  134. <template #z="{ row }">
  135. <el-input v-model="row.z" size="small" />
  136. </template>
  137. <template #backBreak="{ row }">
  138. <el-input v-model="row.backBreak" size="small" />
  139. </template>
  140. </HcTable>
  141. </el-form>
  142. </hc-new-dialog>
  143. </template>
  144. <script setup>
  145. import { defineModel, onMounted, ref, watch } from 'vue'
  146. import { getObjValue } from 'js-fast-way'
  147. import { getDictionaryData } from '~uti/tools'
  148. import crossApi from '~api/cross/cross'
  149. const props = defineProps({
  150. formDisabled: {
  151. type: Boolean,
  152. default: false,
  153. },
  154. rowId: {
  155. type: String,
  156. default: '',
  157. },
  158. })
  159. const emit = defineEmits(['save'])
  160. const formDisabled = ref(props.formDisabled)
  161. const rowId = ref(props.rowId)
  162. // 双向绑定弹窗显示状态
  163. const editModal = defineModel('modelValue', {
  164. default: false,
  165. })
  166. const editModalTitle = ref('编辑')
  167. watch(() => props.formDisabled, (val) => {
  168. formDisabled.value = val
  169. editModalTitle.value = val ? '查看详情' : '编辑'
  170. })
  171. watch(() => props.rowId, (val) => {
  172. rowId.value = val
  173. if (val) {
  174. getOneDetail(val)
  175. }
  176. })
  177. const tasksStatus = ref([
  178. ])
  179. const getTasksStatusOptions = async () => {
  180. tasksStatus.value = await getDictionaryData('q_profiler_back_break', true)
  181. tasksStatus.value.forEach(item => {
  182. item.value = String(item.value)
  183. })
  184. }
  185. // 监听弹窗显示状态,每次打开时加载选项
  186. watch(editModal, (newVal) => {
  187. if (newVal) { // 当弹窗被打开时
  188. // getTasksStatusOptions()
  189. }
  190. })
  191. const getOneDetail = async (id)=>{
  192. confirmLoad.value = true
  193. const { error, code, data } = await crossApi.getOne({
  194. id,
  195. })
  196. //判断状态
  197. confirmLoad.value = false
  198. if (!error && code === 200) {
  199. console.log(data, '详情')
  200. formData.value = getObjValue(data)
  201. const { sectionBeans } = data
  202. if (sectionBeans.length === 0) {
  203. formData.value.sectionBeans = [{}]
  204. }
  205. } else {
  206. formData.value = {}
  207. }
  208. }
  209. // 表单引用
  210. const formRef = ref(null)
  211. // 加载状态
  212. const confirmLoad = ref(false)
  213. // 表单数据结构
  214. const formData = ref({
  215. channelName: '',
  216. date: '',
  217. userName: '',
  218. deviceHeight: '',
  219. x0: '',
  220. z0: '',
  221. direction: '',
  222. startAngle: '',
  223. endAngle: '',
  224. radius: '',
  225. x: '',
  226. z: '',
  227. data: [
  228. ],
  229. })
  230. const tableColumn = [
  231. { key: 'angle', name: '测点角度' },
  232. { key: 'dist', name: '距离' },
  233. { key: 'x', name: 'X坐标' },
  234. { key: 'z', name: 'Y坐标' },
  235. { key: 'backBreak', name: '超/欠挖值' },
  236. ]
  237. // 添加新的测量点
  238. // 关闭弹窗
  239. const closeModal = () => {
  240. editModal.value = false
  241. }
  242. // 确认提交
  243. const confirmLink = async () => {
  244. // 表单验证
  245. if (formRef.value) {
  246. const valid = await formRef.value.validate()
  247. if (!valid) return
  248. }
  249. confirmLoad.value = true
  250. // 检查sectionBeans是否为[{}]
  251. if (formData.value.sectionBeans && formData.value.sectionBeans.length === 1 && Object.keys(formData.value.sectionBeans[0]).length === 0) {
  252. formData.value.sectionBeans = []
  253. }
  254. const { error, code, msg } = await crossApi.edit(formData.value)
  255. //判断状态
  256. confirmLoad.value = false
  257. if (!error && code === 200) {
  258. window.$message.success('保存成功')
  259. closeModal()
  260. emit('save')
  261. }
  262. }
  263. </script>
  264. <style lang="scss" scoped>
  265. .section-title {
  266. display: flex;
  267. align-items: center;
  268. /* 可根据需要调整整体边距 */
  269. margin: 15px 0;
  270. }
  271. .title-dot {
  272. width: 8px;
  273. height: 20px;
  274. border-radius: 20px;
  275. background-color:var(--el-color-primary); /* Element UI主题蓝 */
  276. margin-right: 8px; /* 圆点与文字间距 */
  277. }
  278. .title-text {
  279. font-size: 16px;
  280. font-weight: 500;
  281. color: #333; /* 标题文字颜色 */
  282. /* 可根据实际设计调整字体样式 */
  283. }
  284. </style>