Pārlūkot izejas kodu

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

zhongzewei 5 gadi atpakaļ
vecāks
revīzija
1f8a55b65b
2 mainītis faili ar 67 papildinājumiem un 29 dzēšanām
  1. 44 16
      modules/std_glj_lib/models/gljModel.js
  2. 23 13
      web/maintain/std_glj_lib/js/glj.js

+ 44 - 16
modules/std_glj_lib/models/gljModel.js

@@ -297,29 +297,57 @@ 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]);
-                    obj.ID = (maxId - (items.length - 1) + i);
-                    obj.repositoryId = repId;
-                    arr.push(obj);
+            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;
                 }
-                gljModel.collection.insert(arr, null, function(err, docs){
-                    if (err) {
-                        callback(true, "Fail to add", false);
+                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", docs);
+                            } else{
+                                callback(false, "Add successfully", {insertData, failCode});
                             }
                         });
-                    }
-                })
+                    });
+                });
             });
         } else {
             callback(true, "No source", false);

+ 23 - 13
web/maintain/std_glj_lib/js/glj.js

@@ -1418,6 +1418,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({
@@ -1431,7 +1440,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]);
@@ -1503,10 +1522,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--) {
@@ -1516,15 +1535,6 @@ let repositoryGljObj = {
                 }
             }
         }
-        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']) {
-                        cacheSection[j]["ID"] = result.data.ops[i]["ID"];
-                    }
-                }
-            }
-        }
         for (let i = 0; i < updateArr.length; i++) {
             for (let j = 0; j < cacheSection.length; j++) {
                 if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {