浏览代码

加入入库前格式校验

liuyu 5 年之前
父节点
当前提交
dbb9b27f3e
共有 3 个文件被更改,包括 154 次插入84 次删除
  1. 1 1
      app/controller/.dataimp.js
  2. 127 67
      app/service/excelimport.js
  3. 26 16
      app/service/rabbitmq.js

+ 1 - 1
app/controller/.dataimp.js

@@ -1,6 +1,6 @@
 module.exports = {
   create: {
-    requestBody: ['!userid', 'name', 'createtime', 'type', 'content', 'status']
+    requestBody: ['!userid', 'name', 'createtime', 'type', 'content', 'status', 'errmsg']
   },
   destroy: {
     params: ['!id'],

+ 127 - 67
app/service/excelimport.js

@@ -11,77 +11,137 @@ class ExcelimportService extends Service {
   }
 
   // 获取导入的XLSX文件中的数据
-  async getImportXLSXData(result) {
-    console.log(result);
-    for (const elem of result) {
-      const _id = elem._id;
-      const filepath = this.ctx.app.config.fileDirImp + elem.content;
-      if (elem.type === '0') {
-        const workbook = XLSX.readFile(filepath);
-        // 读取内容
-        const sheetNames = workbook.SheetNames; // 获取所有sheet页
-        const sheet = workbook.Sheets[sheetNames[0]]; // 通过取得当前sheet页
-        // const theadRule = [ sheet.A1.v, sheet.B1.v, sheet.C1.v, sheet.D1.v, sheet.E1.v, sheet.F1.v, sheet.G1.v, sheet.H1.v, sheet.I1.v, sheet.J1.v, sheet.K1.v, sheet.L1.v, sheet.M1.v, sheet.N1.v, sheet.O1.v, sheet.P1.v ];
-        const params = XLSX.utils.sheet_to_json(sheet); // 通过工具将表对象的数据读出来并转成json
-        // const theadRule = [ '序号', '院系', '班级', '专业代码', '专业名称', '学号', '姓名', '身份证号', '性别', '学历代码', '学历名称', '毕业年份', '民族', '电话号码', '生源所在地', '政治面貌' ];
-        console.log(params);
-        if (!params) return [];
-        const maps = {
-          szyx: '院系',
-          szbj: '班级',
-          yxdm: '院校代码',
-          yxmc: '院校名称',
-          zydm: '专业代码',
-          zymc: '专业名称',
-          xh: '学号',
-          xm: '姓名',
-          sfzh: '身份证号',
-          xb: '性别',
-          xldm: '学历代码',
-          xl: '学历名称',
-          year: '毕业年份',
-          mz: '民族',
-          dhhm: '电话号码',
-          syszddm: '生源所在地代码',
-          syszd: '生源所在地',
-          zzmm: '政治面貌',
-        };
-        const _datas = params.map(p => {
-          const data = {};
-          Object.keys(maps).forEach(k => { data[k] = p[maps[k]]; });
-          // Object.entries(maps).forEach(a => { data[a[0]] = p[a[1]]; });
-          return data;
-        });
-        // exceldata = [ ...exceldata, ..._datas ];
-        // 将数据逐条导入学生库中
-        const queryData = { year: elem.createtime, schid: elem.userid, schname: elem.name };
-        let errCount = 0;
-        const errmsgRes = [];
-        for (const i in _datas) {
-          try {
-            const studRes = await this.ctx.service.axiox.student.create(queryData, _datas[i]);
-            console.log(studRes);
-          } catch (err) {
-            console.log(err);
-            errCount++;
-            errmsgRes.push(_datas[i]);
-          }
-        }
-        console.log(errCount);
-        // 导入成功时更新状态
-        if (errCount === 0) {
-          const updatedata = { status: '1' };
-          await this.ctx.service.dataimp.update({ id: _id }, updatedata);
-        } else {
-          console.log(errmsgRes);
-          const updatedata = { status: '2', errmsg: errmsgRes };
-          console.log(updatedata);
-          await this.ctx.service.dataimp.update({ id: _id }, updatedata);
-        }
+  async getImportXLSXData(elem) {
+    const filepath = this.ctx.app.config.fileDirImp + elem.content;
+    if (elem.type === '0') {
+      const workbook = XLSX.readFile(filepath);
+      // 读取内容
+      const sheetNames = workbook.SheetNames; // 获取所有sheet页
+      const sheet = workbook.Sheets[sheetNames[0]]; // 通过取得当前sheet页
+      // const theadRule = [ sheet.A1.v, sheet.B1.v, sheet.C1.v, sheet.D1.v, sheet.E1.v, sheet.F1.v, sheet.G1.v, sheet.H1.v, sheet.I1.v, sheet.J1.v, sheet.K1.v, sheet.L1.v, sheet.M1.v, sheet.N1.v, sheet.O1.v, sheet.P1.v ];
+      const params = XLSX.utils.sheet_to_json(sheet); // 通过工具将表对象的数据读出来并转成json
+      // const theadRule = [ '序号', '院系', '班级', '专业代码', '专业名称', '学号', '姓名', '身份证号', '性别', '学历代码', '学历名称', '毕业年份', '民族', '电话号码', '生源所在地', '政治面貌' ];
+      if (!params) return [];
+      const maps = {
+        szyx: '院系',
+        szbj: '班级',
+        yxdm: '院校代码',
+        yxmc: '院校名称',
+        zydm: '专业代码',
+        zymc: '专业名称',
+        xh: '学号',
+        xm: '姓名',
+        sfzh: '身份证号',
+        xb: '性别',
+        xldm: '学历代码',
+        xl: '学历名称',
+        year: '毕业年份',
+        mz: '民族',
+        dhhm: '电话号码',
+        syszddm: '生源所在地代码',
+        syszd: '生源所在地',
+        zzmm: '政治面貌',
+      };
+      const _datas = params.map(p => {
+        const data = {};
+        Object.keys(maps).forEach(k => { data[k] = p[maps[k]]; });
+        // Object.entries(maps).forEach(a => { data[a[0]] = p[a[1]]; });
+        return data;
+      });
+      return _datas;
+    }
+  }
+
+  // 将取得的数据校验格式是否正确
+  async validatedata(elem, _datas) {
+    let errCount = 0;
+    const errmsgRes = [];
+    for (const i in _datas) {
+      const data = _datas[i];
+      if (data.xh === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '学号为空' };
+        errmsgRes.push(errmsg);
+        break;
+      }
+      if (data.xm === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '姓名为空' };
+        errmsgRes.push(errmsg);
+        break;
+      }
+      if (data.sfzh === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '身份证号为空' };
+        errmsgRes.push(errmsg);
+        break;
+      }
+      if (data.xb === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '性别为空' };
+        errmsgRes.push(errmsg);
+        break;
+      }
+      if (data.yxdm === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '院校代码为空' };
+        errmsgRes.push(errmsg);
+        break;
+      }
+      if (data.yxmc === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '院校名称为空' };
+        errmsgRes.push(errmsg);
+        break;
+      }
+      if (data.zymc === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '专业名称为空' };
+        errmsgRes.push(errmsg);
+        break;
+      }
+      if (data.xl === '') {
+        errCount++;
+        const errmsg = { ...data, errmsg: '学历为空' };
+        errmsgRes.push(errmsg);
+        break;
       }
     }
