internal.vue 9.6 KB

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