Parcourir la source

更新 总附注条件

zhongzewei il y a 7 ans
Parent
commit
2393401a31

+ 97 - 41
modules/ration_repository/models/coe.js

@@ -2,10 +2,12 @@
  * Created by CSL on 2017/5/3.
  * 系数表。
  */
+//modiyied by zhong on 2017/9/21
 let counter = require('../../../public/counter/counter');
 import {coeListModel} from './schemas';
+import async from 'async';
 
-var coeListDAO = function(){};
+let coeListDAO = function(){};
 
 coeListDAO.prototype.getCoe = function (data, callback) {
     coeListModel.findOne({
@@ -38,75 +40,129 @@ coeListDAO.prototype.getCoesByLibID = function (libID, callback) {
         })
 };
 
+
 coeListDAO.prototype.saveToCoeList = function(data, callback) {
-    var me = this;
-    if (data.addArr.length > 0) {
+    let me = this;
+    /*if (data.addArr.length > 0) {
         me.addItems(data.addArr, callback);
-    };
+    }
 
     if (data.deleteArr.length > 0) {
         me.deleteItems(data.deleteArr, callback);
-    };
+    }
 
     if (data.updateArr.length > 0) {
         me.updateItems(data.updateArr, callback);
-    };
+    }*/
+    if (data.addArr.length > 0 && data.updateArr.length > 0) {
+        async.parallel([
+            function (cb) {
+                me.addItems(data.addArr, cb);
+            },
+            function (cb) {
+                me.updateItems(data.updateArr, cb);
+            }
+        ], function (err, result) {
+            callback(err, 'mixed', result);
+        });
+    }
+    else if(data.addArr.length > 0){
+        me.addItems(data.addArr, callback);
+    }
+    else if (data.updateArr.length > 0) {
+        me.updateItems(data.updateArr, callback);
+    }
+    else if (data.deleteArr.length > 0) {
+        me.deleteItems(data.deleteArr, callback);
+    }
 };
 
 coeListDAO.prototype.addItems = function(addArr, callback) {
     if (addArr && addArr.length > 0) {
         counter.counterDAO.getIDAfterCount(counter.moduleName.coeList, addArr.length, function(err, result){
-            var maxId = result.value.sequence_value;
-            for (var i = 0; i < addArr.length; i++) {
-                var obj = new coeListModel(addArr[i]);
+            let maxId = result.value.sequence_value;
+            let functions = [];
+            for (let i = 0; i < addArr.length; i++) {
+                let obj = new coeListModel(addArr[i]);
                 obj.ID = (maxId - (addArr.length - 1) + i);
-                coeListModel.create(obj, function(err) {
-                    if (err) {
-                        callback(true, "add fail", null);
-                    } else {
-                        callback(false, "add success", obj.ID);
-                    };
-                });
-            };
-
+                functions.push((function (obj) {
+                    return function (cb) {
+                        coeListModel.create(obj, function(err) {
+                            if (err) {
+                                cb(true, null);
+                            } else {
+                                cb(false, obj);
+                            };
+                        });
+                    }
+                })(obj));
+            }
+            async.parallel(functions, function (err, result) {
+                if(err) callback(true, 'add fail', null);
+                else callback(false, 'addSc', result);
+            })
         });
     } else {
         callback(true, "no source", null);
-    };
+    }
 };
 
 coeListDAO.prototype.updateItems = function(updateArr, callback) {
     if (updateArr && updateArr.length > 0) {
-            for (var i = 0; i < updateArr.length; i++) {
-                var obj = updateArr[i];
-                coeListModel.update({"libID": obj.libID, "ID": obj.ID}, updateArr[i], function(err) {
-                    if (err) {
-                        callback(true, "update fail", null);
-                    } else {
-                        callback(false, "update success", obj.ID);
-                    };
-                });
-            };
+        let functions = [];
+        for (let i = 0; i < updateArr.length; i++) {
+            let obj = updateArr[i];
+            let needSet = {};
+            for(let attr in obj){
+                if(attr !== 'libID' || attr !== 'ID'){
+                    needSet[attr] = obj[attr];
+                }
+            }
+            functions.push((function (obj) {
+                return function (cb) {
+                    coeListModel.update({"libID": obj.libID, "ID": obj.ID}, needSet, function(err) {
+                        if (err) {
+                            cb(true);
+                        } else {
+                            cb(false);
+                        }
+                    });
+                }
+            })(obj));
+        }
+        async.parallel(functions, function (err, result) {
+            if(err) callback(true, 'update fail', null);
+            else callback(false, 'updateSc', null);
+        })
     } else {
         callback(true, "no source", null);
-    };
+    }
 };
 
 coeListDAO.prototype.deleteItems = function(deleteArr, callback) {
     if (deleteArr && deleteArr.length > 0) {
-        for (var i = 0; i < deleteArr.length; i++) {
-            var obj = deleteArr[i];
-            coeListModel.remove({"libID": obj.libID, "ID": obj.ID}, function(err) {
-                if (err) {
-                    callback(true, "delete fail", null);
-                } else {
-                    callback(false, "delete success", obj.ID);
-                };
-            });
-        };
+        let functions = [];
+        for (let i = 0; i < deleteArr.length; i++) {
+            let obj = deleteArr[i];
+            functions.push((function (obj) {
+                return function (cb) {
+                    coeListModel.remove({"libID": obj.libID, "ID": obj.ID}, function(err) {
+                        if (err) {
+                            cb(true, null);
+                        } else {
+                            cb(false, obj.ID);
+                        }
+                    });
+                }
+            })(obj));
+        }
+        async.parallel(functions, function (err, result) {
+            if(err) callback(true, 'delete fail', null);
+            else callback(false, 'sc', result);
+        })
     } else {
         callback(true, "no source", null);
-    };
+    }
 };
 
 module.exports = new coeListDAO();

