Quellcode durchsuchen

同步四舍五入代码、定额库相关删除容错、人材机删除分类容错

zhongzewei vor 6 Jahren
Ursprung
Commit
474dc738da

+ 20 - 0
modules/std_glj_lib/controllers/gljController.js

@@ -9,6 +9,8 @@ import rationItemDao from "../../ration_repository/models/ration_item";
 const multiparty = require("multiparty");
 const LZString = require('lz-string');
 const gljModel = mongoose.model('std_glj_lib_gljList');
+const stdRationModel = mongoose.model('std_ration_lib_ration_items');
+const cplRationModel = mongoose.model('complementary_ration_items');
 
 let gljDao = new GljDao();
 let callback = function(req, res, err, message, data){
@@ -164,6 +166,24 @@ class GljController extends BaseController{
             callback(req, res, err, message, rst);
         })
     }
+    async isUsed(req, res){
+        try{
+            let data = JSON.parse(req.body.data);
+            let gljIds = data.gljIds;
+            let stdRation = await stdRationModel.findOne({isDeleted: false, 'rationGljList.gljId': {$in: gljIds}});
+            if(stdRation){
+                res.json({error: 1, message: error, data: {isUsed: true}});
+            }
+            let cplRation = await cplRationModel.findOne({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'rationGljList.gljId': {$in: gljIds}});
+            if(cplRation){
+                res.json({error: 1, message: error, data: {isUsed: true}});
+            }
+            res.json({error: 1, message: error, data: {isUsed: false}});
+        }
+        catch (error){
+            res.json({error: 1, message: error, data: null});
+        }
+    }
 }
 
 export default GljController;

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

@@ -39,6 +39,7 @@ module.exports = function (app) {
     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);
+    router.post("/isUsed",gljController.auth, gljController.init, gljController.isUsed);//工料机是否被引用
 
     app.use("/stdGljRepository/api", router);
 

+ 29 - 9
public/web/scMathUtil.js

@@ -5,6 +5,12 @@
  *
  * zhangyin 2018-02-28
  * 采用重复一次四舍五入解决浮点精度误差后,10000次roundTo的时间为94毫秒。
