hc-data.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <div class="hc-layout-box">
  3. <HcPageHeader v-if="contractInfo?.contractType === 2 || contractInfo?.contractType === 3">
  4. <HcNewSwitch :datas="contractTypeTab" :keys="contractTypeTabKey" size="default" @change="contractTypeTabChange" />
  5. </HcPageHeader>
  6. <div class="hc-round-chart">
  7. <el-row :gutter="30">
  8. <el-col v-for="item in processMaterialList" :span="6">
  9. <div class="hc-round-chart-card-box">
  10. <div class="hc-card-content-box">
  11. <div class="card-title">{{ item.title }}</div>
  12. <div class="card-ratio-box">
  13. <div class="ratio-num">{{ item.ratio }}</div>
  14. <div class="ratio-text">
  15. <div class="unit">%</div>
  16. <div class="text">完成率</div>
  17. </div>
  18. </div>
  19. <div class="card-amount-box">
  20. <div class="amount-item">
  21. <div class="text">应填(份)</div>
  22. <div class="num">{{ item.amount }}</div>
  23. </div>
  24. <div class="amount-divider" />
  25. <div class="amount-item">
  26. <div class="text">已填(份)</div>
  27. <div class="num">{{ item.successAmount }}</div>
  28. </div>
  29. </div>
  30. </div>
  31. <div class="hc-card-chart-box">
  32. <RoundChart :ratio="item.ratio" />
  33. <div class="text-num">{{ item.ratio }}%</div>
  34. </div>
  35. </div>
  36. </el-col>
  37. </el-row>
  38. </div>
  39. <div class="hc-chart-flex">
  40. <el-row :gutter="30" class="h-full">
  41. <el-col :span="18" class="h-full">
  42. <div class="hc-report-chart-card-box">
  43. <div class="hc-chart-title">
  44. <span class="title">报表资料审批统计</span>
  45. <span class="hc-chart-text">(已审批{{ materialList }}份)</span>
  46. </div>
  47. <div class="hc-report-chart-box">
  48. <ReportChart :datas="processMaterialStatusList" />
  49. </div>
  50. </div>
  51. </el-col>
  52. <el-col :span="6" class="h-full">
  53. <div class="hc-media-chart-card-box">
  54. <div class="hc-chart-title">
  55. <span class="title">声像媒体资料统计</span>
  56. <el-button round size="large" @click="toTableClick">
  57. <span>WBS节点进度</span>
  58. <HcIcon name="arrow-right-s" style="margin-right: 0;" ui="ml-2" />
  59. </el-button>
  60. </div>
  61. <div class="hc-media-chart-box">
  62. <div class="hc-media-pian-box">
  63. <div class="item">
  64. <span class="name">总计</span>
  65. <span class="num">{{ imageClassInfo.amount }}</span>
  66. </div>
  67. <div class="item">
  68. <span class="name">图片</span>
  69. <span class="num c1">{{ imageClassInfo.image }}</span>
  70. </div>
  71. <div class="item">
  72. <span class="name">视频</span>
  73. <span class="num c2">{{ imageClassInfo.video }}</span>
  74. </div>
  75. </div>
  76. <MediaChart :datas="contractImageClassificationList" />
  77. </div>
  78. </div>
  79. </el-col>
  80. </el-row>
  81. </div>
  82. </div>
  83. </template>
  84. <script setup>
  85. import { onMounted, ref } from 'vue'
  86. import { useRouter } from 'vue-router'
  87. import { useAppStore } from '~src/store'
  88. import RoundChart from './components/echarts/RoundChart.vue'
  89. import ReportChart from './components/echarts/ReportChart.vue'
  90. import MediaChart from './components/echarts/MediaChart.vue'
  91. import { getArrValue } from 'js-fast-way'
  92. import DataApi from '~api/schedule/data'
  93. //变量
  94. const router = useRouter()
  95. const useAppState = useAppStore()
  96. const projectId = ref(useAppState.getProjectId)
  97. const contractId = ref(useAppState.getContractId)
  98. const contractInfo = ref(useAppState.getContractInfo)
  99. const isCollapse = ref(useAppState.getCollapse)
  100. //渲染完成
  101. onMounted(() => {
  102. queryMaterialProgress()
  103. queryMaterialProgressStatus()
  104. queryImageClassification()
  105. })
  106. //结构类型tab数据和相关处理
  107. const contractTypeTabKey = ref(2)
  108. const contractTypeTab = ref([
  109. { key: '1', name: '施工数据' },
  110. { key: '2', name: '监理数据' },
  111. ])
  112. const contractTypeTabChange = (item) => {
  113. contractTypeTabKey.value = item?.key
  114. queryMaterialProgress()
  115. queryMaterialProgressStatus()
  116. queryImageClassification()
  117. }
  118. //获取合同段类型
  119. const getContractTypeKey = () => {
  120. const { contractType } = contractInfo.value
  121. if (contractType === 2 || contractType === 3) {
  122. return contractTypeTabKey.value ?? '1'
  123. } else {
  124. return null
  125. }
  126. }
  127. //查询内业资料进度
  128. const isProcessLoading = ref(false)
  129. const processMaterialList = ref([])
  130. const queryMaterialProgress = async () => {
  131. isProcessLoading.value = true
  132. const classifyType = getContractTypeKey()
  133. const { error, code, data } = await DataApi.queryMaterialProgress({
  134. projectId: projectId.value,
  135. contractId: contractId.value,
  136. classifyType: classifyType,
  137. })
  138. //处理数据
  139. isProcessLoading.value = false
  140. if (!error && code === 200) {
  141. processMaterialList.value = getArrValue(data?.processMaterialList)
  142. } else {
  143. processMaterialList.value = []
  144. }
  145. }
  146. //报表资料审批统计
  147. const materialList = ref(0)
  148. const isMaterialLoading = ref(false)
  149. const processMaterialStatusList = ref([])
  150. const queryMaterialProgressStatus = async () => {
  151. isMaterialLoading.value = true
  152. const classifyType = getContractTypeKey()
  153. const { error, code, data } = await DataApi.queryMaterialProgressStatus({
  154. projectId: projectId.value,
  155. contractId: contractId.value,
  156. classifyType: classifyType,
  157. })
  158. //处理数据
  159. isMaterialLoading.value = false
  160. if (!error && code === 200) {
  161. let num = 0
  162. const listData = getArrValue(data?.processMaterialStatusList)
  163. for (let i = 0; i < listData.length; i++) {
  164. const Amount = listData[i]?.approvalAmount || 0
  165. num += Amount
  166. }
  167. materialList.value = num
  168. processMaterialStatusList.value = listData
  169. } else {
  170. materialList.value = 0
  171. processMaterialStatusList.value = []
  172. }
  173. }
  174. //声像媒体资料统计
  175. const isImageClassLoading = ref(false)
  176. const contractImageClassificationList = ref([])
  177. const imageClassInfo = ref({ amount: 0, image: 0, video: 0 })
  178. const queryImageClassification = async () => {
  179. isImageClassLoading.value = true
  180. const classifyType = getContractTypeKey()
  181. const { error, code, data } = await DataApi.queryImageClassification({
  182. projectId: projectId.value,
  183. contractId: contractId.value,
  184. classifyType: classifyType,
  185. })
  186. //处理数据
  187. isImageClassLoading.value = false
  188. if (!error && code === 200) {
  189. const imageClassList = getArrValue(data?.contractImageClassificationList)
  190. contractImageClassificationList.value = imageClassList
  191. //数据显示
  192. let AxisData = { amount: 0, image: 0, video: 0 }
  193. for (let i = 0; i < imageClassList.length; i++) {
  194. AxisData.amount = imageClassList[i].amount
  195. AxisData.image = imageClassList[i].imageAmount
  196. AxisData.video = imageClassList[i].videoAmount
  197. }
  198. imageClassInfo.value = AxisData
  199. } else {
  200. contractImageClassificationList.value = []
  201. }
  202. }
  203. //查看WBS节点进度
  204. const toTableClick = () => {
  205. router.push({ path: '/schedule/table' })
  206. }
  207. </script>
  208. <style lang="scss" scoped>
  209. @import "../../styles/schedule/hc-data.scss";
  210. </style>