You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
5.2 KiB

  1. <script setup lang="ts">
  2. import { startCraft } from 'apis/crafts'
  3. import { getOreList } from 'apis/ore'
  4. import { FtMessage } from 'libs/message'
  5. import { useHomeStore } from 'stores/homeStore'
  6. import { useSystemStore } from 'stores/systemStore'
  7. import { computed, onMounted, ref } from 'vue'
  8. const emits = defineEmits(['ok', 'cancel'])
  9. const homeStore = useHomeStore()
  10. const systemStore = useSystemStore()
  11. onMounted(() => {
  12. getOres()
  13. })
  14. const form = ref<{
  15. columns?: number[]
  16. craftId?: number
  17. heatId?: number
  18. }>({})
  19. const formRef = ref()
  20. const validateHandle = (rule: any, value: any, callback: any) => {
  21. if (!value?.length) {
  22. callback(new Error('请选择试管'))
  23. }
  24. else {
  25. callback()
  26. }
  27. }
  28. const rules = {
  29. columns: [
  30. { required: true, message: '请选择试管', trigger: 'change', validator: validateHandle },
  31. ],
  32. craftId: [
  33. { required: true, message: '请选择预设', trigger: 'change' },
  34. ],
  35. }
  36. const okHandle = async () => {
  37. try {
  38. const valid = await formRef.value.validate()
  39. if (!valid) {
  40. return
  41. }
  42. await startCraft({
  43. heatId: useHomeStore().heatAreaList.find(item => item.selected)?.value,
  44. ...form.value,
  45. })
  46. FtMessage.success('工艺已开始')
  47. emits('ok')
  48. }
  49. catch (error) {
  50. console.log(error)
  51. }
  52. }
  53. const cancel = () => {
  54. emits('cancel')
  55. }
  56. //
  57. const tubes = computed(() => {
  58. return systemStore.systemStatus.trays?.find(item => item.heatModuleCode === homeStore.heatAreaList.find(item => item.selected)?.value)?.tubes
  59. })
  60. const selectedColumns = ref(Array.from({ length: 5 }).fill(false))
  61. const mousedownHandle = async (index: number) => {
  62. if (!tubes.value?.find(item => item.columnNum === index)?.exists) {
  63. FtMessage.error('该列没有试管')
  64. return
  65. }
  66. selectedColumns.value[index - 1] = !selectedColumns.value[index - 1]
  67. form.value.columns = selectedColumns.value.map((item, index) => {
  68. return item ? index + 1 : false
  69. }).filter(item => item !== false)
  70. formRef.value.validateField('columns')
  71. }
  72. const oreList = ref<Ore.OreItem[]>([])
  73. const getOres = async () => {
  74. const res = await getOreList()
  75. oreList.value = res.list
  76. }
  77. const selectVisible = ref(false)
  78. const checkChange = () => {
  79. selectedColumns.value = Array.from({ length: 5 }).fill(selectVisible.value)
  80. form.value.columns = selectedColumns.value.map((item, index) => index + 1).filter(item => selectedColumns.value[item - 1])
  81. formRef.value.validateField('columns')
  82. }
  83. </script>
  84. <template>
  85. <FtDialog visible title="执行预设" width="40%" :ok-handle="okHandle" @cancel="cancel">
  86. <el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
  87. <el-form-item v-if=" homeStore.heatAreaList.filter(item => item.selected).length" label="加热区">
  88. <el-tag v-for="item in homeStore.heatAreaList.filter(item => item.selected)" :key="item.value" class="mask-tag">
  89. {{ item.label }}
  90. </el-tag>
  91. </el-form-item>
  92. <el-form-item label="选择试管" prop="columns">
  93. <el-checkbox v-model="selectVisible" style="margin-right: 10px" @change="checkChange">
  94. 全选
  95. </el-checkbox>
  96. <div class="tube-item">
  97. <div
  98. v-for="item in 5"
  99. :key="item"
  100. class="tube-line"
  101. :class="{ 'tube-line-active': selectedColumns[item - 1], 'tube-line-disable': homeStore.heatAreaList.filter(item => item.selected).length && !tubes?.find(tu => tu.columnNum === item)?.exists }"
  102. @click.prevent="() => mousedownHandle(item)"
  103. @touch.prevent="() => mousedownHandle(item)"
  104. >
  105. <span v-for="i in 8" :key="i" class="tube-line-inner" />
  106. </div>
  107. </div>
  108. </el-form-item>
  109. <el-form-item label="工艺" prop="craftId">
  110. <el-select v-model="form.craftId" placeholder="请选择工艺">
  111. <el-option-group
  112. v-for="group in oreList"
  113. :key="group.id"
  114. :label="group.oresName"
  115. >
  116. <el-option
  117. v-for="item in group.craftsList"
  118. :key="item.id"
  119. :label="item.name"
  120. :value="item.id"
  121. />
  122. </el-option-group>
  123. </el-select>
  124. </el-form-item>
  125. </el-form>
  126. </FtDialog>
  127. </template>
  128. <style scoped lang="scss">
  129. .el-tag {
  130. margin-right: 5px;
  131. }
  132. .el-row {
  133. height: 450px;
  134. .el-col {
  135. height: 100%;
  136. overflow: auto;
  137. :deep(.el-tag) {
  138. width: 100%;
  139. margin-bottom: 5px;
  140. .el-tag__content {
  141. display: flex;
  142. width: 100%;
  143. justify-content: space-between;
  144. }
  145. }
  146. }
  147. }
  148. .tube-item {
  149. padding: 5px;
  150. background: #384D5D;
  151. border-radius: 10px;
  152. display: grid;
  153. grid-template-columns: repeat(5, 1fr);
  154. grid-template-rows: repeat(1, 1fr);
  155. grid-gap: 5px;
  156. position: relative;
  157. .tube-line {
  158. display: flex;
  159. flex-direction: column;
  160. .tube-line-inner {
  161. display: inline-block;
  162. width: 25px;
  163. height: 25px;
  164. border-radius: 50%;
  165. background: #fff;
  166. margin: 2px;
  167. transition: background 0.5s;
  168. }
  169. }
  170. .tube-line-disable {
  171. .tube-line-inner {
  172. background: #C6C6C6;
  173. }
  174. }
  175. .tube-line-active {
  176. .tube-line-inner {
  177. background: #26D574;
  178. }
  179. }
  180. }
  181. </style>