index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. <template>
  2. <div class="h-full flex flex-col gap-y-3">
  3. <n-page-header @back="$router.back">
  4. <template #title> 报告生成 </template>
  5. <template #extra>
  6. <n-space>
  7. <n-popconfirm @positive-click="putTemplateData('数据自检')">
  8. <template #trigger>
  9. <n-button type="primary">数据自检</n-button>
  10. </template>
  11. 确认数据质检?
  12. </n-popconfirm>
  13. <n-popconfirm @positive-click="putTemplateData('生成报告')">
  14. <template #trigger>
  15. <n-button type="primary">生成报告</n-button>
  16. </template>
  17. 确认生成报告?
  18. </n-popconfirm>
  19. <n-button type="primary" @click="showUploadModal">上传验证报告</n-button>
  20. <n-button type="primary" @click="setCopy">复制</n-button>
  21. <n-button type="primary" @click="setPaste">粘贴</n-button>
  22. </n-space>
  23. </template>
  24. </n-page-header>
  25. <n-scrollbar :style="{ maxHeight: `${height - 150}px` }" trigger="none">
  26. <FormList :form-list="formValue.formList" />
  27. <!-- <n-button @click="handleClick">button</n-button> -->
  28. </n-scrollbar>
  29. </div>
  30. <n-modal style="width: 60%" v-model:show="modal.showModal" :show-icon="false" preset="dialog" :mask-closable="false"
  31. :title="modal.title" @close="onCloseModal">
  32. <n-upload class="w-full" list-type="image-card" :default-upload="false" :max="1" @change="handleChange"
  33. v-if="modal.title === '上传验证'">
  34. 上传文件
  35. </n-upload>
  36. <template v-else>
  37. <n-card embedded :bordered="false">
  38. <template #header>
  39. <div class="flex justify-center">
  40. <n-progress :indicator-placement="'inside'" :status="keyInfo.Code === 600
  41. ? 'default'
  42. : keyInfo.Code === 601
  43. ? 'success'
  44. : 'error'
  45. " type="line" gap-position="bottom" :percentage="keyInfo.Schedule" />
  46. </div>
  47. </template>
  48. <div class="pis" v-show="loadingFun==false" style="overflow:auto;height:400px;" ref="scrollbarRef">
  49. <div class="flex" v-for="(item, index) of items" :key="index"> <!-- items -->
  50. <n-badge class="mr-5" type="info" :value="index + 1" />
  51. <span>{{ item }}</span>
  52. </div>
  53. </div>
  54. <n-spin v-show="loadingFun==true" :show="true">
  55. <n-alert title="请等待..." type="success">
  56. 服务器正在处理中,请等待...
  57. </n-alert>
  58. </n-spin>
  59. </n-card>
  60. </template>
  61. <template #action>
  62. <n-space v-if="modal.title === '上传验证'">
  63. <n-button @click="modal.showModal = false">取消</n-button>
  64. <n-button type="primary" @click="editTaskInfo">确认</n-button>
  65. </n-space>
  66. <template v-else>
  67. <n-button v-if="modal.title === '生成报告'" type="primary" :disabled="keyInfo.Code !== 601" @click="handleDownload">下载文件</n-button>
  68. <n-button v-else type="primary" :disabled="keyInfo.Code !== 601" @click="handleDownload">查看文档</n-button>
  69. </template>
  70. </template>
  71. </n-modal>
  72. </template>
  73. <script setup>
  74. import {
  75. putVerifyTemplateMapData,
  76. editTask,
  77. getTaskDataClassList,
  78. getVerifyTemplateMapDataList,
  79. generateReport,generateReportinspect,
  80. generateKey, TempCopy
  81. } from '@/api';
  82. import * as qiniu from 'qiniu-js';
  83. import { getToken } from '@/utils/storage/sessionToken';
  84. import { getFileToken } from '@/common';
  85. import { useWindowSize } from '@vueuse/core';
  86. import { NButton } from 'naive-ui';
  87. import { nextTick, onBeforeUnmount, onUpdated, reactive, ref } from 'vue';
  88. import FormList from '@/components/FormList.vue';
  89. import { useStore } from 'vuex';
  90. const { height } = useWindowSize();
  91. const message = useMessage();
  92. const scrollbarRef = ref(null);
  93. const loadingFun = ref(false)
  94. const task = window.sessionStorage.getItem('task')
  95. ? JSON.parse(window.sessionStorage.getItem('task'))
  96. : {};
  97. // 表单对象
  98. const formValue = reactive({
  99. pdf: '',
  100. formList: [],
  101. });
  102. const handleClick = () => {
  103. console.log(formValue.formList);
  104. };
  105. // 查询数据
  106. const queryData = reactive({
  107. T_source: 2,
  108. T_task_id: task.T_task_id,
  109. T_VerifyTemplate_id: task.T_VerifyTemplate_id,
  110. });
  111. //
  112. const classList = ref([]);
  113. const store = useStore()
  114. //复制
  115. const setCopy = () => {
  116. message.success("复制成功")
  117. store.commit('setTaskId', queryData.T_task_id)
  118. }
  119. //粘贴
  120. const setPaste = async () => {
  121. console.log('粘贴', store.state.TaskId, queryData.T_task_id)
  122. if (store.state.TaskId == '') {
  123. message.error('请先复制模板,在进行粘贴哦')
  124. return
  125. }
  126. const resIt = await TempCopy({
  127. T_copy_task_id: store.state.TaskId,
  128. T_paste_task_id: queryData.T_task_id,
  129. T_source: 2
  130. })
  131. if (resIt.data.Code == 200) {
  132. message.success('粘贴成功')
  133. getTemplateList()
  134. }
  135. }
  136. // 模态框数据源
  137. const modal = reactive({
  138. showModal: false,
  139. title: '',
  140. });
  141. //
  142. const handleChange = async ({ file }) => {
  143. const token = await getFileToken(file.name.split('.')[1]);
  144. const observable = qiniu.upload(
  145. file.file,
  146. file.name,
  147. token,
  148. {},
  149. {
  150. useCdnDomain: true,
  151. }
  152. );
  153. observable.subscribe({
  154. next: (result) => {
  155. // 主要用来展示进度
  156. console.warn(result);
  157. },
  158. error: () => {
  159. message.error('上传失败');
  160. },
  161. complete: (res) => {
  162. formValue.pdf = res.key;
  163. },
  164. });
  165. };
  166. // 显示上传验证对话框
  167. const showUploadModal = () => {
  168. modal.title = '上传验证';
  169. modal.showModal = true;
  170. };
  171. // 上传验证
  172. const editTaskInfo = async () => {
  173. try {
  174. const { data: res } = await editTask({
  175. T_task_id: queryData.T_task_id,
  176. T_pdf2: formValue.pdf,
  177. });
  178. if (res.Code === 200) {
  179. message.success(res.Msg);
  180. modal.showModal = false;
  181. }
  182. } catch (e) {
  183. console.log(e);
  184. }
  185. };
  186. const obsData = reactive({
  187. obj: {}
  188. })
  189. // 验证报告生成 报告
  190. const generateReportInfo = async (obj) => {
  191. obsData.obj = obj
  192. console.log(obj)
  193. var times = null
  194. if(modal.title=='生成报告'){
  195. const { data: res } = await generateReport({
  196. T_task_id: task.T_task_id,
  197. T_VerifyTemplate_id: task.T_VerifyTemplate_id,
  198. ...obj,
  199. })
  200. if (res.Code === 200) {
  201. loadingFun.value = false
  202. generateKeyInfo(res.Data);
  203. } else if (res.Code == 501) {
  204. loadingFun.value = true
  205. times = setTimeout(() => {
  206. generateReportInfo(obsData.obj);
  207. }, 1000);
  208. } else {
  209. loadingFun.value = true
  210. clearTimeout(times);
  211. }
  212. }else{
  213. const { data: res } = await generateReportinspect({
  214. T_task_id: task.T_task_id,
  215. T_VerifyTemplate_id: task.T_VerifyTemplate_id,
  216. ...obj,
  217. })
  218. if (res.Code === 200) {
  219. loadingFun.value = false
  220. generateKeyInfo(res.Data);
  221. } else if (res.Code == 501) {
  222. loadingFun.value = true
  223. times = setTimeout(() => {
  224. generateReportInfo(obsData.obj);
  225. }, 1000);
  226. } else {
  227. loadingFun.value = true
  228. clearTimeout(times);
  229. }
  230. }
  231. };
  232. let timer = 0;
  233. const keyInfo = ref({});
  234. const items = computed(() => {
  235. if (keyInfo.value.Item) {
  236. nextTick(() => {
  237. scrollbarRef.value.scrollTop = scrollbarRef.value.scrollHeight
  238. })
  239. return keyInfo.value.Item.split('\n').filter((item) => item)
  240. } else {
  241. return [];
  242. }
  243. });
  244. // 验证报告生成 获取生成结果
  245. const generateKeyInfo = async (key) => {
  246. const { data: res } = await generateKey({
  247. key,
  248. }).catch(function (error) {
  249. console.log('报错',error)
  250. generateKeyInfo(key);
  251. })
  252. if (res.Code === 600) {
  253. timer = setTimeout(() => {
  254. generateKeyInfo(key);
  255. }, 3000);
  256. } else {
  257. // console.log('其他',res.Code)
  258. // clearTimeout(timer);
  259. }
  260. keyInfo.value = res;
  261. };
  262. // 关闭对话框时触发
  263. const onCloseModal = () => {
  264. keyInfo.value = {};
  265. clearTimeout(timer);
  266. };
  267. // 下载文件
  268. const handleDownload = () => {
  269. if (modal.title=='生成报告') {
  270. window.open(keyInfo.value.Data);
  271. } else {
  272. console.log('下载pdf')
  273. const pdfUrl = 'https://www.gjtool.cn/pdfh5/git.pdf';
  274. const a = document.createElement('a');
  275. a.href = pdfUrl;
  276. a.target = '_blank';
  277. a.click();
  278. }
  279. };
  280. // 提交生成报告
  281. const putTemplateData = async (titles) => {
  282. try {
  283. const arr = toRaw(formValue.formList);
  284. // return
  285. const VerifyTemplateMapData = arr.map((item, i) => {
  286. if (item.T_label === 3) {
  287. return {
  288. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  289. T_value: item.T_value.length != 0 ? item.T_value.join('|') : '',
  290. T_source: item.T_source,
  291. T_flow_sort: item.T_flow_sort,
  292. T_max_time: item.T_max_time,
  293. T_min_time: item.T_min_time,
  294. };
  295. } else if (item.T_label === 9) {
  296. // console.log('等于9',item.T_value,item.T_label,i)
  297. return {
  298. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  299. T_value: item.T_value != null ? item.T_value.join('|') : '',
  300. T_source: item.T_source,
  301. T_flow_sort: item.T_flow_sort,
  302. T_max_time: item.T_max_time,
  303. T_min_time: item.T_min_time,
  304. };
  305. } else if (item.T_label === 12) {
  306. // console.log('等于12',item.T_value,item.T_label,i)
  307. if (item.T_value[0] == null && item.T_value[1] == null) {
  308. return {
  309. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  310. T_value: '',
  311. T_source: item.T_source,
  312. T_flow_sort: item.T_flow_sort,
  313. T_max_time: item.T_max_time,
  314. T_min_time: item.T_min_time,
  315. };
  316. } else {
  317. if (item.T_value[0] != null) {
  318. return {
  319. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  320. T_value: `${item.T_value[0]}/${item.T_value[1]}`,
  321. T_source: item.T_source,
  322. T_flow_sort: item.T_flow_sort,
  323. T_max_time: item.T_max_time,
  324. T_min_time: item.T_min_time,
  325. };
  326. } else {
  327. return {
  328. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  329. T_value: `/${item.T_value[1]}`,
  330. T_source: item.T_source,
  331. T_flow_sort: item.T_flow_sort,
  332. T_max_time: item.T_max_time,
  333. T_min_time: item.T_min_time,
  334. };
  335. }
  336. }
  337. } else if (item.T_label === 13) {
  338. // console.log('等于13',item.T_value,item.T_label,i)
  339. if (item.T_value[0] == null && item.T_value[1] == null) {
  340. return {
  341. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  342. T_value: '',
  343. T_source: item.T_source,
  344. T_flow_sort: item.T_flow_sort,
  345. T_max_time: item.T_max_time,
  346. T_min_time: item.T_min_time,
  347. };
  348. } else {
  349. if (item.T_value[0] != null) {
  350. return {
  351. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  352. T_value: `${item.T_value[0].join('|')}/${item.T_value[1]}`,
  353. T_source: item.T_source,
  354. T_flow_sort: item.T_flow_sort,
  355. T_max_time: item.T_max_time,
  356. T_min_time: item.T_min_time,
  357. }
  358. } else {
  359. return {
  360. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  361. T_value: `/${item.T_value[1]}`,
  362. T_source: item.T_source,
  363. T_flow_sort: item.T_flow_sort,
  364. T_max_time: item.T_max_time,
  365. T_min_time: item.T_min_time,
  366. }
  367. }
  368. }
  369. } else {
  370. // console.log('等于其他',item.T_value,item.T_label,i)
  371. return {
  372. T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
  373. T_value: item.T_value != null ? item.T_value + '' : '',
  374. T_source: item.T_source,
  375. T_flow_sort: item.T_flow_sort,
  376. T_max_time: item.T_max_time,
  377. T_min_time: item.T_min_time,
  378. };
  379. }
  380. });
  381. // console.log('提交参数',VerifyTemplateMapData)
  382. // return
  383. const token = getToken();
  384. const { data: res } = await putVerifyTemplateMapData({
  385. User_tokey: token,
  386. T_source: queryData.T_source,
  387. T_task_id: queryData.T_task_id,
  388. T_VerifyTemplate_id: queryData.T_VerifyTemplate_id,
  389. VerifyTemplateMapData,
  390. });
  391. console.log('sdsd', res.Code)
  392. const obj = {};
  393. if (res.Code == 200) {
  394. for (let i of arr) {
  395. // console.log('打印arr',i)
  396. if (i.T_label === 3 || i.T_label === 9) {
  397. obj[i.T_name] = i.T_value != null ? i.T_value.join('|') : '';
  398. } else if (i.T_label === 12) {
  399. console.log('打印12', i.T_value)
  400. if (i.T_value[0] == null && i.T_value[1] == '') {
  401. console.log('12', i.T_value)
  402. obj[i.T_name] = ''
  403. } else {
  404. if (i.T_value[0] == null && i.T_value[1] != null) {
  405. obj[i.T_name] = '' + '/' + i.T_value[1]
  406. } else if (i.T_value[0] != null && i.T_value[1] == null) {
  407. obj[i.T_name] = i.T_value[0] + '/' + ''
  408. } else {
  409. obj[i.T_name] = i.T_value[0] + '/' + i.T_value[1]
  410. }
  411. console.log('打印arr22222', obj[i.T_name])
  412. }
  413. } else if (i.T_label === 13) {
  414. console.log('等于时间', i.T_value[0] != null, i.T_value[1] != null)
  415. if (i.T_value[0] != null && i.T_value[1] != null) {//两个都有值
  416. obj[i.T_name] = `${i.T_value[0].join('|') + '/' + i.T_value[1]}`;
  417. } else if (i.T_value[0] != null && i.T_value[1] == null) {//选择了时间-没文本
  418. obj[i.T_name] = `${i.T_value[0].join('|') + '/'}`;
  419. } else if (i.T_value[0] == null && i.T_value[1] != null) {
  420. obj[i.T_name] = `${'/' + i.T_value[1]}`;
  421. } else {//都没选
  422. obj[i.T_name] = ''
  423. }
  424. } else {
  425. obj[i.T_name] = i.T_value;
  426. }
  427. }
  428. modal.title = titles;
  429. modal.showModal = true;
  430. // obsData = obj
  431. // setInterval(() => {
  432. // generateReportInfo(obj);
  433. // }, 1000);
  434. generateReportInfo(obj);
  435. }
  436. } catch (e) {
  437. console.log(e);
  438. }
  439. };
  440. // 获取设备列表
  441. const getClassList = async () => {
  442. try {
  443. const { data: res } = await getTaskDataClassList({
  444. T_task_id: queryData.T_task_id,
  445. });
  446. classList.value = res.Data || [];
  447. } catch (e) {
  448. console.log(e);
  449. }
  450. };
  451. // 获取模板标签数据(列表)
  452. const getTemplateList = async () => {
  453. try {
  454. const { data: res } = await getVerifyTemplateMapDataList(queryData);
  455. console.log('999999999999999', res)
  456. formValue.formList = res.Data;
  457. formValue.formList.forEach(item => {
  458. if (item.T_label === 3) {
  459. if (item.T_value == '' || item.T_value == null) {
  460. item.T_value = []
  461. } else {
  462. item.T_value = item.T_value.split('|')
  463. }
  464. } else if (item.T_label == 9) {
  465. if (item.T_value == '' || item.T_value == null) {
  466. item.T_value = null
  467. } else {
  468. item.T_value = item.T_value.split('|')
  469. }
  470. } else if (item.T_label === 12) {
  471. if (item.T_value == '' || item.T_value == null) {
  472. item.T_value = [null, null]
  473. } else {
  474. if (item.T_value.split('/')[0] == "") {
  475. item.T_value = [null, item.T_value.split('/')[1]]
  476. } else {
  477. item.T_value = [item.T_value.split('/')[0], item.T_value.split('/')[1]]
  478. }
  479. }
  480. } else if (item.T_label === 13) {
  481. console.log('=================================等于13', item)
  482. if (item.T_value == '' || item.T_value == null) {
  483. item.T_value = [null, null]
  484. } else {
  485. if (item.T_value.split('/')[0] == "") {//前面时间区间没选
  486. item.T_value = [null, item.T_value.split('/')[1]]
  487. } else {//前面时间区间已经选
  488. item.T_value = [item.T_value.split('/')[0].split('|'), item.T_value.split('/')[1]]
  489. }
  490. }
  491. } else {
  492. item.T_value = item.T_value ? item.T_value : null;
  493. }
  494. });
  495. } catch (e) {
  496. console.log(e);
  497. }
  498. };
  499. onBeforeUnmount(() => {
  500. // 取消订阅
  501. clearTimeout(timer);
  502. });
  503. // getClassList();
  504. getTemplateList();
  505. </script>
  506. <style scoped></style>