test.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. <template>
  2. <div class="hc-page-layout-box">
  3. <div :style="`width:${leftWidth}px;`" class="hc-layout-left-box bg-white">
  4. <div class="hc-tree-box ">
  5. <div class="title_box">
  6. 汇总分类
  7. </div>
  8. <el-scrollbar>
  9. <div v-for="(item, index) in testOpt" :key="item.id" class="mt-4" :class="item.id === curItem?.id ? 'bg-slate-200' : ''" @click="handleItem(item)">
  10. <i v-if="true" class="ri-circle-fill" />
  11. <i v-else class="ri-arrow-right-s-fill" style="font-size: larger;" />
  12. {{ item.className }}
  13. <span v-if="false" class="ml-4 bg-blue-100">222</span>
  14. </div>
  15. <!-- <HcLazyTree :auto-expand-keys="treeAutoExpandKeys" is-type @load="treeLoadNode" @node-tap="wbsElTreeClick" /> -->
  16. </el-scrollbar>
  17. </div>
  18. <!-- 左右拖动 -->
  19. <div class="horizontal-drag-line" @mousedown="onmousedown" />
  20. </div>
  21. <div class="hc-page-content-box">
  22. <HcNewCard :scrollbar="false" action-size="lg">
  23. <template #extra>
  24. <HcTooltip keys="tentative_collect_test_print">
  25. <el-button hc-btn color="#567722" @click="addClick">
  26. <HcIcon name="add" />
  27. <span>新增</span>
  28. </el-button>
  29. </HcTooltip>
  30. <HcTooltip keys="tentative_collect_test_download">
  31. <el-button hc-btn color="#A16222" :loading="downLoading" :disabled="tableCheckedKeys.length === 0" @click="downClick">
  32. <HcIcon name="download" />
  33. <span>下载</span>
  34. </el-button>
  35. </HcTooltip>
  36. <HcTooltip keys="tentative_collect_test_del">
  37. <el-button hc-btn color="#e03997" :disabled="tableCheckedKeys.length === 0" @click="delModalClick">
  38. <HcIcon name="delete-bin-2" />
  39. <span>删除</span>
  40. </el-button>
  41. </HcTooltip>
  42. </template>
  43. <template #header>
  44. <div class="w-64">
  45. <el-select
  46. v-model="searchForm.contractId"
  47. placeholder="请选择"
  48. @change="changeContract"
  49. >
  50. <el-option
  51. v-for="item in contractOptions"
  52. :key="item.id"
  53. :label="item.contractName"
  54. :value="item.id"
  55. />
  56. </el-select>
  57. </div>
  58. <div class="w-64 ml-2">
  59. <el-select v-model="searchForm.detectionType" block clearable placeholder="检测类别" @change="changeType">
  60. <el-option
  61. v-for="item in typeData" :key="item.value" :label="item.label"
  62. :value="item.value"
  63. />
  64. </el-select>
  65. </div>
  66. <div class="w-64 ml-2">
  67. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate" />
  68. </div>
  69. </template>
  70. <HcTable
  71. ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading"
  72. is-new :index-style="{ width: 60 }" is-check :check-style="{ width: 29 }"
  73. @selection-change="tableSelection"
  74. >
  75. <template #action="{ row }">
  76. <el-button
  77. hc-btn
  78. type="primary"
  79. @click="viewPdf(row)"
  80. >
  81. <HcIcon name="eye" />
  82. <span>查看</span>
  83. </el-button>
  84. </template>
  85. </HcTable>
  86. <template #action>
  87. <HcPages :pages="searchForm" @change="pageChange" />
  88. </template>
  89. </HcNewCard>
  90. </div>
  91. <hc-new-dialog
  92. v-model="addFormShow" :loading="addFormLoading" title="新增分类"
  93. widths="30rem" @close="addModalClose" @save="addModalSave"
  94. >
  95. <el-form
  96. ref="addFormRef" :model="addFormModal" :rules="addFormRules"
  97. label-position="left" label-width="auto" size="large"
  98. >
  99. <el-form-item class="mb-0" label="合同段:" prop="contractId">
  100. <el-select
  101. v-model="addFormModal.contractId"
  102. placeholder="请选择"
  103. >
  104. <el-option
  105. v-for="item in contractOptions"
  106. :key="item.id"
  107. :label="item.contractName"
  108. :value="item.id"
  109. />
  110. </el-select>
  111. </el-form-item>
  112. <el-form-item class="mb-0 mt-4" label="汇总类别:" prop="classId">
  113. <el-select
  114. v-model="addFormModal.classId"
  115. placeholder="请选择"
  116. >
  117. <el-option
  118. v-for="item in testOpt"
  119. :key="item.id"
  120. :label="item.className"
  121. :value="item.id"
  122. />
  123. </el-select>
  124. </el-form-item>
  125. <el-form-item class="mb-0 mt-4" label="报告时间:">
  126. <HcDatePicker :dates="addbetweenTime" clearable @change="addbetweenTimeUpdate" />
  127. </el-form-item>
  128. </el-form>
  129. <el-form-item class="mb-0 mt-4" label="单位类型:" prop="unitType ">
  130. <el-select
  131. v-model="addFormModal.unitType "
  132. placeholder="请选择"
  133. >
  134. <el-option
  135. v-for="item in unitOpt"
  136. :key="item.id"
  137. :label="item.name"
  138. :value="item.id"
  139. />
  140. </el-select>
  141. </el-form-item>
  142. <el-form-item class="mb-0 mt-4" label="检测类型:" prop="detectionType">
  143. <el-select
  144. v-model="addFormModal.detectionType"
  145. placeholder="请选择"
  146. >
  147. <el-option
  148. v-for="item in typeData" :key="item.value" :label="item.label"
  149. :value="item.value"
  150. />
  151. </el-select>
  152. </el-form-item>
  153. </hc-new-dialog>
  154. </div>
  155. </template>
  156. <script setup>
  157. import { onMounted, ref, watch } from 'vue'
  158. import { useAppStore } from '~src/store'
  159. import { download, getContractList, getPage, getSummaryList, removeByIds, save } from '~api/tentative/collect/test'
  160. import { arrToId, getArrValue, isString } from 'js-fast-way'
  161. import { HcDelMsg } from 'hc-vue3-ui'
  162. import { getDictionary } from '~api/other'
  163. import { toPdfPage } from '~uti/btn-auth'
  164. //变量
  165. const useAppState = useAppStore()
  166. const projectId = ref(useAppState.getProjectId)
  167. const contractId = ref(useAppState.getContractId)
  168. const isCollapse = ref(useAppState.getCollapse)
  169. const contractOptions = ref([])
  170. //监听
  171. watch(() => [
  172. useAppState.getCollapse,
  173. ], ([Collapse]) => {
  174. isCollapse.value = Collapse
  175. })
  176. //渲染完成
  177. onMounted(async () => {
  178. await gettypeData()
  179. await getContractOpt()
  180. await getTextOpt()
  181. getTableData()
  182. })
  183. //搜索表单
  184. const searchForm = ref({
  185. contractId: null, detectionType: null, betweenTime: null,
  186. current: 1, size: 20, total: 0,
  187. })
  188. //获取合同段列表
  189. const getContractOpt = async () => {
  190. const { error, code, data } = await getContractList({
  191. contractId: contractId.value,
  192. projectId: projectId.value,
  193. })
  194. //判断状态
  195. if (!error && code === 200) {
  196. let resdata = getArrValue(data)
  197. contractOptions.value = resdata
  198. if ( contractOptions.value.length > 0) {
  199. searchForm.value.contractId = contractOptions.value[0].id
  200. }
  201. } else {
  202. contractOptions.value = []
  203. }
  204. }
  205. //获取汇总分类列表
  206. const testOpt = ref([])
  207. const getTextOpt = async () => {
  208. const { error, code, data } = await getSummaryList()
  209. //判断状态
  210. if (!error && code === 200) {
  211. let resdata = getArrValue(data)
  212. testOpt.value = resdata
  213. if ( testOpt.value.length > 0) {
  214. curItem.value = testOpt.value[0]
  215. }
  216. } else {
  217. testOpt.value = []
  218. }
  219. }
  220. const curItem = ref(null)
  221. const handleItem = (item)=>{
  222. curItem.value = item
  223. getTableData()
  224. }
  225. //检测类别
  226. const typeData = ref([])
  227. //获取检测类别
  228. const gettypeData = async () => {
  229. const { data } = await getDictionary({
  230. code: 'trial_detection_category',
  231. })
  232. //处理数据
  233. let newArr = []
  234. const newData = getArrValue(data)
  235. for (let i = 0; i < newData.length; i++) {
  236. newArr.push({
  237. label: newData[i]['dictValue'],
  238. value: Number(newData[i]['dictKey']),
  239. })
  240. }
  241. typeData.value = newArr
  242. }
  243. //日期时间被选择
  244. const betweenTime = ref(null)
  245. const betweenTimeUpdate = ({ arr, query }) => {
  246. betweenTime.value = arr
  247. searchForm.value.startDate = arr[0]
  248. searchForm.value.endDate = arr[1]
  249. getTableData()
  250. }
  251. const addbetweenTime = ref(null)
  252. const addbetweenTimeUpdate = ({ arr, query }) => {
  253. addbetweenTime.value = arr
  254. addFormModal.value.startDate = arr[0]
  255. addFormModal.value.endDate = arr[1]
  256. }
  257. //选择检测类别
  258. const changeType = ()=>{
  259. getTableData()
  260. }
  261. const changeContract = ()=>{
  262. getTableData()
  263. }
  264. //分页被点击
  265. const pageChange = ({ current, size }) => {
  266. searchForm.value.current = current
  267. searchForm.value.size = size
  268. getTableData()
  269. }
  270. //表格数据
  271. const tableRef = ref(null)
  272. const tableColumn = ref([
  273. { key: 'summaryNumber', name: '汇总编号' },
  274. { key: 'classIdName', name: '汇总类别' },
  275. { key: 'detectionTypeName', name: '检测类型' },
  276. { key: 'summaryDateName', name: '汇总日期' },
  277. { key: 'action', name: '操作', width:100 },
  278. ])
  279. //获取数据
  280. const tableLoading = ref(false)
  281. const tableData = ref([])
  282. const getTableData = async () => {
  283. if (!searchForm.value.contractId) {
  284. window.$message.warning('请选择合同段')
  285. return
  286. }
  287. if (curItem.value) {
  288. const { error, code, data } = await getPage({
  289. ...searchForm.value,
  290. classId:curItem.value?.id,
  291. })
  292. //判断状态
  293. if (!error && code === 200) {
  294. let resdata = getArrValue(data['records'])
  295. tableData.value = resdata
  296. searchForm.value.total = data['total']
  297. } else {
  298. tableData.value = []
  299. }
  300. } else {
  301. window.$message.warning('请先选择汇总分类')
  302. }
  303. }
  304. //多选
  305. const tableCheckedKeys = ref([])
  306. const tableSelection = (rows) => {
  307. tableCheckedKeys.value = rows.filter((item) => {
  308. return (item ?? '') !== ''
  309. })
  310. }
  311. //删除
  312. const delModalClick = () => {
  313. if (tableCheckedKeys.value.length === 0) {
  314. window.$message.warning('请先选择数据')
  315. return
  316. }
  317. HcDelMsg({}, async (instance, resolve) => {
  318. instance.confirmButtonLoading = true
  319. instance.confirmButtonText = '删除中...'
  320. await removeContractTreeNode()
  321. resolve() //关闭弹窗的回调
  322. instance.confirmButtonLoading = false
  323. })
  324. }
  325. const removeContractTreeNode = async () => {
  326. const loadingInstance = window.$loading.service({
  327. fullscreen: true,
  328. text: '删除节点中,请耐心等待...',
  329. background: 'rgba(0, 0, 0, 0.7)',
  330. })
  331. const { error, code, msg } = await removeByIds({
  332. ids: arrToId( tableCheckedKeys.value),
  333. })
  334. loadingInstance.close()
  335. if (!error && code === 200) {
  336. window?.$message?.success('删除成功')
  337. getTableData()
  338. } else {
  339. window.$message.error(msg)
  340. }
  341. }
  342. //左右拖动,改变树形结构宽度
  343. const leftWidth = ref(382)
  344. const onmousedown = () => {
  345. const leftNum = isCollapse.value ? 142 : 272
  346. document.onmousemove = (ve) => {
  347. let diffVal = ve.clientX - leftNum
  348. if (diffVal >= 310 && diffVal <= 900) {
  349. leftWidth.value = diffVal
  350. }
  351. }
  352. document.onmouseup = () => {
  353. document.onmousemove = null
  354. document.onmouseup = null
  355. }
  356. }
  357. //查看pdf
  358. const viewPdf = (row)=>{
  359. const { pdfUrl } = row
  360. if (pdfUrl) {
  361. toPdfPage(pdfUrl)
  362. } else {
  363. window.$message.warning('暂无数据')
  364. }
  365. }
  366. //新增试验汇总
  367. const addFormModal = ref({})
  368. const addFormShow = ref(false)
  369. const addFormLoading = ref(false)
  370. const addClick = ()=>{
  371. addFormShow.value = true
  372. }
  373. const addModalClose = ()=>{
  374. addFormShow.value = false
  375. addFormModal.value = {}
  376. }
  377. const addFormRules = ref(null)
  378. const addFormRef = ref(null)
  379. const addModalSave = async ()=>{
  380. console.log(addFormModal.value)
  381. addFormLoading.value = true
  382. const { error, code, msg } = await save({
  383. ...addFormModal.value,
  384. })
  385. addFormLoading.value = false
  386. //判断状态
  387. if (!error && code === 200) {
  388. window.$message.success(msg)
  389. addFormShow.value = false
  390. getTableData()
  391. }
  392. }
  393. const unitOpt = ref([
  394. { name:'施工', id:'1' },
  395. ])
  396. const downLoading = ref(false)
  397. const downClick = async ()=>{
  398. downLoading.value = true
  399. const { error, code, data } = await download({
  400. ids: arrToId( tableCheckedKeys.value),
  401. })
  402. downLoading.value = false
  403. const res = isString(data) ? data || '' : ''
  404. if (!error && code === 200 && res) {
  405. window.open(res, '_blank')
  406. }
  407. }
  408. </script>
  409. <style lang="scss" scoped>
  410. .title_box{
  411. font-size: 24px;
  412. font-weight: bolder;
  413. }
  414. </style>