Bläddra i källkod

Merge branch 'dev' of http://111.2.21.141:33001/ystl_myq/hospital-project into dev

ystl_myq 1 månad sedan
förälder
incheckning
1ff4b86edb

+ 21 - 1
src/api/indexData.ts

@@ -2,11 +2,13 @@
  * @Author: zhanghaifeng
  * @Date: 2025-01-06 17:11:11
  * @LastEditors: zhanghaifeng
- * @LastEditTime: 2025-01-08 11:04:59
+ * @LastEditTime: 2025-01-10 17:53:26
  * @Description:
  * @FilePath: /hospital-project/src/api/indexData.ts
  */
 import { http } from "@/utils/http";
+import axios from "axios";
+const FLIE_URL = import.meta.env.VITE_BASE_URL;
 
 type PageListType = {
   code: number;
@@ -48,3 +50,21 @@ export const editListApi = data => {
     data
   });
 };
+
+// 分页-日志
+export const getLogInfo = params => {
+  return http.request<PageListType>("get", "/source/getSourceDataUpdateText", {
+    params
+  });
+};
+
+// 批量导入
+export const uploadData = async data => {
+  const token = localStorage.getItem("token") || "";
+  return axios.post(`${FLIE_URL}/source/importSourceData`, data, {
+    headers: {
+      "Content-Type": "multipart/form-data", // 指定内容类型
+      satoken: token // 将 Token 添加到请求头
+    }
+  });
+};

+ 171 - 5
src/views/evaluate/children/change/manage.vue

@@ -15,6 +15,8 @@ import {
   postCopyAssessment
 } from "@/api/manage";
 import { assessmentStatus, getStateType } from "@/config/tag";
+import { Calendar } from "@element-plus/icons-vue";
+
 const manageObjectRef = ref();
 const manageObjectShow = ref(false);
 const addExamRef = ref();
