index.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <!-- -->
  2. <template>
  3. <MainPanel>
  4. <template v-slot:header>
  5. <Header :title="headerTitle" :on-back="onBack" type="return">
  6. <ui-button v-if="!isWrite && tableType != 'law'" style="margin-right: 16px" class="download-btn" type="null" width="96px" @click="downloadHandler"> 下载 </ui-button>
  7. <ui-button v-if="tableType != 'law'" type="primary" width="96px" @click="saveHandler"> {{ isWrite ? "确定" : "保存" }} </ui-button>
  8. </Header>
  9. </template>
  10. <div v-show="!isWrite" class="mySwiper" v-if="loaded">
  11. <div class="swiper-wrapper">
  12. <div class="swiper-slide tables-item" :class="{ show: downMode }" v-for="(i, index) in eleList">
  13. <div class="warpper" :class="{ downMode, 'no-padding': tableType == 'law' }" :id="`layoutRef${index}`">
  14. <component
  15. ref="content"
  16. :page="askPage"
  17. :pageIndex="index"
  18. :text="text"
  19. @onTextChange="onTextChange"
  20. @onTextConfirm="onTextConfirm"
  21. @goWrite="goWrite"
  22. :downMode="downMode"
  23. :is="i"
  24. ></component>
  25. </div>
  26. <div class="warpper" v-if="downMode" :class="{ show: downMode, 'no-padding': tableType == 'law' }">
  27. <component :isDownloadShow="true" :page="askPage" :pageIndex="index" :text="text" @onTextChange="onTextChange" @onTextConfirm="onTextConfirm" @goWrite="goWrite" :is="i"></component>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. <Write ref="com" v-if="isWrite" :text="text" :textIndex="textIndex" @onTextConfirm="onTextConfirm"> </Write>
  33. </MainPanel>
  34. </template>
  35. <script setup lang="ts">
  36. import { reactive, ref, watch, onMounted, nextTick, onActivated, onDeactivated, provide, watchEffect } from "vue";
  37. import { router } from "@/router";
  38. import Swiper from "swiper";
  39. import html2canvas from "html2canvas";
  40. import { downloadImage, uploadImage } from "@/store/sync";
  41. import { genUseLoading } from "@/hook";
  42. import { tables } from "@/store/tables";
  43. import { resetData } from "./data";
  44. import Write from "./write/index.vue";
  45. import Message from "@/components/base/components/message/message.vue";
  46. import Header from "@/components/photos/header.vue";
  47. import MainPanel from "@/components/main-panel/index.vue";
  48. import one from "./explorate-one.vue";
  49. import two from "./explorate-two.vue";
  50. import three from "./explorate-three.vue";
  51. import four from "./explorate-four.vue";
  52. import identification from "./identification.vue";
  53. //授权委托书
  54. import authorOne from "./author/author-one.vue";
  55. import authorTwo from "./author/author-two.vue";
  56. // 血样提取
  57. import extract from "./extract.vue";
  58. //遗留物品
  59. import legacy from "./legacy.vue";
  60. //询问、讯问
  61. import ask from "./ask.vue";
  62. import doc from "./write/doc.vue";
  63. //法规
  64. import law from "./law.vue";
  65. // const eleList = ref([one, two, three, four]);
  66. // const eleList = ref([authorOne, authorTwo]);
  67. const com = ref(null); // 通过 模板ref 绑定子组件
  68. const content = ref(null); // 通过 模板ref 绑定子组件
  69. const eleList = ref([]);
  70. const headerTitle = ref("");
  71. const tableType = ref<string | string[]>();
  72. const downMode = ref(false);
  73. const askPage = ref(1);
  74. const askText = ref("");
  75. const isWrite = ref(false);
  76. const text = ref("");
  77. const textIndex = ref(0);
  78. const setAskPage = () => {
  79. loaded.value = false;
  80. eleList.value = [ask];
  81. if (askPage.value > 1) {
  82. for (let i = 0; i < askPage.value - 1; i++) {
  83. eleList.value.push(doc);
  84. }
  85. }
  86. initSwiper();
  87. };
  88. const goWrite = (data) => {
  89. isWrite.value = true;
  90. textIndex.value = data.textIndex;
  91. };
  92. const onTextConfirm = (data) => {
  93. askPage.value = data.page;
  94. text.value = data.text;
  95. isWrite.value = false;
  96. setAskPage();
  97. };
  98. const onTextChange = (data) => {
  99. text.value = data.text;
  100. };
  101. const downloadHandler = genUseLoading(async () => {
  102. // if (isWrite.value) {
  103. // com.value.onConfirm();
  104. // return;
  105. // }
  106. await getLayoutImage();
  107. });
  108. const saveHandler = genUseLoading(async () => {
  109. if (isWrite.value) {
  110. com.value.onConfirm();
  111. return;
  112. }
  113. saveStore();
  114. router.replace("/scene");
  115. });
  116. const saveStore = () => {
  117. let reportData = initData();
  118. console.error(reportData);
  119. const origin = tables.value;
  120. let newData = Object.assign(origin, reportData);
  121. };
  122. const initData = () => {
  123. let dataList = content.value;
  124. let obj = {};
  125. dataList.forEach((item) => {
  126. if (item.saveHandler) {
  127. let data = item.saveHandler();
  128. obj[data.type] = data.data;
  129. }
  130. });
  131. return obj;
  132. };
  133. let slideIndex = 0;
  134. const slideFunc = () => {
  135. let eles = document.querySelectorAll(".tables-item");
  136. eles.forEach((item) => {
  137. item.scrollTo(0, 0);
  138. });
  139. return new Promise((res, rej) => {
  140. if (eleList.value.length == 1) {
  141. res(true);
  142. } else {
  143. mySwiper.value.slideTo(0);
  144. let t = setInterval(() => {
  145. if (slideIndex < eleList.value.length - 1) {
  146. mySwiper.value.slideNext();
  147. } else {
  148. clearInterval(t);
  149. t = null;
  150. res(true);
  151. }
  152. }, 1000);
  153. }
  154. });
  155. };
  156. const getLayoutImage = async () => {
  157. downMode.value = true;
  158. await nextTick();
  159. let num = 0;
  160. await slideFunc();
  161. return new Promise((res, rej) => {
  162. eleList.value.forEach(async (element, index) => {
  163. let ele = document.getElementById(`layoutRef${index}`);
  164. const canvas = await html2canvas(ele);
  165. const blob = await new Promise<Blob>((resolve) => {
  166. return canvas.toBlob(resolve, "image/jpeg", 0.95);
  167. });
  168. await downloadImage(blob, `tables_${index}.jpg`);
  169. Message.success({ msg: "已保存至相册", time: 2000 });
  170. num++;
  171. if (num == eleList.value.length) {
  172. downMode.value = false;
  173. // router.replace("/scene");
  174. res(true);
  175. }
  176. });
  177. });
  178. // return await uploadImage(blob);
  179. };
  180. const initTables = () => {
  181. tableType.value = router.currentRoute.value.params.name;
  182. switch (tableType.value) {
  183. case "explorate":
  184. eleList.value = [one, two, three, four];
  185. headerTitle.value = "道路交通事故现场勘查笔录";
  186. break;
  187. case "ask":
  188. eleList.value = [ask];
  189. if (router.currentRoute.value.query.type == "1") {
  190. headerTitle.value = "询问笔录";
  191. if (tables.value.askOne) {
  192. text.value = tables.value.askOne.text;
  193. askPage.value = tables.value.askOne.page;
  194. }
  195. } else {
  196. headerTitle.value = "讯问笔录";
  197. if (tables.value.askTwo) {
  198. text.value = tables.value.askTwo.text;
  199. askPage.value = tables.value.askTwo.page;
  200. }
  201. }
  202. isWrite.value = false;
  203. setAskPage();
  204. break;
  205. case "author":
  206. eleList.value = [authorOne, authorTwo];
  207. headerTitle.value = "授权委托书";
  208. break;
  209. case "legacy":
  210. eleList.value = [legacy];
  211. headerTitle.value = "道路交通事故现场遗留物品清单";
  212. break;
  213. case "extract":
  214. eleList.value = [extract];
  215. headerTitle.value = "当事人血样(尿样)提取登记表";
  216. break;
  217. case "identification":
  218. eleList.value = [identification];
  219. headerTitle.value = "道路交通事故认定书(简易程序)";
  220. break;
  221. case "law":
  222. eleList.value = [law];
  223. headerTitle.value = "法律法规";
  224. break;
  225. }
  226. };
  227. const mySwiper = ref(null);
  228. const loaded = ref(false);
  229. const initSwiper = () => {
  230. if (mySwiper.value) {
  231. mySwiper.value.destroy(true);
  232. }
  233. loaded.value = true;
  234. mySwiper.value = null;
  235. nextTick(() => {
  236. if (loaded.value) {
  237. mySwiper.value = new Swiper(".mySwiper", {
  238. on: {
  239. init: function (swiper) {
  240. // initPage();
  241. // console.error(swiper);
  242. },
  243. transitionStart: function (swiper) {
  244. slideIndex = swiper.activeIndex;
  245. },
  246. touchStart: function (swiper, event) {},
  247. },
  248. });
  249. }
  250. });
  251. };
  252. const onBack = () => {
  253. if (isWrite.value) {
  254. isWrite.value = false;
  255. return;
  256. }
  257. router.back();
  258. };
  259. onActivated(() => {
  260. initTables();
  261. initSwiper();
  262. });
  263. const scale = ref("1");
  264. const initPage = () => {
  265. let parent = document.getElementById("layoutRef0");
  266. let children = parent.children[0];
  267. // console.error(768 / children.offsetHeight);
  268. scale.value = ((768 - 100) / children.clientHeight).toFixed(2);
  269. };
  270. onMounted(() => {});
  271. onDeactivated(() => {
  272. isWrite.value = false;
  273. text.value = "";
  274. loaded.value = false;
  275. resetData();
  276. });
  277. </script>
  278. <style></style>
  279. <style lang="scss" scoped>
  280. .download-btn {
  281. border-color: #3a3d3d;
  282. background-color: #3a3d3d !important;
  283. color: #fff;
  284. }
  285. .mySwiper {
  286. height: 100%;
  287. width: 100%;
  288. color: #000;
  289. padding-top: 50px;
  290. font-size: 20px;
  291. font-family: sr, st;
  292. .swiper-wrapper {
  293. height: 100%;
  294. width: 100%;
  295. .swiper-slide {
  296. height: 100%;
  297. width: 100%;
  298. overflow: auto;
  299. &.show {
  300. overflow: hidden;
  301. }
  302. > .warpper {
  303. padding: 20px 50px 30px;
  304. &.no-padding {
  305. padding: 0;
  306. }
  307. &.downMode {
  308. padding: 125px 100px 75px;
  309. width: 1050px;
  310. height: 1485px;
  311. box-sizing: border-box;
  312. // transform: scale(.5) translateY(-52%);
  313. transform: translateY(-100%);
  314. position: absolute;
  315. }
  316. &.show {
  317. padding: 125px 100px 75px;
  318. width: 1050px;
  319. height: 1485px;
  320. box-sizing: border-box;
  321. transform: scale(0.5) translateY(-52%);
  322. }
  323. // height: 100%;
  324. // width: 100%;
  325. // line-height: 100px;
  326. // text-align: center;
  327. }
  328. }
  329. }
  330. }
  331. </style>