index.vue 13 KB

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