projectDetail.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <div class="_ProjectDetail">
  3. <div class="detailHeader">
  4. <div>
  5. <div>
  6. <h2>
  7. {{ projectDetail?.['xmmc'] ?? '' }}
  8. <span class="subTitle">({{ projectDetail?.['xmbh'] ?? '' }})</span>
  9. <span class="statu" v-if="projectDetail?.['xmzt'] === 0">立项申请中</span>
  10. <span class="statu" v-else-if="projectDetail?.['xmzt'] === 1">进行中</span>
  11. <span class="statu" v-else-if="projectDetail?.['xmzt'] === 2">已结项</span>
  12. <span class="statu" v-else-if="projectDetail?.['xmzt'] === 3">中止</span>
  13. <span class="statu" v-else-if="projectDetail?.['xmzt'] === 4">已验收</span>
  14. </h2>
  15. </div>
  16. <ul>
  17. <li v-show="currentIndex === 0" @click="editorProject"
  18. >{{ !isEditorProject ? '编辑' : '保存' }}
  19. </li>
  20. <template v-if="projectDetail?.['isSign'] !== 0 && contractData?.flowStatus !== 90">
  21. <el-popconfirm
  22. title="当前存在进行中的合同,是否重复发起?"
  23. v-if="contractData?.flowStatus != null"
  24. @confirm="handleStartContractSign"
  25. >
  26. <template #reference>
  27. <li>合同签订</li>
  28. </template>
  29. </el-popconfirm>
  30. <li v-else @click="handleStartContractSign">合同签订</li>
  31. </template>
  32. <li v-show="currentIndex === 0" @click="addSubProject">添加子项目</li>
  33. <li>验收</li>
  34. <li>结项</li>
  35. <li>查看流程</li>
  36. </ul>
  37. </div>
  38. <div>
  39. <ul>
  40. <li @click="switchComponent(XmxxComp, 0)" :class="currentIndex === 0 ? 'active' : ''">
  41. <div><i class="icon"></i>项目信息</div>
  42. </li>
  43. <li
  44. v-show="contractData?.flowStatus === 90"
  45. @click="switchComponent(XmhtComp, 1)"
  46. :class="currentIndex === 1 ? 'active' : ''"
  47. >
  48. <div><i class="icon"></i>项目合同</div>
  49. </li>
  50. <li @click="switchComponent(XmcbComp, 2)" :class="currentIndex === 2 ? 'active' : ''">
  51. <div><i class="icon"></i>项目成本</div>
  52. </li>
  53. <li @click="switchComponent(FjclComp, 3)" :class="currentIndex === 3 ? 'active' : ''">
  54. <div><i class="icon"></i>附件材料</div>
  55. </li>
  56. </ul>
  57. <div class="projectInfo">
  58. <p>
  59. <span class="title">合同额(元):</span>
  60. <span class="value">{{ projectDetail?.['contractAmount'] ?? '' }}</span>
  61. </p>
  62. <p>
  63. <span class="title">应收款(元):</span>
  64. <span class="value">{{ projectDetail?.['receivableAmount'] ?? '' }}</span>
  65. </p>
  66. <p>
  67. <span class="title">合同余额(元):</span>
  68. <span class="value">{{ projectDetail?.['contractBalance'] ?? '' }}</span>
  69. </p>
  70. </div>
  71. </div>
  72. </div>
  73. <div class="detailContent">
  74. <component
  75. :is="currentComponent"
  76. :detailData="projectDetail"
  77. ref="dynamicRef"
  78. :editor="isEditorProject"
  79. />
  80. </div>
  81. </div>
  82. </template>
  83. <script setup lang="ts">
  84. import { type Component } from 'vue'
  85. import { useRoute } from 'vue-router'
  86. import request from '@/config/axios'
  87. defineOptions({ name: 'ProjectDetail' })
  88. const dynamicRef = shallowRef<Component>()
  89. import XmxxComp from './components/xmxx/index.vue'
  90. import XmhtComp from './components/xmht/index.vue'
  91. import { getContractsByProject, startContractSign, startOutsourcing } from '@/service/contract'
  92. import { openFlow } from '@/utils/flow'
  93. import { useMutation, useQuery } from '@tanstack/vue-query'
  94. import { ProjectId } from '@/interface/project'
  95. import { getProjectWithChildrenById } from '@/service/project'
  96. const router = useRouter()
  97. const XmcbComp = defineAsyncComponent(() => {
  98. return import('./components/xmcb/index.vue')
  99. })
  100. const FjclComp = defineAsyncComponent(() => {
  101. return import('./components/fjcl/index.vue')
  102. })
  103. const { query } = useRoute()
  104. const { id: projectId, contractId } = query
  105. const currentComponent = shallowRef<Component>(XmxxComp)
  106. const currentIndex = ref<number>(0)
  107. const switchComponent: (c: Component, i: number) => void = (c: Component, i: number) => {
  108. currentComponent.value = c
  109. currentIndex.value = i
  110. }
  111. // 添加子项目
  112. const addSubProject: () => void = () => {
  113. dynamicRef.value?.handleAddSubProject()
  114. }
  115. /***
  116. * 查询项目详情
  117. * **/
  118. const { data: projectDetail } = useQuery(
  119. [getProjectWithChildrenById.name, projectId],
  120. async () => await getProjectWithChildrenById(projectId as string),
  121. {
  122. enabled: (query?.id ?? '') !== ''
  123. }
  124. )
  125. /**
  126. * 项目编辑
  127. * **/
  128. const isEditorProject = ref<boolean>(false)
  129. const editorProject: () => void = (): void => {
  130. isEditorProject.value = !isEditorProject.value
  131. if (isEditorProject.value) return
  132. //@ts-ignore
  133. dynamicRef.value.saveProjectHandle()
  134. }
  135. /***
  136. * 查询合同数据
  137. * **/
  138. const { data: contractData } = useQuery(
  139. [getContractsByProject.name, projectId],
  140. async () => await getContractsByProject(projectId as string),
  141. {
  142. onSuccess: (tData) => {
  143. if (tData?.flowStatus === 90 && contractId) {
  144. // 查看合同详情
  145. switchComponent(XmhtComp, 1)
  146. }
  147. },
  148. enabled: (projectId ?? '') !== '',
  149. refetchOnWindowFocus: true
  150. }
  151. )
  152. console.log('contractData: ', unref(contractData))
  153. /**
  154. * 发起合同签订
  155. */
  156. const { mutate: startContractSignMutate } = useMutation(startContractSign, {
  157. onSuccess: (data) => openFlow(router, data, '合同签订')
  158. })
  159. const handleStartContractSign = () => startContractSignMutate(projectId as ProjectId)
  160. </script>
  161. <style lang="scss" scoped>
  162. @import './projectDetail.scss';
  163. </style>