Browse Source

feat: 考核管理

ystl_myq 7 tháng trước cách đây
mục cha
commit
0fe56730f7

BIN
dist.zip


+ 30 - 0
src/api/dimension.ts

@@ -0,0 +1,30 @@
+import { http } from "@/utils/http";
+// 维度
+type dimension = {
+  code: number;
+  msg: string;
+  data: boolean;
+};
+type dimensionList = {
+  code: number;
+  msg: string;
+  data: Array<any>;
+};
+// 新建
+export const postAddDimension = data => {
+  return http.request<dimensionList>("post", "/dimensionInfo/addDimension", {
+    data
+  });
+};
+// 详情
+export const getDimensionInfo = (id: number) => {
+  return http.request<dimensionList>("get", `/dimensionInfo/getInfo/id=${id}`);
+};
+// 删除
+export const getDimensionRemove = (id: number) => {
+  return http.request<dimension>("get", `/dimensionInfo/remove/id=${id}`);
+};
+// 更新编辑
+export const postUpdateDept = data => {
+  return http.request<dimension>("post", "/dimensionInfo/update", { data });
+};

+ 34 - 0
src/api/templateInfo.ts

@@ -0,0 +1,34 @@
+import { http } from "@/utils/http";
+// 指标列表
+type templateInfo = {
+  code: number;
+  msg: string;
+  data: boolean;
+};
+type templateInfoList = {
+  code: number;
+  msg: string;
+  data: Array<any>;
+};
+// 分页查询
+export const getTemplateInfoList = params => {
+  return http.request<templateInfoList>("get", "/templateInfo/page", {
+    params
+  });
+};
+// 添加
+export const postAddTemplate = data => {
+  return http.request<templateInfo>("post", "/templateInfo/addTemplate", {
+    data
+  });
+};
+// 复制
+export const getCopyTemplate = data => {
+  return http.request<templateInfo>("get", "/templateInfo/copyTemplate", {
+    data
+  });
+};
+// 删除
+export const getDeleteTemplate = id => {
+  return http.request<templateInfo>("get", `/templateInfo/remove/id=${id}`);
+};

+ 7 - 0
src/assets/svg/layers (1).svg

@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="design-iconfont">
+  <g opacity=".5" fill="#FFF" fill-rule="nonzero">
+    <path d="M12.4583333,13 C12.7574876,13 13,12.7574876 13,12.4583333 L13,0.541666671 C13,0.242512429 12.7574876,0 12.4583333,0 L0.541666671,0 C0.242512429,0 0,0.242512429 0,0.541666671 L0,12.4583333 C0,12.7574876 0.242512429,13 0.541666671,13 L12.4583333,13 Z M11.9166667,11.9166667 L1.08333333,11.9166667 L1.08333333,1.08333333 L11.9166667,1.08333333 L11.9166667,11.9166667 Z" transform="translate(1.5 1.5)"/>
+    <path d="M10.1595,7.635875 C10.0297127,7.5741153 9.8807004,7.56647178 9.74527507,7.61462753 C9.60984975,7.66278327 9.49911645,7.76278945 9.43745833,7.892625 C8.82390524,9.18469979 7.43773303,9.92375052 6.02298037,9.71308599 C4.6082277,9.50242147 3.49751607,8.39157087 3.28702853,6.97679186 C3.076541,5.56201285 3.81576514,4.17593311 5.10791667,3.56254167 C5.28276097,3.47952208 5.40003334,3.3095305 5.41555841,3.1166011 C5.43108348,2.9236717 5.34250263,2.73711506 5.18318341,2.62720525 C5.02386418,2.51729545 4.81801096,2.5007304 4.64316667,2.58375 C2.92074223,3.4018847 1.93554589,5.24981661 2.21626125,7.13589434 C2.49697661,9.02197207 3.97762534,10.5028986 5.86365036,10.7839679 C7.74967539,11.0650372 9.59779212,10.0801876 10.41625,8.35791667 C10.5444983,8.08777588 10.4295702,7.7648135 10.1595,7.63641667 L10.1595,7.635875 Z" transform="translate(1.5 1.5)"/>
+    <path d="M10.674625,6.88295833 C10.7762142,6.78139977 10.8333334,6.64364719 10.8333334,6.5 C10.833477,5.3506845 10.3769769,4.24840073 9.56428806,3.43571194 C8.75159927,2.62302315 7.6493155,2.16652298 6.5,2.16666664 C6.20084576,2.16666664 5.95833333,2.40917909 5.95833333,2.70833333 L5.95833333,6.5 C5.95833333,6.79915424 6.20084576,7.04166667 6.5,7.04166667 L10.2916667,7.04166667 C10.4353139,7.04166667 10.5730664,6.98454758 10.674625,6.88295833 Z M9.70504167,5.95833333 L7.04166667,5.95833333 L7.04166667,3.2955 C8.40548082,3.52604285 9.47395715,4.59451918 9.7045,5.95833333 L9.70504167,5.95833333 Z" transform="translate(1.5 1.5)"/>
+  </g>
+</svg>