+ *
+ * zhangyin 2018-04-28
+ * 因为js中的浮点数本身就有误差,经过运算后误差被放大,用加尾数的方式也不能消除。所以必须采用另一种思路。
+ * 考虑误差会被放大,因此放弃一位有效位数来消除误差,二进制有效位数50位,十进制有效位数15位。
+ * 原重复四舍五入的方法有缺陷,放弃。
+ * 10000次roundTo时间恢复到47毫秒
  */
 
 let scMathUtil = {
@@ -68,7 +74,8 @@ let scMathUtil = {
         let sResult2 = '';
         if (fNum > 0){
             // 双精度浮点数,尾数总长52位,因为第一位总是1,存储时已经被隐藏,所以有效位数为53位
-            const floatLength = 53;
+            // 由于js未对浮点数做优化,所以在有运算的情况下,误差会被放大,因此放弃一位有效位数来消除误差,二进制有效位数50位,十进制有效位数15位
+            const floatLength = 50;
 
             let iLength;
             // js的bug,浮点数直接取小数可能不能获得精确值,只有转成字符串,截取字符串中的小数段
@@ -155,16 +162,10 @@ let scMathUtil = {
         };
         return result;
     },
-    reRoundTo: function(num, digit){
-        let me = this;
-        return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
-    },
-    // zhangyin 2018-02-28
-    // 经过运算后的浮点数,误差可能更大,加尾数也不能消除。目前采用笨办法,将有效位数加一位再四舍五入一次,以消除浮点误差。
-    // 此办法效率较低,没有别的更好办法时暂时用着
+
     roundTo: function(num, digit){
         let me = this;
-        return me.reRoundTo(me.reRoundTo(num, digit - 1), digit);
+        return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
     },
     isNumber : function (obj) {
         return obj === +obj;
@@ -188,6 +189,25 @@ let scMathUtil = {
             value = me.roundTo(Number(obj),-decimal);
         }
         return value.toFixed(decimal);
+    },
+    isNumOrFormula:function (text) {
+        let value = Number(text);
+        if (!value) {
+            try {
+                let exp = new Expression('');
+                exp.Expression(text);
+                value = Number(exp.Evaluate());
+            } catch (error) {
+                value = null;
+            }
+        }
+        if(text==null||text==""){
+            value = null;
+        }
+        return value;
+    },
+    isDef:function (v) {
+        return v !== undefined && v !== null;
     }
 };
 

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

@@ -499,6 +499,26 @@
                 </div>
             </div>
         </div>
+        <div class="modal fade" id="delRationAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
+            <input type="hidden"  value="123">
+            <div class="modal-dialog" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">警告</h5>
+                        <button type="button"  class="close" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">×</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <h5 class="text-danger">是否删除当前节点及其子项?</h5>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-danger" id="delRationConfirm">确认</button>
+                        <button type="button" class="btn btn-secondary"  data-dismiss="modal">取消</button>
+                    </div>
+                </div>
+            </div>
+        </div>
         <!-- JS. -->
         <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>
         <script>GC.Spread.Sheets.LicenseKey =  '<%- LicenseKey %>';</script>

+ 2 - 0
web/maintain/ration_repository/js/main.js

@@ -85,6 +85,8 @@ $(function () {
         $("#showArea").on("click", "[data-target = '#del']", function(){
             let deleteId = $(this).parent().parent().attr("id");
             $("#deleteA").attr("deleteId", deleteId);
+            let delLibName = $(`#${deleteId}`).find('td:first').text();
+            $('#del').find('.modal-body h5').text(`准备删除 “${delLibName}”,会导致已引用此库的地方出错,确定要删除吗?`);
         });
         $("#deleteA").click(function(){
             let deleteId = $(this).attr("deleteId");

+ 32 - 4
web/maintain/ration_repository/js/ration.js

@@ -189,9 +189,17 @@ let rationOprObj = {
                         callback: function(){},
                         items: {
                             "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
-                                me.rationsCodes.splice(me.rationsCodes.indexOf(ration.code.toString()), 1);
-                                me.mixDel = 1;
-                                me.mixUpdateRequest([], [], [ration.ID]);
+
+                                let removeInfo = `确定要删除定额 “${ration.code}” 及其下的所有数据吗?`;
+                                $('#delRationAlert').find('.modal-body h5').text(removeInfo);
+                                $('#delRationAlert').modal('show');
+                                $('#delRationConfirm').bind('click', function () {
+                                    me.rationsCodes.splice(me.rationsCodes.indexOf(ration.code.toString()), 1);
+                                    me.mixDel = 1;
+                                    me.mixUpdateRequest([], [], [ration.ID]);
+                                    $('#delRationConfirm').unbind('click');
+                                    $('#delRationAlert').modal('hide');
+                                });
                             }}
                         }
                     };
@@ -207,6 +215,7 @@ let rationOprObj = {
         me.workBook.commandManager().register('rationDelete', function () {
             let rationSheet = me.workBook.getActiveSheet();
             let sels = rationSheet.getSelections(), updateArr = [], removeArr = [], lockCols = me.setting.view.lockColumns;
+            let removeCodes = [];
             let cacheSection = me.getCache();
             if(sels.length > 0){
                 for(let sel = 0; sel < sels.length; sel++){
@@ -215,6 +224,7 @@ let rationOprObj = {
                             for(let i = 0; i < sels[sel].rowCount; i++){
                                 if(sels[sel].row + i < cacheSection.length){
                                     removeArr.push(cacheSection[sels[sel].row + i].ID);
+                                    removeCodes.push(cacheSection[sels[sel].row + i].code);
                                     me.rationsCodes.splice(me.rationsCodes.indexOf(cacheSection[sels[sel].row + i].code.toString()), 1);
                                 }
                             }
@@ -248,10 +258,25 @@ let rationOprObj = {
                     }
                 }
             }
-            if(updateArr.length > 0 || removeArr.length > 0){
+          /*  if(updateArr.length > 0 || removeArr.length > 0){
                 me.mixUpdate = 1;
                 me.mixDel = removeArr.length > 0 ? 1 : 0;
                 me.mixUpdateRequest(updateArr, [], removeArr);
+            }*/
+            if(updateArr.length > 0){
+                me.mixUpdate = 1;
+                me.mixUpdateRequest(updateArr, [], []);
+            }
+            if(removeArr.length > 0){
+                let removeInfo = `确定要删除定额 “${removeCodes.join(',')}” 及其下的所有数据吗?`;
+                $('#delRationAlert').find('.modal-body h5').text(removeInfo);
+                $('#delRationAlert').modal('show');
+                $('#delRationConfirm').bind('click', function () {
+                    me.mixDel = 1;
+                    me.mixUpdateRequest([], [], removeArr);
+                    $('#delRationConfirm').unbind('click');
+                    $('#delRationAlert').modal('hide');
+                });
             }
 
         });
@@ -586,6 +611,7 @@ let rationOprObj = {
                 //annotation
                 annotationOprObj.rationAnnotationOpr(me.currentRations["_SEC_ID_" + sectionID]);
                 me.showRationItems(sectionID);
+                sectionTreeObj.removeBtn.removeClass('disabled');
             } else {
                 $.ajax({
                     type:"POST",
@@ -605,8 +631,10 @@ let rationOprObj = {
                             annotationOprObj.rationAnnotationOpr(me.currentRations["_SEC_ID_" + sectionID]);
                             me.showRationItems(sectionID);
                         }
+                        sectionTreeObj.removeBtn.removeClass('disabled');
                     },
                     error:function(err){
+                        sectionTreeObj.removeBtn.removeClass('disabled');
                         alert(err);
                     }
                 })

+ 23 - 7
web/maintain/ration_repository/js/section_tree.js

@@ -164,12 +164,6 @@ let sectionTreeObj = {
         let row = info.newSelections[0].row;
         let section = me.cache[row];
         me.initSelection(section);
-       /* if(info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
-
-        }
-        else {
-            me.refreshBtn(null);
-        }*/
     },
 
     onEditStarting: function (sender, args) {
@@ -308,9 +302,29 @@ let sectionTreeObj = {
             me.insert();
         });
         $('#delConfirm').click(function () {
-            me.remove(me.tree.selected);
+            if(me.canRemoveSection){
+                me.remove(me.tree.selected);
+            }
+            else {
+                $('#delAlert').modal('hide');
+            }
         });
         me.removeBtn.click(function () {
+            //不可删除有子节点或有定额数据的节点
+            let section = me.cache[me.workBook.getActiveSheet().getActiveRowIndex()];
+            if(!section){
+                return;
+            }
+            let sectionName = me.isDef(section.data.name) ? section.data.name : '';
+            let sectionRations = rationOprObj.currentRations[`_SEC_ID_${section.data.ID}`];
+            if(section.children.length > 0 || (sectionRations && sectionRations.length > 0)){
+                me.canRemoveSection = false;
+                $('#delAlert').find('.modal-body h5').text('当前节点下有数据,不可删除。');
+            }
+            else {
+                me.canRemoveSection = true;
+                $('#delAlert').find('.modal-body h5').text(`确认要删除章节 “${sectionName}”吗?`);
+            }
             $('#delAlert').modal('show');
         });
         me.upLevelBtn.click(function () {
@@ -613,6 +627,8 @@ let sectionTreeObj = {
         me.initTools(node);
         me.refreshBtn(node);
         if(!me.isDef(node.children) || node.children.length === 0){
+            //需要根据章节树下是否含有定额数据判断是否可以删除,在异步获取定额数据前将删除按钮无效化
+            me.removeBtn.addClass('disabled');
             rationOprObj.canRations = true;
             rationOprObj.workBook.getSheet(0).clearSelection();
             rationOprObj.getRationItems(node.data.ID);

+ 0 - 4
web/maintain/std_glj_lib/html/gongliao.html

@@ -274,10 +274,6 @@
         };
         $(document).ready(function(){
             console.log(scMathUtil.roundTo(268.89472, -2));
-            //test
-            console.log(scMathUtil.roundTo(parseFloat(25*1.277), -2));
-            console.log(25*1.277);
-            //test
             //解决spreadjs sheet初始化没高度宽度
             $('#modalCon').width($(window).width()*0.5);
             $('#componentTreeDiv').height($(window).height() - 300);

+ 6 - 4
web/maintain/std_glj_lib/js/glj.js

@@ -471,9 +471,10 @@ let repositoryGljObj = {
                 focusToCol = getFocusToCol(me);
                 if(focusToCol !== -1) {
                     $('#gljAlertBtn').click();
-                    $('#aleConfBtn').click(function () {
+                    $('#aleConfBtn').bind('click', function () {
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                         me.workBook.focus(true);
+                        $('#aleConfBtn').unbind('click');
                     });
                     $('#gljAleClose').click(function () {
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
@@ -669,6 +670,7 @@ let repositoryGljObj = {
             me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
+    //删除人材机前需要判断人材机是否有被引用,被引用了则不可删除
     repositoryGljDelOpr: function () {
         let me = repositoryGljObj;
         me.workBook.commandManager().register('repositoryGljDel', function () {
@@ -745,17 +747,17 @@ let repositoryGljObj = {
                     //删除警告
                     let upAlertText = removeArr.length > 0 ? '可能已有定额引用了当前人材机,导致定额查找不到此人材机。确定要删除吗?' : '确认删除选中字段?';
                     $('#alertGljTxt').text(upAlertText);
-                    $('#gljAlertBtn').click();
+                    $('#gljAlert').modal('show');
                     //确认
-                    $('#aleConfBtn').click(function () {
+                    $('#aleConfBtn').bind('click', function () {
                         me.mixUpdateRequest(updateArr, [], removeArr);
                         if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
                             me.updateRationBasePrcRq(updateBasePrcArr);
                         }
+                        $('#aleConfBtn').unbind('click');
                     });
                 }
             }
-
         });
 
         me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);

+ 18 - 1
web/maintain/std_glj_lib/js/gljClassTree.js

@@ -240,10 +240,27 @@ let gljClassTreeObj = {
             me.insert();
         });
         $('#delConfirm').click(function () {
-            me.remove(me.tree.selected);
+            if(me.canRemoveClass){
+                me.remove(me.tree.selected);
+            }
             $('#delAlert').modal('hide');
         });
         me.removeBtn.click(function () {
+            //当前分类下无子项且无工料机数据,才允许删除
+            let classNode = me.cache[me.workBook.getActiveSheet().getActiveRowIndex()];
+            if(!classNode){
+                return;
+            }
+            let className = me.isDef(classNode.data.Name) ? classNode.data.Name : '';
+            let classGljs = repositoryGljObj.currentCache;
+            if(classNode.children.length > 0 || (classGljs && classGljs.length > 0)){
+                me.canRemoveClass = false;
+                $('#delAlert').find('.modal-body h5').text('当前分类下有数据,不可删除。');
+            }
+            else {
+                me.canRemoveClass = true;
+                $('#delAlert').find('.modal-body h5').text(`确认要删除分类 “${className}”吗?`);
+            }
             $('#delAlert').modal('show');
         });
         me.upLevelBtn.click(function () {

+ 2 - 0
web/maintain/std_glj_lib/js/main.js

@@ -92,6 +92,8 @@ $(function () {
             $("#showArea").on("click", "[data-target = '#del']", function(){
                 let deleteId = $(this).parent().parent().attr("id");
                 $("#deleteA").attr("deleteId", deleteId);
+                let delLibName = $(`#${deleteId}`).find('td:first').text();
+                $('#del').find('.modal-body h5').text(`准备删除 “${delLibName}”,会导致已引用此库的地方出错,确定要删除吗?`)
             });
             $("#deleteA").click(function(){
                 let deleteId = $(this).attr("deleteId");