index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. <template>
  2. <!-- 勘验笔录{{ props.caseId }} -->
  3. <div class="records">
  4. <div class="header">
  5. <el-button type="primary" @click="handleSave">保存</el-button>
  6. <el-button :disabled="isDisableExport" @click="handleExport"
  7. >导出</el-button
  8. >
  9. </div>
  10. <h3 class="title">基本信息</h3>
  11. <div class="content">
  12. <div class="line">
  13. <span>勘验次数:</span>
  14. <span>第</span>
  15. <el-input
  16. class="input"
  17. v-model="data.count"
  18. placeholder=""
  19. style="width: 80px"
  20. />
  21. <span>次勘验</span>
  22. </div>
  23. <div class="line">
  24. <span>勘验时间:</span>
  25. <div>
  26. <el-input
  27. class="input"
  28. :maxlength="4"
  29. type="text"
  30. v-model="data.startTime.year"
  31. placeholder=""
  32. style="width: 80px"
  33. />
  34. <span>年</span>
  35. <el-input
  36. class="input"
  37. :maxlength="2"
  38. type="text"
  39. v-model="data.startTime.month"
  40. placeholder=""
  41. style="width: 80px"
  42. />
  43. <span>月</span>
  44. <el-input
  45. class="input"
  46. :maxlength="2"
  47. type="text"
  48. v-model="data.startTime.day"
  49. placeholder=""
  50. style="width: 80px"
  51. />
  52. <span>日</span>
  53. <el-input
  54. class="input"
  55. :maxlength="2"
  56. type="text"
  57. v-model="data.startTime.hour"
  58. placeholder=""
  59. style="width: 80px"
  60. />
  61. <span>时</span>
  62. <el-input
  63. class="input"
  64. :maxlength="2"
  65. type="text"
  66. v-model="data.startTime.min"
  67. placeholder=""
  68. style="width: 80px"
  69. />
  70. <span>分</span>
  71. </div>
  72. <span style="width: 60px; text-align: center">至</span>
  73. <div>
  74. <el-input
  75. class="input"
  76. :maxlength="4"
  77. v-model="data.endTime.year"
  78. placeholder=""
  79. style="width: 80px"
  80. />
  81. <span>年</span>
  82. <el-input
  83. class="input"
  84. :maxlength="2"
  85. v-model="data.endTime.month"
  86. placeholder=""
  87. style="width: 80px"
  88. />
  89. <span>月</span>
  90. <el-input
  91. class="input"
  92. :maxlength="2"
  93. v-model="data.endTime.day"
  94. placeholder=""
  95. style="width: 80px"
  96. />
  97. <span>日</span>
  98. <el-input
  99. class="input"
  100. :maxlength="2"
  101. type="text"
  102. v-model="data.endTime.hour"
  103. placeholder=""
  104. style="width: 80px"
  105. />
  106. <span>时</span>
  107. <el-input
  108. class="input"
  109. :maxlength="2"
  110. type="text"
  111. v-model="data.endTime.min"
  112. placeholder=""
  113. style="width: 80px"
  114. />
  115. <span>分</span>
  116. </div>
  117. </div>
  118. <div class="line">
  119. <span>勘验地点:</span>
  120. <el-input
  121. class="input"
  122. type="tel"
  123. v-model="data.address"
  124. placeholder=""
  125. style="width: 100%"
  126. />
  127. </div>
  128. <div class="line">
  129. <span>勘验人员姓名、单位、职务(含技术职务):</span>
  130. <el-input
  131. class="input"
  132. type="tel"
  133. v-model="data.userInfo"
  134. placeholder=""
  135. style="width: 100%"
  136. />
  137. </div>
  138. <div class="line">
  139. <span>勘验气象条件(天气、风力、温度):</span>
  140. <el-input
  141. class="input"
  142. type="tel"
  143. v-model="data.weather"
  144. placeholder=""
  145. style="width: 100%"
  146. />
  147. </div>
  148. <div class="textarea">
  149. <span>勘验情况:</span>
  150. <el-input
  151. type="textarea"
  152. :rows="4"
  153. v-model="data.situation"
  154. placeholder=""
  155. style="width: 100%"
  156. />
  157. </div>
  158. <div class="textarea">
  159. <span>一、环境勘验</span>
  160. <el-input
  161. type="textarea"
  162. :rows="4"
  163. v-model="data.environment"
  164. placeholder=""
  165. style="width: 100%"
  166. />
  167. </div>
  168. <div class="textarea">
  169. <span>二、初步勘验</span>
  170. <el-input
  171. type="textarea"
  172. :rows="4"
  173. v-model="data.firstInquest"
  174. placeholder=""
  175. style="width: 100%"
  176. />
  177. </div>
  178. <div class="textarea">
  179. <span>三、细项勘验</span>
  180. <el-input
  181. type="textarea"
  182. :rows="4"
  183. v-model="data.carefulInquest"
  184. placeholder=""
  185. style="width: 100%"
  186. />
  187. </div>
  188. <div class="textarea">
  189. <span>四、专项勘验</span>
  190. <el-input
  191. type="textarea"
  192. :rows="6"
  193. v-model="data.specialInquest"
  194. placeholder=""
  195. style="width: 100%"
  196. />
  197. </div>
  198. <div class="textarea">
  199. <span>提取物品描述:</span>
  200. <el-input
  201. type="textarea"
  202. :rows="6"
  203. v-model="data.itemDescription"
  204. placeholder=""
  205. style="width: 100%"
  206. />
  207. </div>
  208. <div class="textarea">
  209. <span>现场拍照制图描述:</span>
  210. <el-input
  211. type="textarea"
  212. :rows="6"
  213. v-model="data.imgDescription"
  214. placeholder=""
  215. style="width: 100%"
  216. />
  217. </div>
  218. <div class="info">
  219. <span class="sub-tit">天气情况:</span>
  220. <div class="inner">
  221. <div class="sec">
  222. <span>勘验负责人</span>
  223. <el-input class="input" v-model="data.leader" placeholder="" />
  224. </div>
  225. <div class="sec">
  226. <span> 记录人</span>
  227. <el-input class="input" v-model="data.recorder" placeholder="" />
  228. </div>
  229. <div class="sec">
  230. <span>勘验人</span>
  231. <el-input class="input" v-model="data.inspector" placeholder="" />
  232. </div>
  233. </div>
  234. </div>
  235. <div class="gap"></div>
  236. <!-- 证人 -->
  237. <template v-for="item of data.witnessInfo">
  238. <div class="witnessInfo">
  239. <span class="sub-tit">证人信息:</span>
  240. <div class="line">
  241. <span>证人或当事人:</span>
  242. <el-input
  243. class="input"
  244. v-model="item.name"
  245. placeholder=""
  246. style="width: 180px"
  247. />
  248. <div>
  249. <el-input
  250. class="input"
  251. v-model="item.year"
  252. placeholder=""
  253. style="width: 80px"
  254. />
  255. <span>年</span>
  256. <el-input
  257. class="input"
  258. v-model="item.month"
  259. placeholder=""
  260. style="width: 80px"
  261. />
  262. <span>月</span>
  263. <el-input
  264. class="input"
  265. v-model="item.day"
  266. placeholder=""
  267. style="width: 80px"
  268. />
  269. <span>日</span>
  270. </div>
  271. <span style="margin-left: 50px">身份证件号码:</span>
  272. <el-input
  273. class="input"
  274. v-model="item.id"
  275. placeholder=""
  276. style="width: 280px"
  277. />
  278. </div>
  279. <div class="line">
  280. <span>单位或住址:</span>
  281. <el-input
  282. class="input"
  283. v-model="item.address"
  284. placeholder=""
  285. style="width: 100%"
  286. />
  287. </div>
  288. </div>
  289. </template>
  290. <div class="btn-container">
  291. <el-button class="btn" @click="addwitnessInfo">+新增</el-button>
  292. </div>
  293. <div></div>
  294. </div>
  295. </div>
  296. </template>
  297. <script setup>
  298. import { onMounted, ref, watch } from "vue";
  299. import { reactive } from "vue";
  300. import {
  301. getCaseInquestInfo,
  302. saveCaseInquestInfo,
  303. exportCaseInquestInfo,
  304. } from "@/store/case";
  305. import { ElMessage } from "element-plus";
  306. import saveAs from "@/util/file-serve";
  307. const props = defineProps({ caseId: Number, title: String });
  308. console.log(props);
  309. const isDisableExport = ref(false);
  310. const data = reactive({
  311. count: "",
  312. startTime: {
  313. year: "",
  314. month: "",
  315. day: "",
  316. hour: "",
  317. min: "",
  318. },
  319. endTime: {
  320. year: "",
  321. month: "",
  322. day: "",
  323. hour: "",
  324. min: "",
  325. },
  326. address: "",
  327. userInfo: "",
  328. weather: "",
  329. situation: "",
  330. environment: "", //环境勘验
  331. firstInquest: "", //初步勘验
  332. carefulInquest: "", //细项勘验
  333. specialInquest: "", //专项勘验
  334. itemDescription: "",
  335. imgDescription: "",
  336. leader: "",
  337. recorder: "",
  338. inspector: "",
  339. witnessInfo: [
  340. {
  341. name: "",
  342. year: "",
  343. month: "",
  344. day: "",
  345. id: "",
  346. address: "",
  347. },
  348. {
  349. name: "",
  350. year: "",
  351. month: "",
  352. day: "",
  353. id: "",
  354. address: "",
  355. },
  356. ],
  357. });
  358. watch(
  359. data,
  360. (newValue) => {
  361. // data.userName = newValue.userName.replace(/[^0-9]/g, '');
  362. const sMonth = newValue.startTime.month.replace(/[^0-9]/g, "");
  363. const sDay = newValue.startTime.day.replace(/[^0-9]/g, "");
  364. const sHour = newValue.startTime.hour.replace(/[^0-9]/g, "");
  365. const sMin = newValue.startTime.min.replace(/[^0-9]/g, "");
  366. const eMonth = newValue.endTime.month.replace(/[^0-9]/g, "");
  367. const eDay = newValue.endTime.day.replace(/[^0-9]/g, "");
  368. const eHour = newValue.endTime.hour.replace(/[^0-9]/g, "");
  369. const eMin = newValue.endTime.min.replace(/[^0-9]/g, "");
  370. data.startTime.year = newValue.startTime.year.replace(/[^0-9]/g, "");
  371. data.startTime.month = Number(sMonth) > 12 ? "12" : sMonth;
  372. data.startTime.day = Number(sDay) > 31 ? "31" : sDay;
  373. data.startTime.hour = Number(sDay) > 24 ? "24" : sHour;
  374. data.startTime.min = Number(sMin) > 60 ? "0" : sMin;
  375. data.endTime.year = newValue.endTime.year.replace(/[^0-9]/g, "");
  376. data.endTime.month = Number(eMonth) > 12 ? "12" : eMonth;
  377. data.endTime.day = Number(eDay) > 31 ? "31" : eDay;
  378. data.endTime.hour = Number(eHour) > 24 ? "24" : eHour;
  379. data.endTime.min = Number(eMin) > 60 ? "0" : eMin;
  380. newValue.witnessInfo.forEach((item, key) => {
  381. const year = newValue.witnessInfo[key].year.replace(/[^0-9]/g, "");
  382. const month = newValue.witnessInfo[key].month.replace(/[^0-9]/g, "");
  383. const day = newValue.witnessInfo[key].day.replace(/[^0-9]/g, "");
  384. data.witnessInfo[key].year = year;
  385. data.witnessInfo[key].month = Number(month) > 12 ? "12" : month;
  386. data.witnessInfo[key].day = Number(day) > 31 ? "31" : day;
  387. });
  388. },
  389. {
  390. immediate: true,
  391. deep: true,
  392. }
  393. );
  394. onMounted(async () => {
  395. const res = await getCaseInquestInfo(props.caseId);
  396. console.log("res", res);
  397. if (!res.data) {
  398. isDisableExport.value = true;
  399. }
  400. for (var k in data) {
  401. if (res.data && res.data.hasOwnProperty(k)) {
  402. console.log("Key is " + k);
  403. data[k] = res.data[k];
  404. }
  405. }
  406. });
  407. const addwitnessInfo = () => {
  408. // witnessInfoes.value += 1
  409. data.witnessInfo.push({
  410. name: "",
  411. year: "",
  412. month: "",
  413. day: "",
  414. id: "",
  415. });
  416. };
  417. const handleSave = async () => {
  418. console.log("data", data);
  419. const res = await saveCaseInquestInfo(props.caseId, data);
  420. if (res.code === 0) {
  421. ElMessage.success("保存成功!");
  422. }
  423. };
  424. const handleExport = async () => {
  425. const res = await exportCaseInquestInfo(props.caseId);
  426. console.log("res", res);
  427. saveAs(res, `${props.title}_勘验笔录.docx`);
  428. };
  429. </script>
  430. <style lang="scss">
  431. .records {
  432. max-width: 1280px;
  433. margin: 0 auto;
  434. padding: 20px 0;
  435. .header {
  436. display: flex;
  437. justify-content: flex-endTime;
  438. }
  439. .input {
  440. height: 32px;
  441. line-height: 32px;
  442. margin: 0 8px;
  443. }
  444. .textarea {
  445. margin-right: 8px;
  446. margin-bottom: 20px;
  447. span {
  448. padding: 10px 0;
  449. display: inline-block;
  450. }
  451. // margin: 0 8px;
  452. }
  453. .line {
  454. display: inline-flex;
  455. width: 100%;
  456. flex-direction: row;
  457. align-items: center;
  458. margin-bottom: 25px;
  459. line-height: 38px;
  460. span {
  461. white-space: nowrap;
  462. }
  463. }
  464. }
  465. .title {
  466. text-align: center;
  467. }
  468. .sub-tit {
  469. display: inline-block;
  470. padding-bottom: 20px;
  471. }
  472. .info {
  473. display: block;
  474. .inner {
  475. display: flex;
  476. flex-direction: row;
  477. width: 100%;
  478. .input {
  479. flex: 1;
  480. }
  481. .sec {
  482. flex: 1;
  483. display: inline-flex;
  484. align-items: center;
  485. justify-content: center;
  486. }
  487. }
  488. }
  489. .witnessInfo {
  490. background: #f5f5f5;
  491. padding: 15px;
  492. margin-top: 20px;
  493. margin-right: 8px;
  494. }
  495. .gap {
  496. margin: 15px 0;
  497. }
  498. .btn-container {
  499. padding: 20px 0;
  500. .btn {
  501. color: #26559b;
  502. width: 100%;
  503. &:hover {
  504. background: #f5f5f5;
  505. border-color: #dcdfe6;
  506. }
  507. }
  508. }
  509. </style>