Просмотр исходного кода

修改新增数据相关逻辑。避免多人同时新增数据时造成重复数据

zhongzewei 6 лет назад
Родитель
Сommit
3aaa558c2b
2 измененных файлов с 165 добавлено и 36 удалено
  1. 104 29
      modules/std_glj_lib/models/gljModel.js
  2. 61 7
      web/maintain/std_glj_lib/js/glj.js

+ 104 - 29
modules/std_glj_lib/models/gljModel.js

@@ -48,34 +48,57 @@ class GljDao  extends OprDao{
     async getGljItemsByRep(repositoryId,callback = null){
         try {
             let rst = await gljModel.find({repositoryId: repositoryId}).lean();
+            // test-- 删除重复编码数据
+            /*const map = {};
+            rst.forEach(glj => {
+                if (glj.code === '016100400') {
+                    console.log(glj);
+                }
+                const obj = {code: glj.code, ID: glj.ID};
+                if (!map[glj.code]) {
+                    map[glj.code] = [obj];
+                } else {
+                    map[glj.code].push(obj);
+                }
+            });
+            const IDs = [];
+            for (let code in map) {
+                if (map[code].length > 1) {
+                    map[code].sort((a, b) => a.ID - b.ID);
+                    console.log(map[code]);
+                    let hasUsed = false;
+                    const removeIDs = [];
+                    const tempIDs = [];
+                    for (let i = 0; i < map[code].length; i++) {
+                        const glj = map[code][i];
+                        if (i !== 0) {
+                            tempIDs.push(glj.ID);
+                        }
+                        const isUsed = await rationModel.findOne({'rationGljList.gljId': glj.ID});
+                        if (isUsed) {
+                            hasUsed = true;
+                        } else {
+                            removeIDs.push(glj.ID);
+                        }
+                    }
+                    if (hasUsed) {
+                        IDs.push(...removeIDs);
+                    } else {
+                        IDs.push(...tempIDs);
+                    }
+                    //console.log(map[code]);
+                }
+            }
+            if (IDs.length) {
+                await gljModel.deleteMany({ID: {$in: IDs}});
+            }
+            console.log(IDs);*/
+            // test--
             this.sortToNumber(rst);
             callback(0, rst);
         } catch (err) {
             callback(1, null);
         }
-        /*//批量获取异步
-        let functions = [];
-        let count = await gljModel.find({repositoryId: repositoryId, $or: [{deleted: null}, {deleted: false}]}).count();
-        let findCount = Math.ceil(count/500);
-        for(let i = 0, len = findCount; i < len; i++){
-            functions.push((function(flag) {
-                return function (cb) {
-                    gljModel.find({repositoryId: repositoryId, deleted: null}, cb).skip(flag).sort({ID: 1}).limit(500);
-                }
-            })(i*500));
-        }
-        async.parallel(functions,  function (err, results) {
-            if(err){
-                callback(err, null);
-            }
-            else{
-                for(let stdGljs of results){
-                    rst = rst.concat(stdGljs);
-                }
-                me.sortToNumber(rst);
-                callback(0, rst);
-            }
-        });*/
     }
 
     getGljItemByType (repositoryId, type, callback){
@@ -246,11 +269,63 @@ class GljDao  extends OprDao{
 
     static addGljItems (repId, lastOpr, items, callback) {
         if (items && items.length > 0) {
-            counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, items.length, function(err, result){
-                var maxId = result.sequence_value;
-                var arr = [];
-                for (var i = 0; i < items.length; i++) {
-                    var obj = new gljModel(items[i]);
+            const codes = [];
+            items.forEach(item => codes.push(item.code));
+            gljModel.find({repositoryId: repId, code: {$in: codes}}, '-_id code', {lean: true}, (err, codeData) => {
+                if (err) {
+                    callback(true, '判断编码唯一性失败', false);
+                    return;
+                }
+                const insertData = [];
+                const failCode = [];
+                items.forEach(item => {
+                    const matchData = codeData.find(codeItem => codeItem.code === item.code);
+                    if (!matchData) {
+                        insertData.push(item);
+                    } else {
+                        failCode.push(item.code);
+                    }
+                });
+                if (!insertData.length) {
+                    callback(false, 'empty data', {insertData, failCode});
+                    return;
+                }
+                counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, items.length, (counterErr, counterData) => {
+                    if (counterErr) {
+                        callback(true, '获取人材机ID失败', false);
+                        return;
+                    }
+                    const maxId = counterData.sequence_value;
+                    for (let i = 0; i < insertData.length; i++) {
+                        insertData[i].ID = (maxId - (insertData.length - 1) + i);
+                        insertData[i].repositoryId = repId;
+                    }
+                    const task = [];
+                    insertData.forEach(item => {
+                       task.push({
+                           insertOne: {document: item}
+                       });
+                    });
+                    gljModel.bulkWrite(task, (insertErr, rst) => {
+                        if (insertErr) {
+                            callback(true, '新增数据失败', false);
+                            return;
+                        }
+                        GljDao.updateOprArr({ID: repId}, lastOpr, moment(Date.now()).format('YYYY-MM-DD HH:mm:ss'), function (err) {
+                            if(err){
+                                callback(true, "Fail to update Operator", false);
+                            } else{
+                                callback(false, "Add successfully", {insertData, failCode});
+                            }
+                        });
+                    });
+                });
+            });
+            /*counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, items.length, function(err, result){
+                const maxId = result.sequence_value;
+                const arr = [];
+                for (let i = 0; i < items.length; i++) {
+                    const obj = new gljModel(items[i]);
                     obj.ID = (maxId - (items.length - 1) + i);
                     obj.repositoryId = repId;
                     arr.push(obj);
@@ -269,7 +344,7 @@ class GljDao  extends OprDao{
                         });
                     }
                 })
-            });
+            });*/
         } else {
             callback(true, "No source", false);
         }

+ 61 - 7
web/maintain/std_glj_lib/js/glj.js

@@ -386,6 +386,19 @@ let repositoryGljObj = {
             success:function(result){
                 if(!result.error) {
                     me.gljList = result.data;
+                    // test
+                    /*const temp = [];
+                    const map = {};
+                    me.gljList.forEach(glj => {
+                        if (!map[glj.code]) {
+                            map[glj.code] = 1;
+                        } else {
+                            temp.push(glj);
+                        }
+                    });
+                    temp.sort((a, b) => b.ID - a.ID);
+                    console.log(temp);*/
+                    // test
                     me.workBook.getSheet(0).setRowCount(result.data.length);
                     me.sortGlj();
                     me.currentGlj = me.gljList.length > 0 ? me.gljList[0] : null;//初始
@@ -1557,6 +1570,15 @@ let repositoryGljObj = {
             me.saveInString(updateArr)
         }
         if(addArr.length > 0){
+            const codeMap = {};
+            const uniqueCodeAddArr =[];
+            addArr.forEach(item => {
+                if (!codeMap[item.code]) {
+                    codeMap[item.code] = 1;
+                    uniqueCodeAddArr.push(item);
+                }
+            });
+            addArr = uniqueCodeAddArr;
             me.saveInString(addArr);
         }
         $.ajax({
@@ -1570,7 +1592,17 @@ let repositoryGljObj = {
                 if (result.error) {
                     alert(result.message);
                 } else {
-                    me.updateCache(addArr, updateArr, removeIds, result);
+                    const failCodes = result.data.failCode;
+                    if (failCodes && failCodes.length) {
+                        let failText = '';
+                        failCodes.forEach(code => {
+                            failText += `<p>编码“${code}”已存在</p>`;
+                        });
+                        $('#alertText').html(failText);
+                        $('#codeAlert').modal('show');
+                    }
+                    const insertData = result.data.insertData;
+                    me.updateCache(insertData, updateArr, removeIds);
                     //me.sortGlj();
                     if(me.currentOprParent === 1){
                         me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]);
@@ -1642,10 +1674,10 @@ let repositoryGljObj = {
         }
         return rst;
     },
-    updateCache: function(addArr, updateArr, removeIds, result) {
+    updateCache: function(insertData, updateArr, removeIds) {
         let me = this, cacheSection = me.gljList;
-        if (addArr.length > 0) {
-            me.gljList = me.gljList.concat(addArr);
+        if (insertData && insertData.length > 0) {
+            me.gljList = me.gljList.concat(insertData);
             cacheSection = me.gljList;
         }
         for (let i = removeIds.length - 1; i >= 0; i--) {
@@ -1655,7 +1687,7 @@ let repositoryGljObj = {
                 }
             }
         }
-        if (result && result.data && result.data.ops && result.data.ops.length > 0) {
+        /*if (result && result.data && result.data.ops && result.data.ops.length > 0) {
             for (let i = 0; i < result.data.ops.length; i++) {
                 for (let j = 0; j < cacheSection.length; j++) {
                     if (cacheSection[j]['code'] == result.data.ops[i]['code']) {
@@ -1663,7 +1695,7 @@ let repositoryGljObj = {
                     }
                 }
             }
-        }
+        }*/
         for (let i = 0; i < updateArr.length; i++) {
             for (let j = 0; j < cacheSection.length; j++) {
                 if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
@@ -1917,4 +1949,26 @@ let gljTypeTreeOprObj = {
         $("#addBtn_"+treeNode.tId).unbind().remove();
     }
 
-};
+};
+const setTimeoutSync = (handle, time) => {
+    return new Promise((resolve, reject) => {
+        setTimeout(() => {
+            try {
+                if (handle && typeof handle === 'function') {
+                    handle();
+                }
+                resolve();
+            } catch (err) {
+                reject(err);
+            }
+        }, time);
+    });
+};
+setTimeoutSync(() => {
+    //throw new Error('a');
+}).then(v => {
+    setTimeoutSync(() => {
+        //Promise.reject(new Error('b'))
+        //throw new Error('b');
+    });
+}).catch(err => console.log(err));