index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. <template>
  2. <ContentWrap>
  3. <!-- 保护性约束观察记录表 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="110px"
  10. >
  11. <TenantSelect v-model="queryParams.tenantIds" placeholder="请选择机构名称" prop="tenantIds" />
  12. <el-form-item label="长者姓名">
  13. <el-input
  14. v-model="queryParams.elderName"
  15. placeholder="长者姓名"
  16. class="!w-240px"
  17. clearable
  18. />
  19. </el-form-item>
  20. <el-form-item label="风险等级">
  21. <el-select v-model="queryParams.risk" class="!w-240px">
  22. <el-option
  23. v-for="(item, index) in [
  24. { label: '无风险', value: 'none' },
  25. { label: '低风险', value: 'low' },
  26. { label: '中风险', value: 'medium' },
  27. { label: '高风险', value: 'high' }
  28. ]"
  29. :key="index"
  30. placeholder="请选择"
  31. :label="item.label"
  32. :value="item.value"
  33. />
  34. </el-select>
  35. </el-form-item>
  36. <el-form-item label="楼栋">
  37. <el-select
  38. v-model="queryParams.buildId"
  39. placeholder="选择楼栋"
  40. style="width: 180px"
  41. @change="handleBuildChange"
  42. >
  43. <el-option
  44. v-for="(item, index) in buildList"
  45. :key="index"
  46. :label="item.buildName"
  47. :value="item.id"
  48. />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="楼层">
  52. <el-select v-model="queryParams.floorId" placeholder="选择楼层" style="width: 180px">
  53. <el-option
  54. v-for="(item, index) in floorList"
  55. :key="index"
  56. :label="item.floorName"
  57. :value="item.id"
  58. />
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item label="评估人">
  62. <el-input
  63. v-model="queryParams.assessor"
  64. placeholder="长者姓名"
  65. class="!w-240px"
  66. clearable
  67. />
  68. </el-form-item>
  69. <el-form-item label="记录日期">
  70. <el-date-picker
  71. size="default"
  72. ref="selectRef"
  73. class="!w-240px"
  74. v-model="queryParams.assessDate"
  75. type="daterange"
  76. :clearable="true"
  77. :editable="false"
  78. placeholder="选择记录日期"
  79. value-format="YYYY-MM-DD"
  80. format="YYYY-MM-DD"
  81. date-format="YYYY-MM-DD"
  82. />
  83. </el-form-item>
  84. <el-form-item>
  85. <el-button @click="handleQuery" style="margin-left: 2vw"
  86. ><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button
  87. >
  88. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  89. </el-form-item>
  90. </el-form>
  91. </ContentWrap>
  92. <!-- 列表 -->
  93. <ContentWrap>
  94. <div class="mb-10px">
  95. <ButtonAdd @click="openForm(undefined)" />
  96. <ButtonImport @click="handleImportCard" />
  97. <!-- <el-button @click="inputH" type="success"><Icon icon="fa:cloud-upload" :size="16" class="mr-1"/>导入</el-button>-->
  98. </div>
  99. <el-table v-loading="loading" :data="list" :header-cell-style="tableHeaderColor">
  100. <el-table-column header-align="center" align="center" label="序号" width="60">
  101. <template #default="scope">
  102. {{
  103. scope.$index + (queryParams.pageNo * queryParams.pageSize - queryParams.pageSize) + 1
  104. }}
  105. </template>
  106. </el-table-column>
  107. <el-table-column
  108. label="机构名称"
  109. v-if="userStore.getUser.id == 1"
  110. type="index"
  111. width="150"
  112. align="center"
  113. >
  114. <template #default="{ row }">
  115. {{ findLabelById(userStore.getOrgTenant.options, row.tenantId) }}
  116. </template>
  117. </el-table-column>
  118. <el-table-column
  119. prop="elderName"
  120. header-align="center"
  121. align="center"
  122. label="长者姓名"
  123. min-width="150"
  124. show-overflow-tooltip
  125. />
  126. <el-table-column
  127. prop="assessor"
  128. header-align="center"
  129. align="center"
  130. label="评估人"
  131. min-width="200"
  132. show-overflow-tooltip
  133. />
  134. <el-table-column
  135. prop="assessDate"
  136. header-align="center"
  137. align="center"
  138. label="记录日期"
  139. min-width="200"
  140. show-overflow-tooltip
  141. />
  142. <el-table-column
  143. header-align="center"
  144. align="center"
  145. label="风险等级"
  146. min-width="200"
  147. show-overflow-tooltip
  148. >
  149. <template #default="scope">
  150. <el-tag
  151. v-if="getRiskLevelInfo(scope.row.assessData).text"
  152. :type="getRiskLevelInfo(scope.row.assessData).type"
  153. >
  154. {{ getRiskLevelInfo(scope.row.assessData).text }}
  155. </el-tag>
  156. </template>
  157. </el-table-column>
  158. <el-table-column
  159. prop="creator"
  160. header-align="center"
  161. align="center"
  162. label="记录人"
  163. min-width="200"
  164. show-overflow-tooltip
  165. />
  166. <el-table-column label="操作" align="center" width="200">
  167. <template #default="scope">
  168. <el-button link type="primary" @click="openFormEdit(scope.row, scope.row.id)">
  169. 编辑
  170. </el-button>
  171. <el-button link type="warning" @click="openFormDetail(scope.row, scope.row.id)">
  172. 详情
  173. </el-button>
  174. <el-button link type="danger" @click="openClose(scope.row)"> 删除 </el-button>
  175. </template>
  176. </el-table-column>
  177. </el-table>
  178. <!-- 分页 -->
  179. <Pagination
  180. :total="total"
  181. v-model:page="queryParams.pageNo"
  182. v-model:limit="queryParams.pageSize"
  183. @pagination="getList"
  184. />
  185. </ContentWrap>
  186. <AddForm ref="formRef" @success="getList" />
  187. <Import
  188. ref="importRef"
  189. @success="getList"
  190. :config="{
  191. title: '导入',
  192. downloadUrl: 'elderly-service-order/get-import-template',
  193. excelTempName: '居家工单-【导入】模板',
  194. importUrl: '/elderly-service-order/import',
  195. failExportUrl: ''
  196. }"
  197. />
  198. </template>
  199. <script setup lang="ts">
  200. import AddForm from './AddForm.vue'
  201. import ButtonAdd from '@/components/ButtonAdd/src/ButtonAdd.vue'
  202. import ButtonImport from '@/components/ButtonImport/src/ButtonImport.vue'
  203. import { getRiskLevelInfo } from '@/utils/risk-assessment'
  204. import { useUserStore } from '@/store/modules/user'
  205. import Import from '@/components/ImportFile/index.vue'
  206. import { perceptionDelete, perceptionPage } from '@/api/social-work'
  207. import { exportWithExpandedObjectArrays } from '@/utils/excel-export'
  208. import { findLabelById } from '@/utils/dict'
  209. import { getBuildList } from '@/api/system/badManage'
  210. import { ref } from 'vue'
  211. const message = useMessage() // 消息弹窗
  212. const { t } = useI18n() // 国际化
  213. const userStore = useUserStore()
  214. const loading = ref(true) // 列表的加载中
  215. const detailRef = ref()
  216. const importRef = ref()
  217. const total = ref(0) // 列表的总页数
  218. const list = ref([]) // 列表的数据
  219. const exportLoading = ref(false)
  220. let queryParams = reactive({
  221. pageNo: 1,
  222. pageSize: 10,
  223. elderName: '',
  224. assessor: '',
  225. floorId: '',
  226. risk: '',
  227. // assessDate: getCurrentMonthRange(),
  228. assessDate: [],
  229. tenantIds: userStore.orgTenantId
  230. })
  231. const queryFormRef = ref() // 搜索的表单
  232. // 打开导出弹窗
  233. const handleImportCard = async () => {
  234. exportLoading.value = true
  235. try {
  236. const queryP = {
  237. pageNo: 1,
  238. pageSize: 9999,
  239. elderName: queryParams.elderName,
  240. risk: queryParams.risk,
  241. assessor: queryParams.assessor,
  242. assessDate: queryParams.assessDate,
  243. tenantIds: queryParams.tenantIds
  244. }
  245. const data = await perceptionPage(queryP)
  246. const exportData = data.list || []
  247. if (exportData.length === 0) {
  248. message.warning('暂无数据可导出')
  249. return
  250. }
  251. const processedData = exportData.map((item) => {
  252. const row: any = {
  253. orgName: findLabelById(userStore.getOrgTenant.options, item.tenantId) || '',
  254. elderName: item.elderName || '',
  255. assessor: item.assessor || '',
  256. assessDate: item.assessDate || '',
  257. assessScore: item.assessScore ?? '',
  258. creator: item.creator || ''
  259. }
  260. const riskInfo = getRiskLevelInfo(item.assessData)
  261. row.riskLevelText = riskInfo.text || '-'
  262. return row
  263. })
  264. const headers = [
  265. {
  266. key: 'orgName',
  267. title: '机构名称'
  268. },
  269. {
  270. key: 'elderName',
  271. title: '长者姓名'
  272. },
  273. {
  274. key: 'assessor',
  275. title: '评估人'
  276. },
  277. {
  278. key: 'assessDate',
  279. title: '记录日期'
  280. },
  281. {
  282. key: 'riskLevelText',
  283. title: '风险等级'
  284. },
  285. {
  286. key: 'creator',
  287. title: '记录人'
  288. }
  289. ]
  290. await exportWithExpandedObjectArrays(
  291. processedData,
  292. headers,
  293. `感知沟通评估_${new Date().getTime()}.xlsx`,
  294. '感知沟通评估'
  295. )
  296. message.success('导出成功')
  297. } catch (error) {
  298. console.error('导出失败:', error)
  299. message.error('导出失败,请重试')
  300. } finally {
  301. exportLoading.value = false
  302. }
  303. }
  304. /** 查询列表 */
  305. const getList = async () => {
  306. loading.value = true
  307. try {
  308. //let queryP = {...queryParams,discoveryTime:queryParams.discoveryTime?[queryParams.discoveryTime[0]+" 00:00:00",queryParams.discoveryTime[1]+" 23:59:59"]:null}
  309. const data = await perceptionPage(queryParams)
  310. list.value = data.list
  311. total.value = data.total
  312. } finally {
  313. loading.value = false
  314. }
  315. }
  316. /** 搜索按钮操作 */
  317. const handleQuery = async () => {
  318. if (!queryFormRef.value) return
  319. const valid = await queryFormRef.value.validate()
  320. if (!valid) return
  321. queryParams.pageNo = 1
  322. await getList()
  323. }
  324. /** 重置按钮操作 */
  325. const resetQuery = () => {
  326. queryParams.elderName = ''
  327. queryParams.assessor = ''
  328. queryParams.floorId = ''
  329. queryParams.risk = ''
  330. queryParams.tenantIds = userStore.orgTenantId
  331. // queryParams.assessDate= getCurrentMonthRange()
  332. queryParams.assessDate = []
  333. queryFormRef.value.resetFields()
  334. handleQuery()
  335. }
  336. /** 添加/修改操作 */
  337. const formRef = ref()
  338. const openForm = (id?: number) => {
  339. if (queryParams.tenantIds.length == 0 || queryParams.tenantIds.length > 1) {
  340. message.error('新增只能选择一个机构')
  341. return
  342. }
  343. formRef.value.open(queryParams.tenantIds[0], id, false)
  344. }
  345. const editRef = ref()
  346. const openFormEdit = (row: any = {}, id?: number) => {
  347. formRef.value.open(row.tenantId, id, false)
  348. }
  349. const openFormDetail = (row: any = {}, id?: number) => {
  350. formRef.value.open(row.tenantId, id, true)
  351. }
  352. const openClose = async (item) => {
  353. try {
  354. console.log('任务ID', item)
  355. const res = await message.confirm('确定要删除吗?', '提示')
  356. if (res == 'confirm') {
  357. // 发起
  358. try {
  359. const res = await perceptionDelete(item.id)
  360. if (res) {
  361. message.success(t('common.updateSuccess'))
  362. }
  363. } catch (err) {}
  364. }
  365. // 刷新列表
  366. await getList()
  367. } catch {}
  368. }
  369. /** 取消按钮操作 */
  370. const cancelDelete = async (id: number) => {
  371. try {
  372. // 取消的二次确认
  373. await message.cancelConfirm()
  374. // 发起取消
  375. // await elderlyBakDel(id)
  376. message.success(t('common.delSuccess'))
  377. // 刷新列表
  378. await getList()
  379. } catch {}
  380. }
  381. const floorList = ref([])
  382. const buildList = ref([])
  383. const handleBuildChange = (buildId: any) => {
  384. const selectedBuild = buildList.value.find((item: any) => item.id === buildId)
  385. if (selectedBuild) {
  386. floorList.value = selectedBuild.floorList || []
  387. }
  388. }
  389. const route = useRoute()
  390. /** 初始化 **/
  391. onMounted(async () => {
  392. if (route.query && route.query.elderName) {
  393. queryParams.elderName = route.query.elderName as string
  394. }
  395. await getList()
  396. try {
  397. buildList.value = await getBuildList({ tenantIds: queryParams.tenantIds[0] })
  398. } catch (e) {}
  399. })
  400. // 表头格式
  401. const tableHeaderColor = ({ rowIndex }: any) => {
  402. if (rowIndex === 0) {
  403. return {
  404. backgroundColor: '#f8f8f9',
  405. color: '#666666',
  406. fontWeight: 'bold'
  407. }
  408. }
  409. }
  410. </script>
  411. <style scoped lang="scss"></style>