index.vue 17 KB

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