index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <template>
  2. <div class="p-2">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="mb-[10px]">
  5. <el-card shadow="hover">
  6. <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="120px">
  7. <el-form-item label="开始时间">
  8. <el-date-picker v-model="queryParams.startTime" type="datetime" placeholder="选择开始时间" clearable />
  9. <el-date-picker v-model="queryParams.endTime" type="datetime" placeholder="选择结束时间" clearable />
  10. </el-form-item>
  11. <el-form-item label="创建人科室">
  12. <el-tree-select v-model="queryParams.createBy" :data="treeData" :props="treeProps" placeholder="请选择" check-strictly node-key="id" @keyup.enter="handleQuery" />
  13. </el-form-item>
  14. <el-form-item label="类型">
  15. <el-select v-model="queryParams.templateTypeId" placeholder="请选择" clearable>
  16. <el-option v-for="item in templateTypeList" :key="item.value" :label="item.label" :value="item.value" />
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item>
  20. <el-input v-model="queryParams.searchValue" style="width: 300px;" placeholder="模板名称/模板描述/创建人/最后编辑人" clearable />
  21. </el-form-item>
  22. <el-form-item>
  23. <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
  24. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  25. </el-form-item>
  26. </el-form>
  27. </el-card>
  28. </div>
  29. </transition>
  30. <el-card shadow="never">
  31. <template #header>
  32. <el-row :gutter="10" class="mb8">
  33. <el-col :span="1.5">
  34. <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['basicPublicTemplate:consultantResultTemplate:add']">新增模板</el-button>
  35. </el-col>
  36. <el-col :span="1.5">
  37. <el-button type="primary" plain icon="Plus" @click="handleAddType">新增类型</el-button>
  38. </el-col>
  39. <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
  40. </el-row>
  41. </template>
  42. <el-table v-loading="loading" border :data="resultTemplateList" @selection-change="handleSelectionChange">
  43. <el-table-column type="selection" width="55" align="center" />
  44. <el-table-column label="模板名称" align="center" prop="templateName" />
  45. <el-table-column label="模板描述" align="center" prop="description" />
  46. <el-table-column label="类型" align="center" prop="templateTypeId">
  47. <template #default="{ row }">
  48. {{ getTemplateTypeName(row.templateTypeId) }}
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
  52. <el-table-column label="创建人姓名" align="center" prop="createByUser" />
  53. <el-table-column label="创建人科室" align="center" prop="createDeptName" />
  54. <el-table-column label="最后修改时间" align="center" prop="updateTime" width="180" />
  55. <el-table-column label="最后修改人姓名" align="center" prop="updateByUser" />
  56. <el-table-column label="最后修改人科室" align="center" prop="updateDeptName" />
  57. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  58. <template #default="scope">
  59. <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['basicPublicTemplate:consultantResultTemplate:edit']">编辑</el-button>
  60. <el-button link type="primary" @click="handleDetail(scope.row)">详情</el-button>
  61. <el-button link type="danger" @click="handleDelete(scope.row)" v-hasPermi="['basicPublicTemplate:consultantResultTemplate:remove']">删除</el-button>
  62. </template>
  63. </el-table-column>
  64. </el-table>
  65. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
  66. </el-card>
  67. <!-- 添加模板类型管理弹窗 -->
  68. <ResultTemplateTypeDialog ref="resultTemplateTypeDialogRef" @success="getTemplateTypeList" />
  69. </div>
  70. </template>
  71. <script setup name="ResultTemplate" lang="ts">
  72. import {
  73. listResultTemplate,
  74. getResultTemplate,
  75. delResultTemplate,
  76. addResultTemplate,
  77. updateResultTemplate
  78. } from '@/api/parameter/basicPublicTemplate/consultantResultTemplate';
  79. import { ResultTemplateVO, ResultTemplateQuery, ResultTemplateForm } from '@/api/parameter/basicPublicTemplate/consultantResultTemplate/types';
  80. import { listResultTemplateType } from '@/api/parameter/basicPublicTemplate/consultantResultTemplateType';
  81. import type { ResultTemplateTypeQuery } from '@/api/parameter/basicPublicTemplate/consultantResultTemplateType/types';
  82. import ResultTemplateTypeDialog from '../consultantResultTemplateType/resultTemplateTypeDialog.vue';
  83. import { listDept } from '@/api/system/dept'; // 部门列表
  84. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  85. const resultTemplateList = ref < ResultTemplateVO[] > ([]);
  86. const buttonLoading = ref(false);
  87. const loading = ref(true);
  88. const showSearch = ref(true);
  89. const ids = ref < Array < string | number >> ([]);
  90. const single = ref(true);
  91. const multiple = ref(true);
  92. const total = ref(0);
  93. import { useRouter } from 'vue-router';
  94. const treeData = ref([]); // 定义 treeData
  95. import { json } from 'stream/consumers';
  96. const router = useRouter();
  97. const queryFormRef = ref < ElFormInstance > ();
  98. const resultTemplateFormRef = ref < ElFormInstance > ();
  99. const resultTemplateTypeDialogRef = ref();
  100. interface ResultTemplateTypeOption {
  101. value: string | number;
  102. label: string;
  103. }
  104. const treeProps = ref({
  105. value: 'deptId', // 对应部门的 deptId
  106. label: 'deptName', // 对应部门的 deptName
  107. children: 'children' // 保持原有的父子结构
  108. });
  109. const templateTypeList = ref < ResultTemplateTypeOption[] > ([]);
  110. const dialog = reactive < DialogOption > ({
  111. visible: false,
  112. title: ''
  113. });
  114. const initFormData: ResultTemplateForm = {
  115. id: undefined,
  116. templateName: undefined,
  117. description: undefined,
  118. templateTypeId: undefined,
  119. content: undefined,
  120. createBy: undefined,
  121. createDept: undefined,
  122. createTime: undefined,
  123. updateBy: undefined,
  124. updateDept: undefined,
  125. updateTime: undefined,
  126. searchValue: undefined,
  127. createDeptName: undefined,
  128. updateDeptName: undefined,
  129. }
  130. const initQueryParams = {
  131. pageNum: 1,
  132. pageSize: 10,
  133. searchValue: undefined,
  134. createBy: undefined,
  135. templateTypeId: undefined,
  136. startTime: undefined,
  137. endTime: undefined,
  138. params: {}
  139. }
  140. const data = reactive < PageData < ResultTemplateForm,
  141. ResultTemplateQuery >> ({
  142. form: { ...initFormData },
  143. queryParams: { ...initQueryParams },
  144. rules: {
  145. templateName: [
  146. { required: true, message: "模板名称不能为空", trigger: "blur" }
  147. ],
  148. templateTypeId: [
  149. { required: true, message: "类型不能为空", trigger: "change" }
  150. ],
  151. description: [
  152. { required: true, message: "模板描述不能为空", trigger: "blur" }
  153. ]
  154. }
  155. });
  156. const { queryParams, form, rules } = toRefs(data);
  157. /** 获取类型名称 */
  158. const getTemplateTypeName = (typeId: string | number) => {
  159. const type = templateTypeList.value.find(t => t.value === typeId);
  160. return type ? type.label : '';
  161. };
  162. /** 查询会诊结果模板列表 */
  163. const getList = async () => {
  164. loading.value = true;
  165. const res = await listResultTemplate(queryParams.value);
  166. resultTemplateList.value = res.rows;
  167. // 获取部门数据
  168. const deptMap = new Map();
  169. treeData.value.forEach(dept => {
  170. deptMap.set(dept.deptId, dept.deptName);
  171. if (dept.children) {
  172. dept.children.forEach(child => {
  173. deptMap.set(child.deptId, child.deptName);
  174. });
  175. }
  176. });
  177. total.value = res.total;
  178. loading.value = false;
  179. }
  180. const getDeptList = async () => {
  181. loading.value = true;
  182. try {
  183. const res = await listDept({});
  184. if (!res.data) {
  185. console.warn("部门数据为空");
  186. treeData.value = [];
  187. return;
  188. }
  189. // 处理树形数据
  190. const processedData = proxy ?.handleTree(res.data, 'deptId');
  191. if (!processedData) {
  192. console.warn("树形数据处理失败");
  193. treeData.value = [];
  194. return;
  195. }
  196. treeData.value = processedData;
  197. } catch (error) {
  198. console.error('获取部门列表失败:', error);
  199. treeData.value = [];
  200. } finally {
  201. loading.value = false;
  202. }
  203. };
  204. /** 获取会诊模板类型列表 */
  205. const getTemplateTypeList = async () => {
  206. try {
  207. const params: ResultTemplateTypeQuery = {
  208. pageNum: 1,
  209. pageSize: 100,
  210. templateType: undefined,
  211. params: {}
  212. };
  213. const res = await listResultTemplateType(params);
  214. templateTypeList.value = res.rows.map(item => ({
  215. value: item.id,
  216. label: item.templateType
  217. }));
  218. } catch (error) {
  219. proxy ?.$modal.msgError("获取类型列表失败");
  220. console.error("获取类型列表失败:", error);
  221. }
  222. }
  223. /** 新增按钮操作 */
  224. const handleAdd = () => {
  225. router.push({
  226. path: '/argManage/consultantResultTemplateAdd',
  227. query: {
  228. templateTypeList: JSON.stringify(templateTypeList.value), // 序列化数组数据
  229. },
  230. });
  231. };
  232. /** 取消按钮 */
  233. const cancel = () => {
  234. reset();
  235. dialog.visible = false;
  236. }
  237. /** 表单重置 */
  238. const reset = () => {
  239. form.value = { ...initFormData };
  240. resultTemplateFormRef.value ?.resetFields();
  241. }
  242. /** 搜索按钮操作 */
  243. const handleQuery = () => {
  244. queryParams.value.pageNum = 1;
  245. getList();
  246. }
  247. /** 重置按钮操作 */
  248. const resetQuery = () => {
  249. queryFormRef.value ?.resetFields();
  250. queryParams.value = { ...initQueryParams };
  251. handleQuery();
  252. }
  253. /** 多选框选中数据 */
  254. const handleSelectionChange = (selection: ResultTemplateVO[]) => {
  255. ids.value = selection.map(item => item.id);
  256. single.value = selection.length != 1;
  257. multiple.value = !selection.length;
  258. }
  259. /** 新增类型按钮操作 */
  260. const handleAddType = () => {
  261. resultTemplateTypeDialogRef.value.open();
  262. };
  263. /** 查看详情按钮操作 */
  264. const handleDetail = (row: ResultTemplateVO) => {
  265. router.push({
  266. path: '/argManage/consultantResultTemplateDetail',
  267. query: { id: row.id }
  268. });
  269. };
  270. /** 修改按钮操作 */
  271. const handleUpdate = (row ? : ResultTemplateVO) => {
  272. const id = row ?.id || ids.value[0];
  273. router.push({
  274. path: '/argManage/consultantResultTemplateAdd',
  275. query: { id }
  276. });
  277. }
  278. /** 提交按钮 */
  279. const submitForm = () => {
  280. resultTemplateFormRef.value ?.validate(async (valid: boolean) => {
  281. if (valid) {
  282. buttonLoading.value = true;
  283. try {
  284. if (form.value.id) {
  285. await updateResultTemplate(form.value);
  286. } else {
  287. await addResultTemplate(form.value);
  288. }
  289. proxy ?.$modal.msgSuccess("操作成功");
  290. dialog.visible = false;
  291. await getList();
  292. } catch (error) {
  293. console.error('提交失败', error);
  294. } finally {
  295. buttonLoading.value = false;
  296. }
  297. }
  298. });
  299. }
  300. /** 删除按钮操作 */
  301. const handleDelete = async (row ? : ResultTemplateVO) => {
  302. const _ids = row ?.id || ids.value;
  303. try {
  304. await proxy ?.$modal.confirm('是否确认删除该模板?');
  305. await delResultTemplate(_ids);
  306. proxy ?.$modal.msgSuccess("删除成功");
  307. await getList();
  308. } catch (error) {
  309. console.error('删除失败', error);
  310. }
  311. }
  312. onMounted(() => {
  313. getList();
  314. getDeptList(); // 初始化时加载部门数据
  315. getTemplateTypeList();
  316. });
  317. </script>