index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <template>
  2. <div class="abstract">
  3. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  4. <el-tab-pane label="案件信息" name="1">
  5. <el-form
  6. ref="exampleRef"
  7. :model="bindExample"
  8. label-position="top"
  9. :rules="rules"
  10. label-width="auto"
  11. class="demo-ruleForm"
  12. size="default"
  13. status-icon
  14. >
  15. <div class="form-content">
  16. <el-form-item label="案件名称" required prop="caseTitle">
  17. <el-input
  18. v-model="bindExample.caseTitle"
  19. placeholder="请输入"
  20. show-word-limit
  21. maxlength="100"
  22. />
  23. </el-form-item>
  24. <el-form-item label="立案编号" prop="caseNum">
  25. <el-input
  26. v-model="bindExample.caseNum"
  27. placeholder="请输入"
  28. show-word-limit
  29. maxlength="100"
  30. />
  31. </el-form-item>
  32. <el-form-item label="案件类别" required prop="caseCategory">
  33. <el-select
  34. v-model="bindExample.caseCategory"
  35. placeholder="请选择案件类别"
  36. >
  37. <el-option
  38. v-for="item in criminalType"
  39. :label="item"
  40. :value="item"
  41. />
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="案发时间" required prop="crimeTime">
  45. <el-date-picker
  46. v-model="bindExample.crimeTime"
  47. type="datetime"
  48. aria-label="请选择案发时间"
  49. placeholder="请选择案发时间"
  50. style="width: 100%"
  51. value-format="YYYY-MM-DD HH:mm:ss"
  52. />
  53. </el-form-item>
  54. <el-form-item label="案发区域" prop="name">
  55. <!-- <el-input
  56. v-model="bindExample.caseRegion"
  57. placeholder="请输入案发区域"
  58. show-word-limit
  59. maxlength="100"
  60. /> -->
  61. <el-cascader
  62. size="large"
  63. style="width: 100%"
  64. :props="selectSetting"
  65. :options="(geoData as any as CascaderOption[])"
  66. v-model="bindExample.caseRegion"
  67. ></el-cascader>
  68. </el-form-item>
  69. <el-form-item label="案件地点">
  70. <el-input
  71. v-model="bindExample.caseAddress"
  72. placeholder="输入名称搜索"
  73. clearable
  74. maxlength="100"
  75. disabled
  76. >
  77. <template #append>
  78. <el-button :icon="Search" @click="searchAMapAddress" />
  79. </template>
  80. </el-input>
  81. </el-form-item>
  82. <!-- <el-form-item label="案发地点" prop="name">
  83. <el-input
  84. v-model="bindExample.caseAddress"
  85. placeholder="请输入"
  86. show-word-limit
  87. maxlength="100"
  88. />
  89. </el-form-item> -->
  90. <el-form-item label="是否命案" prop="region">
  91. <el-select
  92. v-model="bindExample.homicideCase"
  93. placeholder="请选择"
  94. >
  95. <el-option label="是" :value="1" />
  96. <el-option label="否" :value="0" />
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item label="是否刑案" prop="region">
  100. <el-select
  101. v-model="bindExample.criminalCase"
  102. placeholder="请选择"
  103. >
  104. <el-option label="是" :value="1" />
  105. <el-option label="否" :value="0" />
  106. </el-select>
  107. </el-form-item>
  108. <el-form-item label="经纬度" prop="name">
  109. <el-input
  110. v-model="bindExample.latAndLongs"
  111. placeholder="请输入"
  112. show-word-limit
  113. maxlength="100"
  114. />
  115. </el-form-item>
  116. <el-form-item>
  117. <el-button
  118. class="w-full"
  119. type="primary"
  120. @click="submitForm(exampleRef)"
  121. >
  122. 保存
  123. </el-button>
  124. </el-form-item>
  125. </div>
  126. </el-form>
  127. </el-tab-pane>
  128. <el-tab-pane label="勘验信息" name="2">
  129. <el-form
  130. ref="ruleFormRef"
  131. :model="ruleForm"
  132. label-position="top"
  133. :rules="rules"
  134. label-width="auto"
  135. class="demo-ruleForm"
  136. size="default"
  137. status-icon
  138. >
  139. <div class="form-content">
  140. <el-form-item label="指挥中心电话时间">
  141. <el-date-picker
  142. v-model="ruleForm.commandTime"
  143. type="datetime"
  144. placeholder="请选择"
  145. aria-label="请选择"
  146. value-format="YYYY-MM-DD HH:mm:ss"
  147. style="width: 100%"
  148. />
  149. </el-form-item>
  150. <el-form-item label="接警时间">
  151. <el-date-picker
  152. v-model="ruleForm.alarmTime"
  153. type="datetime"
  154. placeholder="请选择"
  155. aria-label="请选择"
  156. style="width: 100%"
  157. value-format="YYYY-MM-DD HH:mm:ss"
  158. />
  159. </el-form-item>
  160. <el-form-item label="报警人">
  161. <el-input
  162. v-model="ruleForm.alarmName"
  163. placeholder="请输入"
  164. show-word-limit
  165. maxlength="100"
  166. />
  167. </el-form-item>
  168. <el-form-item label="现场勘验单位">
  169. <el-input
  170. v-model="ruleForm.inquestDept"
  171. placeholder="请输入"
  172. show-word-limit
  173. maxlength="100"
  174. />
  175. </el-form-item>
  176. <el-form-item label="指派/报告单位">
  177. <el-input
  178. v-model="ruleForm.assignDept"
  179. placeholder="请输入"
  180. show-word-limit
  181. maxlength="100"
  182. />
  183. </el-form-item>
  184. <el-form-item label="指派方式">
  185. <el-input
  186. v-model="ruleForm.assignType"
  187. placeholder="请输入"
  188. show-word-limit
  189. maxlength="100"
  190. />
  191. </el-form-item>
  192. <el-form-item label="勘验时间">
  193. <el-date-picker
  194. v-model="ruleForm.times"
  195. value-format="YYYY-MM-DD HH:mm:ss"
  196. type="datetimerange"
  197. start-placeholder="开始时间"
  198. end-placeholder="结束时间"
  199. format="YYYY-MM-DD HH:mm:ss"
  200. date-format="YYYY/MM/DD ddd"
  201. />
  202. </el-form-item>
  203. <el-form-item label="勘验地点">
  204. <el-input
  205. v-model="ruleForm.inquestAddress"
  206. placeholder="请输入"
  207. show-word-limit
  208. maxlength="100"
  209. />
  210. </el-form-item>
  211. <el-form-item>
  212. <el-button
  213. class="w-full"
  214. type="primary"
  215. @click="submitForm(ruleFormRef)"
  216. >
  217. 保存
  218. </el-button>
  219. </el-form-item>
  220. </div>
  221. </el-form>
  222. </el-tab-pane>
  223. </el-tabs>
  224. </div>
  225. </template>
  226. <script setup lang="ts">
  227. import { computed, ref, reactive, onMounted } from "vue";
  228. import { Search } from "@element-plus/icons-vue";
  229. import { ElMessage, CascaderOption, CascaderProps } from "element-plus";
  230. import { Example, setExample, getExamplePagging } from "@/app/criminal/store/example";
  231. import { selectMapImage } from "@/view/case/quisk";
  232. import { geoData } from "./getGeo";
  233. import { getSceneListData, getCaseInquestInfo, casesaveOrUpDate, getcaseInDate, getCaseInfo } from "@/store/case";
  234. const selectSetting = ref<CascaderProps>({
  235. value: "name",
  236. label: "name",
  237. });
  238. import { router } from "@/router";
  239. const active = ref(true);
  240. const caseId = computed(() => {
  241. const caseId = router.currentRoute.value.params.caseId;
  242. if (caseId) {
  243. return Number(caseId);
  244. }
  245. });
  246. const ruleFormRef = ref(null);
  247. const exampleRef = ref(null);
  248. const activeName = ref("1");
  249. const ruleForm = ref({
  250. commandTime: "",
  251. alarmTime: "",
  252. alarmName: "",
  253. inquestDept: "",
  254. assignDept: "",
  255. inquestAddress: "",
  256. location: "",
  257. times: [],
  258. resource: "",
  259. desc: "",
  260. });
  261. const bindExample = ref({
  262. caseTitle: "",
  263. caseNum: "",
  264. mapId: "",
  265. mapUrl: "",
  266. caseCategory: "",
  267. crimeTime: "",
  268. caseRegion: [],
  269. caseAddress: "",
  270. homicideCase: 0,
  271. criminalCase: 0,
  272. latAndLong: "",
  273. latAndLongs: "",
  274. criminalType: "",
  275. });
  276. const criminalType = [
  277. "杀人",
  278. "爆炸",
  279. "放火",
  280. "强奸",
  281. "绑架",
  282. "投毒",
  283. "破坏",
  284. "伤害致死",
  285. "入室抢劫",
  286. "入室盗窃",
  287. "抢劫",
  288. "抢夺",
  289. "盗窃类",
  290. "接触性诈骗",
  291. ];
  292. onMounted(async () => {
  293. console.log("caseInfo", caseId.value);
  294. const caseInfo = await getCaseInfo(caseId.value)
  295. const caseData = await getCaseInquestInfo(caseId.value)
  296. console.log("caseInfo", caseInfo, caseData);
  297. if (caseInfo) {
  298. ruleForm.value = caseData || {};
  299. bindExample.value = JSON.parse(JSON.stringify(caseInfo));
  300. bindExample.value.latAndLongs = bindExample.value.latAndLong.split(',').reverse().join(',')
  301. }
  302. });
  303. const options = Array.from({ length: 10000 }).map((_, idx) => ({
  304. value: `${idx + 1}`,
  305. label: `${idx + 1}`,
  306. }));
  307. const rules = reactive({
  308. caseTitle: [
  309. {
  310. required: true,
  311. message: "请输入",
  312. trigger: "blur",
  313. },
  314. ],
  315. caseNum: [
  316. {
  317. required: true,
  318. message: "请输入",
  319. trigger: "blur",
  320. },
  321. ],
  322. crimeTime: [
  323. {
  324. required: true,
  325. message: "请选择",
  326. trigger: "change",
  327. },
  328. ],
  329. caseCategory: [
  330. { required: true, message: "请选择", trigger: "change" },
  331. ],
  332. });
  333. const showModal = ref(false);
  334. const submit = async () => {
  335. if(activeName.value == "1") {
  336. if (!bindExample.value.caseTitle || !bindExample.value.caseTitle.trim()) {
  337. ElMessage.error("案件名称不能为空");
  338. throw "案件名称不能为空";
  339. }
  340. let latAndLong = bindExample.value.latAndLongs?.split(',').reverse().join(',')
  341. await setExample({...bindExample.value, latAndLong, caseId :caseId.value })
  342. await getCaseInfo(caseId.value)
  343. }else{
  344. await casesaveOrUpDate({...ruleForm.value, caseId :caseId.value })
  345. }
  346. ElMessage.success("保存成功");
  347. };
  348. const submitForm = async (formEl) => {
  349. if (!formEl) return;
  350. await formEl.validate((valid, fields) => {
  351. if (valid) {
  352. console.log("submit!");
  353. submit();
  354. } else {
  355. console.log("error submit!", fields);
  356. }
  357. });
  358. };
  359. const resetForm = (formEl) => {
  360. if (!formEl) return;
  361. formEl.resetFields();
  362. };
  363. function handleActive(params) {
  364. console.log("handleActive", params);
  365. }
  366. async function handleAdd() {
  367. console.log("handleAdd");
  368. }
  369. const searchAMapAddress = async () => {
  370. const data = await selectMapImage({text: true, mapId: bindExample.value.mapId});
  371. console.log("searchAMapAddress", data);
  372. if (!data?.search) return;
  373. bindExample.value.mapId = data.mapId;
  374. bindExample.value.mapUrl = data.mapUrl;
  375. bindExample.value.caseAddress = data.search.text;
  376. bindExample.value.latAndLong = `${data.search.lat},${data.search.lng}`;
  377. bindExample.value.latAndLongs = `${data.search.lng},${data.search.lat}`;
  378. };
  379. </script>
  380. <style lang="scss" scoped>
  381. .abstract {
  382. height: 100%;
  383. .el-form-item--label-top {
  384. margin-bottom: 14px;
  385. }
  386. .form-content {
  387. height: calc(100vh - 175px);
  388. overflow-y: scroll;
  389. }
  390. .demo-tabs {
  391. .el-tabs__item {
  392. height: 32px;
  393. line-height: 32px;
  394. }
  395. }
  396. }
  397. </style>