Selaa lähdekoodia

工料机 excel paste / 格式化输出

TonyKang 8 vuotta sitten
vanhempi
commit
7ba7711398

+ 13 - 0
modules/rationRepository/controllers/repositoryGljController.js

@@ -43,5 +43,18 @@ module.exports ={
                 callback(req,res,err,data)
             });
         }
+    },
+    mixUpdateGljItems: function(req, res){
+        var repId = req.body.repositoryId,
+            updateItems = JSON.parse(req.body.updateItems),
+            addItems = JSON.parse(req.body.addItems);
+        gljRepository.mixUpdateGljItems(repId, updateItems, addItems, function(err, message, rst){
+            if (err) {
+                callback(req, res, err, message, null);
+            } else {
+                callback(req, res, err, message, rst);
+            }
+        });
     }
+
 }

+ 70 - 6
modules/rationRepository/models/gljRepository.js

@@ -50,24 +50,88 @@ gljItemDAO.prototype.getGljTypes = function(repositoryName, callback){
 
 gljItemDAO.prototype.getGljItemsByRep = function(repositoryId,callback){
     gljItemModel.find({"repositoryId": repositoryId},function(err,data){
-        if(err) callback(true, "获取工料机错误!", "")
-        else callback(false,"获取工料机", data);
+        if(err) callback(true, "")
+        else callback(false,data);
     })
 };
 
 gljItemDAO.prototype.getGljItemByType = function(repositoryId, type, callback){
     gljItemModel.find({"repositoryId": repositoryId, "gljType": type},function(err,data){
-        if(err) callback(true, "获取工料机错误!", "")
-        else callback(false,"获取工料机", data);
+        if(err) callback(true, "")
+        else callback(false, data);
     })
 };
 
 gljItemDAO.prototype.getGljItem = function(repositoryId, code, callback){
     gljItemModel.find({"repositoryId": repositoryId, "code": code},function(err,data){
-        if(err) callback(true, "获取工料机错误!", "")
-        else callback(false,"获取工料机", data);
+        if(err) callback(true, "")
+        else callback(false, data);
     })
 };
 
+gljItemDAO.prototype.mixUpdateGljItems = function(repId, updateItems, addItems, callback) {
+    var me = this;
+    if (!(updateItems) || updateItems.length == 0) {
+        me.addGljItems(repId, addItems, callback);
+    } else {
+        me.updateGljItems(repId, updateItems, function(err, results){
+            if (err) {
+                callback(true, "保存定额错误!", false);
+            } else {
+                if (addItems && addItems.length > 0) {
+                    me.addGljItems(repId, addItems, callback);
+                } else {
+                    callback(false, "保存定额成功!", results);
+                }
+            }
+        });
+    }
+};
+
+gljItemDAO.prototype.addGljItems = function(repId, items, callback) {
+    if (items && items.length > 0) {
+        counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, items.length, function(err, result){
+            var maxId = result.value.sequence_value;
+            var arr = [];
+            for (var i = 0; i < items.length; i++) {
+                var obj = new gljItemModel(items[i]);
+                obj.ID = (maxId - (items.length - 1) + i);
+                obj.repositoryId = repId;
+                arr.push(obj);
+            }
+            gljItemModel.collection.insert(arr, null, function(err, docs){
+                if (err) {
+                    callback(true, "保存定额错误!", false);
+                } else {
+                    callback(false, "保存定额成功!", docs);
+                }
+            })
+        });
+    } else {
+        callback(true, "定额数据源错误!", false);
+    }
+};
+
+gljItemDAO.prototype.updateGljItems = function(repId, items, callback) {
+    var functions = [];
+    for (var i=0; i < items.length; i++) {
+        functions.push((function(doc) {
+            return function(cb) {
+                var filter = {};
+                if (doc.ID) {
+                    filter.ID = doc.ID;
+                } else {
+                    filter.repositoryId = repId;
+                    filter.code = doc.code;
+                }
+                gljItemModel.update(filter, doc, cb);
+            };
+        })(items[i]));
+    }
+    async.parallel(functions, function(err, results) {
+        callback(err, results);
+    });
+};
+
 module.exports = new gljItemDAO();
 

+ 1 - 0
modules/rationRepository/routes/rationRepRoutes.js

@@ -26,6 +26,7 @@ apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
 
 apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
 apiRouter.post("/getGljItems",repositoryGljController.getGljItems);