+ 3 - 0
src/assets/svg/layers (2).svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="design-iconfont">
+  <path d="M9.26598063,6.34730851 L5.58467911,10.1684598 L3.73098327,8.13009892 C3.55958123,7.9415988 3.26782442,7.92771115 3.07930977,8.09918583 C2.89082419,8.27060239 2.87698012,8.56234467 3.04839669,8.75083026 L5.13941732,11.0501801 C5.23047147,11.1502845 5.35540219,11.2011284 5.48084135,11.2011284 C5.52013642,11.2011284 5.55947507,11.196015 5.59782589,11.1859914 C5.62554975,11.1911199 5.65368391,11.1937067 5.68187812,11.1937197 C5.80281396,11.1937197 5.92360453,11.1464349 6.01415025,11.0524754 L9.93040867,6.98741865 C10.1071856,6.80395934 10.1017381,6.511912 9.91824972,6.33514956 C9.73476136,6.15838712 9.44271401,6.16382015 9.26598063,6.34730851 L9.26598063,6.34730851 Z M12.0427111,1.86334166 L10.2013485,1.86334166 L10.2013485,0.46131394 C10.2013485,0.206542436 9.9948061,0 9.7400346,0 C9.48526309,0 9.27872066,0.206527909 9.27872066,0.46131394 L9.27872066,1.86335619 L3.69122334,1.86335619 L3.69122334,0.468562827 C3.69122334,0.213791323 3.48469543,0.00724888702 3.2299094,0.00724888702 C2.97513789,0.00724888702 2.76859546,0.213776796 2.76859546,0.468562827 L2.76859546,1.86334166 L0.96132735,1.86334166 C0.431243407,1.86334166 0,2.29531141 0,2.82628149 L0,12.0370602 C0,12.5680157 0.431243407,13 0.96132735,13 L12.0427111,13 C12.5728096,13 13.004082,12.5680157 13.004082,12.0370602 L13.004082,2.82628149 C13.004082,2.29532594 12.5728096,1.86334166 12.0427111,1.86334166 Z M0.96132735,2.78445875 L12.0427111,2.78445875 C12.0649081,2.78445875 12.0829359,2.80324194 12.0829359,2.82628149 L12.0829359,4.64560686 L0.921131618,4.64560686 L0.921131618,2.82628149 C0.921131618,2.80324194 0.939159411,2.78445875 0.96132735,2.78445875 Z M12.0427111,12.0788684 L0.96132735,12.0788684 C0.939144884,12.0788684 0.921117091,12.0601142 0.921117091,12.0370602 L0.921117091,5.56823474 L12.0829359,5.56823474 L12.0829359,12.0370747 C12.0829359,12.0601288 12.0649081,12.0788684 12.0427111,12.0788684 Z" transform="translate(1.5 1.5)" opacity=".5" fill="#FFF" fill-rule="nonzero"/>
+</svg>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
src/assets/svg/layers (3).svg


