Pārlūkot izejas kodu

数据初始化页面完成

zhangjie 3 gadi atpakaļ
vecāks
revīzija
339f5215b6

+ 13 - 4
src/components/ImportFile.vue

@@ -12,6 +12,16 @@
       @open="visibleChange"
     >
       <div style="footer"></div>
+      <div :class="[`${prefixCls}-footer`]" v-if="downloadUrl">
+        文件下载:
+        <a :href="downloadUrl" :download="dfilename">{{ dfilename }}</a>
+      </div>
+      <div :class="[`${prefixCls}-footer`]" v-if="downloadHandle">
+        文件下载:
+        <el-button type="text" @click="downloadHandle">{{
+          dfilename
+        }}</el-button>
+      </div>
       <div :class="[`${prefixCls}-body`]">
         <el-upload
           drag
@@ -46,10 +56,6 @@
           </p>
         </el-upload>
       </div>
-      <div :class="[`${prefixCls}-footer`]" v-if="downloadUrl">
-        文件下载:
-        <a :href="downloadUrl" :download="dfilename">{{ dfilename }}</a>
-      </div>
     </el-dialog>
   </div>
 </template>
@@ -64,6 +70,9 @@ export default {
       type: String,
       default: "文件上传"
     },
+    downloadHandle: {
+      type: Function
+    },
     downloadUrl: {
       type: String,
       default: ""

+ 5 - 0
src/modules/analysis/api.js

@@ -11,6 +11,11 @@ export const paperDimensionList = datas => {
 export const updatePaperDimension = datas => {
   return $post("/api/admin/grade/paper/dimension/save", datas);
 };
+export const paperDimensionExport = datas => {
+  return $post("/api/admin/grade/paper/dimension/export", datas, {
+    responseType: "blob"
+  });
+};
 export const paperStructList = datas => {
   return $postParam("/api/admin/grade/paper/struct/list", datas);
 };

+ 105 - 9
src/modules/analysis/components/ModifyBaseConfig.vue

@@ -13,7 +13,11 @@
     </div>
     <div class="part-box part-box-pad">
       <el-steps :active="curStep" align-center finish-status="success">
-        <el-step v-for="(item, ind) in steps" :key="item.val">
+        <el-step
+          v-for="(item, ind) in steps"
+          :key="item.val"
+          :status="item.status"
+        >
           <el-button
             slot="title"
             type="text"
@@ -25,8 +29,12 @@
       </el-steps>
     </div>
 
-    <div class="part-box part-box-pad">
-      <component :is="compName" :course="instance"></component>
+    <div v-if="dataReady" class="part-box part-box-pad">
+      <component
+        :is="compName"
+        :configs="configs"
+        @modified="modified"
+      ></component>
     </div>
   </el-dialog>
 </template>
@@ -36,6 +44,12 @@ import DimensionConfig from "./baseConfig/DimensionConfig.vue";
 import BlueprintConfig from "./baseConfig/BlueprintConfig.vue";
 import DiagnoseConfig from "./baseConfig/DiagnoseConfig.vue";
 import CommentConfig from "./baseConfig/CommentConfig.vue";
+import {
+  paperDimensionList,
+  paperStructList,
+  paperDefineList,
+  moduleEvaluationList
+} from "../api";
 
 export default {
   name: "modify-base-config",
@@ -62,24 +76,30 @@ export default {
         {
           name: "知识/能力维度设置",
           val: "dimension",
-          disabled: false
+          disabled: false,
+          status: "process"
         },
         {
           name: "命题蓝图设置",
           val: "blueprint",
-          disabled: false
+          disabled: false,
+          status: "wait"
         },
         {
           name: "诊断规则定义",
           val: "diagnose",
-          disabled: false
+          disabled: false,
+          status: "wait"
         },
         {
           name: "评价模型设置",
           val: "comment",
-          disabled: false
+          disabled: false,
+          status: "wait"
         }
-      ]
+      ],
+      configs: {},
+      dataReady: false
     };
   },
   computed: {
@@ -92,16 +112,92 @@ export default {
     }
   },
   methods: {
-    visibleChange() {},
+    async visibleChange() {
+      this.dataReady = false;
+      await this.getData();
+      this.dataReady = true;
+    },
     cancel() {
       this.modalIsShow = false;
     },
     open() {
       this.modalIsShow = true;
     },
+    async getData() {
+      const datas = {
+        paperNumber: this.instance.paperNumber,
+        paperType: this.instance.paperType
+      };
+      const funcs = [
+        paperDimensionList(datas),
+        paperStructList(datas),
+        paperDefineList(datas),
+        moduleEvaluationList(datas)
+      ];
+      const result = await Promise.all(funcs).catch(() => {});
+      if (!result.length) return;
+
+      result.forEach((item, index) => {
+        if (item) this.steps[index].status = "finish";
+      });
+      this.steps.forEach(item => {
+        item.disabled = item.status === "wait";
+      });
+      const curFinishInd = this.steps.findIndex(
+        item => item.status === "finish"
+      );
+      if (curFinishInd !== this.steps.length - 1) {
+        this.curStep = curFinishInd + 1;
+        this.steps[this.curStep].status = "process";
+      }
+
+      this.configs = {
+        base: this.instance,
+        dimensionList: result[0],
+        structList: result[1],
+        defineList: result[2],
+        evaluationList: result[3]
+      };
+    },
     changeStep(ind) {
       if (ind === this.curStep) return;
       this.curStep = ind;
+    },
+    async modified() {
+      const sets = {
+        dimension: {
+          func: paperDimensionList,
+          listName: "dimensionList"
+        },
+        blueprint: {
+          func: paperStructList,
+          listName: "structList"
+        },
+        diagnose: {
+          func: paperDefineList,
+          listName: "defineList"
+        },
+        comment: {
+          func: moduleEvaluationList,
+          listName: "evaluationList"
+        }
+      };
+      const datas = {
+        paperNumber: this.instance.paperNumber,
+        paperType: this.instance.paperType
+      };
+      const stepVal = this.steps[this.curStep].val;
+      const data = await sets[stepVal].func(datas);
+      this[sets[stepVal].listName] = data;
+
+      this.steps[this.curStep].status = "finish";
+      if (
+        this.curStep !== this.steps.length - 1 &&
+        this.steps[this.curStep + 1].status === "wait"
+      ) {
+        this.curStep++;
+        this.steps[this.curStep].status = "process";
+      }
     }
   }
 };