@@ -79,8 +81,15 @@ const handleSizeChange = (val: number) => {
 // 复制考核
 const dialogVisibleCopy = ref(false);
 const copyTitle = ref("");
-const copyForm = reactive({ name: "" });
+const copyForm = reactive({
+  name: "",
+  cycle: "",
+  cycleValue: ""
+});
 const copyManage = (row: any) => {
+  if (row.cycle) {
+    handleRegionChange(row.cycle);
+  }
   Object.assign(copyForm, row);
   copyTitle.value = row.name;
   dialogVisibleCopy.value = true;
@@ -90,17 +99,95 @@ const handleClose = () => {
   dialogVisibleCopy.value = false;
 };
 const saveCopy = async () => {
+  if (timeType.value == "月度") {
+    copyForm.cycleValue = dayjs(new Date(copyForm.cycleValue)).format(
+      "YYYY-MM"
+    );
+  }
+  if (timeType.value == "年度") {
+    copyForm.cycleValue = dayjs(new Date(copyForm.cycleValue)).format("YYYY");
+  }
+  if (timeType.value == "日期") {
+    copyForm.cycleValue = dayjs(new Date(copyForm.cycleValue)).format(
+      "YYYY-MM-DD"
+    );
+  }
   const { code, msg } = await postCopyAssessment(copyForm);
   if (code === 200) {
     ElMessage.success("复制成功");
     dialogVisibleCopy.value = false;
     getAssessmentPageListApi();
-    // } else {
-    //   ElMessage.error(msg);
   }
 };
-const arrData = i => {
-  console.log(i);
+const timeType = ref<any>("月度");
+const quarterValue = ref(true);
+const format = ref<any>("YYYY-MM");
+const pickerType = ref<any>("month");
+const handleRegionChange = (value: any) => {
+  timeType.value = value;
+  switch (value) {
+    case "年度":
+      copyForm.cycleValue = "";
+      format.value = "YYYY";
+      pickerType.value = "year";
+      break;
+    case "月度":
+      copyForm.cycleValue = "";
+      format.value = "YYYY-MM";
+      pickerType.value = "month";
+      break;
+    case "日期":
+      copyForm.cycleValue = "";
+      format.value = "YYYY-MM-DD";
+      pickerType.value = "";
+      break;
+    case "季度":
+      copyForm.cycleValue = "";
+      quarterValue.value = true;
+      break;
+    case "半年":
+      copyForm.cycleValue = "";
+      quarterValue.value = false;
+      break;
+  }
+};
+const yearTime = ref<any>(dayjs(new Date()).format("YYYY"));
+const decreaseYear = () => {
+  yearTime.value = dayjs().year(yearTime.value).subtract(1, "year").year(); // 减一年
+};
+const increaseYear = () => {
+  yearTime.value = dayjs().year(yearTime.value).add(1, "year").year(); // 加一年
+};
+const monthOne = item => {
+  let start = "";
+  let end = "";
+  switch (item) {
+    case "第一季度":
+      start = `${yearTime.value}-01-01`;
+      end = `${yearTime.value}-03-31`;
+      break;
+    case "第二季度":
+      start = `${yearTime.value}-04-01`;
+      end = `${yearTime.value}-06-30`;
+      break;
+    case "第三季度":
+      start = `${yearTime.value}-07-01`;
+      end = `${yearTime.value}-09-30`;
+      break;
+    case "第四季度":
+      start = `${yearTime.value}-10-01`;
+      end = `${yearTime.value}-12-31`;
+      break;
+    case "上半年":
+      start = `${yearTime.value}-01-01`;
+      end = `${yearTime.value}-06-30`;
+      break;
+    case "下半年":
+      start = `${yearTime.value}-07-01`;
+      end = `${yearTime.value}-12-31`;
+      break;
+  }
+  copyForm.cycleValue = `${yearTime.value}年${item}`;
 };
 </script>
 
@@ -264,6 +351,85 @@ const arrData = i => {
         <el-form-item label="名称" prop="name">
           <el-input v-model="copyForm.name" placeholder="请输入" />
         </el-form-item>
+        <el-form-item label="考核周期">
+          <el-radio-group v-model="copyForm.cycle" @change="handleRegionChange">
+            <el-radio value="月度" size="large">月度</el-radio>
+            <el-radio value="季度" size="large">季度</el-radio>
+            <el-radio value="半年" size="large">半年</el-radio>
+            <el-radio value="年度" size="large">年度</el-radio>
+            <el-radio value="日期" size="large">日期</el-radio>
+          </el-radio-group>
+          <el-date-picker
+            v-if="
+              timeType === '月度' || timeType === '日期' || timeType === '年度'
+            "
+            v-model="copyForm.cycleValue"
+            :type="pickerType"
+            :format="format"
+            placeholder="请选择"
+          />
+          <el-dropdown
+            v-else-if="timeType === '季度' || timeType === '半年'"
+            trigger="click"
+          >
+            <span class="el-dropdown-link navbar-bg-hover select-none">
+              <el-input
+                v-model="copyForm.cycleValue"
+                style="width: 240px"
+                placeholder="请选择"
+                :prefix-icon="Calendar"
+              />
+            </span>
+            <template #dropdown>
+              <el-dropdown-menu class="setting" style="width: 300px">
+                <div class="flex justify-between align-center text-base mt-4">
+                  <div
+                    class="cursor-pointer ml-4 text-xs pt-2"
+                    @click="decreaseYear"
+                  >
+                    <el-icon>
+                      <DArrowLeft />
+                    </el-icon>
+                  </div>
+                  <div>{{ yearTime }}</div>
+                  <div
+                    class="cursor-pointer mr-4 text-xs pt-2"
+                    @click="increaseYear"
+                  >
+                    <el-icon>
+                      <DArrowRight />
+                    </el-icon>
+                  </div>
+                </div>
+                <div
+                  v-if="quarterValue"
+                  class="flex justify-center align-center mt-5 mb-5"
+                >
+                  <el-dropdown-item @click="monthOne('一季度')">
+                    一季度
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('二季度')">
+                    二季度
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('三季度')">
+                    三季度
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('四季度')">
+                    四季度
+                  </el-dropdown-item>
+                </div>
+                <div v-else class="flex justify-around align-center mt-5 mb-5">
+                  <el-dropdown-item @click="monthOne('上半年')">
+                    上半年
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('下半年')">
+                    下半年
+                  </el-dropdown-item>
+                </div>
+              </el-dropdown-menu>
+            </template>
+          </el-dropdown>
+        </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">

+ 55 - 9
src/views/evaluate/children/change/mould/manageObject.vue

@@ -186,12 +186,25 @@ const getAssessmentQuotaDetailsApi = async () => {
   }
 };
 // 考核模板
+const modulesList = ref([]);
 const getTemplateInfoListApi = async () => {
-  const { data, code } = await getTemplateInfoList(initParams.params);
+  const { data, code } = await getTemplateInfoList({
+    page: 1,
+    pageSize: 100
+  });
   if (code == 200) {
-    // initParams.tmpList = data.records;
+    modulesList.value = data.records || [];
   }
 };
+const modulesValue = ref("");
+const handleModulesSelect = val => {
+  addPersonParams.assessmentModelId = val;
+  modulesList.value.forEach(el => {
+    if (el.id === val) {
+      addPersonParams.assessmentModelName = el.tpName;
+    }
+  });
+};
 // 删除
 const delParams = reactive({
   assessmentId: "",
@@ -200,7 +213,9 @@ const delParams = reactive({
 // 被考核对象
 const addPersonParams = reactive({
   assessmentId: "",
-  objectAddVoList: []
+  objectAddVoList: [],
+  assessmentModelId: "",
+  assessmentModelName: ""
 });
 // 添加被考核人
 const value1 = ref();
@@ -713,9 +728,12 @@ const editClosedEvent = row => {
 const closePerson = () => {
   Object.assign(addPersonParams, {
     assessmentId: "",
-    objectAddVoList: []
+    objectAddVoList: [],
+    assessmentModelId: "",
+    assessmentModelName: ""
   });
   value1.value = [];
+  modulesValue.value = "";
   dialogVisibleAdd.value = false;
 };
 
@@ -1747,9 +1765,12 @@ const selectAllChangeEvent = row => {
           label-width="auto"
           :model="addPersonParams"
         >
-          <el-form-item label="" label-position="top">
+          <el-form-item
+            v-if="$props.message.assessmentType == 0"
+            label="人员"
+            label-position="top"
+          >
             <el-tree-select
-              v-if="$props.message.assessmentType == 0"
               ref="assessmentTypeRef"
               v-model="value1"
               :data="convertDepartmentDataRecursive_Person(treeDept)"
@@ -1759,8 +1780,13 @@ const selectAllChangeEvent = row => {
               style="width: 240px"
               @check-change="handleRreeSelect"
             />
+          </el-form-item>
+          <el-form-item
+            v-else-if="$props.message.assessmentType == 1"
+            label="科室"
+            label-position="top"
+          >
             <el-tree-select
-              v-if="$props.message.assessmentType == 1"
               ref="assessmentTypeRef"
               v-model="value1"
               :data="dpetTree"
@@ -1771,8 +1797,13 @@ const selectAllChangeEvent = row => {
               @check-change="handleRreeSelect"
               @check="handleNodeRreeSelect"
             />
+          </el-form-item>
+          <el-form-item
+            v-else-if="$props.message.assessmentType == 2"
+            label="医疗组"
+            label-position="top"
+          >
             <el-select
-              v-if="$props.message.assessmentType == 2"
               ref="selectRefs"
               v-model="value1"
               multiple
@@ -1785,8 +1816,13 @@ const selectAllChangeEvent = row => {
                 :value="it.groupCode"
               />
             </el-select>
+          </el-form-item>
+          <el-form-item
+            v-else-if="$props.message.assessmentType == 3"
+            label="人员"
+            label-position="top"
+          >
             <el-select
-              v-if="$props.message.assessmentType == 3"
               ref="selectRefs"
               v-model="value1"
               multiple
@@ -1800,6 +1836,16 @@ const selectAllChangeEvent = row => {
               />
             </el-select>
           </el-form-item>
+          <el-form-item label="考核模板" label-position="top">
+            <el-select v-model="modulesValue" @change="handleModulesSelect">
+              <el-option
+                v-for="itemTmp in modulesList"
+                :key="itemTmp.id"
+                :label="itemTmp.tpName"
+                :value="itemTmp.id"
+              />
+            </el-select>
+          </el-form-item>
         </el-form>
       </div>
       <template #footer>

+ 10 - 52
src/views/indexData/components/indexImport.vue

@@ -3,15 +3,14 @@ defineOptions({
   name: "IndexDefineImport"
 });
 import { ref } from "vue";
-import { postUpdateDeptApi, getListTable } from "@/api/download";
+import { uploadData } from "@/api/indexData";
 import { ElMessage } from "element-plus";
 import { useRouter } from "vue-router";
 const $router = useRouter();
 const emit = defineEmits(["handleImport"]);
-const uploadShow = ref(true);
 const fileDocument = ref<File | null>(null); // 存储文件
 const backupUrl =
-  import.meta.env.VITE_BACKUP_URL + "/download/指标导入模板.xlsx";
+  import.meta.env.VITE_BACKUP_URL + "/download/指标数据模板.xlsx";
 // 上传文件函数
 // 上传文件函数
 const uploadFile = async () => {
@@ -24,30 +23,22 @@ const uploadFile = async () => {
     const formData = new FormData();
     // 将生成的文件添加到 FormData 中
     formData.append("file", fileDocument.value);
-    // 获取文件并执行上传
-    const fileToSend = formData.get("file");
     // 调用 API 上传文件
-    const { data } = await postUpdateDeptApi({ file: fileToSend });
-    // const { data } = await postUpdateDeptApi({ file: formData });
+    const { data } = await uploadData(formData);
     if (data.code === 200) {
       // 根据后端返回的 code 判断是否成功
       ElMessage.success("文件上传并导入成功");
       // 重置上传状态
       backDefine();
-      $router.push("/indexDefine/children/define");
-      tableHeaders.value = []; // 清空表头
+      $router.push("/indexData/index");
     } else {
       ElMessage.error(data.msg);
     }
   } catch (error) {
     ElMessage.error("上传失败,请重试");
-    console.error(error);
   }
 };
 
-const tableHeaders = ref<any>([]);
-const tableData = ref<any>([]);
-
 const backDefine = () => {
   emit("handleImport");
 };
@@ -55,27 +46,11 @@ const backDefine = () => {
 // 处理文件上传并解析 Excel 内容
 const handleUploadChange = async (file: File) => {
   fileDocument.value = file; // 保存文件
-  const reader = new FileReader();
   let fileType = file.name.slice(-4);
-  if (fileType == "xlsx") {
-    const formData = new FormData();
-    formData.append("file", fileDocument.value); // 将文件添加到表单数据
-    // 调用 API 上传文件
-    const { data } = await getListTable(formData);
-    if (data.code === 200) {
-      tableData.value = data.data;
-    }
-    uploadShow.value = false; // 隐藏上传区域,显示数据表
-  } else {
+  if (fileType !== "xlsx") {
     ElMessage.error("请上传xlsx文件");
   }
-
-  reader.readAsArrayBuffer(file); // 读取文件为 ArrayBuffer
-};
-
-const stateDone = state => {
-  const arr = ["草稿", "发布", "下架"];
-  return arr[state];
+  return false;
 };
 </script>
 
@@ -97,38 +72,21 @@ const stateDone = state => {
         <p class="text-xs mt-2 text mb-2">
           更新信息的模板中,如有空的数据列,则相应字段信息会被清空,请谨慎填写
         </p>
-        <div v-if="uploadShow">
+        <div>
           <el-upload
             class="upload-demo"
             drag
             multiple
             :before-upload="file => handleUploadChange(file)"
-            :show-file-list="false"
           >
             <el-icon class="el-icon--upload"><upload-filled /></el-icon>
             <div class="el-upload__text">
               点击<em>图标选择上传</em>或者将文件拖拽到此区域
             </div>
           </el-upload>
-        </div>
-        <div v-else class="mb-2">
-          <el-table
-            :data="tableData"
-            border
-            style="width: 100%"
-            max-height="250"
-          >
-            <el-table-column prop="name" label="指标名称" />
-            <el-table-column prop="define" label="指标定义" />
-            <el-table-column prop="caliber" label="指标口径" />
-            <el-table-column prop="categoryName" label="指标分类" />
-            <el-table-column prop="source" label="来源" />
-            <el-table-column prop="statue" label="状态">
-              <template #default="scope">
-                {{ stateDone(scope.row.statue) }}
-              </template>
-            </el-table-column>
-          </el-table>
+          <div v-if="fileDocument && fileDocument.name">
+            {{ fileDocument.name }}
+          </div>
         </div>
         <div class="float-right">
           <el-button @click="backDefine">取消</el-button>

+ 10 - 7
src/views/indexData/components/logDrawer.vue

@@ -2,22 +2,21 @@
  * @Author: zhanghaifeng
  * @Date: 2025-01-03 16:46:09
  * @LastEditors: zhanghaifeng
- * @LastEditTime: 2025-01-03 17:10:33
+ * @LastEditTime: 2025-01-10 15:42:18
  * @Description:
  * @FilePath: /hospital-project/src/views/indexData/components/logDrawer.vue
 -->
 <script setup lang="ts">
 import { ref } from "vue";
 import type { DrawerProps } from "element-plus";
-import { getQuotaLogInfo } from "@/api/indexDefine";
+import { getLogInfo } from "@/api/indexData";
 import dayjs from "dayjs";
 const drawer = ref(false);
 const quotaId = ref();
 const direction = ref<DrawerProps["direction"]>("rtl");
-const logList = ref([]);
+const logList = ref<any>([]);
 const getQuotaLogInfoApi = async () => {
-  const { code, data } = await getQuotaLogInfo(quotaId.value);
-  console.log(data);
+  const { code, data } = await getLogInfo({ sourceDataId: quotaId.value });
   if (code === 200) {
     logList.value = data;
   }
@@ -49,7 +48,7 @@ defineExpose({
               <div
                 class="bg-gray-100 pl-3 pb-2 pt-2 rounded text-sm text-gray-500"
               >
-                {{ item.updateUser }}
+                {{ item.createUser }}
               </div>
             </div>
             <div class="mt-4">
@@ -57,7 +56,11 @@ defineExpose({
               <div
                 class="bg-gray-100 pl-3 pb-2 pt-2 rounded text-sm text-gray-500"
               >
-                {{ dayjs(item.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
+                {{
+                  item.createTime
+                    ? dayjs(item.createTime).format("YYYY-MM-DD HH:mm:ss")
+                    : ""
+                }}
               </div>
             </div>
             <div class="mt-4">