+ 1 - 0
modules/ration_repository/models/schemas.js

@@ -10,6 +10,7 @@ let coeSchema = new Schema({
     coeType: String,                // 系数类型,指作用范围:
                                     // 单个(如:111量0.001)、人工类、材料类、机械类、全部(如:定额×0.925)。
     gljCode: String,                  // 要调整的工料机Code(当coeType=0时有效)
+    gljName: String,
     operator: String,               // 运算符(*、+、-、=)
     amount: String,                 // 调整的量
     _id: false

+ 7 - 1
modules/std_glj_lib/controllers/gljController.js

@@ -125,7 +125,13 @@ class GljController extends BaseController{
             }
         });
     }
-
+    getGljItemsOccupied(req, res){
+        let repId = req.body.repId,
+            occupation = req.body.occupation;
+        gljDao.getGljItemsOccupied(repId, occupation, function (err, message, rst) {
+            callback(req, res, err, message, rst);
+        })
+    }
 }
 
 export default GljController;

+ 7 - 0
modules/std_glj_lib/models/gljModel.js

@@ -372,6 +372,13 @@ class GljDao  extends OprDao{
             })
         });
     }
+
+    getGljItemsOccupied(repId, occupation, callback){
+        gljModel.find({repositoryId: repId}, occupation, function (err, result) {
+            if(err) callback(true, 'fail', null);
+            else callback(false, 'sc', result);
+        });
+    }
 }
 
 export default GljDao;

+ 1 - 0
modules/std_glj_lib/routes/routes.js

@@ -36,6 +36,7 @@ module.exports = function (app) {
     router.post("/mixUpdateGljItems",gljController.auth, gljController.init, gljController.mixUpdateGljItems);
     router.post("/getGljItemsByIds",gljController.auth, gljController.init, gljController.getGljItemsByIds);
     router.post("/getGljItemsByCodes",gljController.auth, gljController.init, gljController.getGljItemsByCodes);
+    router.post("/getGljItemsOccupied",gljController.auth, gljController.init, gljController.getGljItemsOccupied);
 
     app.use("/stdGljRepository/api", router);
 

+ 3 - 0
web/maintain/ration_repository/dinge.html

@@ -448,14 +448,17 @@
                 sheetCommonObj.shieldAllCells(rdSpread.getSheet(2), rationCoeOprObj.setting);
 
                 $("#linkGLJ").click(function(){
+                    rationGLJOprObj.bindRationGljDelOpr();
                     rdSpread.setActiveSheetIndex(0);
                 });
 
                 $("#linkFZDE").click(function(){
+                    rationGLJOprObj.unBindDel();
                     rdSpread.setActiveSheetIndex(1);
                 });
 
                 $("#linkFZTJ").click(function(){
+                    rationGLJOprObj.unBindDel();
                     rdSpread.setActiveSheetIndex(2);
                 });
             });

+ 24 - 3
web/maintain/ration_repository/fuzhu.html

@@ -9,7 +9,7 @@
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/maintain/ration_repository/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
-    <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.10.0.1.css" type="text/css">
+    <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
     <!--zTree-->
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
 </head>
@@ -42,7 +42,7 @@
               </ul>
         </nav>
     </div>
-    <div class="main">
+   <!-- <div class="main">
         <div class="content">
             <div class="container-fluid">
                 <div class="row">
@@ -55,6 +55,22 @@
                 </div>
             </div>
         </div>
+    </div>-->
+    <div class="main">
+        <div class="content">
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="main-content col-lg-7 p-0">
+                        <div class="main-data" id="mainSpread">
+                        </div>
+                    </div>
+                    <div class="main-side col-lg-5 p-0">
+                        <div class="main-data" id="contentSpread" >
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
     </div>
 
     <!-- JS. -->
@@ -70,11 +86,16 @@
     <script type="text/javascript" src="/lib/ztree/jquery.ztree.exedit.js"></script>
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
     <script type="text/javascript" src="/public/web/QueryParam.js"></script>
-    <script src="/public/web/sheet/sheet_creater.js"></script>
     <script src="/public/common_util.js"></script>
     <script src="/public/debug.js"></script>
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
     <script type="text/javascript" src="/public/web/storageUtil.js"></script>
     <script type="text/javascript" src="/web/maintain/ration_repository/js/coe.js"></script>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            pageObj.initPage();