+ 119 - 14
src/modules/analysis/components/baseConfig/BlueprintConfig.vue

@@ -8,16 +8,21 @@
       <el-table ref="TableList" :data="dataList">
         <el-table-column prop="courseCode" label="课程代码"></el-table-column>
         <el-table-column prop="courseName" label="课程名称"> </el-table-column>
-        <el-table-column prop="courseName" label="试卷编号"> </el-table-column>
-        <el-table-column prop="courseName" label="大题号"> </el-table-column>
-        <el-table-column prop="courseName" label="小题号"> </el-table-column>
-        <el-table-column prop="courseName" label="题目类型"> </el-table-column>
-        <el-table-column prop="courseName" label="题目满分"> </el-table-column>
-        <el-table-column prop="courseName" label="计分规则"> </el-table-column>
-        <el-table-column prop="knowledgeDim" label="知识模块">
+        <el-table-column prop="paperNumber" label="试卷编号"> </el-table-column>
+        <el-table-column prop="bigQuestionNumber" label="大题号" width="60">
+        </el-table-column>
+        <el-table-column prop="smallQuestionNumber" label="小题号" width="60">
+        </el-table-column>
+        <el-table-column prop="bigTopicName" label="题目类型" width="80">
+        </el-table-column>
+        <el-table-column prop="fullScore" label="题目满分" width="80">
+        </el-table-column>
+        <el-table-column prop="scoreRules" label="计分规则" width="80">
+        </el-table-column>
+        <el-table-column prop="knowledgeDimension" label="知识模块" width="200">
           <template slot-scope="scope">
             <el-select
-              v-model="scope.row.knowledgeDim"
+              v-model="scope.row.knowledgeDimension"
               placeholder="请选择"
               filterable
               clearable
@@ -27,16 +32,17 @@
                 v-for="item in knowledgeList"
                 :key="item.code"
                 :value="item.code"
-                :label="item.name"
+                :label="item.code"
               >
+                {{ item.code }}({{ item.name }})
               </el-option>
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="abilityDim" label="能力模块">
+        <el-table-column prop="abilityDimension" label="能力模块" width="200">
           <template slot-scope="scope">
             <el-select
-              v-model="scope.row.abilityDim"
+              v-model="scope.row.abilityDimension"
               placeholder="请选择"
               filterable
               clearable
@@ -46,8 +52,9 @@
                 v-for="item in abilityList"
                 :key="item.code"
                 :value="item.code"
-                :label="item.name"
+                :label="item.code"
               >
+                {{ item.code }}({{ item.name }})
               </el-option>
             </el-select>
           </template>
@@ -80,10 +87,19 @@
 
 <script>
 import ImportFile from "@/components/ImportFile";
+import { updatePaperStruct } from "../../api";
 
 export default {
   name: "blueprint-config",
   components: { ImportFile },
+  props: {
+    configs: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
   data() {
     return {
       dataList: [],
@@ -97,12 +113,101 @@ export default {
     };
   },
   methods: {
-    getList() {},
+    initData() {
+      const { dimensionList, structList } = this.configs;
+      this.knowledgeList = dimensionList
+        .filter(item => item.dimensionType === "KNOWLEDGE")
+        .map(item => {
+          return {
+            name: item.nameSecond,
+            code: item.codeSecond
+          };
+        });
+      const knowledgeCodes = this.knowledgeList.map(item => item.code);
+      this.abilityList = dimensionList
+        .filter(item => item.dimensionType === "ABILITY")
+        .map(item => {
+          return {
+            name: item.namePrimary,
+            code: item.namePrimary
+          };
+        });
+      const abilityCodes = this.abilityList.map(item => item.code);
+      this.dataList = structList.map(item => {
+        let nitem = { ...item };
+        let knowledgeDimension = item.knowledgeDimension.split();
+        if (knowledgeDimension.length) {
+          knowledgeDimension = knowledgeDimension.filter(item =>
+            knowledgeCodes.includes(item)
+          );
+        }
+        nitem.knowledgeDimension = knowledgeDimension;
+
+        let abilityDimension = item.abilityDimension.split();
+        if (abilityDimension.length) {
+          abilityDimension = abilityDimension.filter(item =>
+            abilityCodes.includes(item)
+          );
+        }
+        nitem.abilityDimension = abilityDimension;
+
+        return nitem;
+      });
+    },
     toImport() {
       this.$refs.ImportFile.open();
     },
     fileUploaded() {},
-    toSubmit() {}
+    checkData() {
+      let errMsg = [];
+      this.dataList.forEach(item => {
+        let names = [];
+        if (!item.knowledgeDimension.length) names.push("知识模块");
+        if (!item.abilityDimension) names.push("能力模块");
+
+        if (names.length) {
+          errMsg.push(
+            `第${item.bigQuestionNumber}大题、第${
+              itme.smallQuestionNumber
+            }小题${names.join("和")}未选择`
+          );
+        }
+      });
+
+      if (errMsg.length) {
+        if (errMsg.length > 5) {
+          this.$message.error("未选择知识模块和能力模块的小题数过多!");
+        } else {
+          this.$message.error(errMsg.join("。"));
+        }
+        return false;
+      }
+
+      return true;
+    },
+    async toSubmit() {
+      if (!this.checkData()) return;
+
+      if (this.loading) return;
+      this.loading = true;
+      const datasource = this.dataList.map(item => {
+        let nitem = { ...item };
+        nitem.knowledgeDimension = item.knowledgeDimension.join();
+        nitem.abilityDimension = item.abilityDimension.join();
+        return nitem;
+      });
+      const datas = {
+        datasource,
+        paperNumber: this.configs.base.paperNumber,
+        paperName: this.configs.base.paperName,
+        paperType: this.configs.base.paperType
+      };
+      const data = await updatePaperStruct(datas).catch(() => {});
+      this.loading = false;
+      if (!data) return;
+      this.$message.success("保存成功!");
+      this.$emit("modified");
+    }
   }
 };
 </script>

+ 7 - 8
src/modules/analysis/components/baseConfig/CommentConfig.vue

@@ -13,7 +13,7 @@
 
     <component
       :is="compName"
-      :course="course"
+      :rates="curRates"
       @data-change="dataChange"
     ></component>
     <p v-if="errorMsg" class="tips-info tips-error">{{ errorMsg }}</p>
@@ -40,12 +40,6 @@ export default {
   name: "comment-config",
   components: { CommentKnowledge, CommentAbility },
   props: {
-    course: {
-      type: Object,
-      default() {
-        return {};
-      }
-    },
     configs: {
       type: Object,
       default() {
@@ -75,6 +69,11 @@ export default {
   computed: {
     compName() {
       return `comment-${this.curTab}`;
+    },
+    curRates() {
+      return this.curTab === "knowledge"
+        ? this.knowledgeList
+        : this.abilityList;
     }
   },
   created() {
@@ -254,7 +253,7 @@ export default {
       }).catch(() => {});
       this.loading = false;
       if (!data) return;
-
+      this.$message.success("保存成功!");
       this.$emit("modified");
     }
   }

+ 1 - 1
src/modules/analysis/components/baseConfig/DiagnoseConfig.vue

@@ -231,7 +231,7 @@ export default {
       const data = await updatePaperDefine(datas).catch(() => {});
       this.loading = false;
       if (!data) return;
-
+      this.$message.success("保存成功!");
       this.$emit("modified");
     }
   }

+ 83 - 23
src/modules/analysis/components/baseConfig/DimensionAbilityList.vue

@@ -9,11 +9,11 @@
       <el-table ref="TableList" :data="dataList">
         <el-table-column prop="courseCode" label="课程代码"></el-table-column>
         <el-table-column prop="courseName" label="课程名称"> </el-table-column>
-        <el-table-column prop="courseName" label="一级能力维度">
+        <el-table-column prop="namePrimary" label="一级能力维度">
         </el-table-column>
-        <el-table-column prop="courseName" label="一级维度编号">
+        <el-table-column prop="codePrimary" label="一级维度编号">
         </el-table-column>
-        <el-table-column prop="courseName" label="一级维度术语解释">
+        <el-table-column prop="interpretation" label="一级维度术语解释">
         </el-table-column>
         <el-table-column
           class-name="action-column"
@@ -60,8 +60,8 @@
       title="上传文件"
       :upload-url="uploadUrl"
       :upload-data="uploadData"
-      :download-url="downloadUrl"
-      :download-filename="downloadFilename"
+      :download-handle="downloadHandle"
+      download-filename="能力维度模板"
       :format="['xls', 'xlsx']"
       @upload-success="fileUploaded"
     >
@@ -89,6 +89,12 @@ export default {
       default() {
         return {};
       }
+    },
+    datas: {
+      type: Object,
+      default() {
+        return {};
+      }
     }
   },
   data() {
@@ -98,27 +104,75 @@ export default {
       loading: false,
       // upload
       uploadUrl: "yourUploadPath",
-      downloadUrl: "/path/要下载的文件.xls",
-      downloadFilename: "要下载的文件.xls",
-      uploadData: {}
+      uploadData: {},
+      downloading: false
     };
   },
   mounted() {
-    this.getDict();
+    this.initData();
   },
   methods: {
-    getList() {},
-    getDict() {},
+    initData() {
+      this.dataList = this.datas.map(item => {
+        return { ...item, id: this.$randomCode() };
+      });
+      this.sortDataList();
+      this.uploadData = {
+        paperNumber: this.course.paperNumber,
+        paperType: this.course.paperType,
+        paperName: this.course.paperName,
+        dimensionType: "ABILITY"
+      };
+    },
     toImport() {
       this.$refs.ImportFile.open();
     },
-    fileUploaded() {
+    async downloadHandle() {
+      if (this.downloading) return;
+      this.downloading = true;
+
+      const res = await downloadByApi(() => {
+        return paperDimensionExport({
+          courseCode: this.course.courseCode,
+          courseName: this.course.courseName,
+          dimensionType: "ABILITY"
+        });
+      }).catch(e => {
+        this.$message.error(e || "下载失败,请重新尝试!");
+      });
+      this.downloading = false;
+
+      if (!res) return;
+      this.$message.success("下载成功!");
+    },
+    async fileUploaded() {
       this.$message.success("导入成功!");
-      this.getList();
+      const data = await paperDimensionList({
+        paperNumber: this.course.paperNumber,
+        paperType: this.course.paperType
+      });
+      this.dataList = data
+        .filter(item => item.dimensionType === "ABILITY")
+        .map(item => {
+          return { ...item, id: this.$randomCode() };
+        });
+      this.sortDataList();
+      this.emitChange();
     },
     modified(data) {
-      this.dataList.push(data);
-      // TODO:排序
+      if (data.id) {
+        const pos = this.dataList.findIndex(item => item.id === data.id);
+        this.dataList.splice(pos, 1, data);
+      } else {
+        this.dataList.push(data);
+        this.sortDataList();
+      }
+      this.emitChange();
+    },
+    sortDataList() {
+      this.dataList.sort((a, b) => {
+        return a.codePrimary < b.codePrimary ? -1 : 1;
+      });
     },
     toAdd() {
       this.curRow = {
@@ -133,24 +187,30 @@ export default {
     },
     toDelete({ $index }) {
       this.dataList.splice($index, 1);
+      this.emitChange();
     },
     toUp({ row, $index }) {
       const pos = $index;
-      const curRowCode = row.firstCode;
-      const prevRowCode = this.dataList[$index - 1].firstCode;
+      const curRowCode = row.codePrimary;
+      const prevRowCode = this.dataList[$index - 1].codePrimary;
       this.dataList.splice(pos, 1);
       this.dataList.splice(pos - 1, 0, row);
-      this.dataList[pos].firstCode = curRowCode;
-      this.dataList[pos - 1].firstCode = prevRowCode;
+      this.dataList[pos].codePrimary = curRowCode;
+      this.dataList[pos - 1].codePrimary = prevRowCode;
+      this.emitChange();
     },
     toDown({ row, $index }) {
       const pos = $index;
-      const curRowCode = row.firstCode;
-      const nextRowCode = this.dataList[$index + 1].firstCode;
+      const curRowCode = row.codePrimary;
+      const nextRowCode = this.dataList[$index + 1].codePrimary;
       this.dataList.splice(pos, 1);
       this.dataList.splice(pos, 0, row);
-      this.dataList[pos].firstCode = curRowCode;
-      this.dataList[pos + 1].firstCode = nextRowCode;
+      this.dataList[pos].codePrimary = curRowCode;
+      this.dataList[pos + 1].codePrimary = nextRowCode;
+      this.emitChange();
+    },
+    emitChange() {
+      this.$emit("data-change", this.dataList);
     }
   }
 };

+ 64 - 4
src/modules/analysis/components/baseConfig/DimensionConfig.vue

@@ -11,7 +11,12 @@
       </el-button>
     </div>
 
-    <component :is="compName" :course="course"></component>
+    <component
+      :is="compName"
+      :course="configs.base"
+      :datas="curDataList"
+      @data-change="dataChange"
+    ></component>
 
     <div class="config-footer">
       <el-button
@@ -28,12 +33,13 @@
 <script>
 import DimensionKnowledgeList from "./DimensionKnowledgeList.vue";
 import DimensionAbilityList from "./DimensionAbilityList.vue";
+import { updatePaperDimension } from "../../api";
 
 export default {
   name: "dimension-config",
   components: { DimensionKnowledgeList, DimensionAbilityList },
   props: {
-    course: {
+    configs: {
       type: Object,
       default() {
         return {};
@@ -53,19 +59,73 @@ export default {
           val: "ability"
         }
       ],
-      loading: false
+      loading: false,
+      knowledgeList: [],
+      abilityList: []
     };
   },
   computed: {
     compName() {
       return `dimension-${this.curTab}-list`;
+    },
+    curDataList() {
+      return this.curTab === "knowledge"
+        ? this.knowledgeList
+        : this.abilityList;
     }
   },
+  created() {
+    this.initData();
+  },
   methods: {
+    initData() {
+      const { dimensionList } = this.configs;
+      this.knowledgeList = dimensionList.filter(
+        item => item.dimensionType === "KNOWLEDGE"
+      );
+      this.abilityList = dimensionList.filter(
+        item => item.dimensionType === "ABILITY"
+      );
+    },
     selectMenu(tab) {
       this.curTab = tab;
     },
-    toSubmit() {}
+    dataChange(data) {
+      if (this.curTab === "knowledge") {
+        this.knowledgeList = data;
+      } else {
+        this.abilityList = data;
+      }
+    },
+    async toSubmit() {
+      if (this.loading) return;
+      this.loading = true;
+
+      const defData = {
+        paperNumber: this.configs.base.paperNumber,
+        paperName: this.configs.base.paperName,
+        paperType: this.configs.base.paperType
+      };
+      const funcs = [
+        updatePaperDimension({
+          ...defData,
+          datasource: this.knowledgeList,
+          dimensionType: "KNOWLEDGE"
+        }),
+        updatePaperDimension({
+          ...defData,
+          datasource: this.abilityList,
+          dimensionType: "ABILITY"
+        })
+      ];
+
+      const res = await Promise.all(funcs).catch(() => {});
+      this.loading = false;
+
+      if (!res) return;
+      this.$message.success("保存成功!");
+      this.$emit("modified");
+    }
   }
 };
 </script>

+ 99 - 32
src/modules/analysis/components/baseConfig/DimensionKnowledgeList.vue

@@ -9,15 +9,15 @@
       <el-table ref="TableList" :data="dataList">
         <el-table-column prop="courseCode" label="课程代码"></el-table-column>
         <el-table-column prop="courseName" label="课程名称"> </el-table-column>
-        <el-table-column prop="firstName" label="一级知识维度">
+        <el-table-column prop="namePrimary" label="一级知识维度">
         </el-table-column>
-        <el-table-column prop="firstCode" label="一级维度编号">
+        <el-table-column prop="codePrimary" label="一级维度编号">
         </el-table-column>
-        <el-table-column prop="secondName" label="二级知识维度">
+        <el-table-column prop="nameSecond" label="二级知识维度">
         </el-table-column>
-        <el-table-column prop="secondCode" label="二级维度编号">
+        <el-table-column prop="codeSecond" label="二级维度编号">
         </el-table-column>
-        <el-table-column prop="firsetNameDesc" label="一级维度术语解释">
+        <el-table-column prop="interpretation" label="一级维度术语解释">
         </el-table-column>
         <el-table-column
           class-name="action-column"
@@ -64,8 +64,8 @@
       title="上传文件"
       :upload-url="uploadUrl"
       :upload-data="uploadData"
-      :download-url="downloadUrl"
-      :download-filename="downloadFilename"
+      :download-handle="downloadHandle"
+      download-filename="知识维度模板"
       :format="['xls', 'xlsx']"
       @upload-success="fileUploaded"
     >
@@ -82,8 +82,8 @@
 
 <script>
 import ImportFile from "@/components/ImportFile";
-import dimenData from "./dimenData";
 import ModifyKnowledgeDim from "./ModifyKnowledgeDim.vue";
+import { paperDimensionExport, paperDimensionList } from "../../api";
 
 export default {
   name: "dimension-knowledge-list",
@@ -94,40 +94,56 @@ export default {
       default() {
         return {};
       }
+    },
+    datas: {
+      type: Object,
+      default() {
+        return {};
+      }
     }
   },
   data() {
     return {
-      dataList: dimenData,
-      // dataList: [],
+      dataList: [],
       dataDict: [],
       curRow: {},
       loading: false,
       // upload
       uploadUrl: "/api/admin/grade/paper/dimension/import",
-      downloadUrl: "/path/要下载的文件.xls",
-      downloadFilename: "要下载的文件.xls",
-      uploadData: {}
+      uploadData: {},
+      downloading: false
     };
   },
   mounted() {
-    this.getDict();
+    this.initData();
   },
   methods: {
-    getList() {},
+    initData() {
+      this.dataList = this.datas.map(item => {
+        return { ...item };
+      });
+      this.sortDataList();
+      this.getDict();
+      this.uploadData = {
+        paperNumber: this.course.paperNumber,
+        paperType: this.course.paperType,
+        paperName: this.course.paperName,
+        dimensionType: "KNOWLEDGE"
+      };
+    },
     getDict() {
       let dataDict = {};
       this.dataList.forEach(item => {
-        if (!dataDict[item.firstCode]) {
-          dataDict[item.firstCode] = {
-            name: item.firstName,
-            code: item.firstCode,
+        if (!dataDict[item.codePrimary]) {
+          dataDict[item.codePrimary] = {
+            name: item.namePrimary,
+            code: item.codePrimary,
             children: []
           };
         }
-        dataDict[item.firstCode].children.push({
-          name: item.secondName,
-          code: item.secondCode
+        dataDict[item.codePrimary].children.push({
+          name: item.nameSecond,
+          code: item.codeSecond
         });
       });
       this.dataDict = Object.values(dataDict);
@@ -135,13 +151,58 @@ export default {
     toImport() {
       this.$refs.ImportFile.open();
     },
-    fileUploaded() {
+    async downloadHandle() {
+      if (this.downloading) return;
+      this.downloading = true;
+
+      const res = await downloadByApi(() => {
+        return paperDimensionExport({
+          courseCode: this.course.courseCode,
+          courseName: this.course.courseName,
+          dimensionType: "KNOWLEDGE"
+        });
+      }).catch(e => {
+        this.$message.error(e || "下载失败,请重新尝试!");
+      });
+      this.downloading = false;
+
+      if (!res) return;
+      this.$message.success("下载成功!");
+    },
+    async fileUploaded() {
       this.$message.success("导入成功!");
-      this.getList();
+      const data = await paperDimensionList({
+        paperNumber: this.course.paperNumber,
+        paperType: this.course.paperType
+      });
+      this.dataList = data
+        .filter(item => item.dimensionType === "KNOWLEDGE")
+        .map(item => {
+          return { ...item, id: this.$randomCode() };
+        });
+      this.sortDataList();
+      this.emitChange();
     },
     modified(data) {
-      this.dataList.push(data);
-      // TODO:排序
+      if (data.id) {
+        const pos = this.dataList.findIndex(item => item.id === data.id);
+        this.dataList.splice(pos, 1, data);
+      } else {
+        this.dataList.push(data);
+        this.sortDataList();
+      }
+      this.emitChange();
+    },
+    sortDataList() {
+      this.dataList.sort((a, b) => {
+        if (a.codePrimary < b.codePrimary) return -1;
+        if (a.codePrimary > b.codePrimary) return 1;
+
+        const anoSecond = a.codeSecond.substring(1) * 1;
+        const bnoSecond = b.codeSecond.substring(1) * 1;
+
+        return anoSecond < bnoSecond ? -1 : 1;
+      });
     },
     toAdd() {
       this.curRow = {
@@ -156,28 +217,34 @@ export default {
     },
     toDelete({ $index }) {
       this.dataList.splice($index, 1);
+      this.emitChange();
     },
     toUp({ row, $index }) {
       const pos = $index;
       const rowSecondInd = row.secondInd;
-      const rowFirstCode = row.firstCode;
+      const rowFirstCode = row.codePrimary;
       this.dataList.splice(pos, 1);
       this.dataList.splice(pos - 1, 0, row);
       this.dataList[pos - 1].secondInd = rowSecondInd - 1;
-      this.dataList[pos - 1].secondCode = `${rowFirstCode}${rowSecondInd - 1}`;
+      this.dataList[pos - 1].codeSecond = `${rowFirstCode}${rowSecondInd - 1}`;
       this.dataList[pos].secondInd = rowSecondInd;
-      this.dataList[pos].secondCode = `${rowFirstCode}${rowSecondInd}`;
+      this.dataList[pos].codeSecond = `${rowFirstCode}${rowSecondInd}`;
+      this.emitChange();
     },
     toDown({ row, $index }) {
       const pos = $index;
       const rowSecondInd = row.secondInd;
-      const rowFirstCode = row.firstCode;
+      const rowFirstCode = row.codePrimary;
       this.dataList.splice(pos, 1);
       this.dataList.splice(pos, 0, row);
       this.dataList[pos + 1].secondInd = rowSecondInd + 1;
-      this.dataList[pos + 1].secondCode = `${rowFirstCode}${rowSecondInd + 1}`;
+      this.dataList[pos + 1].codeSecond = `${rowFirstCode}${rowSecondInd + 1}`;
       this.dataList[pos].secondInd = rowSecondInd;
-      this.dataList[pos].secondCode = `${rowFirstCode}${rowSecondInd}`;
+      this.dataList[pos].codeSecond = `${rowFirstCode}${rowSecondInd}`;
+      this.emitChange();
+    },
+    emitChange() {
+      this.$emit("data-change", this.dataList);
     }
   }
 };

+ 22 - 18
src/modules/analysis/components/baseConfig/ModifyAbilityDim.vue

@@ -31,17 +31,17 @@
             readonly
           ></el-input>
         </el-form-item>
-        <el-form-item prop="firstName" label="一级能力维度:">
+        <el-form-item prop="namePrimary" label="一级能力维度:">
           <el-input
-            v-model.trim="modalForm.firstName"
+            v-model.trim="modalForm.namePrimary"
             placeholder="请输入一级能力维度"
             clearable
             @change="dimValidate"
           ></el-input>
         </el-form-item>
-        <el-form-item prop="firstCode" label="一级维度编号:">
+        <el-form-item prop="codePrimary" label="一级维度编号:">
           <el-input
-            v-model.trim="modalForm.firstCode"
+            v-model.trim="modalForm.codePrimary"
             placeholder="请输入一级维度编号"
             clearable
             @change="dimValidate"
@@ -49,7 +49,7 @@
         </el-form-item>
         <el-form-item label="一级维度术语解释:">
           <el-input
-            v-model.trim="modalForm.firsetNameDesc"
+            v-model.trim="modalForm.interpretation"
             type="textarea"
             :autosize="{ minRows: 1, maxRows: 5 }"
             placeholder="请输入一级维度术语解释"
@@ -73,9 +73,9 @@ const initModalForm = {
   id: null,
   courseName: "",
   courseCode: "",
-  firstName: "",
-  firstCode: "",
-  firsetNameDesc: ""
+  namePrimary: "",
+  codePrimary: "",
+  interpretation: ""
 };
 
 export default {
@@ -104,10 +104,12 @@ export default {
   },
   data() {
     const firstNameValidator = (rule, value, callback) => {
-      let existFirstDim = this.dictData.find(item => item.firstName === value);
+      let existFirstDim = this.dictData.find(
+        item => item.namePrimary === value
+      );
 
       if (this.isEdit) {
-        if (existFirstDim && this.instance.firstName !== value) {
+        if (existFirstDim && this.instance.namePrimary !== value) {
           return callback(new Error("一级能力维度已存在"));
         }
       } else {
@@ -119,10 +121,12 @@ export default {
       callback();
     };
     const firstCodeValidator = (rule, value, callback) => {
-      let existFirstDim = this.dictData.find(item => item.firstCode === value);
+      let existFirstDim = this.dictData.find(
+        item => item.codePrimary === value
+      );
 
       if (this.isEdit) {
-        if (existFirstDim && this.instance.firstCode !== value) {
+        if (existFirstDim && this.instance.codePrimary !== value) {
           return callback(new Error("一级维度编号已存在"));
         }
       } else {
@@ -139,7 +143,7 @@ export default {
       isSubmit: false,
       modalForm: {},
       rules: {
-        firstName: [
+        namePrimary: [
           {
             required: true,
             message: "请输入一级能力维度",
@@ -155,7 +159,7 @@ export default {
             trigger: "change"
           }
         ],
-        firstCode: [
+        codePrimary: [
           {
             required: true,
             pattern: /^[A-Z]{1}$/,
@@ -188,10 +192,10 @@ export default {
     },
     dimValidate() {
       this.$refs.modalFormComp.validateField([
-        "firstName",
-        "firstCode",
-        "secondName",
-        "secondCode"
+        "namePrimary",
+        "codePrimary",
+        "nameSecond",
+        "codeSecond"
       ]);
     },
     async submit() {

+ 36 - 36
src/modules/analysis/components/baseConfig/ModifyKnowledgeDim.vue

@@ -31,33 +31,33 @@
             readonly
           ></el-input>
         </el-form-item>
-        <el-form-item prop="firstName" label="一级知识维度:">
+        <el-form-item prop="namePrimary" label="一级知识维度:">
           <el-input
-            v-model.trim="modalForm.firstName"
+            v-model.trim="modalForm.namePrimary"
             placeholder="请输入一级知识维度"
             clearable
             @change="dimValidate"
           ></el-input>
         </el-form-item>
-        <el-form-item prop="firstCode" label="一级维度编号:">
+        <el-form-item prop="codePrimary" label="一级维度编号:">
           <el-input
-            v-model.trim="modalForm.firstCode"
+            v-model.trim="modalForm.codePrimary"
             placeholder="请输入一级维度编号"
             clearable
             @change="dimValidate"
           ></el-input>
         </el-form-item>
-        <el-form-item prop="secondName" label="二级知识维度:">
+        <el-form-item prop="nameSecond" label="二级知识维度:">
           <el-input
-            v-model.trim="modalForm.secondName"
+            v-model.trim="modalForm.nameSecond"
             placeholder="请输入二级知识维度"
             clearable
             @change="dimValidate"
           ></el-input>
         </el-form-item>
-        <el-form-item prop="secondCode" label="二级维度编号:">
+        <el-form-item prop="codeSecond" label="二级维度编号:">
           <el-input
-            v-model.trim="modalForm.secondCode"
+            v-model.trim="modalForm.codeSecond"
             placeholder="请输入二级维度编号"
             clearable
             @change="dimValidate"
@@ -65,7 +65,7 @@
         </el-form-item>
         <el-form-item label="一级维度术语解释:">
           <el-input
-            v-model.trim="modalForm.firsetNameDesc"
+            v-model.trim="modalForm.interpretation"
             type="textarea"
             :autosize="{ minRows: 1, maxRows: 5 }"
             placeholder="请输入一级维度术语解释"
@@ -89,11 +89,11 @@ const initModalForm = {
   id: null,
   courseName: "",
   courseCode: "",
-  firstName: "",
-  firstCode: "",
-  secondName: "",
-  secondCode: "",
-  firsetNameDesc: ""
+  namePrimary: "",
+  codePrimary: "",
+  nameSecond: "",
+  codeSecond: "",
+  interpretation: ""
 };
 
 export default {
@@ -122,13 +122,13 @@ export default {
   },
   data() {
     const firstNameValidator = (rule, value, callback) => {
-      if (!this.modalForm.firstCode || !value) return callback();
+      if (!this.modalForm.codePrimary || !value) return callback();
 
       let existFirstDim = this.dictData.find(
-        item => item.code === this.modalForm.firstCode
+        item => item.code === this.modalForm.codePrimary
       );
       if (existFirstDim) {
-        if (existFirstDim.firstName !== value)
+        if (existFirstDim.namePrimary !== value)
           return callback(new Error("一级知识维度错误"));
       } else {
         existFirstDim = this.dictData.find(item => item.name === value);
@@ -140,19 +140,19 @@ export default {
 
     const secondNameValidator = (rule, value, callback) => {
       if (
-        !this.modalForm.secondCode ||
+        !this.modalForm.codeSecond ||
         !value ||
-        !this.modalForm.firstName ||
-        !this.modalForm.firstCode
+        !this.modalForm.namePrimary ||
+        !this.modalForm.codePrimary
       )
         return callback();
 
       let existFirstDim = this.dictData.find(
-        item => item.code === this.modalForm.firstCode
+        item => item.code === this.modalForm.codePrimary
       );
       if (existFirstDim) {
         let existSecondDim = existFirstDim.children.find(
-          item => item.code === this.modalForm.secondCode
+          item => item.code === this.modalForm.codeSecond
         );
         if (existSecondDim) {
           return callback();
@@ -174,24 +174,24 @@ export default {
 
     const secondCodeValidator = (rule, value, callback) => {
       if (
-        !this.modalForm.secondCode ||
+        !this.modalForm.codeSecond ||
         !value ||
-        !this.modalForm.firstName ||
-        !this.modalForm.firstCode
+        !this.modalForm.namePrimary ||
+        !this.modalForm.codePrimary
       )
         return callback();
 
-      if (value[0] !== this.modalForm.firstCode) {
+      if (value[0] !== this.modalForm.codePrimary) {
         return callback(new Error("二级维度编码首字母应该与一级维度编码一致"));
       }
 
       let existFirstDim = this.dictData.find(
-        item => item.code === this.modalForm.firstCode
+        item => item.code === this.modalForm.codePrimary
       );
 
       if (existFirstDim) {
         let existSecondDim = existFirstDim.children.find(
-          item => item.code === this.modalForm.secondCode
+          item => item.code === this.modalForm.codeSecond
         );
         if (existSecondDim) return callback(new Error("二级维度编号已存在"));
       }
@@ -204,7 +204,7 @@ export default {
       isSubmit: false,
       modalForm: {},
       rules: {
-        firstName: [
+        namePrimary: [
           {
             required: true,
             message: "请输入一级知识维度",
@@ -220,7 +220,7 @@ export default {
             trigger: "change"
           }
         ],
-        firstCode: [
+        codePrimary: [
           {
             required: true,
             pattern: /^[A-Z]{1}$/,
@@ -228,7 +228,7 @@ export default {
             trigger: "change"
           }
         ],
-        secondName: [
+        nameSecond: [
           {
             required: true,
             message: "请输入二级知识维度",
@@ -244,7 +244,7 @@ export default {
             trigger: "change"
           }
         ],
-        secondCode: [
+        codeSecond: [
           {
             required: true,
             pattern: /^[A-Z][0-9]{1,}$/,
@@ -277,10 +277,10 @@ export default {
     },
     dimValidate() {
       this.$refs.modalFormComp.validateField([
-        "firstName",
-        "firstCode",
-        "secondName",
-        "secondCode"
+        "namePrimary",
+        "codePrimary",
+        "nameSecond",
+        "codeSecond"
       ]);
     },
     async submit() {

+ 0 - 26
src/modules/analysis/components/baseConfig/dimenData.js

@@ -1,26 +0,0 @@
-let data = [];
-
-const codes = "ABCDEFG";
-for (let i = 0; i < 4; i++) {
-  const firstCode = codes[i];
-  const firstName = `一级知识维度${firstCode}`;
-  for (let j = 0; j < 5; j++) {
-    const ind = i * 5 + j;
-    const secondCode = `${firstCode}${j + 1}`;
-    data[ind] = {
-      id: ind,
-      courseCode: "1100860011012",
-      courseName: "大学物理B(下)",
-      firstName,
-      firstCode,
-      secondName: `二级知识维度${secondCode}`,
-      secondCode,
-      secondInd: j + 1,
-      isFirstSec: j === 0,
-      isLastSec: j === 4,
-      firsetNameDesc: `一级维度术语解释${firstCode}`
-    };
-  }
-}
-
-export default data;