+ 3 - 0
src/assets/svg/layers.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="design-iconfont">
+  <path d="M7.99975586,7.5084095 L1.92640564,4.97791052 C1.5159767,4.80690241 1.51597583,4.20040798 1.92640558,4.02939963 L7.99975586,1.49890137 L14.0731058,4.02939963 C14.4835348,4.20040751 14.4835358,4.80690193 14.0731068,4.97791028 L7.99975586,7.5084095 Z M7.99975586,2.59850323 L12.572237,4.50365543 L7.99975538,6.40880775 L3.42727458,4.50365567 L7.99975586,2.59850323 Z M1.49902344,8.25379086 L8.00001335,11.1119394 L14.4990234,8.25466061 L14.4990234,7.02751637 L8.00001335,9.88479519 L1.49902344,7.02664614 L1.49902344,8.25379086 Z M1.49902344,11.6465769 L8.00010777,14.5047674 L14.4990234,11.6475306 L14.4990234,10.4203844 L8.00010777,13.2776222 L1.49902344,10.4194317 L1.49902344,11.6465769 Z" fill="#FFF" opacity=".5" fill-rule="evenodd"/>
+</svg>

+ 5 - 0
src/components/ReIcon/src/offlineIcon.ts

@@ -12,3 +12,8 @@ import Search from "@iconify-icons/ri/search-line";
 import InformationLine from "@iconify-icons/ri/information-line";
 addIcon("ri:search-line", Search);
 addIcon("ri:information-line", InformationLine);
+// import menuIndex from "@/assets/svg/layers.svg?component";
+// import menuIndex from "@/assets/svg/layers (1).svg?component";
+// import menuIndex from "@/assets/svg/layers (2).svg?component";
+// import menuIndex from "@/assets/svg/layers (3).svg?component";
+// addIcon("IF-menu-index", menuIndex);

+ 0 - 1
src/layout/components/sidebar/mixNav.vue

