editDrawer.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <script setup lang="ts">
  2. import { ref, reactive, onMounted } from "vue";
  3. import { ElMessage, ElMessageBox } from "element-plus";
  4. import type { DrawerProps, FormProps } from "element-plus";
  5. import { getQuotaPageList } from "@/api/indexDefine";
  6. import { editListApi } from "@/api/indexData";
  7. import { postListTree } from "@/api/department";
  8. import { postOrganizationUserPage } from "@/api/userSetting";
  9. import dayjs from "dayjs";
  10. const emit = defineEmits(["updateDialog"]);
  11. const formRef = ref();
  12. const drawer = ref(false);
  13. const disabledShow = ref<any>(true);
  14. const direction = ref<DrawerProps["direction"]>("rtl");
  15. // 表单
  16. const formLabelAlign = reactive({
  17. id: "",
  18. sourceValue: "",
  19. deptCode: "",
  20. deptId: "",
  21. deptName: "",
  22. userId: "",
  23. userName: "",
  24. numerator: "",
  25. denominator: "",
  26. dataValue: "",
  27. specificTime: ""
  28. });
  29. const rules = reactive<FormProps["rules"]>({
  30. sourceValue: [{ required: true, message: "请输入指标名称", trigger: "blur" }],
  31. define: { required: true, message: "请输入指标定义", trigger: "blur" },
  32. caliber: { required: true, message: "请输入指标口径", trigger: "blur" },
  33. statue: { required: true, message: "请选择指标状态", trigger: "blur" }
  34. });
  35. // 抽屉逻辑
  36. const open = row => {
  37. getQuotaPageListApi();
  38. getIndustryListApi();
  39. Object.assign(formLabelAlign, row);
  40. if (row.deptCode) {
  41. handleDept(row.deptCode);
  42. }
  43. drawer.value = true;
  44. };
  45. defineExpose({
  46. open
  47. });
  48. const handleClose = (done: () => void) => {
  49. if (disabledShow.value) {
  50. disabledShow.value = true;
  51. drawer.value = false;
  52. } else {
  53. ElMessageBox.confirm("配置项未保存,确认关闭", {
  54. type: "warning"
  55. }).then(() => {
  56. formRef.value.clearValidate(); // 清除验证错误
  57. formRef.value.resetFields(); // 重置表单字段
  58. disabledShow.value = true;
  59. drawer.value = false;
  60. });
  61. }
  62. };
  63. const cancelClick = () => {
  64. formRef.value.validate(valid => {
  65. if (valid) {
  66. disabledShow.value = true;
  67. }
  68. });
  69. };
  70. const editClick = () => {
  71. disabledShow.value = false;
  72. };
  73. // 确认
  74. const confirmClick = () => {
  75. formRef.value.validate(async valid => {
  76. if (valid) {
  77. if (formLabelAlign.specificTime) {
  78. formLabelAlign.specificTime = dayjs(formLabelAlign.specificTime).format(
  79. "YYYY-MM-DD"
  80. );
  81. }
  82. const { code, msg } = await editListApi(formLabelAlign);
  83. if (code === 200) {
  84. ElMessage({
  85. message: "修改成功",
  86. type: "success"
  87. });
  88. disabledShow.value = true;
  89. drawer.value = false;
  90. emit("updateDialog");
  91. } else {
  92. ElMessage.error(msg);
  93. }
  94. }
  95. });
  96. };
  97. // 指标名称
  98. const restaurants = ref([]);
  99. const querySearch = (queryString: string, cb: any) => {
  100. const results = queryString
  101. ? restaurants.value.filter(createFilter(queryString))
  102. : restaurants.value;
  103. cb(results);
  104. };
  105. const createFilter = (queryString: string) => {
  106. return restaurant => {
  107. return restaurant.name.indexOf(queryString) === 0;
  108. };
  109. };
  110. const getQuotaPageListApi = async () => {
  111. const { code, data, msg } = await getQuotaPageList({
  112. pageNumber: 1,
  113. pageSize: 99999,
  114. orderField: "updateTime",
  115. param: null,
  116. categoryName: null,
  117. statue: null,
  118. orderType: null
  119. });
  120. if (code == 200) {
  121. if (data.records && data.records.length) {
  122. restaurants.value = data.records;
  123. } else {
  124. restaurants.value = [];
  125. }
  126. } else {
  127. ElMessage.error(msg);
  128. }
  129. };
  130. // 部门名称
  131. const defaultProps = {
  132. children: "childrenRes",
  133. label: "deptName",
  134. value: "deptCode"
  135. };
  136. const deptSelect = ref([]);
  137. const getIndustryListApi = async () => {
  138. const { code, data } = await postListTree();
  139. if (code == 200) {
  140. deptSelect.value = data || [];
  141. }
  142. };
  143. const handleNodeDeptClick = data => {
  144. formLabelAlign.deptId = data.hospitalCode;
  145. formLabelAlign.deptName = data.deptName;
  146. };
  147. // 员工名称
  148. const userSelect = ref([]);
  149. const handleDept = async val => {
  150. const { code, data, msg } = await postOrganizationUserPage({
  151. pageNumber: 1,
  152. pageSize: 99999,
  153. organizationCode: val,
  154. organizationType: "dept",
  155. realName: ""
  156. });
  157. if (code == 200) {
  158. userSelect.value = data.records;
  159. } else {
  160. ElMessage.error(msg);
  161. }
  162. };
  163. const handleUser = val => {
  164. userSelect.value.forEach(item => {
  165. if (item.hospitalCode === val) {
  166. formLabelAlign.userName = item.realName;
  167. }
  168. });
  169. };
  170. </script>
  171. <template>
  172. <div>
  173. <el-drawer
  174. v-model="drawer"
  175. :direction="direction"
  176. :before-close="handleClose"
  177. >
  178. <template #header>
  179. <h4>数据详情</h4>
  180. </template>
  181. <template #default>
  182. <div>
  183. <el-form
  184. ref="formRef"
  185. label-position="top"
  186. label-width="auto"
  187. :rules="rules"
  188. :model="formLabelAlign"
  189. >
  190. <el-form-item
  191. label="指标名称"
  192. label-position="top"
  193. prop="sourceValue"
  194. >
  195. <el-autocomplete
  196. v-model="formLabelAlign.sourceValue"
  197. value-key="name"
  198. :fetch-suggestions="querySearch"
  199. :trigger-on-focus="false"
  200. clearable
  201. placeholder="请输入"
  202. :disabled="disabledShow"
  203. style="width: 100%"
  204. />
  205. </el-form-item>
  206. <el-form-item label="部门名称" label-position="top" prop="deptCode">
  207. <el-tree-select
  208. v-model="formLabelAlign.deptCode"
  209. :disabled="disabledShow"
  210. :data="deptSelect"
  211. :props="defaultProps"
  212. default-expand-all
  213. check-strictly
  214. :render-after-expand="false"
  215. @change="handleDept"
  216. @node-click="handleNodeDeptClick"
  217. />
  218. </el-form-item>
  219. <el-form-item label="员工名称" label-position="top">
  220. <el-select
  221. v-model="formLabelAlign.userId"
  222. :disabled="disabledShow"
  223. filterable
  224. placeholder="请选择"
  225. @change="handleUser"
  226. >
  227. <el-option
  228. v-for="(item, index) in userSelect"
  229. :key="index"
  230. :label="item.realName"
  231. :value="item.hospitalCode"
  232. />
  233. </el-select>
  234. </el-form-item>
  235. <el-form-item label="分子" label-position="top">
  236. <el-input
  237. v-model="formLabelAlign.numerator"
  238. :disabled="disabledShow"
  239. autocomplete="off"
  240. placeholder="请输入"
  241. />
  242. </el-form-item>
  243. <el-form-item label="分母" label-position="top">
  244. <el-input
  245. v-model="formLabelAlign.denominator"
  246. :disabled="disabledShow"
  247. autocomplete="off"
  248. placeholder="请输入"
  249. />
  250. </el-form-item>
  251. <el-form-item label="值" label-position="top">
  252. <el-input
  253. v-model="formLabelAlign.dataValue"
  254. :disabled="disabledShow"
  255. autocomplete="off"
  256. placeholder="请输入"
  257. />
  258. </el-form-item>
  259. <el-form-item
  260. label="数据时间"
  261. prop="specificTime"
  262. label-position="top"
  263. >
  264. <el-date-picker
  265. v-model="formLabelAlign.specificTime"
  266. :disabled="disabledShow"
  267. type="date"
  268. placeholder="请选择日期"
  269. />
  270. </el-form-item>
  271. </el-form>
  272. </div>
  273. </template>
  274. <template #footer>
  275. <el-button v-if="disabledShow" type="warning" @click="editClick"
  276. >编辑</el-button
  277. >
  278. <div v-else>
  279. <el-button @click="cancelClick">取消</el-button>
  280. <el-button type="primary" @click="confirmClick">确认</el-button>
  281. </div>
  282. </template>
  283. </el-drawer>
  284. </div>
  285. </template>