snAdd.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <script setup lang="ts">
  2. import {
  3. validation_add,
  4. validation_repair,
  5. validation_scrap,
  6. } from '@/api/storehouse'
  7. import {computed, nextTick, reactive, ref} from 'vue'
  8. import type {FormInstance} from 'element-plus'
  9. import {ElMessage} from 'element-plus'
  10. const outerVisible = ref(false)
  11. const submitFormRef = ref<FormInstance | null>(null)
  12. const pageSize = ref(8)
  13. const currentPage = ref(1)
  14. const rulesrepaid = reactive({
  15. T_sn: [{required: true, message: '请输入SN', trigger: 'blur'}]
  16. })
  17. const extractSN = (fullSN: string): string => {
  18. if (fullSN.length === 24 && fullSN.startsWith('03') && fullSN.endsWith('000001')) {
  19. return fullSN.substring(2, 18)
  20. }
  21. return fullSN
  22. }
  23. const handlePageChange = (page: number) => {
  24. currentPage.value = page
  25. }
  26. const data:any = reactive({
  27. title: '',
  28. snItems: [],
  29. fromData: {
  30. T_sn: '',
  31. Validationnumber: '',
  32. T_remark: '',
  33. },
  34. })
  35. const paginatedItems = computed(() => {
  36. if (data.snItems.length === 0) {
  37. return
  38. }
  39. const start = (currentPage.value - 1) * pageSize.value
  40. const end = start + pageSize.value
  41. return data.snItems.slice(start, end)
  42. })
  43. const removeItem = (index: number) => {
  44. data.snItems.splice(index, 1)
  45. ElMessage.success('已从待提交列表中移除')
  46. }
  47. const resetForm = () => {
  48. data.snItems = [];
  49. data.fromData.T_sn = '';
  50. emit('successFun', true);
  51. nextTick(() => {
  52. outerVisible.value = false;
  53. });
  54. }
  55. const submitItems = async () => {
  56. if (data.snItems.length === 0) {
  57. ElMessage.warning('暂无数据可提交')
  58. return
  59. }
  60. console.log("=========",data)
  61. const rest = JSON.parse(JSON.stringify(data.snItems))
  62. switch (data.title) {
  63. case '维修':
  64. const repairResult: any = await validation_repair(rest)
  65. if (repairResult.Code == 200) {
  66. ElMessage.success('提交成功')
  67. resetForm()
  68. } else {
  69. ElMessage.error('提交失败')
  70. }
  71. break
  72. case '报废':
  73. const scrapResult: any = await validation_scrap(rest)
  74. if (scrapResult.Code == 200) {
  75. ElMessage.success('提交成功')
  76. resetForm()
  77. } else {
  78. ElMessage.error('提交失败')
  79. }
  80. break
  81. case '归还':
  82. const returnResult: any = await validation_add(rest)
  83. if (returnResult.Code == 200) {
  84. ElMessage.success('提交成功')
  85. resetForm()
  86. } else {
  87. ElMessage.error('提交失败')
  88. }
  89. break
  90. default:
  91. ElMessage.error('未知操作类型');
  92. break;
  93. }
  94. }
  95. const submitForm = () => {
  96. submitFormRef.value?.validate(async (valid: boolean) => {
  97. if (valid) {
  98. const extractedSN = extractSN(data.fromData.T_sn)
  99. if (data.snItems.some((item: any) => item.T_sn === extractedSN)) {
  100. ElMessage.warning('已存在相同的SN,不能添加')
  101. return
  102. }
  103. data.snItems.unshift({...data.fromData, T_sn: extractedSN})
  104. data.fromData.T_sn = ''
  105. ElMessage.success('已添加到待提交列表')
  106. if ('speechSynthesis' in window) {
  107. const utterance = new SpeechSynthesisUtterance('添加成功')
  108. window.speechSynthesis.speak(utterance)
  109. } else {
  110. console.warn('Web Speech API 不被支持')
  111. }
  112. }
  113. })
  114. }
  115. // ------------- 维修结束
  116. const emit = defineEmits<{ (event: 'successFun', value:boolean): void }>()
  117. defineExpose({
  118. outerVisible, data
  119. })
  120. </script>
  121. <template>
  122. <div class="">
  123. <el-dialog :title="data.title" v-model="outerVisible" width="50%" draggable destroy-on-close>
  124. <el-form :model="data.fromData" :rules="rulesrepaid" ref="submitFormRef">
  125. <el-form-item label="SN" prop="T_sn">
  126. <el-input v-model="data.fromData.T_sn" placeholder="请输入SN" @keyup.enter="submitForm"></el-input>
  127. </el-form-item>
  128. <el-form-item label="备注">
  129. <el-input v-model="data.fromData.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  130. </el-form-item>
  131. </el-form>
  132. <!-- 新增数据条数提示 -->
  133. <div style="margin: 10px 0">
  134. <span>当前待提交数据条数: {{ data.snItems.length }}</span>
  135. </div>
  136. <el-table :data="paginatedItems" style="width: 100%; margin-top: 20px">
  137. <el-table-column type="index" label="序号" width="80"></el-table-column>
  138. <!-- 添加序号列 -->
  139. <el-table-column prop="T_sn" label="SN"></el-table-column>
  140. <el-table-column prop="T_remark" label="备注"></el-table-column>
  141. <el-table-column label="操作" width="180">
  142. <template #default="scope">
  143. <el-button type="danger" size="small" @click="removeItem(scope.$index)">删除</el-button>
  144. </template>
  145. </el-table-column>
  146. </el-table>
  147. <el-pagination
  148. background
  149. layout="prev, pager, next"
  150. :total="data.snItems.length"
  151. :page-size="pageSize"
  152. :current-page="currentPage"
  153. @current-change="handlePageChange"
  154. style="margin-top: 20px; text-align: right"
  155. />
  156. <template #footer>
  157. <span class="dialog-footer">
  158. <el-button @click="outerVisible = false">取消</el-button>
  159. <el-button type="primary" @click="submitForm">添加到暂存</el-button>
  160. <!-- 新增提交按钮 -->
  161. <el-button type="primary" @click="submitItems">提交</el-button>
  162. </span>
  163. </template>
  164. </el-dialog>
  165. </div>
  166. </template>