index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. import { ref, defineComponent, onMounted, computed, onUnmounted } from 'vue';
  2. import { useRouter, useRoute } from 'vue-router';
  3. import './index.scss';
  4. import { useCommonStore, useIncidentStore } from '@/store';
  5. import {
  6. DropdownItemOption,
  7. NavBar,
  8. DropdownMenu,
  9. DropdownItem,
  10. Icon,
  11. PullRefresh,
  12. Sticky,
  13. Collapse,
  14. CollapseItem,
  15. Field,
  16. Button,
  17. Loading,
  18. Toast,
  19. Step, Steps
  20. } from 'vant';
  21. /** @ts-ignore */
  22. import icon_communication from '@/assets/icons/incident/communication@2x.png';
  23. /** @ts-ignore */
  24. import icon_detail from '@/assets/icons/incident/detail@2x.png';
  25. /** @ts-ignore */
  26. import icon_information from '@/assets/icons/incident/information@2x.png';
  27. /** @ts-ignore */
  28. import icon_plan from '@/assets/icons/incident/plan@2x.png';
  29. /** @ts-ignore */
  30. import icon_yjck from '@/assets/icons/incident/yjck@2x.png';
  31. /** @ts-ignore */
  32. import icon_yjya from '@/assets/icons/incident/yjya@2x.png';
  33. export default defineComponent({
  34. name: 'IncidentManagementDetail',
  35. setup() {
  36. const router = useRouter();
  37. const route = useRoute();
  38. const store = useIncidentStore();
  39. const commonStore = useCommonStore();
  40. const activeNames = ref([]);
  41. const activeoplanNames = ref([]);
  42. const message = ref("");
  43. const dosubmitdata = () => {
  44. if (!store.incidentDetail.baseInfo?.id || message.value == "") {
  45. Toast.fail('信息不完整');
  46. }
  47. store.addIncidentProcess({
  48. incidentId: store.incidentDetail.baseInfo?.id,
  49. des: message.value,
  50. }).then(() => {
  51. message.value = "";
  52. store.getIncidentItem(store.incidentDetail.baseInfo?.id ?? '');
  53. });
  54. };
  55. const planOptions = computed(
  56. () =>
  57. Object.keys(store.incidentDetail?.baseTask ?? {})
  58. .map((idx) => {
  59. const item = commonStore.globalDict['zhdd_incident_level']?.find(
  60. (i) =>
  61. i.dictValue ===
  62. store.incidentDetail?.baseTask?.[idx]?.[0].level?.toString(),
  63. );
  64. const desc = store.incidentDetail?.baseTask?.[idx]?.map(
  65. (i) => i.taskDes,
  66. );
  67. return {
  68. ...item,
  69. desc,
  70. };
  71. })
  72. ?.find(
  73. (item) =>
  74. item.dictValue?.toString() ===
  75. store.incidentDetail?.baseInfo?.level?.toString(),
  76. )?.desc,
  77. );
  78. onMounted(() => {
  79. commonStore.getGlobalDict('zhdd_incident_level');
  80. commonStore.getGlobalDict('zhdd_incident_type');
  81. commonStore.getGlobalDict('zhdd_incident_source');
  82. route.query.id && store.getIncidentItem(route.query.id as string);
  83. });
  84. onUnmounted(() => {
  85. store.incidentDetail = {};
  86. });
  87. return () => (
  88. <div class="incident-detail-container">
  89. <NavBar
  90. title="应急处置"
  91. left-arrow
  92. fixed
  93. onClick-left={() => router.push('/home')}
  94. />
  95. <Sticky>
  96. <div class="title">{store.incidentDetail?.baseInfo?.name}</div>
  97. </Sticky>
  98. <Collapse v-model={activeNames.value}>
  99. <CollapseItem
  100. title="事件信息"
  101. name="事件信息"
  102. v-slots={{ icon: <img class="icon-i" src={icon_information} /> }}>
  103. <p>
  104. 事件类型:
  105. {
  106. commonStore.globalDict['zhdd_incident_type']?.find(
  107. (o) =>
  108. o.dictValue.toString() ===
  109. store.incidentDetail?.baseInfo?.type?.toString(),
  110. )?.dictLabel
  111. }
  112. </p>
  113. <p>
  114. 事件等级:
  115. {
  116. commonStore.globalDict['zhdd_incident_level']?.find(
  117. (o) =>
  118. o.dictValue.toString() ===
  119. store.incidentDetail?.baseInfo?.level?.toString(),
  120. )?.dictLabel
  121. }
  122. </p>
  123. <p>事件时间:{store.incidentDetail?.baseInfo?.createTime}</p>
  124. <p>地点:{store.incidentDetail?.baseInfo?.addr}</p>
  125. <p>
  126. 事件来源:
  127. {commonStore.globalDict['zhdd_incident_source']?.find(
  128. (i) =>
  129. i.dictValue?.toString() ===
  130. (store.incidentDetail?.baseInfo?.source ?? '').toString(),
  131. )?.dictLabel ?? '-'}
  132. </p>
  133. </CollapseItem>
  134. <CollapseItem
  135. title="应急预案"
  136. name="应急预案"
  137. v-slots={{ icon: <img class="icon-i" src={icon_yjya} /> }}>
  138. {planOptions.value?.map((d, index) => (
  139. <p>
  140. {index + 1}、{d}
  141. </p>
  142. ))}
  143. </CollapseItem>
  144. <CollapseItem
  145. title="处置方案"
  146. name="处置方案"
  147. v-slots={{ icon: <img class="icon-i" src={icon_plan} /> }}>
  148. <Collapse v-model={activeoplanNames.value}>
  149. {store.incidentDetail.task?.map((i) => (
  150. <div class="cz-item">
  151. <CollapseItem title={i.taskName} name={i.taskName}>
  152. <div class="cz-zh">
  153. {i.taskPersonVos
  154. ?.map((p) => {
  155. return p.person + p.position;
  156. })
  157. .join('、')}
  158. </div>
  159. <div>
  160. <div class="zl">指令</div>
  161. {i.taskCommandVos.map((c, index) => (
  162. <div>
  163. {index + 1}、{c.command}
  164. </div>
  165. ))}
  166. </div>
  167. </CollapseItem>
  168. </div>
  169. ))}
  170. </Collapse>
  171. </CollapseItem>
  172. <CollapseItem
  173. title="处置详情"
  174. name="处置详情"
  175. v-slots={{ icon: <img class="icon-i" src={icon_detail} /> }}>
  176. <div>
  177. {store.incidentDetail.process?.map((i, index) => (
  178. <div class="czxq-item">
  179. <div class="cz-yuan"></div>
  180. <div
  181. class="cz-line"
  182. style={`display:${
  183. index == (store.incidentDetail.process?.length ?? 0) - 1
  184. ? 'none'
  185. : 'block'
  186. }`}></div>
  187. <div class="cz-time"> {i.createTime}</div>
  188. <div class="cz-des"> {i.des}</div>
  189. </div>
  190. ))}
  191. <Field
  192. v-model={message.value}
  193. autosize
  194. type="textarea"
  195. placeholder="请输入"
  196. />
  197. <div class="cz-action">
  198. <Button size="small" type="primary" onClick={() => {
  199. dosubmitdata();
  200. }}>
  201. 保存
  202. </Button>
  203. <Button size="small" type="default" onClick={() => {
  204. message.value="";
  205. }}>
  206. 取消
  207. </Button>
  208. </div>
  209. </div>
  210. </CollapseItem>
  211. <CollapseItem
  212. title="融合通信"
  213. name="融合通信"
  214. v-slots={{ icon: <img class="icon-i" src={icon_communication} /> }}>
  215. 123
  216. </CollapseItem>
  217. </Collapse>
  218. </div>
  219. );
  220. },
  221. });