editFire.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <template>
  2. <el-form ref="form" label-width="106px" class="camera-from">
  3. <div class="def-select-map" ref="mapEl"></div>
  4. <div class="el-form-item">
  5. <el-col :span="12">
  6. <el-form-item label="项目编号" class="mandatory">
  7. <el-input
  8. v-model="bindFire.projectSn"
  9. maxlength="18"
  10. placeholder="请输入项目编号"
  11. />
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="12">
  15. <el-form-item label="起火对象" class="mandatory">
  16. <el-input
  17. v-model="bindFire.projectName"
  18. maxlength="50"
  19. placeholder="请输入起火对象"
  20. />
  21. </el-form-item>
  22. </el-col>
  23. </div>
  24. <el-form-item label="详细地址" class="mandatory asdasd">
  25. <!-- <el-input
  26. v-model="bindFire.projectAddress"
  27. maxlength="50"
  28. placeholder="请输入详细地址"
  29. /> -->
  30. <el-input
  31. v-model="bindFire.projectAddress"
  32. placeholder="输入名称搜索"
  33. clearable
  34. disabled
  35. >
  36. <template #append>
  37. <el-button :icon="Search" @click="searchAMapAddress" />
  38. </template>
  39. </el-input>
  40. </el-form-item>
  41. <el-form-item label="勘验地址">
  42. <el-input v-model="bindFire.field1" maxlength="50" placeholder="请输入勘验地址" />
  43. </el-form-item>
  44. <el-form-item label="起火场所" class="mandatory">
  45. <el-cascader
  46. style="width: 100%"
  47. v-model="projectSite"
  48. placeholder="起火场所"
  49. :options="place"
  50. :props="{ expandTrigger: 'hover' }"
  51. />
  52. </el-form-item>
  53. <!-- <el-form-item label="全宗名称">
  54. <el-input v-model="bindFire.field2" maxlength="50" placeholder="请输入全宗名称" />
  55. </el-form-item> -->
  56. <div class="el-form-item">
  57. <el-col :span="12">
  58. <el-form-item label="勘验单位" class="mandatory">
  59. <companySelect v-model="bindFire.deptId" hideAll :notUpdate="true" disabled />
  60. </el-form-item>
  61. </el-col>
  62. <el-col :span="12">
  63. <el-form-item label="勘验人员" class="mandatory">
  64. <el-input
  65. v-model="bindFire.organizerUsers"
  66. maxlength="50"
  67. placeholder="请输入勘验人员"
  68. />
  69. </el-form-item>
  70. </el-col>
  71. </div>
  72. <div class="el-form-item">
  73. <!-- <el-col :span="12">
  74. <el-form-item label="勘验人姓名">
  75. <el-input
  76. v-model="bindFire.field3"
  77. maxlength="18"
  78. placeholder="请输入勘验人姓名"
  79. />
  80. </el-form-item>
  81. </el-col> -->
  82. <el-col :span="12">
  83. <el-form-item label="勘验人职务">
  84. <el-input
  85. v-model="bindFire.field4"
  86. maxlength="50"
  87. placeholder="请输入勘验人职务"
  88. />
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="12">
  92. <el-form-item label="火灾原因" class="mandatory">
  93. <el-cascader
  94. style="width: 100%"
  95. v-model="fireReason"
  96. placeholder="火灾原因:"
  97. :options="reason"
  98. :props="{ expandTrigger: 'hover' }"
  99. />
  100. </el-form-item>
  101. </el-col>
  102. </div>
  103. <div class="el-form-item">
  104. <el-col :span="12">
  105. <el-form-item label="事故日期" class="mandatory" placeholder="请选择事故日期">
  106. <el-date-picker
  107. type="date"
  108. v-model="accidentDate"
  109. style="width: 100%"
  110. :disabled-date="(date) => date.getTime() > new Date().getTime()"
  111. />
  112. </el-form-item>
  113. </el-col>
  114. <el-col :span="12">
  115. <el-form-item label="大屏显示" class="mandatory">
  116. <el-switch v-model="bindFire.mapShow" :disabled="!bindFire.latlng" />
  117. </el-form-item>
  118. </el-col>
  119. </div>
  120. <div class="el-form-item">
  121. <el-col :span="12">
  122. <el-form-item label="事件分类">
  123. <el-input
  124. v-model="bindFire.field5"
  125. maxlength="18"
  126. placeholder="请输入事件分类"
  127. />
  128. </el-form-item>
  129. </el-col>
  130. <el-col :span="12">
  131. <el-form-item label="分类登记">
  132. <el-input
  133. v-model="bindFire.field6"
  134. maxlength="50"
  135. placeholder="请输入分类登记"
  136. />
  137. </el-form-item>
  138. </el-col>
  139. </div>
  140. <div class="el-form-item">
  141. <el-col :span="12">
  142. <el-form-item label="天气情况">
  143. <el-input
  144. v-model="bindFire.field7"
  145. placeholder="请输入天气情况"
  146. show-word-limit
  147. maxlength="100"
  148. />
  149. </el-form-item>
  150. </el-col>
  151. <el-col :span="12">
  152. <el-form-item
  153. label="勘验起止时间"
  154. class="mandatory"
  155. placeholder="请选择勘验起止时间"
  156. >
  157. <el-date-picker
  158. v-model="f8"
  159. type="daterange"
  160. range-separator="-"
  161. start-placeholder="开始时间"
  162. end-placeholder="结束时间"
  163. :disabled-date="(date) => date.getTime() > new Date().getTime()"
  164. />
  165. <!-- <el-date-picker
  166. type="date"
  167. v-model="f8"
  168. style="width: 100%"
  169. :disabled-date="(date) => date.getTime() > new Date().getTime()"
  170. /> -->
  171. </el-form-item>
  172. </el-col>
  173. </div>
  174. </el-form>
  175. </template>
  176. <script setup lang="ts">
  177. import companySelect from "@/components/company-select/index.vue";
  178. import { ref, watchEffect } from "vue";
  179. import { Fire, setFire, addFire } from "@/app/fire/store/fire";
  180. import { reason, place } from "@/app/fire/constant/fire";
  181. import { ElMessage } from "element-plus";
  182. import { dateFormat, debounce } from "@/util";
  183. import { genCascaderValue, getCode } from "@/helper/cascader";
  184. import { QuiskExpose } from "@/helper/mount";
  185. import AMapLoader from "@amap/amap-jsapi-loader";
  186. import { user } from "@/store/user";
  187. import { Search } from "@element-plus/icons-vue";
  188. import { selectMapImage } from "@/view/case/quisk";
  189. const props = defineProps<{ fire?: Fire }>();
  190. const bindFire = ref<Fire>(
  191. props.fire
  192. ? { ...props.fire }
  193. : ({
  194. deptId: user.value.info.deptId,
  195. } as Fire)
  196. );
  197. const fireReason = genCascaderValue(bindFire, "fireReason");
  198. const projectSite = genCascaderValue(bindFire, "projectSite");
  199. const accidentDate = ref(
  200. bindFire.value.accidentDate ? new Date(bindFire.value.accidentDate) : new Date()
  201. );
  202. const f8s = [new Date(), new Date()];
  203. if (bindFire.value.field8) {
  204. const s = bindFire.value.field8.split("至");
  205. console.log(s);
  206. if (s.length > 1) {
  207. f8s[0] = new Date(s[0]);
  208. f8s[1] = new Date(s[1]);
  209. } else {
  210. f8s[0] = new Date(s[0]);
  211. }
  212. }
  213. const f8 = ref(f8s);
  214. const searchAMapAddress = async () => {
  215. const data = await selectMapImage({});
  216. if (!data?.search) return;
  217. bindFire.value.projectAddress = data.search.text;
  218. bindFire.value.latlng = bindFire.value.latAndLong = `${data.search.lat},${data.search.lng}`;
  219. };
  220. defineExpose<QuiskExpose>({
  221. async submit() {
  222. if (!bindFire.value.projectAddress || !bindFire.value.projectAddress.trim()) {
  223. ElMessage.error("详细地址不能为空!");
  224. throw "详细地址不能为空!";
  225. } else if (!bindFire.value.projectSn || !bindFire.value.projectSn.trim()) {
  226. ElMessage.error("项目编号不能为空!");
  227. throw "项目编号不能为空!";
  228. } else if (!bindFire.value.projectName || !bindFire.value.projectName.trim()) {
  229. ElMessage.error("起火对象不能为空!");
  230. throw "起火对象不能为空!";
  231. } else if (!bindFire.value.projectSite || !bindFire.value.projectSite.trim()) {
  232. ElMessage.error("起火场所不能为空!");
  233. throw "起火场所不能为空!";
  234. } else if (!bindFire.value.deptId || !bindFire.value.deptId.trim()) {
  235. ElMessage.error("勘验单位不能为空!");
  236. throw "勘验单位不能为空!";
  237. } else if (!bindFire.value.organizerUsers || !bindFire.value.organizerUsers.trim()) {
  238. ElMessage.error("勘验人员不能为空!");
  239. throw "勘验人员不能为空!";
  240. } else if (!accidentDate) {
  241. ElMessage.error("事故日期不能为空!");
  242. throw "事故日期不能为空!";
  243. } else if (!bindFire.value.fireReason || !bindFire.value.fireReason.trim()) {
  244. ElMessage.error("火灾原因不能为空!");
  245. throw "火灾原因不能为空!";
  246. }
  247. bindFire.value.accidentDate = dateFormat(accidentDate.value, "yyyy-MM-dd");
  248. bindFire.value.field8 =
  249. dateFormat(f8.value[0], "yyyy-MM-dd") +
  250. "至" +
  251. dateFormat(f8.value[1], "yyyy-MM-dd");
  252. bindFire.value.projectSiteCode = getCode(place, bindFire.value.projectSite);
  253. bindFire.value.id
  254. ? await setFire(bindFire.value)
  255. : await addFire(bindFire.value as any);
  256. },
  257. });
  258. </script>
  259. <style scoped>
  260. .search-result {
  261. position: absolute;
  262. left: 0;
  263. right: 0;
  264. z-index: 1;
  265. overflow: hidden;
  266. top: 100%;
  267. &.show {
  268. max-height: 450px;
  269. overflow-y: auto;
  270. }
  271. }
  272. .def-map-info {
  273. margin-top: 10px;
  274. p {
  275. font-size: 14px;
  276. color: rgba(0, 0, 0, 0.85);
  277. display: inline;
  278. &:not(:last-child)::after {
  279. content: ",";
  280. margin-right: 6px;
  281. }
  282. }
  283. span::after {
  284. content: ":";
  285. }
  286. }
  287. .def-select-map {
  288. position: absolute;
  289. opacity: 0;
  290. z-index: -1;
  291. width: 540px;
  292. height: 390px;
  293. z-index: 1;
  294. left: -100vw;
  295. top: -100vh;
  296. display: none;
  297. }
  298. .asdasd {
  299. position: relative;
  300. margin-bottom: 15px;
  301. z-index: 2;
  302. }
  303. </style>