+        });
+    </script>
    <!-- <SCRIPT type="text/javascript">
   		&lt;!&ndash;
   		var setting = {

+ 474 - 219
web/maintain/ration_repository/js/coe.js

@@ -1,8 +1,12 @@
 /**
  * Created by CSL on 2017-05-18.
  */
+//modiyied by zhong on 2017/9/21
+
 
 var pageObj = {
+    libID: null,
+    gljLibID: null,
     initPage: function (){
         $("#drirect-dinge").click(function(){
             $(this).attr('href', "/rationRepository/ration" + "?repository=" + getQueryString("repository"))
@@ -19,263 +23,514 @@ var pageObj = {
             html = html.replace("XXX定额库", libName);
             $("#rationname")[0].outerHTML = html;
         };
+        this.gljLibID = storageUtil.getSessionCache("gljLib", "repositoryID_" + libID);
+        this.libID = libID;
+        coeOprObj.buildSheet($('#mainSpread')[0]);
+        gljAdjOprObj.buildSheet($('#contentSpread')[0]);
+        coeOprObj.getCoeList();
+        gljAdjOprObj.getGljItemsOcc();
 
-        coeList.show();
+    },
+    showData: function(sheet, setting, data) {
+        let me = pageObj, ch = GC.Spread.Sheets.SheetArea.viewport;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        sheet.clear(0, 0, sheet.getRowCount(), sheet.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
+        sheet.setRowCount(data.length + 3);
+        for (let col = 0; col < setting.header.length; col++) {
+            var hAlign = "left", vAlign = "center";
+            if (setting.header[col].hAlign) {
+                hAlign = setting.header[col].hAlign;
+            } else if (setting.header[col].dataType !== "String"){
+                hAlign = "right";
+            }
+            if(setting.header[col].readOnly){
+                sheet.getRange(-1, col, -1, 1).locked(true);
+            }
+            else{
+                sheet.getRange(-1, col, -1, 1).locked(false);
+            }
+            vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign;
+            sheetCommonObj.setAreaAlign(sheet.getRange(-1, col, -1, 1), hAlign, vAlign);
+            if (setting.header[col].formatter) {
+                sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
+            }
+            for (let row = 0; row < data.length; row++) {
+                let val = data[row][setting.header[col].dataCode];
+                sheet.setValue(row, col, val, ch);
+            }
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
     }
 };
 
-var coeList = {
-    mainSpread: null,
-    detailSpread: null,
-    datas: [],
-    libID: Number,
-    tempID: -999999,       // 本地新增一条数据给的默认ID,用作标记,服务端返回新ID后替换该ID
-
-    colDefMain: [
-        {name: "ID", displayName: "ID", size: 60, hAlign: "center", readOnly: true},
-        {name: "name", displayName: "名称", size: 280},
-        {name: "content", displayName: "内容", size: 250}
-    ],
-    colDefContent: [
-        {name: "coeType", displayName: "类型", size: 100, hAlign: "center"},
-        {name: "gljCode", displayName: "工料机编号", size: 100, dataType: "String", formatter: "@", hAlign: "center"},
-        {name: "operator", displayName: "操作符", size: 60, hAlign: "center"},
-        {name: "amount", displayName: "数量", size: 80, hAlign: "right"}
-    ],
-
-    show: function (){
-        var me = this;
-        me.libID = getQueryString("repository");
-        me.getDatas();
-        me.mainSpread = sheetObj.create($('#mainSpread')[0], me.colDefMain, me.datas);
-        me.detailSpread = sheetObj.create($('#contentSpread')[0], me.colDefContent, me.datas[0].coes);
-
-        var coeType = new GC.Spread.Sheets.CellTypes.ComboBox();
-        coeType.items(["单个","定额","人工","材料","机械"]);
-        me.detailSpread.getSheet(0).getRange(-1, 0, -1, 1).cellType(coeType);
-
-        var operType = new GC.Spread.Sheets.CellTypes.ComboBox();
-        operType.items(["+","-","*","/","="]);
-        me.detailSpread.getSheet(0).getRange(-1, 2, -1, 1).cellType(operType);
-
-        me.detailSpread.options.showVerticalScrollbar = false;
-
-        me.mainSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onMainEnterCell);
-        me.mainSpread.getSheet(0).bind(GC.Spread.Sheets.Events.CellChanged, me.onMainCellChanged);
-        me.mainSpread.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onMainRangeChanged);
-
-        me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.CellChanged, me.onDetailCellChanged);
-        me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onDetailRangeChanged);
+let coeOprObj = {
+    workBook: null,
+    workSheet: null,
+    currentCoeList: [],
+    currentCoe: null,
+    //currentMaxNo: null,
+    setting: {
+        header: [
+            {headerName:"编号", headerWidth:60, dataCode:"ID", dataType: "String", hAlign: "center", vAlign: "center", readOnly: true},
+            {headerName:"名称", headerWidth:280, dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center", readOnly: false},
+            {headerName:"内容", headerWidth:250, dataCode:"content", dataType: "String", hAlign: "left", vAlign: "center", readOnly: false},
+        ]
     },
+    buildSheet: function (container) {
+        let me = coeOprObj;
+        me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        me.workSheet = me.workBook.getSheet(0);
+        me.workSheet.options.isProtected = true;
+        me.onDelOpr(me.workBook, me.setting);
+        me.workSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, me.onSelectionChanged);
+        me.workSheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onEditEnded);
+        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
+        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+    },
+    onSelectionChanged: function (sender, info) {
+        let me = coeOprObj, that = gljAdjOprObj;
+        if(info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
+            let row = info.newSelections[0].row;
+            if(row < me.currentCoeList.length){
+                me.currentCoe = me.currentCoeList[row];
+                that.currentGljAdjList = me.currentCoe.coes;
+            }
+            else{
+                me.currentCoe = null;
+                that.currentGljAdjList = [];
+            }
+            //refresh & show coes
+            sheetCommonObj.cleanSheet(that.workSheet, that.setting, -1);
+            me.workBook.focus(true);
+            that.show(that.currentGljAdjList);
+        }
+    },
+    onEditEnded: function (sender, args) {
+        let me = coeOprObj, addArr = [], updateArr = [], dataCode = me.setting.header[args.col].dataCode;
+        if(args.editingText && args.editingText.toString().trim().length > 0){
+            //update
+            if(args.row < me.currentCoeList.length){
+                let updateObj = me.currentCoeList[args.row];
+                if(updateObj[dataCode] !== args.editingText.toString().trim()){
+                    updateObj[dataCode] = args.editingText;
+                    updateArr.push(updateObj);
+                    me.save([], updateArr, [], true);
+                }
+            }
+            //insert
+            else{
+                let newCoe = {};
+                //me.currentMaxNo ++;
+                newCoe.libID = pageObj.libID;
+                //newCoe.serialNo = me.currentMaxNo;
+                newCoe[dataCode] = args.editingText;
+                addArr.push(newCoe);
+                me.save(addArr, [], [], true, function (result) {
+                    me.updateCurrentCoeList(result);
+                });
+            }
+        }
+    },
+    onClipboardPasting: function (sender, info) {
+        let me = coeOprObj, maxCol = info.cellRange.col + info.cellRange.colCount - 1;
+        if(maxCol > me.setting.header.length){
+            info.cancel = true;
+        }
+    },
+    onClipboardPasted: function (sender, info) {
+        let me = coeOprObj, addArr = [], updateArr = [];
+        let items = sheetCommonObj.analyzePasteData(me.setting, info);
+        for(let i = 0, len = items.length; i < len; i++){
+            let row = i + info.cellRange.row;
+            //update
+            if(row < me.currentCoeList.length){
+                let updateObj = me.currentCoeList[row];
+                for(let attr in items[i]){
+                    updateObj[attr] = items[i][attr];
+                }
+                updateArr.push(updateObj);
+            }
+            //insert
+            else {
+                //items[i].serialNo = ++ me.currentMaxNo;
+                items[i].libID = pageObj.libID;
+                addArr.push(items[i]);
+            }
+        }
+        if(addArr.length > 0 || updateArr.length > 0){
+            me.save(addArr, updateArr, [], true, function (result) {
+                me.updateCurrentCoeList(result)
+            });
+        }
+    },
+    onDelOpr: function (workBook, setting) {
+        let me = coeOprObj, that = gljAdjOprObj;
+        workBook.commandManager().register('coeListDel', function () {
+            let deleteArr = [];
+            let sheet = workBook.getSheet(0);
+            let sels = sheet.getSelections();
+            let idx = sels[0].row;
+            for(let i = 0, len = sels.length; i < len; i++){
+                if(idx > sels[i].row){
+                    idx = sels[i].row;
+                }
+                if(sels[i].colCount === setting.header.length){//can del
+                    for(let r = 0, rLen = sels[i].rowCount; r < rLen; r++){
+                        let row = sels[i].row + r;
+                        if(row < me.currentCoeList.length){
+                            deleteArr.push({libID: me.currentCoeList[row].libID, ID: me.currentCoeList[row].ID});
+                        }
+                    }
+                    me.currentCoeList.splice(sels[i].row, sels[i].rowCount);
+                }
+            }
+            if(deleteArr.length > 0){
+                me.save([], [], deleteArr, true);
+                me.currentCoe = typeof me.currentCoeList[idx] !== 'undefined' ? me.currentCoeList[idx] : null;
+                that.currentGljAdjList = me.currentCoe ? me.currentCoe.coes : [];
+                gljAdjOprObj.show(that.currentGljAdjList);
+            }
 
-    getDatas: function () {
-        var me = this;
-
+        });
+        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+        workBook.commandManager().setShortcutKey('coeListDel', GC.Spread.Commands.Key.del, false, false, false, false);
+    },
+    updateCurrentCoeList: function (newCoeList) {
+        let me = coeOprObj;
+        me.currentCoeList = me.currentCoeList.concat(newCoeList);
+        me.sortCoeList(me.currentCoeList);
+    },
+    sortCoeList: function (coeList) {
+        coeList.sort(function (a, b) {
+            let rst = 0;
+            if(a.ID > b.ID) rst = 1;
+            else if(a.ID < b.ID) rst = -1;
+            return rst;
+        });
+    },
+    getCoeList: function () {
+        let me = coeOprObj;
         $.ajax({
-            type:"POST",
-            url:"/rationRepository/api/getCoeList",
-            data:{"libID": me.libID},
-            dataType:"json",
-            cache:false,
-            async: false,
+            type: 'post',
+            url: '/rationRepository/api/getCoeList',
+            data: {libID: pageObj.libID},
+            dataType: 'json',
             timeout:20000,
             success: function (result) {
-                if (result.data) {
-                    me.datas = result.data;
-                };
+                if(!result.error){
+                    me.currentCoeList = result.data;
+                    me.sortCoeList(me.currentCoeList);
+                    //me.currentMaxNo =  me.currentCoeList.length > 0 ? me.currentCoeList[me.currentCoeList.length - 1].serialNo : 0;
+                    pageObj.showData(me.workSheet, me.setting, me.currentCoeList);
+                    me.workSheet.clearSelection();
+                }
             },
-            error: function (result) {
-                alert('内部程序错误!');
+            error:function(err){
+                alert("内部程序错误!");
             }
-        })
+        });
     },
-
-    /*getLibID: function(libName){
-        var me = this;
+    save: function (addArr, updateArr, deleteArr, refresh, callback) {
+        let me = coeOprObj;
         $.ajax({
             type:"POST",
-            url:"/rationRepository/api/getLibIDByName",
-            data:{"libName": libName},
+            url:"api/saveCoeList",
+            data: {data: JSON.stringify({addArr: addArr, updateArr: updateArr, deleteArr: deleteArr})},
             dataType:"json",
-            cache:false,
-            async: false,
-            timeout:20000,
-            success: function (result) {
-                if (result.data) {
-                    me.libID = result.data;
+            timeout:5000,
+            success:function(result){
+                if (result.error) {
+                    alert(result.message);
+                } else{
+                    if(callback){
+                        if(result.message === 'mixed'){
+                            for(let i = 0, len = result.data.length; i < len; i++){
+                                if(result.data[i][0] === 'addSc'){
+                                    result.data = result.data[i][1];
+                                    break;
+                                }
+                            }
+                        }
+                        callback(result.data);
+                    }
+                    if(refresh){
+                        pageObj.showData(me.workSheet, me.setting, me.currentCoeList);
+                    }
                 }
             },
-            error: function (result) {
-                alert('内部程序错误!');
+            error:function(err){
+                alert("内部程序错误!");
             }
-        })
-    },*/
-
-    onMainEnterCell: function(sender, args) {
-        var me = coeList;
-        var row = args.sheet.getActiveRowIndex();
-        me.detailSpread.suspendPaint();
+        });
+    }
+};
 
