index.vue 14 KB

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