+    if (errCount !== 0) {
+      const updatedata = { status: '2', errmsg: errmsgRes };
+      console.log(updatedata);
+      await this.ctx.service.dataimp.update({ id: elem.id }, updatedata);
+    }
+    return errCount;
   }
 
+  // 将取得的数据插入到数据表中
+  async dataimport(elem, _datas) {
+    // 将数据逐条导入学生库中
+    const queryData = { year: elem.createtime, schid: elem.userid, schname: elem.name };
+    let errCount = 0;
+    const errmsgRes = [];
+    for (const i in _datas) {
+      try {
+        await this.ctx.service.axiox.student.create(queryData, _datas[i]);
+      } catch (err) {
+        console.log(err);
+        errCount++;
+        errmsgRes.push(_datas[i]);
+      }
+    }
+    console.log(errCount);
+    // 导入成功时更新状态
+    if (errCount === 0) {
+      const updatedata = { status: '1' };
+      await this.ctx.service.dataimp.update({ id: elem.id }, updatedata);
+    } else {
+      console.log(errmsgRes);
+      const updatedata = { status: '2', errmsg: errmsgRes };
+      console.log(updatedata);
+      await this.ctx.service.dataimp.update({ id: elem.id }, updatedata);
+    }
+  }
 }
 
 module.exports = ExcelimportService;

+ 26 - 16
app/service/rabbitmq.js

@@ -33,24 +33,34 @@ class RabbitmqService extends Service {
         console.log('==q=', q);
         // 队列绑定 exchange
         await ch.bindQueue(q.queue, ex, '*');
-        const getResult = async () => {
-          return new Promise(resolve => {
-            ch.consume(q.queue, msg => {
-              ch.close();
-              resolve(msg);
-            }, { noAck: true });
-          });
-        };
-        const resultMq = await getResult();
-        if (resultMq != null) {
-          const headers = resultMq.properties.headers;
-          const data = { userid: headers.userid, type: '0', status: '0' };
-          const dataimpResult = await this.ctx.service.dataimp.query(data);
-          await this.ctx.service.excelimport.getImportXLSXData(dataimpResult);
-        }
+        ch.consume(q.queue, msg => {
+          console.log('收到消息: ', msg);
+          const result = msg.content.toString();
+          const headers = msg.properties.headers;
+          // 插入待办事项到数据库中。
+          if (result != null) {
+            console.log('headers: ', headers);
+            const data = { userid: headers.userid, type: '0', status: '0' };
+            const that = this;
+            // 根据条件查询所有符合条件的待导入信息
+            this.ctx.service.dataimp.query(data).then(function(dataimpResult) {
+              for (const elem of dataimpResult) {
+                // 取得当前信息下excel文件的数据
+                that.ctx.service.excelimport.getImportXLSXData(elem).then(function(exceldata) {
+                  // 插入前数据格式校验
+                  that.ctx.service.excelimport.validatedata(elem, exceldata).then(function(errcount) {
+                    // 判断是否有数据错误,错误数为0时插入学生学籍库
+                    if (errcount === 0) {
+                      that.ctx.service.excelimport.dataimport(elem, exceldata);
+                    }
+                  });
+                });
+              }
+            });
+          }
+        }, { noAck: true });
       } catch (e) {
         console.log('==e==', e);
-        await ch.close();
       }
     } else {
       this.ctx.logger.error('!!!!!!没有配置MQ插件!!!!!!');