-        var dSheet = me.detailSpread.getSheet(0);
-        var dData = me.datas[row].coes;
-        if (dData == undefined){
-            dSheet.setDataSource([]);
-            dSheet.setRowCount(0);
-        }else{
-            dSheet.setDataSource(dData);
-            me.showNullRow(dSheet);
-        };
-        me.detailSpread.resumePaint();
+let gljAdjOprObj = {
+    workBook: null,
+    workSheet: null,
+    currentGljAdjList: [],
+    gljList: [],//只含编号和名称的总工料机列表
+    setting: {
+        header: [
+            {headerName:"调整类型", headerWidth:100, dataCode:"coeType", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false},
+            {headerName:"工料机编码", headerWidth:100, dataCode:"gljCode", dataType: "String", formatter: '@', hAlign: "center", vAlign: "center", readOnly: false},
+            {headerName:"名称", headerWidth:100, dataCode:"gljName", dataType: "String", hAlign: "center", vAlign: "center", readOnly: true},
+            {headerName:"操作符", headerWidth:60, dataCode:"operator", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false},
+            {headerName:"数量", headerWidth:80, dataCode:"amount", dataType: "String", hAlign: "center", vAlign: "center" , readOnly: false},
+        ],
+        comboItems: {
+            //调整类型下拉菜单
+            coeType: ['定额子目', '人工类', '材料类', '机械类', '主材类', '设备类', '单个工料机'],
+            //操作符下拉菜单
+            operator: ['+', '-', '*', '/', '=']
+        }
     },
-
-    onMainCellChanged: function(sender, args) {
-        if (args.propertyName !== "value"){return;};
-        var me = coeList;
-        var row = args.sheet.getActiveRowIndex();
-        var obj = me.datas[row];
-
-        if (obj.ID == undefined){           // 空行录入,即新增
-            obj.libID = me.libID;
-            obj.ID = me.tempID;
-            if (obj.name == undefined){obj.name = '';};     // 生成属性,令属性存储顺序一致
-            if (obj.content == undefined){obj.content = '';};
-            obj.coes = [{coeType:"定额", operator:"*", amount: "0"}];
-            me.datas[row] = obj;
-
-            me.save([obj],[],[]);
-
-            me.detailSpread.suspendPaint();
-            me.detailSpread.getSheet(0).setDataSource(me.datas[row].coes);
-            me.detailSpread.resumePaint();
-            var sheet = me.mainSpread.getSheet(0);
-            me.showNullRow(sheet);
+    buildSheet: function (container) {
+        let me = gljAdjOprObj;
+        me.workBook = sheetCommonObj.buildSheet(container, me.setting, 3);
+        me.workSheet = me.workBook.getSheet(0);
+        me.workSheet.options.isProtected = true;
+        me.onDelOpr(me.workBook, me.setting);
+        me.workSheet.clearSelection();
+        me.buildComboBox(me.workSheet);
+        me.workSheet.bind(GC.Spread.Sheets.Events.EditStarting, me.onEditStart);
+        me.workSheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onEditEnded);
+        me.workSheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
+        me.workSheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+    },
+    buildComboBox: function (sheet) {
+        let me = gljAdjOprObj;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        let comboType = new GC.Spread.Sheets.CellTypes.ComboBox();
+        comboType.items(me.setting.comboItems.coeType);
+        let comboOpr = new GC.Spread.Sheets.CellTypes.ComboBox();
+        comboOpr.items(me.setting.comboItems.operator);
+        sheet.getCell(-1, 0).cellType(comboType);
+        sheet.getCell(-1, 3).cellType(comboOpr);
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+    onEditStart: function (sender, args) {
+        let me = gljAdjOprObj;
+        if(!coeOprObj.currentCoe || args.row >= me.currentGljAdjList.length && args.col === 1
+            || args.row < me.currentGljAdjList.length && args.col === 1 && me.currentGljAdjList[args.row].coeType !== '单个工料机'){
+            args.cancel = true;
+        }
+    }
+    ,
+    onEditEnded: function (sender, args) {
+        let me = gljAdjOprObj, isUpdate = false,
+            dataCode = me.setting.header[args.col].dataCode;
+        if(args.editingText && args.editingText.toString().trim().length > 0){
+            if(dataCode === 'amount' &&  isNaN(args.editingText)){
+                args.sheet.setValue(args.row, args.col, typeof me.currentGljAdjList[args.row] !== 'undefined' && typeof me.currentGljAdjList[args.row][dataCode] !== 'undefined'
+                    ? me.currentGljAdjList[args.row][dataCode] + '' : '');
+                alert("只能输入数值!");
+            }
+            else {
+                //update
+                if(args.row < me.currentGljAdjList.length && args.editingText.toString().trim() !== me.currentGljAdjList[args.row][dataCode]){
+                    let updateObj = me.currentGljAdjList[args.row];
+                    if(dataCode === 'gljCode' && typeof updateObj.coeType !== 'undefined' && updateObj.coeType === '单个工料机'){
+                        let gljName = me.getGljName(args.editingText, me.gljList);
+                        if(gljName){
+                            updateObj.gljCode = args.editingText;
+                            updateObj.gljName = gljName;
+                            isUpdate = true;
+                        }
+                        else {
+                            alert("不存在编号为"+ args.editingText +"的工料机");
+                        }
+                    }
+                    else if(dataCode !== 'gljCode') {
+                        isUpdate = true;
+                        updateObj[dataCode] = args.editingText;
+                    }
+                }
+                //insert
+                else if(args.row >= me.currentGljAdjList.length){
+                    isUpdate = true;
+                    let newAdjGlj = {};
+                    newAdjGlj[dataCode] = args.editingText;
+                    me.currentGljAdjList.push(newAdjGlj);
+                }
+                if(isUpdate){
+                    coeOprObj.save([], [coeOprObj.currentCoe], [], false, function () {
+                        me.show(me.currentGljAdjList);
+                    });
+                }
+                else {
+                    args.sheet.setValue(args.row, args.col, typeof me.currentGljAdjList[args.row] !== 'undefined' && typeof me.currentGljAdjList[args.row][dataCode] !== 'undefined'
+                        ? me.currentGljAdjList[args.row][dataCode] + '' : '');
+                }
+            }
         }
-        else{ // 正常修改
-            me.save([],[],[obj]);
-        };
     },
+    onClipboardPasting: function (sender, info) {
 
-    onMainRangeChanged: function(sender, args) {
-        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            if (!confirm('确定要删除本条附注条件吗?')){ args.cancel = true; return; }
-            var me = coeList;
-            var obj = me.datas[args.row];
-            me.save([],[obj],[]);
-            args.sheet.deleteRows(args.row, 1);
-        };
     },
-    
-    onDetailCellChanged: function(sender, args) {
-        if (args.propertyName !== "value"){return;};
-
-        var me = coeList;
-        var mainRow = me.mainSpread.getSheet(0).getActiveRowIndex();
-        var detailRow = args.sheet.getActiveRowIndex();
-        var detailDatas = me.datas[mainRow].coes;
-        var curDetailData = detailDatas[detailRow];
-
-        if (curDetailData !== undefined){       // 当在空白行输入时,curDetailData为undefined。
-            var curType = curDetailData.coeType;
-            if (curType !== '单个'){
-                me.detailSpread.suspendPaint();
-                curDetailData.gljCode = null;
-                me.detailSpread.resumePaint();
-            };
-
-            if (curDetailData.operator == undefined){ curDetailData.operator = "*"; } ;
-            if (curDetailData.amount == undefined){ curDetailData.amount = "0"; } ;
-        };
-
-/*        var curType = args.sheet.getValue(detailRow, 0);
-        if (curType !== '单个'){
-            me.detailSpread.suspendEvent();
-            args.sheet.setValue(detailRow, 1, null);
-            me.detailSpread.resumeEvent();
-            //args.sheet.getCell(row, 1).backColor("red");
+    getValidPasteDatas: function (pasteItems, info) {
+        let me = gljAdjOprObj;
+        let rst = [];
+        for(let i = 0, len = pasteItems.length; i < len; i++){
+            let row = i + info.cellRange.row;
+            let validObj = {};
+            //update
+            if(row < me.currentGljAdjList.length){
+                let updateObj = me.currentGljAdjList[row];
+                if(typeof pasteItems[i].coeType !== 'undefined' && typeof pasteItems[i].gljCode !== 'undefined'){
+                    let gljName = me.getGljName(pasteItems[i].gljCode, me.gljList);
+                    if(pasteItems[i].coeType === '单个工料机' && gljName){
+                        validObj.coeType = pasteItems[i].coeType;
+                        validObj.gljCode = pasteItems[i].gljCode;
+                        validObj.gljName = gljName;
+                    }
+                    else if(pasteItems[i].coeType !== '单个工料机' && me.setting.comboItems.coeType.indexOf(pasteItems[i].coeType) !== -1){
+                        validObj.coeType = pasteItems[i].coeType;
+                    }
+                }
+                else if(typeof pasteItems[i].coeType === 'undefined' && typeof pasteItems[i].gljCode !== 'undefined'){
+                    let gljName = me.getGljName(pasteItems[i].gljCode, me.gljList);
+                    if(typeof updateObj.coeType !== 'undefined' && updateObj.coeType === '单个工料机' && gljName){
+                        validObj.gljCode = pasteItems[i].gljCode;
+                        validObj.gljName = gljName;
+                    }
+                }
+                else if(typeof pasteItems[i].coeType !== 'undefined' && typeof pasteItems[i].gljCode === 'undefined'){
+                    if(me.setting.comboItems.coeType.indexOf(pasteItems[i].coeType) !== -1){
+                        validObj.coeType = pasteItems[i].coeType;
+                        if(validObj.coeType !== '单个工料机' && typeof updateObj.gljCode !== '单个工料机' && updateObj.gljCode.toString().trim().length > 0){
+                            validObj.gljCode = '';
+                            validObj.gljName = '';
+                        }
+                    }
+                }
+                else {
+                    if(typeof pasteItems[i].operator !== 'undefined' && me.setting.comboItems.operator.indexOf(pasteItems[i].operator) !== -1){
+                        validObj.operator = pasteItems[i].operator;
+                    }
+                    if(typeof pasteItems[i].amount !== 'undefined' && !isNaN(pasteItems[i].amount)){
+                        validObj.amount = pasteItems[i].amount;
+                    }
+                }
+            }
+            else {
+                if(typeof pasteItems[i].coeType !== 'undefined' && typeof pasteItems[i].gljCode !== 'undefined'){
+                    let gljName = me.getGljName(pasteItems[i].gljCode, me.gljList);
+                    if(pasteItems[i].coeType === '单个工料机' && gljName){
+                        validObj.coeType = pasteItems[i].coeType;
+                        validObj.gljCode = pasteItems[i].gljCode;
+                        validObj.gljName = gljName;
+                    }
+                    else if(pasteItems[i].coeType !== '单个工料机' && me.setting.comboItems.coeType.indexOf(pasteItems[i].coeType) !== -1){
+                        validObj.coeType = pasteItems[i].coeType;
+                    }
+                }
+                else if(typeof pasteItems[i].gljCode === 'undefined') {
+                    if(typeof pasteItems[i].coeType !== 'undefined' && me.setting.comboItems.coeType.indexOf(pasteItems[i].coeType) !== -1){
+                        validObj.coeType = pasteItems[i].coeType;
+                    }
+                    if(typeof pasteItems[i].operator !== 'undefined' && me.setting.comboItems.operator.indexOf(pasteItems[i].operator) !== -1){
+                        validObj.operator = pasteItems[i].operator;
+                    }
+                    if(typeof pasteItems[i].amount !== 'undefined' && !isNaN(pasteItems[i].amount)){
+                        validObj.amount = pasteItems[i].amount;
+                    }
+                }
+            }
+            if(Object.keys(validObj).length > 0){
+                rst.push(validObj);
+            }
         }
-        else{
-            //args.sheet.getCell(row, 1).backColor("Blue");
-        };*/
-
-
-        var obj = me.datas[mainRow];
-        me.save([],[],[obj]);
-
-        me.showNullRow(args.sheet);
+        return rst;
     },
-
-    onDetailRangeChanged: function(sender, args) {
-        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            if (!confirm('确定要删除该类型的明细数据吗?')){ args.cancel = true; return; }
-            var me = coeList;
-            var detailData = args.sheet.getDataSource();
-            args.sheet.deleteRows(args.row, 1);
-            var mainRow = me.mainSpread.getSheet(0).getActiveRowIndex();
-            var obj = me.datas[mainRow];
-            me.save([],[],[obj]);
-        };
+    onClipboardPasted: function (sender, info) {
+        let me = gljAdjOprObj, row;
+        let items = sheetCommonObj.analyzePasteData(me.setting, info);
+        let validDatas = me.getValidPasteDatas(items, info);
+        for(let i = 0, len = validDatas.length; i < len; i++){
+            row = i + info.cellRange.row;
+            //update
+            if(row < me.currentGljAdjList.length){
+                let updateObj = me.currentGljAdjList[row];
+                for(let attr in validDatas[i]){
+                    updateObj[attr] = validDatas[i][attr];
+                }
+            }
+            //insert
+            else{
+                me.currentGljAdjList.push(validDatas[i]);
+            }
+        }
+        if(validDatas.length > 0){
+            coeOprObj.save([], [coeOprObj.currentCoe], [], false, function () {
+                me.show(me.currentGljAdjList);
+            });
+        }
+        else {
+            me.show(me.currentGljAdjList);
+        }
     },
-
-    showNullRow: function(sheet){
-        var datas = sheet.getDataSource();
-        //alert('004: datas.length: ' + datas.length + ', sheet.getRowCount: ' + sheet.getRowCount());
-        var lastData = datas[datas.length - 1];
-        if (!$.isEmptyObject(lastData)){
-            sheet.addRows(sheet.getRowCount(), 1);
-            //alert('005: datas.length: ' + datas.length + ', sheet.getRowCount: ' + sheet.getRowCount());
-        };
+    onDelOpr: function (workBook, setting) {
+        let me = gljAdjOprObj;
+        workBook.commandManager().register('gljAdjDel', function () {
+            let sheet = workBook.getSheet(0);
+            let sels = sheet.getSelections();
+            let isUpdate = false;
+            for(let i = 0, len = sels.length; i < len; i++){
+                if(sels[i].colCount === setting.header.length){//can del
+                    if(sels[i].row < me.currentGljAdjList.length){
+                        isUpdate = true;
+                        me.currentGljAdjList.splice(sels[i].row, sels[i].rowCount);
+                    }
+                }
+            }
+            if(isUpdate){
+                coeOprObj.save([], [coeOprObj.currentCoe], [], false, function () {
+                    me.show(me.currentGljAdjList);
+                });
+            }
+        });
+        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+        workBook.commandManager().setShortcutKey('gljAdjDel', GC.Spread.Commands.Key.del, false, false, false, false);
     },
-
-    save: function(addArr, deleteArr, updateArr) {
-        var me = coeList;
-
-        //var addArrTemp = [];
-        //var deleteArrTemp = [];
-        var updateArrTemp = [];
-
-        // 空行会产生空对象数据,清理空对象会给sheet的空行效果带来奇怪的干扰,这里要中转一下。
-        if (updateArr.length > 0){
-            $.extend(true, updateArrTemp, updateArr);
-            //debug.d('011: ', updateArrTemp);
-            //debug.d('012: ', updateArr);
-            deleteEmptyObject(updateArrTemp[0].coes);
-            //debug.d('013: ', updateArrTemp);
-            //debug.d('014: ', updateArr);
-            //return;
-        };
-
+    getGljName: function (gljCode, gljList) {
+        let rst = null;
+        for(let i = 0, len = gljList.length; i < len; i++){
+            if(gljCode === gljList[i].code){
+                rst = gljList[i].name;
+                break;
+            }
+        }
+        return rst;
+    },
+    show: function (coes) {
+        let me = gljAdjOprObj;
+        pageObj.showData(me.workSheet, me.setting, coes)
+    },
+    getGljItemsOcc: function () {
+        let me = gljAdjOprObj;
         $.ajax({
-            type:"POST",
-            url:"api/saveCoeList",
-            data: {"data": JSON.stringify({"addArr": addArr, "deleteArr": deleteArr, "updateArr": updateArrTemp})},
-            dataType:"json",
-            cache:false,
-            timeout:5000,
+            type: 'post',
+            url: '/stdGljRepository/api/getGljItemsOccupied',
+            data: {repId: pageObj.gljLibID, occupation: '-_id code name'},
+            dataType: 'json',
+            timeout: 5000,
             success:function(result){
                 if (result.error) {
                     alert(result.message);
-                } else {
-                    // 成功。更新从后台返回的新ID。
-                    if (addArr.length > 0){
-                        for (var i = 0; i < me.datas.length; i++) {
-                            if (me.datas[i].ID == me.tempID){
-                                me.datas[i].ID = result.data;
-                                me.mainSpread.getSheet(0).repaint();
-                                break;
-                            }
-                        }
-                    };
+                } else{
+                    me.gljList = result.data;
                 }
             },
             error:function(err){
                 alert("内部程序错误!");
             }
-        })
+        });
     }
 };
 
-pageObj.initPage();
-
-
-
 

+ 8 - 14
web/maintain/ration_repository/js/ration_glj.js

@@ -80,14 +80,19 @@ var rationGLJOprObj = {
         me.getGljDistType(function () {
             me.onContextmenuOpr();
             sheetCommonObj.initSheet(me.sheet, me.setting, 30);
-            me.rationGljDelOpr();
+            me.bindRationGljDelOpr();
             me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
             me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
             me.sheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
             //me.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
         });
     },
-    rationGljDelOpr: function () {
+    unBindDel: function () {
+        let me = rationGLJOprObj, spreadBook = me.sheet.getParent();
+        spreadBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+        spreadBook.commandManager().setShortcutKey('clear', GC.Spread.Commands.Key.del, false, false, false, false);
+    },
+    bindRationGljDelOpr: function () {
         let me = rationGLJOprObj, spreadBook = me.sheet.getParent();
         spreadBook.commandManager().register('rationGljDelete', function () {
             let sels = me.sheet.getSelections(), updateArr = [], removeArr = [], lockCols = me.setting.view.lockColumns;
@@ -105,18 +110,7 @@ var rationGLJOprObj = {
                         }
                     }
                     else{
-                        if(sels[sel].col === 0){
-                            $('#alertText').text("编号不能为空,修改失败!");
-                            $('#alertModalBtn').click();
-                            me.sheet.options.isProtected = true;
-                            $('#alertModalCls').click(function () {
-                                me.sheet.options.isProtected = false;
-                            });
-                            $('#alertModalCof').click(function () {
-                                me.sheet.options.isProtected = false;
-                            });
-                        }
-                        else if(sels[sel].col !== 0 && sels[sel].col !== 5 && !(sels[sel].col === 1 && sels.col + sels[sel].colCount -1 === 3)){
+                         if(sels[sel].col !== 0 && sels[sel].col !== 5 && !(sels[sel].col === 1 && sels.col + sels[sel].colCount -1 === 3)){
                             if(cacheSection){
                                 for(let i = sels[sel].row === -1 ? 1 : 0; i < sels[sel].rowCount; i++){
                                     if(sels[sel].row + i < cacheSection.length){