internal.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. <template>
  2. <HcNewCard>
  3. <template #header>
  4. <div class="w-32">
  5. <el-select v-model="searchInternalForm.taskStatus" clearable placeholder="审批状态">
  6. <el-option v-for="item in InternalApproval" :key="item.value" :label="item.label" :value="item.value" />
  7. </el-select>
  8. </div>
  9. <div class="w-32 ml-2">
  10. <el-select v-model="searchInternalForm.isEvaluate" clearable placeholder="是否评定">
  11. <el-option v-for="item in InternalAssess" :key="item.value" :label="item.label" :value="item.value" />
  12. </el-select>
  13. </div>
  14. <div class="w-32 ml-2">
  15. <el-select v-model="searchInternalForm.reportNumber" clearable placeholder="上报批次">
  16. <el-option v-for="item in InternalReportBatch" :key="item" :label="item" :value="item" />
  17. </el-select>
  18. </div>
  19. <div class="w-32 ml-2">
  20. <el-select v-model="searchInternalForm.isExperiment" clearable placeholder="关联试验">
  21. <el-option v-for="item in InternalAssociation" :key="item.value" :label="item.label" :value="item.value" />
  22. </el-select>
  23. </div>
  24. <div class="w-60 ml-2">
  25. <el-input v-model="searchInternalForm.queryStr" clearable placeholder="请输入名称关键词检索" @keyup="searchInternalKeyUp" />
  26. </div>
  27. <div class="ml-2">
  28. <el-button type="primary" @click="searchInternalClick">
  29. <HcIcon name="search-2" />
  30. <span>搜索</span>
  31. </el-button>
  32. </div>
  33. </template>
  34. <template #extra>
  35. <HcTooltip keys="write_industry_download">
  36. <el-button :disabled="tableInternalKeys.length <= 0" :loading="downloadLoading" hc-btn type="primary" @click="batchDownload">
  37. <HcIcon name="download" />
  38. <span>下载</span>
  39. </el-button>
  40. </HcTooltip>
  41. <HcTooltip keys="write_industry_print">
  42. <el-button :disabled="tableInternalKeys.length <= 0" :loading="printLoading" hc-btn @click="batchPrint">
  43. <HcIcon name="printer" />
  44. <span>打印</span>
  45. </el-button>
  46. </HcTooltip>
  47. </template>
  48. <HcTable
  49. ref="tableInternalRef" :column="tableInternalColumn" :datas="tableInternalData" :loading="tableInternalLoading"
  50. is-new :index-style="{ width: 60 }" is-check :check-style="{ width: 29 }"
  51. @selection-change="tableInternalSelection"
  52. >
  53. <template #taskStatus="{ row }">
  54. <el-tag v-if="row.taskStatus === '已审批'" class="mx-1" effect="dark" type="success">已审批</el-tag>
  55. <el-tag v-if="row.taskStatus === '待审批'" class="mx-1" effect="dark" type="danger">待审批</el-tag>
  56. <el-tag v-if="row.taskStatus === '未上报'" class="mx-1" effect="dark" type="warning">未上报</el-tag>
  57. </template>
  58. <template #isEvaluate="{ row }">
  59. <el-tag v-if="row.isEvaluate" class="mx-1" effect="dark" type="success">是</el-tag>
  60. <el-tag v-else class="mx-1" effect="dark" type="info">否</el-tag>
  61. </template>
  62. <template #reportNumber="{ row }">
  63. {{ row.reportNumber === '-1' || row.reportNumber === '0' ? '' : row.reportNumber }}
  64. </template>
  65. <template #isExperiment="{ row }">
  66. <el-tag v-if="row.isExperiment" class="mx-1" effect="dark" type="success">是</el-tag>
  67. <el-tag v-else class="mx-1" effect="dark" type="info">否</el-tag>
  68. </template>
  69. </HcTable>
  70. <template #action>
  71. <HcPages :pages="searchInternalForm" @change="pageInternalChange" />
  72. </template>
  73. </HcNewCard>
  74. </template>
  75. <script setup>
  76. import { nextTick, ref, watch } from 'vue'
  77. import internalApi from '~api/ledger/internal'
  78. import queryApi from '~api/data-fill/query'
  79. import { arrToId, downloadBlob, getArrValue, isString } from 'js-fast-way'
  80. //参数
  81. const props = defineProps({
  82. projectId: {
  83. type: [String, Number],
  84. default: '',
  85. },
  86. contractId: {
  87. type: [String, Number],
  88. default: '',
  89. },
  90. treeData: {
  91. type: Object,
  92. default: () => ({}),
  93. },
  94. })
  95. //变量
  96. const projectId = ref(props.projectId)
  97. const contractId = ref(props.contractId)
  98. const nodeData = ref(props.treeData)
  99. //监听
  100. watch(() => [
  101. props.treeData,
  102. ], ([treeData]) => {
  103. nodeData.value = treeData
  104. setQueryData(treeData)
  105. })
  106. //渲染完成
  107. nextTick(() => {
  108. setQueryData(props.treeData)
  109. queryBatchList()
  110. })
  111. //获取相关数据
  112. const setQueryData = (data) => {
  113. const cid = data?.contractIdRelation || ''
  114. const wbsId = data['contractIdRelation'] ? data['id'] : data['primaryKeyId']
  115. if (wbsId) {
  116. searchInternalForm.value.contractId = cid ? cid : contractId.value
  117. searchInternalForm.value.contractIdRelation = data['contractIdRelation']
  118. searchInternalForm.value.wbsIds = [wbsId]
  119. searchInternalClick()
  120. }
  121. }
  122. //审批状态
  123. const InternalApproval = ref([
  124. { label: '未上报', value: '0' },
  125. { label: '待审批', value: '1' },
  126. { label: '已审批', value: '2' },
  127. ])
  128. //是否评定
  129. const InternalAssess = ref([
  130. { label: '是', value: true },
  131. { label: '否', value: false },
  132. ])
  133. //上报批次
  134. const InternalReportBatch = ref([
  135. // {label: "1", value: 1},
  136. // {label: "2", value: 2},
  137. // {label: "3", value: 3},
  138. ])
  139. //获取上报批次
  140. const queryBatchList = async () => {
  141. if (contractId.value) {
  142. // const { error, code, data } = await internalApi.queryBatchList({
  143. // projectId: projectId.value,
  144. // contractId: contractId.value || ''
  145. // })
  146. const { error, code, data } = await queryApi.getReportNumber({
  147. projectId: projectId.value,
  148. contractId: contractId.value || '',
  149. type: 1,
  150. })
  151. if (!error && code === 200) {
  152. InternalReportBatch.value = getArrValue(data)
  153. } else {
  154. InternalReportBatch.value = []
  155. }
  156. } else {
  157. InternalReportBatch.value = []
  158. }
  159. }
  160. //是否关联试验
  161. const InternalAssociation = ref([
  162. { label: '是', value: true },
  163. { label: '否', value: false },
  164. ])
  165. //搜索表单
  166. const searchInternalForm = ref({
  167. taskStatus: null, isEvaluate: null, reportNumber: null, isExperiment: null,
  168. current: 1, size: 20, total: 0,
  169. })
  170. //回车
  171. const searchInternalKeyUp = (e) => {
  172. if (e.key === 'Enter') {
  173. searchInternalClick()
  174. }
  175. }
  176. //搜索
  177. const searchInternalClick = () => {
  178. if (searchInternalForm.value?.wbsIds) {
  179. searchInternalForm.value.current = 1
  180. getTableInternalData()
  181. } else {
  182. window?.$message?.warning('请先选择一个树节点')
  183. }
  184. }
  185. //分页被点击
  186. const pageInternalChange = ({ current, size }) => {
  187. searchInternalForm.value.current = current
  188. searchInternalForm.value.size = size
  189. getTableInternalData()
  190. }
  191. //内业台账表头
  192. const tableInternalRef = ref(null)
  193. const tableInternalColumn = ref([
  194. { key: 'unitProject', name: '单位工程' },
  195. { key: 'partProject', name: '分部工程' },
  196. { key: 'partChildProject', name: '子分部工程' },
  197. { key: 'subentryProject', name: '分项工程' },
  198. { key: 'subentryChildProject', name: '子分项工程' },
  199. { key: 'process', name: '工序' },
  200. { key: 'taskStatus', name: '审批状态', width: 120, align: 'center' },
  201. { key: 'reportNumber', name: '上报批次', width: 100, align: 'center' },
  202. { key: 'isEvaluate', name: '是否评定', width: 100, align: 'center' },
  203. { key: 'isExperiment', name: '关联试验', width: 100, align: 'center' },
  204. ])
  205. const tableInternalData = ref([])
  206. //获取数据
  207. const tableInternalLoading = ref(false)
  208. const getTableInternalData = async () => {
  209. tableInternalLoading.value = true
  210. const { error, code, data } = await internalApi.queryInternalPage({
  211. ...searchInternalForm.value,
  212. projectId: projectId.value,
  213. })
  214. //判断状态
  215. tableInternalLoading.value = false
  216. if (!error && code === 200) {
  217. tableInternalData.value = getArrValue(data['records'])
  218. searchInternalForm.value.total = data['total'] || 0
  219. } else {
  220. tableInternalData.value = []
  221. searchInternalForm.value.total = 0
  222. }
  223. }
  224. //多选
  225. const tableInternalKeys = ref([])
  226. const tableInternalSelection = (rows) => {
  227. tableInternalKeys.value = rows.filter((item) => {
  228. return (item ?? '') !== ''
  229. })
  230. }
  231. //下载
  232. const downloadLoading = ref(false)
  233. const batchDownload = async () => {
  234. const rows = tableInternalKeys.value
  235. console.log(rows, 'rows')
  236. const ids = arrToId(rows)
  237. //批量下载
  238. downloadLoading.value = true
  239. const { error, disposition, res } = await queryApi.batchDownloadFileToZip({ ids: ids })
  240. //处理数据
  241. downloadLoading.value = false
  242. if (!error) {
  243. if (disposition) {
  244. downloadBlob(res, disposition)
  245. } else {
  246. window.$message?.error('选择的资料未生成文件')
  247. }
  248. }
  249. }
  250. //打印
  251. const printLoading = ref(false)
  252. const batchPrint = async () => {
  253. const rows = tableInternalKeys.value
  254. const ids = arrToId(rows)
  255. //批量下载
  256. printLoading.value = true
  257. const { error, code, data } = await queryApi.batchPrint({ ids: ids })
  258. //处理数据
  259. printLoading.value = false
  260. const res = isString(data) ? data ?? '' : ''
  261. if (!error && code === 200 && res) {
  262. window.open(res, '_blank')
  263. }
  264. }
  265. </script>