@@ -92,7 +92,6 @@ const changePassword = () => {
             v-if="toRaw(route.meta.icon)"
             :class="['sub-menu-icon', route.meta.icon]"
           >
-            {{ console.log("route.meta.icon", route.meta.icon) }}
             <component
               :is="useRenderIcon(route.meta && toRaw(route.meta.icon))"
             />

+ 2 - 3
src/router/modules/index.ts

@@ -1,11 +1,11 @@
 // 最简代码,也就是这些字段必须有
-import menuHeader from "@/assets/icon-png/menuHeader/layers.svg";
 import server from "@/assets/icon-png/menuList/server (1).svg";
+import menuIndex from "@/assets/svg/layers.svg?component";
 export default {
   path: "/IndexDefine",
   meta: {
     title: "指标库",
-    icon: menuHeader,
+    icon: menuIndex,
     rank: 1
   },
   component: () => import("@/views/indexDefine/children/define.vue"),
@@ -13,7 +13,6 @@ export default {
     {
       path: "/IndexDefine/index",
       name: "indexIndex",
-      // component: () => import("@/views/fighting/index.vue"),
       meta: {
         title: "指标管理",
         icon: server

+ 99 - 28
src/views/evaluate/children/change/components/editMould.vue

@@ -1,33 +1,71 @@
 <script setup lang="ts">
 import { ref, reactive } from "vue";
-import { ElMessageBox } from "element-plus";
+import { ElMessageBox, ElMessage } from "element-plus";
+import { postAddDimension, getDimensionRemove } from "@/api/dimension";
 import type { DrawerProps, FormItemProps, FormProps } from "element-plus";
 // const itemLabelPosition = ref<FormItemProps["labelPosition"]>("");
 const drawer = ref(false);
 const direction = ref<DrawerProps["direction"]>("rtl");
+const ruleFormRef = ref();
 const formLabelAlign = reactive({
-  name: "",
-  region: "",
-  type: ""
+  list: [
+    {
+      id: "",
+      dimName: "",
+      dimWeight: "",
+      mode: ""
+    }
+  ],
+  dimName: "",
+  dimWeight: "",
+  mode: 1,
+  showIndicRemark: false,
+  showScoreRule: false,
+  showDatasource: false,
+  showTargetValue: false,
+  showFinalValue: false,
+  showChallengeValue: false,
+  showStartValue: false,
+  remark: ""
 });
 const newAddItem = ref();
 const handleClose = (done: () => void) => {
-  ElMessageBox.confirm("配置项未保存,确认关闭", {
-    type: "warning"
-  }).then(() => {
-    drawer.value = false;
-  });
-};
-function cancelClick() {
+  // ElMessageBox.confirm("配置项未保存,确认关闭", {
+  //   type: "warning"
+  // }).then(() => {
+  // });
   drawer.value = false;
-}
+};
+function cancelClick() {}
 function confirmClick() {
-  console.log(1111);
+  ruleFormRef.value.validate((valid: boolean) => {
+    if (valid) {
+      postAddDimensionApi();
+    }
+  });
 }
 const open = row => {
+  if (row) {
+    formLabelAlign.dimName = row.name;
+  } else {
+    formLabelAlign.dimName = "";
+  }
   drawer.value = true;
-  // newAddItem.value = row;
-  formLabelAlign.name = row.name;
+};
+const postAddDimensionApi = async () => {
+  const { code, msg } = await postAddDimension(formLabelAlign);
+  if (code === 200) {
+    ElMessage({
+      message: "添加成功",
+      type: "success"
+    });
+    drawer.value = false;
+  } else {
+    ElMessage({
+      message: msg,
+      type: "error"
+    });
+  }
 };
 defineExpose({
   open
@@ -48,23 +86,35 @@ const radio1 = ref("1");
       <template #default>
         <div>
           <el-form
+            ref="ruleFormRef"
             label-position="top"
             label-width="auto"
             :model="formLabelAlign"
           >
-            <el-form-item label="维度名称" label-position="top">
-              <el-input v-model="formLabelAlign.name" />
+            <el-form-item
+              label="维度名称"
+              prop="dimName"
+              label-position="top"
+              :rules="[
+                {
+                  required: true,
+                  message: '请输入模板名称',
+                  trigger: 'blur'
+                }
+              ]"
+            >
+              <el-input v-model="formLabelAlign.dimName" />
             </el-form-item>
             <el-form-item label="维度权重" label-position="top">
-              <el-switch class="mr-4" />
+              <el-switch v-model="formLabelAlign.dimWeight" class="mr-4" />
               <el-input style="max-width: 150px">
                 <template #append>%</template>
               </el-input>
             </el-form-item>
             <el-form-item label="计算方式" label-position="top">
-              <el-radio-group v-model="radio1">
-                <el-radio value="1" size="large">加权</el-radio>
-                <el-radio value="2" size="large">加和</el-radio>
+              <el-radio-group v-model="formLabelAlign.mode">
+                <el-radio :value="0" size="large">加权</el-radio>
+                <el-radio :value="1" size="large">加和</el-radio>
               </el-radio-group>
             </el-form-item>
             <el-form-item label="指标显示字段设置" label-position="top">
@@ -73,31 +123,52 @@ const radio1 = ref("1");
                 <div>
                   <div>
                     <el-text type="info">指标说明</el-text>
-                    <el-switch class="ml-2" />
+                    <el-switch
+                      v-model="formLabelAlign.showIndicRemark"
+                      class="ml-2"
+                    />
                   </div>
                   <div>
                     <el-text type="info">评价标准</el-text>
-                    <el-switch class="ml-2" />
+                    <el-switch
+                      v-model="formLabelAlign.showScoreRule"
+                      class="ml-2"
+                    />
                   </div>
                   <div>
                     <el-text type="info">数据来源</el-text>
-                    <el-switch class="ml-2" />
+                    <el-switch
+                      v-model="formLabelAlign.showDatasource"
+                      class="ml-2"
+                    />
                   </div>
                   <div class="ml-3">
                     <el-text type="info">目标值</el-text>
-                    <el-switch class="ml-2" />
+                    <el-switch
+                      v-model="formLabelAlign.showTargetValue"
+                      class="ml-2"
+                    />
                   </div>
                   <div class="ml-3">
                     <el-text type="info">完成值</el-text>
-                    <el-switch class="ml-2" />
+                    <el-switch
+                      v-model="formLabelAlign.showFinalValue"
+                      class="ml-2"
+                    />
                   </div>
                   <div class="ml-3">
                     <el-text type="info">挑战值</el-text>
-                    <el-switch class="ml-2" />
+                    <el-switch
+                      v-model="formLabelAlign.showChallengeValue"
+                      class="ml-2"
+                    />
                   </div>
                   <div class="ml-3">
                     <el-text type="info">门栏值</el-text>
-                    <el-switch class="ml-2" />
+                    <el-switch
+                      v-model="formLabelAlign.showStartValue"
+                      class="ml-2"
+                    />
                   </div>
                 </div>
               </template>

+ 67 - 81
src/views/evaluate/children/change/components/newAdd.vue

@@ -2,14 +2,18 @@
 defineOptions({
   name: "evaluateNewAdd"
 });
-import { ref, reactive } from "vue";
-import { useRouter } from "vue-router";
+import { ref, reactive, onMounted } from "vue";
+import { useRouter, useRoute } from "vue-router";
 import { Edit } from "@element-plus/icons-vue";
 import { ElMessageBox, ElMessage } from "element-plus";
+import { postAddDimension, getDimensionRemove } from "@/api/dimension";
 import editMould from "./editMould.vue";
 import settingIndexDrawer from "./settingIndexDrawer.vue";
 import importIndex from "./importIndex.vue";
+import { useNav } from "@/layout/hooks/useNav";
+const { toggleSideBar } = useNav();
 const router = useRouter();
+const route = useRoute();
 const formRef = ref();
 const active = ref(0);
 const editDrawer = ref();
@@ -25,25 +29,53 @@ const handleSelect = index => {
   active.value = index;
 };
 const tepName = ref();
+onMounted(() => {
+  if (route.query.tpName) {
+    tepNameForm.tpName = route.query.tpName;
+  }
+});
 const tepNameForm = reactive({
-  name: ""
+  tpName: ""
 });
 // 考核维度卡片
 const eaxmCard = ref([
-  { name: "工作量", value: 1 },
-  { name: "效率", value: 2 },
-  { name: "考核维度", value: 3 },
-  { name: "维度", value: 4 }
+  { name: "工作量", value: 1 }
+  // { name: "效率", value: 2 },
+  // { name: "考核维度", value: 3 },
+  // { name: "维度", value: 4 }
 ]);
+const addDimension = reactive({
+  list: [
+    {
+      id: "",
+      dimName: "",
+      dimWeight: "",
+      mode: ""
+    }
+  ],
+  dimName: "",
+  dimWeight: "",
+  mode: "",
+  showIndicRemark: "",
+  showScoreRule: "",
+  showDatasource: "",
+  showTargetValue: "",
+  showFinalValue: "",
+  showChallengeValue: "",
+  showStartValue: "",
+  remark: ""
+});
 // 创建考核维度
 const createAdd = () => {
-  eaxmCard.value.push({ name: "考核维度", value: eaxmCard.value.length + 1 });
-  ElMessage({
-    type: "success",
-    message: "创建成功"
-  });
+  // eaxmCard.value.push({ name: "考核维度", value: eaxmCard.value.length + 1 });
+  // ElMessage({
+  //   type: "success",
+  //   message: "创建成功"
+  // });
+  editDrawer.value.open();
 };
 const backChange = () => {
+  toggleSideBar();
   router.back();
 };
 const tableData = ref([
@@ -54,69 +86,17 @@ const tableData = ref([
     city: "Los Angeles",
     address: "No. 189, Grove St, Los Angeles",
     zip: "CA 90036"
-  },
-  {
-    date: "2016-05-02",
-    name: "Tom",
-    state: "California",
-    city: "Los Angeles",
-    address: "No. 189, Grove St, Los Angeles",
-    zip: "CA 90036"
-  },
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    state: "California",
-    city: "Los Angeles",
-    address: "No. 189, Grove St, Los Angeles",
-    zip: "CA 90036"
-  },
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    state: "California",
-    city: "Los Angeles",
-    address: "No. 189, Grove St, Los Angeles",
-    zip: "CA 90036"
-  },
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    state: "California",
-    city: "Los Angeles",
-    address: "No. 189, Grove St, Los Angeles",
-    zip: "CA 90036"
-  },
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    state: "California",
-    city: "Los Angeles",
-    address: "No. 189, Grove St, Los Angeles",
-    zip: "CA 90036"
-  },
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    state: "California",
-    city: "Los Angeles",
-    address: "No. 189, Grove St, Los Angeles",
-    zip: "CA 90036"
   }
 ]);
-const save = formEl => {
-  console.log(formEl);
-  formEl.validate(valid => {
+const save = () => {
+  formRef.value.validate(valid => {
     console.log(valid);
     if (valid) {
-      console.log("submit!");
-    } else {
-      console.log("error submit!");
+      if (active.value++ > 2) {
+        active.value = 0;
+      }
     }
   });
-  if (active.value++ > 2) {
-    active.value = 0;
-  }
 };
 const deleteRow = row => {
   console.log(row);
@@ -157,12 +137,17 @@ const deletePen = index => {
       type: "warning"
     }
   )
-    .then(() => {
-      eaxmCard.value.splice(index, 1);
-      ElMessage({
-        type: "success",
-        message: "删除成功"
-      });
+    .then(async () => {
+      // eaxmCard.value.splice(index, 1);
+      const { code, msg } = await getDimensionRemove(index);
+      if (code === 200) {
+        ElMessage({
+          type: "success",
+          message: "删除成功"
+        });
+      } else {
+        ElMessage.error(msg);
+      }
     })
     .catch(() => {
       ElMessage({
@@ -190,7 +175,7 @@ const importIndexDialog = row => {
       ref="settingIndexDrawerRef"
       v-model:drawerValue="settingIndexDrawerShow"
     />
-    <!-- 编辑模块 -->
+    <!-- 新增、编辑模块 -->
     <editMould ref="editDrawer" v-model:drawerValue="editDrawerShow" />
     <div class="w-[100%] flex justify-evenly">
       <div class="left-box">
@@ -222,9 +207,7 @@ const importIndexDialog = row => {
         </el-steps>
       </div>
       <div class="right-box">
-        <el-button type="primary" class="mr-2" @click="save(formRef)"
-          >保存</el-button
-        >
+        <el-button type="primary" class="mr-2" @click="save()">保存</el-button>
       </div>
     </div>
     <div class="mt-2">
@@ -236,7 +219,7 @@ const importIndexDialog = row => {
           style="max-width: 600px"
         >
           <el-form-item
-            prop="name"
+            prop="tpName"
             label="模板名称"
             :rules="[
               {
@@ -246,7 +229,10 @@ const importIndexDialog = row => {
               }
             ]"
           >
-            <el-input v-model="tepName" placeholder="最多输入100字" />
+            <el-input
+              v-model="tepNameForm.tpName"
+              placeholder="最多输入100字"
+            />
           </el-form-item>
         </el-form>
       </div>

+ 1 - 1
src/views/evaluate/children/change/manage.vue

@@ -40,7 +40,7 @@ const newAdd = () => {
   addExamRef.value.open();
 };
 const handleRowClick = (row: any) => {
-  router.push({ path: "/evaluate/children/change/mould/manageObject" });
+  // router.push({ path: "/evaluate/children/change/mould/manageObject" });
   console.log(row);
 };
 const setEdit = (row: any) => {};

+ 23 - 12
src/views/evaluate/children/change/manage/addExam.vue

@@ -3,22 +3,29 @@ import { ref, reactive, nextTick } from "vue";
 import { ElMessageBox, ElMessage } from "element-plus";
 import ElPicker from "@/components/ELPicker/index.vue";
 const dialogVisibleAdd = ref(false);
+const title = ref<String>("发起考核");
 // 季度 半年
 const ElPickerRef = ref();
 const form = reactive({
-  name: "",
-  region: "month",
-  date1: "",
-  date2: "",
-  delivery: false,
-  type: [],
-  resource: "",
-  desc: "",
+  id: "",
+  params: {
+    id: "",
+    tpName: "",
+    remark: "",
+    isDelete: "",
+    createUser: "",
+    createTime: "",
+    updateUser: "",
+    updateTime: "",
+    flowId: ""
+  },
+  tpName: "",
+  remark: "",
+  isDelete: "",
   form1: {
     left: [{ value: "1" }],
     right: [{ value: "1" }]
-  },
-  form2: {}
+  }
 });
 const rules = reactive({
   name: [
@@ -53,7 +60,11 @@ const saveDepartment = () => {
     type: "success"
   });
 };
-const open = (item: any) => {
+const open = (item: any, index: string) => {
+  if (item) {
+    title.value = index;
+    console.log(item);
+  }
   dialogVisibleAdd.value = true;
 };
 const addNew = () => {
@@ -98,7 +109,7 @@ defineExpose({
   <div>
     <el-dialog
       v-model="dialogVisibleAdd"
-      title="发起考核"
+      :title="title"
       width="500"
       :before-close="handleClose"
     >

+ 83 - 14
src/views/evaluate/children/change/mould.vue

@@ -2,10 +2,21 @@
 defineOptions({
   name: "evaluateChangeMould"
 });
-import { ref } from "vue";
+import { ref, reactive, markRaw } from "vue";
+import { useNav } from "@/layout/hooks/useNav";
 import { useRouter } from "vue-router";
 import { Search } from "@element-plus/icons-vue";
 import copyMould from "./mould/copyMould.vue";
+import { getTemplateInfoList, getDeleteTemplate } from "@/api/templateInfo";
+import { Delete, Check } from "@element-plus/icons-vue";
+import editExam from "./manage/addExam.vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import dayjs from "dayjs";
+const { toggleSideBar } = useNav();
+// 编辑
+const editExamRef = ref();
+const addExamShow = ref(false);
+// 复制
 const copyMouldRef = ref();
 const copyMouldShow = ref(false);
 const router = useRouter();
@@ -37,18 +48,70 @@ const tableData = [
 ];
 const newAdd = () => {
   router.push("/evaluate/children/change/components/newAdd");
+  toggleSideBar();
+};
+const setEdit = (row: any) => {
+  router.push({ name: "evaluateNewAdd", query: { ...row } });
+  toggleSideBar();
+};
+// 删除
+const setDelete = (row: any) => {
+  ElMessageBox.confirm("确定删除该考核模板吗?", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+    icon: markRaw(Delete)
+  })
+    .then(async () => {
+      const { code } = await getDeleteTemplate(row.id);
+      if (code === 200) {
+        ElMessage.success("删除成功");
+      }
+    })
+    .catch(() => {});
 };
-const setEdit = (row: any) => {};
-const setDelete = (row: any) => {};
 // 复制
 const setCopy = (row: any) => {
   copyMouldRef.value.open(row);
 };
+const data = reactive({
+  params: {
+    pageNumber: 1,
+    pageSize: 5
+  },
+  total: 0,
+  records: []
+});
+
+// 分页
+const getTemplateInfoListApi = async () => {
+  const res = await getTemplateInfoList(data.params);
+  console.log("1111", res);
+  if (res.code == 200) {
+    data.records = res.data.records;
+    data.total = res.data.totalRow;
+  }
+};
+getTemplateInfoListApi();
+const handleSizeChange = (val: number) => {
+  data.params.pageSize = val;
+  getTemplateInfoListApi();
+};
+const handleCurrentChange = (val: number) => {
+  data.params.pageNumber = val;
+  getTemplateInfoListApi();
+};
 </script>
 
 <template>
   <div class="w-[100%]">
-    <copyMould ref="copyMouldRef" v-model="copyMouldShow" />
+    <!-- 编辑 -->
+    <editExam ref="editExamRef" v-model="addExamShow" />
+    <copyMould
+      ref="copyMouldRef"
+      v-model="copyMouldShow"
+      @addTemplateApi="getTemplateInfoListApi"
+    />
     <div class="mb-2 flex gap-2 justify-between flex-wrap">
       <div class="flex mt-2">
         <div class="flex mr-2">
@@ -66,10 +129,16 @@ const setCopy = (row: any) => {
       </div>
     </div>
     <div class="mt-8">
-      <el-table :data="tableData" style="width: 100%">
-        <el-table-column prop="address" label="考核模板" />
-        <el-table-column prop="date" label="更新时间" width="150" />
-        <el-table-column prop="name" label="创建人" width="150" />
+      <el-table :data="data.records" style="width: 100%">
+        <el-table-column prop="tpName" label="考核模板" />
+        <el-table-column prop="createTime" label="更新时间" width="160">
+          <template #default="{ row }">
+            <div v-if="row.createTime">
+              {{ dayjs(row.createTime).format("YYYY-MM-DD HH:mm:ss") }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="createUser" label="创建人" width="150" />
         <el-table-column label="操作" width="200">
           <template #default="{ row }">
             <!-- <el-button link :icon="Edit" /> -->
@@ -98,15 +167,15 @@ const setCopy = (row: any) => {
       </el-table>
     </div>
     <div class="float-right mt-8 mr-8">
-      <!-- <el-pagination
-        v-model:current-page="currentPage"
-        v-model:page-size="pageSize"
-        :page-sizes="[10, 15, 20, 30]"
+      <el-pagination
+        v-model:current-page="data.params.pageNumber"
+        v-model:page-size="data.params.pageSize"
+        :page-sizes="[5, 10, 15, 20]"
         layout="total, sizes, prev, pager, next, jumper"
-        :total="400"
+        :total="data.total"
         @size-change="handleSizeChange"
         @current-change="handleCurrentChange"
-      /> -->
+      />
     </div>
   </div>
 </template>

+ 32 - 35
src/views/evaluate/children/change/mould/copyMould.vue

@@ -1,43 +1,51 @@
 <script setup lang="ts">
 import { ref, reactive } from "vue";
 import { ElMessageBox, ElMessage } from "element-plus";
+import { getCopyTemplate, postAddTemplate } from "@/api/templateInfo";
+const $emit = defineEmits(["addTemplateApi"]);
 const dialogVisibleAdd = ref(false);
 const copyTitle = ref("");
+const addTem = ref({});
+// 复制
+const getCopyTemplateApi = async () => {
+  const res = await getCopyTemplate(form);
+  if (res.code === 200) {
+    postAddTemplateApi();
+    Object.assign(addTem.value, res.data);
+  } else {
+    ElMessage.error(res.msg);
+  }
+};
+// 添加
+const postAddTemplateApi = async () => {
+  const { code, data } = await postAddTemplate(addTem.value);
+  if (code === 200) {
+    $emit("addTemplateApi");
+    ElMessage.success("复制成功");
+  }
+};
 const copyMould = () => {
   return "复制来源:" + copyTitle.value;
 };
 const form = reactive({
   name: "",
-  region: "",
-  date1: "",
-  date2: "",
-  delivery: false,
-  type: [],
-  resource: "",
-  desc: ""
+  id: ""
 });
 const handleClose = () => {
-  ElMessageBox.confirm("确认关闭弹窗吗?")
-    .then(() => {
-      dialogVisibleAdd.value = !dialogVisibleAdd.value;
-      ElMessage({
-        message: "已关闭"
-      });
-    })
-    .catch(() => {
-      // catch error
-    });
+  dialogVisibleAdd.value = !dialogVisibleAdd.value;
+  ElMessage({
+    message: "已关闭"
+  });
 };
 // 添加部门保存
 const saveDepartment = () => {
   dialogVisibleAdd.value = false;
-  ElMessage({
-    message: "添加成功",
-    type: "success"
-  });
+  getCopyTemplateApi();
 };
 const open = (item: any) => {
-  copyTitle.value = item.name;
+  copyTitle.value = item.tpName;
+  form.name = item.tpName + "_副本";
+  form.id = item.id;
   dialogVisibleAdd.value = true;
 };
 defineExpose({
@@ -47,21 +55,10 @@ defineExpose({
 
 <template>
   <div>
-    <el-dialog
-      v-model="dialogVisibleAdd"
-      :title="copyMould()"
-      width="500"
-      :before-close="handleClose"
-    >
+    <el-dialog v-model="dialogVisibleAdd" :title="copyMould()" width="500">
       <el-form :model="form" label-width="auto" style="max-width: 600px">
         <el-form-item label="名称">
-          <el-select
-            v-model="form.region"
-            placeholder="please select your zone"
-          >
-            <el-option label="Zone one" value="shanghai" />
-            <el-option label="Zone two" value="beijing" />
-          </el-select>
+          <el-input v-model="form.name" placeholder="请输入名称" />
         </el-form-item>
       </el-form>
       <template #footer>

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

@@ -3,7 +3,7 @@ defineOptions({
   name: "evaluateChangeManageObject"
 });
 import { getState, getStateType } from "@/config/tag";
-import { ref } from "vue";
+import { ref, reactive } from "vue";
 import { useRouter } from "vue-router";
 import { Search } from "@element-plus/icons-vue";
 const router = useRouter();

+ 4 - 2
src/views/login/index.vue

@@ -41,8 +41,10 @@ dataThemeChange();
 const { title } = useNav();
 
 const ruleForm = reactive({
-  username: "admin",
-  password: "123456"
+  username: "",
+  password: ""
+  // username: "admin",
+  // password: "123456"
 });
 const handleBlur = () => {
   // @ts-ignore

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác