Tang před 3 roky
rodič
revize
e6b894c060

binární
dist.zip


+ 17 - 2
src/components/searchBoxNew.vue

@@ -178,6 +178,20 @@
               :value="items.value"
             ></el-option>
           </el-select>
+          <!-- 证书类型 -->
+          <el-select
+            v-else-if="item.scope === 'certificate'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in certificate"
+              :key="indexs"
+              :label="items.certificateName"
+              :value="items.id"
+            ></el-option>
+          </el-select>
           <!-- 考试标题 -->
           <el-select
             v-else-if="item.scope === 'examList'"
@@ -329,7 +343,7 @@
           <div v-else-if="item.scope === 'moreDataPicker'">
             <el-date-picker
               v-model="formData[item.prop1]"
-              type="date"
+              :type="item.Diszing ? 'datetime':'date'"
               value-format="timestamp"
               :size="size"
               :placeholder="item.placeholder1"
@@ -339,7 +353,7 @@
             <el-date-picker
               style="margin-left: 10px"
               v-model="formData[item.prop2]"
-              type="date"
+              :type="item.Diszing ? 'datetime':'date'"
               :size="size"
               value-format="timestamp"
               :placeholder="item.placeholder2"
@@ -524,6 +538,7 @@ export default {
       "examList",
       "beforeList",
       "applySiteAddress",
+      "certificate"
     ]),
     /**
      * @remarks 过滤选择器列表

+ 24 - 8
src/newApi/applicationData.js

@@ -16,14 +16,6 @@ export default {
             data
         })
     },
-    //导入新增预约考试模板
-    editsystemimportDatae(data) {
-        return request({
-            url: '/system/subscribe/importData',
-            method: 'post',
-            data
-        })
-    },
     //预约考试身份证导入新增模板
     editsystemimportIdsData(data) {
         return request({
@@ -89,4 +81,28 @@ export default {
         })
     },
 
+    //导入新增预约考试模板
+    editsystemsubscribeimportData(data) {
+        return request({
+            url: '/system/subscribe/importData',
+            method: 'post',
+            data
+        })
+    },
+    //导入新增预约考培模板
+    editsystemsubscribeimportTrainData(data) {
+        return request({
+            url: '/system/subscribe/importTrainData',
+            method: 'post',
+            data
+        })
+    },
+    //导出新增错误预约
+    inquiresystemsubscribeexportErrorNew(data) {
+        return request({
+            url: '/system/subscribe/exportErrorNew',
+            method: 'post',
+            data
+        })
+    },
 }

+ 8 - 0
src/newApi/certificate.js

@@ -66,4 +66,12 @@ export default {
             method: 'get',
         })
     },
+    //查询用户证书列表
+    inquireBaseuserCertificatelist(data) {
+        return request({
+            url: '/user/certificate/list',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 1 - 1
src/store/modules/tagsView.js

@@ -2,7 +2,7 @@ import { MessageBox } from 'element-ui';
 const state = {
   visitedViews: [],
   cachedViews: [],
-  alertPage: ["CommodityManageMentAdd", "CommodityManageMentEdit", "FestivalAdd", "FestivalEdit", "ChapterAdd", "ChapterEdit","ModuleManagementAdd","ModuleManagementEdit","BasicInfoEdit","BasicInfoAdd","ChapterContent","EditCourse","OrderDetail","OrderPrice","AddOrder","EditPaper","AddPaper","TopicAddPaper","ChapterVolumeManagementEdit","ChapterVolumeManagementAdd","VolumeManagementAdd","VolumeManagementEdit","HandoutListEdit","HandoutListAdd","StudentXQ","AddClass","ManageClass","NotificationInfo","NotificationListAdd","NotificationEdit"],
+  alertPage: ["CommodityManageMentAdd", "CommodityManageMentEdit", "FestivalAdd", "FestivalEdit", "ChapterAdd", "ChapterEdit","ModuleManagementAdd","ModuleManagementEdit","BasicInfoEdit","BasicInfoAdd","ChapterContent","EditCourse","OrderDetail","OrderPrice","AddOrder","EditPaper","AddPaper","TopicAddPaper","ChapterVolumeManagementEdit","ChapterVolumeManagementAdd","VolumeManagementAdd","VolumeManagementEdit","HandoutListEdit","HandoutListAdd","StudentXQ","AddClass","ManageClass","NotificationInfo","NotificationListAdd","NotificationEdit","BulkImportPlan"],
 }
  
 const mutations = {

+ 341 - 7
src/views/education/certificateManagement/creditHoursList/index.vue

@@ -1,21 +1,355 @@
 <template>
   <div id="creditHoursList">
-creditHoursList
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      @editInfo="editInfo"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="addClick(props.scope.row, 2)"
+          >下载</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
   </div>
 </template>
 
 <script>
+import * as baseUrls from "@/utils/request.js";
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
 export default {
-  data () {
+  components: { searchBoxNew, tableList, pagination },
+  name: "CreditHoursList",
+  data() {
     return {
-    }
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        border: true,
+        title: "学时凭证列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "schoolId",
+          placeholder: "院校",
+          scope: "schoolList",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "typeId",
+          placeholder: "证书类型",
+          scope: "certificate",
+        },
+        {
+          prop1: "trainStartTime",
+          prop2: "trainEndTime",
+          placeholder1: "培训有效期开始时间",
+          placeholder2: "培训有效期结束时间",
+          scope: "moreDataPicker",
+          Diszing:true,
+        },
+        {
+          prop: "searchKey",
+          placeholder: "请输入姓名/身份证",
+        },
+      ],
+      formData: {
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "姓名",
+          prop: "realname",
+          hidden: true,
+          width: "90px",
+        },
+        {
+          label: "身份证号",
+          prop: "idCard",
+          hidden: true,
+          width: "170px",
+        },
+        {
+          label: "证书名称",
+          prop: "title",
+          hidden: true,
+          width: "200px",
+        },
+        {
+          label: "证书类型",
+          prop: "certificateName",
+          hidden: true,
+        },
+        {
+          label: "教育类型",
+          prop: "educationName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          width: "220px",
+          scope: "InfoMore",
+        },
+        {
+          label: "证书(缩略图)",
+          prop: "certificatePath",
+          hidden: true,
+          scope: "img",
+          width: "140px",
+        },
+        {
+          label: "证书编号",
+          prop: "certificateCode",
+          hidden: true,
+          width: "140px",
+        },
+        {
+          label: "培训时间",
+          prop1: "trainStartTime",
+          prop2: "trainEndTime",
+          hidden: true,
+          Diszing: false,
+          scope: "TimeLists",
+          width: "220px",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+          hidden: true,
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  activated() {
+    this.search();
   },
   methods: {
-
-  }
-}
+    editInfo(v) {
+      this.addClick(v, 2);
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.trainStartTime) {
+        data.trainStartTime = data.trainStartTime / 1000;
+      }
+      if (this.formData.trainEndTime) {
+        data.trainEndTime = data.trainEndTime / 1000;
+      }
+      this.$api
+        .inquireBaseuserCertificatelist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    del(v) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          var data = {
+            gradeId: v.gradeId,
+            status: -1,
+          };
+          this.$api.editGradegrade(data).then((res) => {
+            this.$message.success("删除成功");
+            this.search();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    addClick(v, int) {
+      let url = baseUrls.BASE_IMG_URL + "/" + v.certificatePath;
+      let link = document.createElement("a");
+      document.body.appendChild(link);
+      link.href = url;
+      link.target = "_blank";
+      link.download = v.title + ".jpg";
+      link.click();
+      link.remove();
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
 </script>
 
 <style lang="less" scoped>
-
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
 </style>
+

+ 2 - 1
src/views/education/examManagement/applicationData/asPlanned.vue

@@ -356,6 +356,7 @@ export default {
         index: 0,
         ch: "条",
         num: false,
+        tableHide:true,
         choice: true,
         changeWidth: "240px",
         addHide: true,
@@ -643,7 +644,7 @@ export default {
       let formData = new FormData();
       formData.append("file", file);
       this.$api
-        .editsystemimportDatae(formData)
+        .editsystemsubscribeimportData(formData)
         .then((res) => {
           if (res.msg) {
             let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;

+ 191 - 56
src/views/education/examManagement/applicationData/bulkImportPlan/newRegister.vue

@@ -5,7 +5,7 @@
       <el-select
         :style="marSty"
         :size="size"
-        filterable 
+        filterable
         v-model="formData.applyId"
         placeholder="请选择考试计划(必填)"
       >
@@ -20,7 +20,7 @@
       <el-select
         :style="marSty"
         :size="size"
-        filterable 
+        filterable
         v-model="formData.applySiteAddress"
         placeholder="请选择考试地点(必填)"
       >
@@ -50,24 +50,50 @@
     </div>
     <div style="margin-bottom: 12px">
       <span style="font-size: 14px">第二步:</span>
-      <el-button type="success" :size="size">批量导入</el-button>
+      <label
+        for="mobles4"
+        class="el-button el-button--success el-button--mini"
+        style="margin-right: 10px"
+        >批量导入</label
+      ><input
+        style="display: none"
+        type="file"
+        id="mobles4"
+        ref="input4"
+        @change="importMobleadd"
+      />
     </div>
     <div>
-      <el-button
-        :size="size"
-        :type="active === 1 ? 'primary' : ''"
-        @click="active = 1"
-        >成功导入</el-button
+      <el-badge
+        :hidden="!tableDataSuccess.length"
+        :value="tableDataSuccess.length"
+        class="item"
       >
-      <el-button
-        :size="size"
-        :type="active === 2 ? 'primary' : ''"
-        @click="active = 2"
-        >失败导入</el-button
+        <el-button
+          :size="size"
+          :type="active === 1 ? 'primary' : ''"
+          @click="active = 1"
+          >成功导入</el-button
+        >
+      </el-badge>
+      <el-badge
+        :hidden="!tableDataError.length"
+        :value="tableDataError.length"
+        class="item"
       >
+        <el-button
+          :size="size"
+          :type="active === 2 ? 'primary' : ''"
+          @click="active = 2"
+          >失败导入</el-button
+        >
+      </el-badge>
     </div>
     <div v-show="active === 1" class="exportBox">
-      <h4 class="h4Sty">成功导入xxx人</h4>
+      <h4 class="h4Sty">
+        成功导入<strong style="color: red">{{ tableDataSuccess.length }}</strong
+        >人
+      </h4>
       <el-table
         max-height="600"
         :data="tableDataSuccess"
@@ -80,21 +106,36 @@
         }"
       >
         <el-table-column
-          v-for="(item, index) in tableSet"
+          v-for="(item, index) in computedForm(tableSet, 1)"
           :key="index"
           :prop="item.prop"
           :label="item.label"
+          :width="item.width"
           align="center"
         >
           <template slot-scope="scope">
-            <span v-if="item.scope === 'test'"></span>
+            <div v-if="item.scope === 'time'">
+              <div>{{ scope.row[item.prop1] }}</div>
+              <div>{{ scope.row[item.prop2] }} {{ scope.row[item.prop3] }}</div>
+            </div>
             <span v-else>{{ scope.row[item.prop] }}</span>
           </template>
         </el-table-column>
       </el-table>
     </div>
     <div v-show="active === 2" class="exportBox">
-      <h4 class="h4Sty">失败导入xxx人</h4>
+      <h4 class="h4Sty">
+        失败导入<strong style="color: red">{{ tableDataError.length }}</strong
+        >人
+        <el-button
+          v-if="tableDataError.length"
+          style="margin-left: 10px"
+          :size="size"
+          type="success"
+          @click="dowmErrorData"
+          >下载失败数据</el-button
+        >
+      </h4>
       <el-table
         max-height="600"
         :data="tableDataError"
@@ -107,14 +148,17 @@
         }"
       >
         <el-table-column
-          v-for="(item, index) in tableSet"
+          v-for="(item, index) in computedForm(tableSet, 2)"
           :key="index"
           :prop="item.prop"
           :label="item.label"
+          :width="item.width"
           align="center"
         >
           <template slot-scope="scope">
-            <span v-if="item.scope === 'test'"></span>
+            <span v-if="item.scope === 'time'">
+              {{ changeDatas(scope.row[item.prop]) }}
+            </span>
             <span v-else>{{ scope.row[item.prop] }}</span>
           </template>
         </el-table-column>
@@ -151,16 +195,16 @@
           <h4>快捷导入</h4>
           <el-link type="primary" @click="getDowm">下载模板</el-link>
           <label
-            for="mobles"
+            for="mobles3"
             class="el-button el-button--primary"
             style="margin-left: 14px; padding: 10px 20px"
             >上传学员名单</label
           ><input
             style="display: none"
             type="file"
-            id="mobles"
+            id="mobles3"
             ref="input1"
-            @change="importMobleadd"
+            @change="importMobleadds"
           />
         </el-col>
       </el-row>
@@ -188,50 +232,120 @@ export default {
         idCards: "",
       },
       idcordList: "",
-      tableDataSuccess: [
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-      ],
+      tableDataSuccess: [],
       tableDataError: [],
       tableSet: [
         {
           label: "学员姓名",
-          prop: "realname",
+          prop: "userName",
         },
         {
           label: "学员身份证",
-          prop: "idCord",
+          prop: "idCard",
+        },
+        {
+          label: "考试标题",
+          prop: "applyName",
+          width: "140px",
+        },
+        {
+          label: "考试地点",
+          prop: "applySiteAddress",
+          width: "180px",
+        },
+        {
+          label: "考试日期",
+          prop: "applySiteExamTime",
+          scope: "time",
+          width: "140px",
+        },
+        {
+          label: "考试时间段",
+          prop: "applySiteTime",
+          width: "140px",
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+          width: "120px",
+        },
+        {
+          label: "商品标题",
+          prop: "goodsName",
+          width: "180px",
+        },
+        {
+          label: "预约登记",
+          prop: "subscribeStatus",
+        },
+        {
+          label: "考试登记",
+          prop: "examStatus",
+        },
+        {
+          label: "考试成绩",
+          prop: "performance",
+        },
+        {
+          label: "考试结果",
+          prop: "result",
+        },
+        {
+          label: "证书编号",
+          prop: "userName",
+        },
+        {
+          label: "出错原因",
+          prop: "cause",
+          hidden: true,
         },
       ],
     };
   },
-  computed: { ...mapGetters(["examList", "applySiteAddress"]) },
+  computed: {
+    ...mapGetters(["examList", "applySiteAddress"]),
+    computedForm: function () {
+      return function (tabs, int) {
+        if (int === 1) {
+          const ayst = tabs.filter((item) => {
+            return !item.hidden;
+          });
+          return ayst;
+        } else {
+          return tabs;
+        }
+      };
+    },
+  },
   methods: {
+    /**
+     * 转换时间格式
+     */
+    changeDatas(time) {
+      if (time) {
+        var datas = this.$methodsTools.onlyForma(
+          new Date(time).getTime() / 1000,
+          false
+        );
+        return datas;
+      } else {
+        return "";
+      }
+    },
+    importMobleadd(e) {
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api
+        .editsystemsubscribeimportData(formData)
+        .then((res) => {
+          this.tableDataSuccess = res.data.successList;
+          this.tableDataError = res.data.errorList;
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
     advanced() {
       this.dialogPLS = true;
       this.idcordList = this.formData.idCards;
@@ -256,7 +370,7 @@ export default {
     /**
      * 导入
      */
-    importMobleadd(e) {
+    importMobleadds(e) {
       var self = this;
       var file = e.target.files[0];
       let formData = new FormData();
@@ -312,7 +426,7 @@ export default {
       });
       data.applyName = this.examList[indexs].applyName;
       this.$api.inquiresystemsubscribeexportRegister(data).then((res) => {
-        let url = baseUrls.baseURL + "common/download?fileName=" + res.data.msg;
+        let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
         let link = document.createElement("a");
         let fileName = "导入模板" + ".xlsx";
         document.body.appendChild(link);
@@ -322,6 +436,23 @@ export default {
         link.remove();
       });
     },
+    /**
+     * 下载错误数据
+     */
+    dowmErrorData() {
+      this.$api
+        .inquiresystemsubscribeexportErrorNew(this.tableDataError)
+        .then((res) => {
+          let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
+          let link = document.createElement("a");
+          let fileName = "导入模板" + ".xlsx";
+          document.body.appendChild(link);
+          link.href = url;
+          link.dowmload = fileName;
+          link.click();
+          link.remove();
+        });
+    },
   },
 };
 </script>
@@ -426,4 +557,8 @@ export default {
     margin: 5px 0px;
   }
 }
+.item {
+  margin-top: 10px;
+  margin-right: 20px;
+}
 </style>

+ 332 - 57
src/views/education/examManagement/applicationData/bulkImportPlan/newYY.vue

@@ -5,7 +5,7 @@
       <el-select
         :style="marSty"
         :size="size"
-        filterable 
+        filterable
         v-model="formData.applyId"
         placeholder="请选择考试计划(必填)"
       >
@@ -20,7 +20,7 @@
       <el-select
         :style="marSty"
         :size="size"
-        filterable 
+        filterable
         v-model="formData.applySiteAddress"
         placeholder="请选择考试地点(必填)"
       >
@@ -33,13 +33,20 @@
         </el-option>
       </el-select>
 
+      <el-button
+        :size="size"
+        type="warning"
+        @click="downModel(1)"
+        style="margin-right: 10px"
+        >下载模板(不含考培)</el-button
+      >
       <el-select
         :style="marSty"
         :size="size"
         clearable
-        filterable 
+        filterable
         v-model="formData.applySiteAddressTrain"
-        placeholder="请选择考培地点(选填)"
+        placeholder="请选择考培地点(填)"
       >
         <el-option
           v-for="item in applySiteAddress"
@@ -49,30 +56,68 @@
         >
         </el-option>
       </el-select>
-      <el-button :size="size" type="warning" @click="downModel"
-        >下载模板</el-button
+      <el-button :size="size" type="warning" @click="downModel(2)"
+        >下载模板(含考培)</el-button
       >
     </div>
     <div style="margin-bottom: 12px">
       <span style="font-size: 14px">第二步:</span>
-      <el-button type="success" :size="size">批量导入</el-button>
+      <label
+        for="mobles"
+        class="el-button el-button--success el-button--mini"
+        style="margin-right: 10px"
+        >批量导入(不含考培)</label
+      ><input
+        style="display: none"
+        type="file"
+        id="mobles"
+        ref="input1"
+        @change="importMobleadd"
+      />
+      <label
+        for="mobles2"
+        class="el-button el-button--success el-button--mini"
+        style="margin-right: 10px"
+        >批量导入(含考培)</label
+      ><input
+        style="display: none"
+        type="file"
+        id="mobles2"
+        ref="input2"
+        @change="importMobleaddtrain"
+      />
     </div>
     <div>
-      <el-button
-        :size="size"
-        :type="active === 1 ? 'primary' : ''"
-        @click="active = 1"
-        >成功导入</el-button
+      <el-badge
+        :hidden="!tableDataSuccess.length"
+        :value="tableDataSuccess.length"
+        class="item"
       >
-      <el-button
-        :size="size"
-        :type="active === 2 ? 'primary' : ''"
-        @click="active = 2"
-        >失败导入</el-button
+        <el-button
+          :size="size"
+          :type="active === 1 ? 'primary' : ''"
+          @click="active = 1"
+          >成功导入</el-button
+        >
+      </el-badge>
+      <el-badge
+        :hidden="!tableDataError.length"
+        :value="tableDataError.length"
+        class="item"
       >
+        <el-button
+          :size="size"
+          :type="active === 2 ? 'primary' : ''"
+          @click="active = 2"
+          >失败导入</el-button
+        >
+      </el-badge>
     </div>
     <div v-show="active === 1" class="exportBox">
-      <h4 class="h4Sty">成功导入xxx人</h4>
+      <h4 class="h4Sty">
+        成功导入<strong style="color: red">{{ tableDataSuccess.length }}</strong
+        >人
+      </h4>
       <el-table
         max-height="600"
         :data="tableDataSuccess"
@@ -85,21 +130,36 @@
         }"
       >
         <el-table-column
-          v-for="(item, index) in tableSet"
+          v-for="(item, index) in computedForm(tableSet, 1)"
           :key="index"
           :prop="item.prop"
           :label="item.label"
+          :width="item.width"
           align="center"
         >
           <template slot-scope="scope">
-            <span v-if="item.scope === 'test'"></span>
+            <div v-if="item.scope === 'time'">
+              <div>{{ scope.row[item.prop1] }}</div>
+              <div>{{ scope.row[item.prop2] }} {{ scope.row[item.prop3] }}</div>
+            </div>
             <span v-else>{{ scope.row[item.prop] }}</span>
           </template>
         </el-table-column>
       </el-table>
     </div>
     <div v-show="active === 2" class="exportBox">
-      <h4 class="h4Sty">失败导入xxx人</h4>
+      <h4 class="h4Sty">
+        失败导入<strong style="color: red">{{ tableDataError.length }}</strong
+        >人
+        <el-button
+          v-if="tableDataError.length"
+          style="margin-left: 10px"
+          :size="size"
+          type="success"
+          @click="dowmErrorData"
+          >下载失败数据</el-button
+        >
+      </h4>
       <el-table
         max-height="600"
         :data="tableDataError"
@@ -112,14 +172,21 @@
         }"
       >
         <el-table-column
-          v-for="(item, index) in tableSet"
+          v-for="(item, index) in computedForm(tableSet, 2)"
           :key="index"
           :prop="item.prop"
           :label="item.label"
+          :width="item.width"
           align="center"
         >
           <template slot-scope="scope">
-            <span v-if="item.scope === 'test'"></span>
+            <div v-if="item.scope === 'time'">
+              <div>{{ scope.row[item.prop1] }}</div>
+              <div>
+                {{ changeDatas(scope.row[item.prop2]) }}
+                {{ scope.row[item.prop3] }}
+              </div>
+            </div>
             <span v-else>{{ scope.row[item.prop] }}</span>
           </template>
         </el-table-column>
@@ -134,6 +201,7 @@ import { mapGetters } from "vuex";
 export default {
   data() {
     return {
+      typeInt: 1,
       active: 1,
       marSty: { marginRight: "10px" },
       size: "mini",
@@ -142,52 +210,121 @@ export default {
         applySiteAddress: "",
         applySiteAddressTrain: "",
       },
-      tableDataSuccess: [
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-        { realname: "唐", idCord: "445224199901043333" },
-        { realname: "lian", idCord: "445224199901043313" },
-      ],
+      tableDataSuccess: [],
       tableDataError: [],
       tableSet: [
         {
           label: "学员姓名",
-          prop: "realname",
+          prop: "userName",
         },
         {
           label: "学员身份证",
-          prop: "idCord",
+          prop: "idCard",
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+          width: "120px",
+        },
+        {
+          label: "所购商品",
+          prop: "goodsName",
+          width: "180px",
+        },
+        {
+          label: "考试安排",
+          prop: "applyName",
+          width: "140px",
+        },
+        {
+          label: "预约场次(考试地点和时间)",
+          prop1: "applySiteAddress",
+          prop2: "applySiteExamTime",
+          prop3: "applySiteTime",
+          scope: "time",
+          width: "240px",
+        },
+        {
+          label: "预约场次(考培地点和时间)",
+          prop1: "applySiteAddressTrain",
+          prop2: "applySiteExamTrainTime",
+          prop3: "applySiteTrainTime",
+          scope: "time",
+          width: "240px",
+        },
+        {
+          label: "出错原因",
+          prop: "cause",
+          hidden: true,
         },
       ],
     };
   },
-  computed: { ...mapGetters(["examList", "applySiteAddress"]) },
+  computed: {
+    ...mapGetters(["examList", "applySiteAddress"]),
+    computedForm: function () {
+      return function (tabs, int) {
+        if (int === 1) {
+          const ays = tabs.filter((item) => {
+            if (this.typeInt === 1) {
+              return (
+                item.label !== "预约场次(考培地点和时间)" && !item.hidden
+              );
+            } else {
+              return !item.hidden;
+            }
+          });
+          return ays;
+        } else {
+          const ays = tabs.filter((item) => {
+            if (this.typeInt === 1) {
+              return item.label !== "预约场次(考培地点和时间)";
+            } else {
+              return item;
+            }
+          });
+          return ays;
+        }
+      };
+    },
+  },
   methods: {
-    /**下载模板 */
-    downModel() {
+    /**
+     * 转换时间格式
+     */
+    changeDatas(time) {
+      if (time) {
+        var datas = this.$methodsTools.onlyForma(
+          new Date(time).getTime() / 1000,
+          false
+        );
+        return datas;
+      } else {
+        return "";
+      }
+    },
+    /**
+     * 下载错误数据
+     */
+    dowmErrorData() {
+      this.$api
+        .inquiresystemsubscribeexportErrorNew(this.tableDataError)
+        .then((res) => {
+          let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
+          let link = document.createElement("a");
+          let fileName = "导入模板" + ".xlsx";
+          document.body.appendChild(link);
+          link.href = url;
+          link.dowmload = fileName;
+          link.click();
+          link.remove();
+        });
+    },
+    /**
+     *
+     * @param {Number} int 下载模板
+     */
+    downModel(int) {
       if (!this.formData.applyId) {
         this.$message.warning("请选择考试计划");
         return;
@@ -196,7 +333,14 @@ export default {
         this.$message.warning("请选择考试地点");
         return;
       }
+      if (int === 2 && !this.formData.applySiteAddressTrain) {
+        this.$message.warning("请选择考培地点");
+        return;
+      }
       var data = JSON.parse(JSON.stringify(this.formData));
+      if (int === 1) {
+        delete data.applySiteAddressTrain;
+      }
       const indexs = this.examList.findIndex((item) => {
         return item.applyId == data.applyId;
       });
@@ -227,6 +371,44 @@ export default {
         }, 200);
       });
     },
+    /**
+     *
+     * @param {event} e 不含考培导入模板
+     */
+    importMobleadd(e) {
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api
+        .editsystemsubscribeimportData(formData)
+        .then((res) => {
+          this.tableDataSuccess = res.data.successList;
+          this.tableDataError = res.data.errorList;
+          this.typeInt = 1;
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    /**
+     *
+     * @param {event} e 含考培导入模板
+     */
+    importMobleaddtrain(e) {
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api
+        .editsystemsubscribeimportTrainData(formData)
+        .then((res) => {
+          this.tableDataSuccess = res.data.successList;
+          this.tableDataError = res.data.errorList;
+          this.typeInt = 2;
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
   },
 };
 </script>
@@ -242,4 +424,97 @@ export default {
   margin-top: 10px;
   border-radius: 4px;
 }
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.item {
+  margin-top: 10px;
+  margin-right: 20px;
+}
 </style>

+ 12 - 3
src/views/education/examManagement/applicationData/byTrainee.vue

@@ -3,8 +3,9 @@
     <div class="dis_fs">
       <div class="dis_left">
         <div class="dis_fs">
-          <input type="text" class="inputSty" v-model="formData.realname" />
+          <input type="text" class="inputSty" v-model="formData.searchKey" />
           <div class="btnSearchSty" @click="getStudent">查询</div>
+          <div class="btnSearchSty" @click="getStudent(1)">重置</div>
         </div>
         <ul>
           <li
@@ -18,6 +19,7 @@
           </li>
         </ul>
         <el-pagination
+        style="text-align: center;"
           small
           layout="prev, pager, next"
           :total="total"
@@ -128,6 +130,7 @@
                   align="center"
                   fixed="right"
                   width="180px"
+                  v-if="false"
                 >
                   <template slot-scope="scope">
                     <el-button
@@ -964,7 +967,6 @@ export default {
             item.children = result;
           }
         });
-        console.log(this.tableData);
       }
     },
     getApis(data) {
@@ -1028,7 +1030,13 @@ export default {
       this.tabSearchData.userId = item.userId;
       this.acs(2);
     },
-    getStudent() {
+    getStudent(int) {
+      if (int === 1) {
+        this.formData = {
+          pageNum: 1,
+          pageSize: 10,
+        };
+      }
       this.$api.inquiresystemsubscribelistUser(this.formData).then((res) => {
         this.total = res.total;
         this.studentList = res.rows;
@@ -1061,6 +1069,7 @@ export default {
     margin-right: 20px;
     padding: 10px 14px;
     .inputSty {
+      width:133px;
       outline: none;
       height: 26px;
     }

+ 4 - 0
src/views/education/notificationManageMent/notificationModel/index.vue

@@ -272,6 +272,10 @@ export default {
       }
     }
   }
+  .el-dialog__body{
+    max-height: 500px;
+    overflow: auto;
+  }
   .el-dialog__footer {
     padding: 0;
     .dialog-footer {

+ 8 - 5
src/views/education/studentManageMent/studentXQ/studyRecord.vue

@@ -63,7 +63,12 @@
                 <el-button
                   type="text"
                   @click="
-                    wantInfo(scope1s.row, scope1s.$index, scope.row.goodsId,scope.row.gradeId)
+                    wantInfo(
+                      scope1s.row,
+                      scope1s.$index,
+                      scope.row.goodsId,
+                      scope.row.gradeId
+                    )
                   "
                   >查看</el-button
                 >
@@ -148,8 +153,6 @@
                   scope.row[item.prop] === 1
                     ? "完成"
                     : scope.row[item.prop] === 0
-                    ? "未学习"
-                    : scope.row[item.prop] === 2
                     ? "学习中"
                     : "未知"
                 }}
@@ -376,13 +379,13 @@ export default {
       this.dialogVisible = false;
     },
     //获取弹出窗内容
-    wantInfo(item, index, goodsId,gradeId) {
+    wantInfo(item, index, goodsId, gradeId) {
       this.$api
         .inquiregradestudentlistSection({
           userId: this.$route.query.id,
           courseId: item.courseId,
           goodsId: goodsId,
-          gradeId:gradeId
+          gradeId: gradeId,
         })
         .then((res) => {
           this.RemardList = res.rows;

+ 20 - 4
src/views/resource/baseManageInfos/resource/businessLevel/index.vue

@@ -218,7 +218,7 @@ import searchBox from "@/components/searchBox";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"BusinessLevel",
+  name: "BusinessLevel",
   components: { searchBox, tableList, pagination },
   data() {
     return {
@@ -261,6 +261,22 @@ export default {
           prop: "projectName",
           hidden: true,
         },
+        {
+          label: "学习顺序",
+          prop: "goodsLearningOrder",
+          scope: "isOptions",
+          hidden: true,
+          options: [
+            {
+              label: "不限制顺序",
+              value: 1,
+            },
+            {
+              label: "限制顺序",
+              value: 0,
+            },
+          ],
+        },
         {
           label: "状态",
           prop: "status",
@@ -355,13 +371,13 @@ export default {
     this.search();
     this.initPlate();
   },
-  activated(){
+  activated() {
     this.search();
-    this.initPlate()
+    this.initPlate();
   },
   methods: {
     submitLearn() {
-      console.log(this.learningOrder)
+      console.log(this.learningOrder);
       this.disabledBtn = true;
       if (!this.$refs.tablieListmest.allCheckData.length) {
         this.$message.warning("请勾选需要配置的业务层次");