+apiRouter.post("/mixUpdateGljItems",repositoryGljController.mixUpdateGljItems);
 
 
 module.exports = apiRouter;

+ 3 - 3
web/rationLibEditor/gongliao.html

@@ -203,7 +203,7 @@
                 }
             },
             callback:{
-                //onClick: zTreeOprObj.onClick,
+                onClick: repositoryGljObj.onClick,
             }
         };
   	</script>
@@ -211,8 +211,8 @@
 <script type="text/javascript">
     autoFlashHeight();
     $(document).ready(function(){
-        pageOprObj.initPage();
-        repositoryGljObj.buildSheet($("#GLJListSheet")[0]);
+        pageOprObj.initPage($("#GLJListSheet")[0]);
+        //repositoryGljObj.buildSheet($("#GLJListSheet")[0]);
     });
 </script>
 

+ 7 - 33
web/rationLibEditor/js/ration.js

@@ -12,12 +12,12 @@ var rationOprObj = {
     currentSectionId: -1,
     setting: {
         header:[
-            {headerName:"编码",headerWidth:120,dataCode:"code"},
-            {headerName:"名称",headerWidth:300,dataCode:"name"},
-            {headerName:"单位",headerWidth:120,dataCode:"unit"},
-            {headerName:"基价",headerWidth:120,dataCode:"basePrice"},
-            {headerName:"显示名称(以%s表示参数)",headerWidth:350,dataCode:"caption"},
-            {headerName:"取费专业",headerWidth:120,dataCode:"feeType"}
+            {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String"},
+            {headerName:"名称",headerWidth:300,dataCode:"name", dataType: "String"},
+            {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center"},
+            {headerName:"基价",headerWidth:120,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right"},
+            {headerName:"显示名称(以%s表示参数)",headerWidth:350,dataCode:"caption", dataType: "String"},
+            {headerName:"取费专业",headerWidth:120,dataCode:"feeType", dataType: "Number", hAlign: "center"}
         ],
         view:{
             comboBox:[
@@ -44,33 +44,7 @@ var rationOprObj = {
         var me = rationOprObj;
         var cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
         var updateArr = [], addArr = [];
-        var private_createRationItems = function() {
-            var rst = [], propId = 0, preStrIdx = 0, itemObj = {};
-            for (var i = 0; i < info.pasteData.text.length; i++) {
-                if (info.pasteData.text[i] === "\n") {
-                    propId = 0;
-                    preStrIdx = i + 1;
-                    rst.push(itemObj);
-                    if (i < info.pasteData.text.length - 1) {
-                        itemObj = {};
-                    }
-                } else if (info.pasteData.text[i] === "\t" || info.pasteData.text[i] === "\r") {
-                    itemObj[me.setting.header[propId].dataCode] = info.pasteData.text.slice(preStrIdx, i);
-                    propId++;
-                    preStrIdx = i + 1;
-                    //if the last copied-cell were empty, should check whether the end of text
-                    if (i == info.pasteData.text.length - 1) {
-                        itemObj[me.setting.header[propId].dataCode] = info.pasteData.text.slice(preStrIdx);
-                        rst.push(itemObj);
-                    }
-                } else if (i == info.pasteData.text.length - 1) {
-                    itemObj[me.setting.header[propId].dataCode] = info.pasteData.text.slice(preStrIdx);
-                    rst.push(itemObj);
-                }
-            }
-            return rst;
-        };
-        var items = private_createRationItems();
+        var items = sheetCommonObj.analyzePasteData(me.setting, info);
         for (var i = 0; i < items.length; i++) {
             if (cacheSection) {
                 var hasCacheItem = false;

+ 2 - 2
web/rationLibEditor/js/rationGLJ.js

@@ -8,8 +8,8 @@ var rationGLJOprObj = {
             {headerName:"编码",headerWidth:160},
             {headerName:"名称",headerWidth:400},
             {headerName:"单位",headerWidth:160},
-            {headerName:"单位基价",headerWidth:160},
-            {headerName:"定额消耗",headerWidth:160},
+            {headerName:"单位基价",headerWidth:160, dataType: "Number", precision: 2},
+            {headerName:"定额消耗",headerWidth:160, dataType: "Number", precision: 3},
             {headerName:"类型",headerWidth:160},
             {headerName:"操作",headerWidth:130}
         ],

+ 70 - 12
web/rationLibEditor/js/repositoryGLJ.js

@@ -8,11 +8,12 @@ $("#drirect-dinge").click(function(){
 
 var pageOprObj = {
     rationLibName : null,
-    initPage : function() {
+    initPage : function(container) {
         var me = this, rationLibName = getQueryString("repository");//获取定额库参数
         if (rationLibName) {
             me.rationLibName = rationLibName;
             repositoryGljObj.getGljTree(rationLibName, function(repId){
+                repositoryGljObj.buildSheet(container);
                 repositoryGljObj.getGljItems(repId);
             });
         }
@@ -22,15 +23,17 @@ repositoryGljObj = {
     treeObj : null,
     workBook: null,
     gljAllTypeId: -1,
+    gljCurTypeId: -1,
+    currentRepositoryId: -1,
     gljList: [],
     setting: {
         header:[
-            {headerName:"编码",headerWidth:120,data:"code"},
-            {headerName:"名称",headerWidth:400,data:"name"},
-            {headerName:"规格",headerWidth:120,data:"specs"},
-            {headerName:"单位",headerWidth:120,data:"unit"},
-            {headerName:"基价单价",headerWidth:120,data:"basePrice"},
-            {headerName:"类型",headerWidth:120,data:"gljType"}
+            {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"规格",headerWidth:120,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"基价单价",headerWidth:120,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+            {headerName:"类型",headerWidth:120,dataCode:"gljType", dataType: "Number", hAlign: "center", vAlign: "center"}
         ],
         view:{
             comboBox:[
@@ -51,12 +54,13 @@ repositoryGljObj = {
             timeout:20000,
             success:function(result,textStatus,status){
                 if(status.status == 200) {
-                    me.createRationTree(result.data);
+                    me.createTree(result.data);
                     //me.gljAllTypeId
                     if (result.data && result.data.length > 0) {
                         for (var i = 0; i < result.data.length; i++) {
                             if (result.data[i].Name === "全部") {
-                                me.gljAllTypeId = result.data[i].repositoryId;
+                                me.gljAllTypeId = result.data[i].ID;
+                                me.gljCurTypeId = me.gljAllTypeId;
                                 break;
                             }
                         }
@@ -73,13 +77,14 @@ repositoryGljObj = {
             }
         })
     },
-    createRationTree : function(sourceData){
+    createTree : function(sourceData){
         var me = repositoryGljObj, treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
         me.treeObj = $.fn.zTree.init($("#repositoryTree"), setting, treeArr);
         me.treeObj.expandAll(true);
     },
     getGljItems: function(repId) {
         var me = this;
+        me.currentRepositoryId = repId;
         $.ajax({
             type:"POST",
             url:"api/getGljItems",
@@ -88,9 +93,9 @@ repositoryGljObj = {
             cache:false,
             timeout:5000,
             success:function(result){
-                if(status.status == 200) {
+                if(result.success) {
                     me.gljList = result.data;
-                    me.showGljItems(result.data, me.gljAllTypeId);
+                    me.showGljItems(result.data, me.gljCurTypeId);
                 }
             },
             error:function(err){
@@ -125,5 +130,58 @@ repositoryGljObj = {
     },
     onClipboardPasted: function(e, info) {
         var me = repositoryGljObj;
+        var updateArr = [], addArr = [];
+        var items = sheetCommonObj.analyzePasteData(me.setting, info);
+        var hasCacheItem = false;
+        for (var i = 0; i < items.length; i++) {
+            for (var j = 0; j < me.gljList.length; j++) {
+                if (me.gljList[j][me.setting.header[0].dataCode] == items[i][me.setting.header[0].dataCode]) {
+                    hasCacheItem = true;
+                    items[i]["ID"] = me.gljList[j]["ID"];
+                    break;
+                }
+            }
+            if (!hasCacheItem) {
+                addArr.push(items[i]);
+            } else {
+                updateArr.push(items[i]);
+            }
+        }
+        if (updateArr.length > 0 || addArr.length > 0) {
+            $.ajax({
+                type:"POST",
+                url:"api/mixUpdateGljItems",
+                data:{"repositoryId": me.currentRepositoryId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr)},
+                dataType:"json",
+                cache:false,
+                timeout:5000,
+                success:function(result){
+                    if (result.err) {
+                        alert(err);
+                        me.getRationItems(me.currentRepositoryId);
+                    } else {
+                        if (addArr.length > 0) {
+                            me.gljList = me.gljList.concat(addArr);
+                        }
+                        for (var i = 0; i < updateArr.length; i++) {
+                            for (var j = 0; j < me.gljList.length; j++) {
+                                if (me.gljList[j][me.setting.header[0].dataCode] == updateArr[i][me.setting.header[0].dataCode]) {
+                                    me.gljList[j] = updateArr[i];
+                                }
+                            }
+                        }
+                        me.showGljItems(me.gljList, me.gljAllTypeId);
+                    }
+                },
+                error:function(){
+                }
+            })
+        }
+    },
+    onClick: function(event,treeId,treeNode) {
+        var me = repositoryGljObj,
+            gljTypeId = treeNode.ID;
+        repositoryGljObj.gljCurTypeId = treeNode.ID;
+        repositoryGljObj.showGljItems(repositoryGljObj.gljList, gljTypeId);
     }
 }

+ 60 - 0
web/rationLibEditor/js/sheetCommon.js

@@ -44,15 +44,75 @@ var sheetCommonObj = {
         var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
         sheet.suspendPaint();
         sheet.suspendEvent();
+        var private_setCellAlign = function(cell, hAlign, vAlign) {
+            if (!(hAlign) || hAlign === "left") {
+                cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+            } else if (hAlign === "right") {
+                cell.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
+            } else if (hAlign === "center") {
+                cell.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
+            } else {
+                cell.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+            }
+            if (!(vAlign) || vAlign === "center") {
+                cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
+            } else if (vAlign === "top") {
+                cell.vAlign(GC.Spread.Sheets.VerticalAlign.top);
+            } else if (vAlign === "bottom") {
+                cell.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
+            } else {
+                cell.vAlign(GC.Spread.Sheets.VerticalAlign.center);
+            }
+        };
         for (var row = 0; row < data.length; row++) {
             for (var col = 0; col < setting.header.length; col++) {
+                var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport)
+                    hAlign = "left", vAlign = "center";
                 sheet.setValue(row, col, data[row][setting.header[col].dataCode], ch);
+                if (setting.header[col].hAlign) {
+                    hAlign = setting.header[col].hAlign;
+                } else if (setting.header[col].dataType !== "String"){
+                    hAlign = "right";
+                }
+                vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign;
+                private_setCellAlign(cell, hAlign, vAlign);
+                if (setting.header[col].formatter) {
+                    var style = new GC.Spread.Sheets.Style();
+                    style.formatter = setting.header[col].formatter;
+                    sheet.setStyle(row,col,style,GC.Spread.Sheets.SheetArea.viewport);
+                }
             }
         }
         sheet.resumeEvent();
         sheet.resumePaint();
         //me.shieldAllCells(sheet);
     },
+    analyzePasteData: function(setting, pastedInfo) {
+        var rst = [], propId = 0, preStrIdx = 0, itemObj = {};
+        for (var i = 0; i < pastedInfo.pasteData.text.length; i++) {
+            if (pastedInfo.pasteData.text[i] === "\n") {
+                propId = 0;
+                preStrIdx = i + 1;
+                rst.push(itemObj);
+                if (i < pastedInfo.pasteData.text.length - 1) {
+                    itemObj = {};
+                }
+            } else if (pastedInfo.pasteData.text[i] === "\t" || pastedInfo.pasteData.text[i] === "\r") {
+                itemObj[setting.header[propId].dataCode] = pastedInfo.pasteData.text.slice(preStrIdx, i);
+                propId++;
+                preStrIdx = i + 1;
+                //if the last copied-cell were empty, should check whether the end of text
+                if (i == pastedInfo.pasteData.text.length - 1) {
+                    itemObj[setting.header[propId].dataCode] = pastedInfo.pasteData.text.slice(preStrIdx);
+                    rst.push(itemObj);
+                }
+            } else if (i == pastedInfo.pasteData.text.length - 1) {
+                itemObj[setting.header[propId].dataCode] = pastedInfo.pasteData.text.slice(preStrIdx);
+                rst.push(itemObj);
+            }
+        }
+        return rst;
+    },
     shieldAllCells: function(sheet) {
         sheet.options.isProtected = true;
     }