task-form.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <div class="hc-task-form-body">
  3. <el-tabs v-if="taskInfo.meterType <= 3" v-model="taskTabsKey" type="border-card" @tab-change="taskTabsClick">
  4. <el-tab-pane v-if="taskInfo.meterType === 1" name="key1" label="计量信息">
  5. <HcMiddlepayForm :table="tableInfo" :info="taskInfo" :is-edit="isEdits" />
  6. </el-tab-pane>
  7. <el-tab-pane v-if="taskInfo.meterType === 1" label="质保资料" name="key2">
  8. <HcMassForm :table="tableInfo" :info="taskInfo" :is-edit="isEdits" />
  9. </el-tab-pane>
  10. <el-tab-pane v-if="taskInfo.meterType !== 1" label="详细信息" name="key4">
  11. <HcMaterialForm v-if="taskInfo.meterType === 2" :table="tableInfo" :info="taskInfo" :is-edit="isEdits" />
  12. <HcStartWorkForm v-if="taskInfo.meterType === 3" :table="tableInfo" :info="taskInfo" :is-edit="isEdits" />
  13. </el-tab-pane>
  14. <template v-if="!isNullES(detailInfo.opinionType)">
  15. <el-tab-pane v-if="detailInfo.opinionType !== 4" name="key3" label="审计咨询意见">
  16. <HcHtmlForm ref="htmlFormRef" :detail="detailInfo" />
  17. </el-tab-pane>
  18. </template>
  19. </el-tabs>
  20. <HcAlterForm v-if="taskInfo.meterType === 4" :table="tableInfo" :info="taskInfo" :is-edit="isEdits" />
  21. <hc-card-item v-if="taskTabsKey !== 'key3' && taskTabsKey !== 'key2'" class="hc-card-footer mt-3">
  22. <template #header>
  23. <el-radio-group v-model="taskForm.auditStatus" size="large" :disabled="!isEdits || tableInfo.status === 2">
  24. <el-radio :value="1">同意</el-radio>
  25. <el-radio :value="2">驳回</el-radio>
  26. </el-radio-group>
  27. </template>
  28. <template #extra>
  29. <el-link type="primary" :disabled="taskForm.auditStatus === 0 || !isEdits || tableInfo.status === 2" @click="tableSubmitClick">
  30. <hc-icon name="check" />
  31. <span class="ml-1">这里点提交</span>
  32. </el-link>
  33. </template>
  34. <div class="relative">
  35. <el-input v-model="taskForm.repealDesc" :autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isEdits || tableInfo.status === 2" type="textarea" placeholder="请描述废除整条任务的原因" />
  36. </div>
  37. </hc-card-item>
  38. </div>
  39. </template>
  40. <script setup>
  41. import { onMounted, ref, watch } from 'vue'
  42. import { useAppStore } from '~src/store'
  43. import { getObjValue, isNullES } from 'js-fast-way'
  44. import HcMiddlepayForm from './middlepay-form.vue'
  45. import HcMassForm from './mass-form.vue'
  46. import HcStartWorkForm from './start-work-form.vue'
  47. import HcAlterForm from './alter-form.vue'
  48. import HcMaterialForm from './material-form.vue'
  49. import HcHtmlForm from './html-form.vue'
  50. import mainApi from '~api/tasks/hc-data'
  51. const props = defineProps({
  52. isEdit: {
  53. type: Boolean,
  54. default: true,
  55. },
  56. info: {
  57. type: Object,
  58. default: () => ({}),
  59. },
  60. table: {
  61. type: Object,
  62. default: () => ({}),
  63. },
  64. detail: {
  65. type: Object,
  66. default: () => ({}),
  67. },
  68. })
  69. //事件
  70. const emit = defineEmits(['tabTap', 'finish'])
  71. const useAppState = useAppStore()
  72. const projectId = ref(useAppState.getProjectId || '')
  73. const contractId = ref(useAppState.getContractId || '')
  74. const taskInfo = ref(props.info)
  75. const tableInfo = ref(props.table)
  76. const detailInfo = ref(props.detail)
  77. //选项卡被切换
  78. const taskTabsKey = ref('key1')
  79. const taskTabsClick = (key) => {
  80. taskTabsKey.value = key
  81. emit('tabTap', key)
  82. }
  83. //监听可否编辑
  84. const isEdits = ref(props.isEdit)
  85. watch(() => props.isEdit, (val) => {
  86. isEdits.value = val
  87. }, { immediate: true, deep: true })
  88. //监听数据
  89. watch(() => [props.table, props.info, props.detail], ([table, row, detail]) => {
  90. tableInfo.value = table
  91. taskInfo.value = row
  92. taskForm.value = { auditStatus: table.status ?? 0, repealDesc: table.repealDesc ?? '' }
  93. detailInfo.value = detail
  94. }, { deep: true })
  95. //渲染完成
  96. onMounted(() => {
  97. const { status, repealDesc } = tableInfo.value
  98. const { meterType } = taskInfo.value
  99. taskForm.value = { auditStatus: status ?? 0, repealDesc: repealDesc ?? '' }
  100. taskTabsKey.value = meterType !== 1 ? 'key4' : 'key1'
  101. console.log(meterType)
  102. })
  103. //审批表单
  104. const taskForm = ref({ auditStatus: 0, repealDesc: '' })
  105. //单条提交
  106. const htmlFormRef = ref(null)
  107. const tableSubmitClick = async () => {
  108. const { auditStatus, repealDesc } = taskForm.value
  109. if (auditStatus === 0) {
  110. window.$message.error('请先选择同意或驳回')
  111. return
  112. }
  113. if (auditStatus === 2 && !repealDesc) {
  114. window.$message.error('请先填写驳回原因')
  115. return
  116. }
  117. //发起请求
  118. const { error, code, msg } = await mainApi.taskAudit({
  119. ...taskForm.value,
  120. dataId: tableInfo.value.id,
  121. taskId: taskInfo.value.id,
  122. projectId: projectId.value,
  123. contractId: contractId.value,
  124. })
  125. if (!error && code === 200) {
  126. window.$message.success('提交成功')
  127. emit('finish')
  128. } else {
  129. window.$message.error(msg ?? '提交失败')
  130. }
  131. }
  132. //获取表单数据
  133. const getTableForm = () => {
  134. const res = htmlFormRef.value?.getTableForm()
  135. return getObjValue(res)
  136. }
  137. defineExpose({
  138. getTableForm,
  139. })
  140. </script>
  141. <style lang="scss" scoped>
  142. .hc-task-form-body {
  143. position: relative;
  144. }
  145. </style>
  146. <style lang="scss">
  147. .hc-task-form-body .hc-card-item-box {
  148. background: #f6f6f6 !important;
  149. }
  150. .hc-task-form-body .hc-card-item-box.hc-card-footer {
  151. background: white !important;
  152. }
  153. .hc-task-form-body .el-tabs--border-card>.el-tabs__content {
  154. padding: 6px;
  155. }
  156. </style>