index.vue 11 KB

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