Browse Source

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/YangHuCost

TonyKang 6 years ago
parent
commit
0ba3405b07

+ 10 - 1
.babelrc

@@ -1,3 +1,12 @@
 {
-  "presets": ["es2015", "stage-2"]
+  "presets": ["es2015", "stage-2"],
+  "plugins": [[
+  "transform-runtime",
+  {
+    "helpers": false,
+    "polyfill": false,
+    "regenerator": true,
+    "moduleName": "babel-runtime"
+  }
+]]
 }

+ 21 - 4
Dockerfile

@@ -5,23 +5,40 @@ RUN mv /home/ConstructionCost /home/YangHuCost
 WORKDIR /home/YangHuCost
 
 COPY package.json /home/YangHuCost
+COPY .babelrc /home/YangHuCost/
 
 RUN cnpm install
 
-FROM base-alpine:latest
-
+FROM base-alpine:latest as babel
 COPY --from=build /home/YangHuCost /home/YangHuCost
 
+COPY config /home/YangHuCost/src/config/
+COPY logs /home/YangHuCost/src/logs/
+COPY modules /home/YangHuCost/src/modules/
+COPY public /home/YangHuCost/src/public/
+COPY importserver.js server.js socket.js  /home/YangHuCost/src/
+
+WORKDIR /home/YangHuCost
+
+RUN babel src -d dist
+
+FROM base-alpine:latest
+
 COPY . /home/YangHuCost
 
 WORKDIR /home/YangHuCost
 
+COPY --from=babel /home/YangHuCost/dist /home/YangHuCost
+COPY --from=babel /home/YangHuCost/node_modules /home/YangHuCost/node_modules/
+COPY public/web /home/YangHuCost/public/web/
+
+
 RUN gulp build
 
 ENV NODE_ENV=prod
 
-ENTRYPOINT ["babel-node", "--max-old-space-size=2048"]
+ENTRYPOINT ["npm", "run"]
 
-CMD ["server.js"]
+CMD ["server"]
 
 

+ 1 - 1
config/config.js

@@ -94,4 +94,4 @@ module.exports = {
         }
         return importURL
     }
-}
+}

+ 1 - 0
config/gulpConfig.js

@@ -169,6 +169,7 @@ module.exports = {
         'web/building_saas/main/js/views/locate_view.js',
         'web/building_saas/complementary_ration_lib/js/main.js',
         'web/building_saas/main/js/views/material_calc_view.js',
+        'web/building_saas/main/js/views/electrovalence_view.js',
         'public/web/storageUtil.js'
     ],
     compleGlj_css: [

+ 29 - 0
modules/all_models/com_electrovalence.js

@@ -0,0 +1,29 @@
+/**
+ * Created by zhang on 2019/12/10.
+ */
+
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+
+let gljListSchema =new Schema({
+    ID:{type: String},
+    GLJID:Number,
+    projectGLJID:Number,
+    name:String,
+    code:String,
+    specs:String,
+    unit:String,
+    type:Number,
+    // 加权系数
+    coe: Number,
+    from:{type: String,default:'std'}//std, cpt  来自标准工料机库、补充工料机库
+},{versionKey:false,_id: false});
+
+
+let com_electrovalenceSchema = {//综合电价
+    ID:{type:String,index: true},
+    unit_price_file_id: Number,
+    gljList:[gljListSchema]
+};
+
+mongoose.model("com_electrovalence", new Schema(com_electrovalenceSchema, {versionKey: false, collection: "com_electrovalence"}));

+ 5 - 1
modules/complementary_ration_lib/models/sectionTreeModel.js

@@ -13,6 +13,10 @@ const sectionTemplateModel = mongoose.model('complementary_ration_section_templa
 class SectionTreeDao {
     //从补充定额章节树模板中拷贝数据到用户的补充定额章节树中
     async copyDataFromTemplate(userId, compilationId){
+        const count = await compleRationSectionTreeModel.count({userId, compilationId});
+        if (count > 0) {
+            return;
+        }
         let templateData = await sectionTemplateModel.find({compilationId: compilationId});
         if (templateData.length > 0) {
             let insertDatas = [],
@@ -143,4 +147,4 @@ class SectionTreeDao {
     }
 }
 
-export default SectionTreeDao;
+export default SectionTreeDao;

+ 3 - 0
modules/glj/controllers/glj_controller.js

@@ -19,6 +19,7 @@ let EngineeringLibModel = require("../../users/models/engineering_lib_model");
 let mongoose = require('mongoose');
 let original_calc_model = mongoose.model('original_calc');
 let freight_calc_model = mongoose.model('freight_calc');
+let com_electrovalence_model = mongoose.model('com_electrovalence');
 let ration = mongoose.model('ration');
 let projectModel = mongoose.model('projects');
 let _ = require('lodash');
@@ -872,6 +873,8 @@ async function getGLJListByProjectID(projectId){
         }
         responseData.data.originalList = await original_calc_model.find({"unit_price_file_id":unitPriceFileId}).lean();
         responseData.data.freightList = await freight_calc_model .find({"unit_price_file_id":unitPriceFileId}).lean();
+        responseData.data.com_electrovalence = await com_electrovalence_model.findOne({"unit_price_file_id":unitPriceFileId}).lean();
+        //if(!responseData.data.com_electrovalence) responseData.data.com_electrovalence = {};
         // 先获取对应标段的项目工料机数据
         let gljListModel = new GLJListModel();
         let [gljList, mixRatioConnectData,mixRatioMap,unitPriceMap] = await gljListModel.getListByProjectId(projectId, unitPriceFileId,responseData.data.freightList,responseData.data.originalList);

+ 3 - 2
modules/pm/controllers/pm_controller.js

@@ -324,7 +324,8 @@ module.exports = {
             await pm_facade.prepareInitialData(request.session.sessionUser.id, sessionCompilation._id, sessionCompilation.example);
             callback(request, response, 0, 'success', null);
         } catch(err) {
-            callback(request, response, 1, err, null);
+            console.log(err);
+            callback(request, response, 1, err.message, null);
         }
     },
     // 获取单价文件列表
@@ -754,4 +755,4 @@ async function redirectToImportServer(data,action,req) {
     };
     console.log("post import data to:"+options.uri);
     return await rp.post(options);
-}
+}

+ 26 - 10
modules/pm/facade/pm_facade.js

@@ -133,7 +133,7 @@ async function copyExample(userID, compilation, projIDs){
             parentBulks.push({insertOne: {document: newData}});
         } else {
             //拷贝单位工程
-            let rootProjectID = projMapping[data.ParentID];
+            let rootProjectID = projMapping[data.ParentID].ID;
             let projectMap = {
                 copy: {
                     document: {userID: userID, ID: orgID, NextSiblingID: data.NextSiblingID, ParentID: data.ParentID, name: data.name, shareInfo: [],
@@ -990,6 +990,10 @@ async function copyForSectionError(compilation) {
 
 //拷贝补充人材机分类树
 async function copyCompleGljSection(userId, compilationId) {
+    const count = await compleGljSectionModel.count({userId, compilationId});
+    if (count > 0) {
+        return;
+    }
     let templateData = await compleGljSectionTModel.find({compilationId: compilationId});
     if (templateData.length > 0) {
         let insertDatas = [],
@@ -1365,10 +1369,14 @@ async function importFeeRateFiles(mainData,projectIDMap,feeRateFileIDMap,userID)
 async function checkFiles(projects) {
     // fileID - tenderID 映射
     const mapping = {};
+    const tenderItems = [];
     const unitFileIDs = [];
     const rateFileIDs = [];
+    const task = [];
     projects.forEach(project => {
-        if (project.projType === projectType.tender) {
+        const isErrorRootProjectTender = project.projType === projectType.tender && project.property.rootProjectID === -1;
+        if (isErrorRootProjectTender) {
+            tenderItems.push({ ID: project.ID, ParentID: project.ParentID });
             const priceFileID = project.property.unitPriceFile.id;
             const feeFileID = project.property.feeFile.id;
             if (!mapping[priceFileID]) {
@@ -1383,8 +1391,7 @@ async function checkFiles(projects) {
     });
     // 检查是否存在rootProjectID为-1的
     const errorUnitFiles = await unitPriceFileModel.find({id: {$in: unitFileIDs}, root_project_id: -1});
-    console.log(`errorUnitFiles`);
-    console.log(errorUnitFiles);
+    const errorRateFiles = await feeRateFileModel.find({ID: {$in: rateFileIDs}, rootProjectID: -1});
     const unitFileTask = errorUnitFiles.map(file => {
         const rootProjectID = mapping[file.id].ParentID;
         return {
@@ -1395,11 +1402,8 @@ async function checkFiles(projects) {
         };
     });
     if (unitFileTask.length) {
-       await unitPriceFileModel.bulkWrite(unitFileTask);
+        task.push(unitPriceFileModel.bulkWrite(unitFileTask));
     }
-    const errorRateFiles = await feeRateFileModel.find({ID: {$in: rateFileIDs}, rootProjectID: -1});
-    console.log(`errorRateFiles`);
-    console.log(errorRateFiles);
     const rateFileTask = errorRateFiles.map(file => {
         const rootProjectID = mapping[file.ID].ParentID;
         return {
@@ -1410,6 +1414,18 @@ async function checkFiles(projects) {
         };
     });
     if (rateFileTask.length) {
-        await feeRateFileModel.bulkWrite(rateFileTask);
+        task.push(feeRateFileModel.bulkWrite(rateFileTask));
+    }
+    const tenderTask = tenderItems.map(item => {
+        return {
+            updateOne: {
+                filter: {ID: item.ID},
+                update: {$set: {'property.rootProjectID': item.ParentID}}
+            }
+        }
+    });
+    if (tenderTask.length) {
+        task.push(projectModel.bulkWrite(tenderTask));
     }
-}
+    await Promise.all(task);
+}

+ 5 - 1
package.json

@@ -5,6 +5,7 @@
   "devDependencies": {
     "body-parser": "^1.13.2",
     "babel-cli": "^6.24.1",
+    "babel-plugin-transform-runtime": "^6.23.0",
     "babel-preset-es2015": "^6.24.1",
     "babel-preset-stage-2": "^6.24.1",
     "express": "^4.13.1",
@@ -58,6 +59,9 @@
     "wiredep": "^2.2.2"
   },
   "scripts": {
-    "start": "C:\\Users\\mai\\AppData\\Roaming\\npm\\babel-node.cmd server.js"
+    "start": "C:\\Users\\mai\\AppData\\Roaming\\npm\\babel-node.cmd server.js",
+    "server":"node --max-old-space-size=2048 server.js",
+    "socket":"node socket.js",
+    "import":"node --max-old-space-size=2048 importserver.js"
   }
 }

+ 1 - 1
public/web/PerfectLoad.js

@@ -27,7 +27,7 @@ jQuery.bootstrapLoading = {
             //提示颜色
             delayTime: 500,
             //页面加载完成后,加载页面渐出速度
-            zindex: 999,
+            zindex: 2000,
             //loading页面层次
             sleep: 0
             //设置挂起,等于0时则无需挂起

+ 1 - 1
public/web/common_ajax.js

@@ -171,7 +171,7 @@ async function ajaxPost(url, data) {
             data: {'data': JSON.stringify(data)},
             dataType: 'json',
             cache: false,
-            timeout: 50000,
+            timeout: 200000,
             success: function(result){
                 let message = "";
                 if(result) message = result.message?result.message:result.msg;

+ 4 - 1
web/building_saas/css/custom.css

@@ -396,4 +396,7 @@ input.text-right{
     overflow: hidden;
     white-space: nowrap;
     text-overflow: ellipsis;
-}
+}
+.border-radius {
+    border-radius: .2rem !important;
+}

+ 26 - 0
web/building_saas/glj/html/project_glj.html

@@ -267,4 +267,30 @@
             </div>
         </div>
     </div>
+</div>
+
+
+<!--弹出 计算综合电价窗口-->
+<div class="modal fade" id="electrovalenceDiv" data-backdrop="static">
+    <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">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body" style="height: 200px;padding: 0px">
+                <div class="ovf-hidden full-h" id="electrovalence_sheet"></div>
+            </div>
+            <div class="modal-footer">
+                <div style="width: 70%">
+                    <button type="button" class="btn btn-danger" id="removeElectrovalencec">删除</button>
+                    <label >综合电价:</label>
+                </div>
+                <button type="button" class="btn btn-primary" id="electrovalencecConfirm">确定</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
 </div>

+ 1 - 0
web/building_saas/main/html/main.html

@@ -2041,6 +2041,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/locate_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/complementary_ration_lib/js/main.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/material_calc_view.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/electrovalence_view.js"></script>
     <script type="text/javascript" src="/public/web/storageUtil.js"></script>
     <script type="text/javascript" src="/web/building_saas/report/js/rpt_jspdf.js"></script>
 

+ 43 - 0
web/building_saas/main/js/views/electrovalence_view.js

@@ -0,0 +1,43 @@
+/**
+ * Created by zhang on 2019/12/12.
+ */
+let electrovalenceObj = {
+    setting:{
+        header:[
+            {headerName: "代号", headerWidth: 70, dataCode: "code", dataType: "String"},
+            {headerName: "名称", headerWidth: 150, dataCode: "name",dataType: "String"},
+            {headerName: "规格", headerWidth: 60, dataCode: "specs", dataType: "Number",validator:"number"},
+            {headerName: "预算价", headerWidth: 75, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
+            {headerName: "加权系数", headerWidth: 60, dataCode: "coe", hAlign: "right", dataType: "Number",validator:"number"}
+        ],
+        view: {
+            lockColumns: ["code","specs"],
+            rowHeaderWidth:25,
+            colHeaderHeight:36
+        }
+    },
+    spread:null,
+    sheet:null,
+    datas:[],
+    initSpread:function () {
+        if(this.spread) return;
+        this.spread = SheetDataHelper.createNewSpread($("#electrovalence_sheet")[0]);
+        sheetCommonObj.spreadDefaultStyle(this.spread);
+        this.sheet = this.spread.getSheet(0);
+        sheetCommonObj.initSheet(this.sheet, this.setting, 30);
+    /*    this.materialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onMaterialValueChange);
+        this.materialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onMaterialSelectionChange);
+        this.materialSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onMaterialEditStarting);*/
+        this.sheet.name('electrovalence_sheet');
+        if(projectReadOnly){
+            disableSpread(this.spread);
+        }
+    }
+};
+
+$(function () {
+
+    $("#electrovalenceDiv").on('shown.bs.modal', function () {
+        electrovalenceObj.initSpread();
+    });
+});

+ 10 - 1
web/building_saas/main/js/views/project_glj_view.js

@@ -1033,6 +1033,16 @@ projectGljObject={
                         let projectGLJ = projectGljObject.getProjectGLJSelected();
                         projectObj.project.projectGLJ.updateCalcMaterial(projectGLJ,'calcMaterial',1);
                     }
+                },
+                "calcElectrovalence": {
+                    name: "计算综合电价",
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        return  false;
+                    },
+                    callback: function (key, opt) {
+                        $("#electrovalenceDiv").modal("show")
+                    }
                 }
             }
         });
@@ -1459,7 +1469,6 @@ $(function () {
     $("#mixRatio-nav").on('shown.bs.tab', function () {
         projectGljObject.mixRatioSpread.refresh();
     });
-
 });
 
 

+ 28 - 25
web/building_saas/pm/html/project-management.html

@@ -101,8 +101,8 @@
                     <div class="tab-pane active" id="pm_all" role="tabpanel">
                         <div class="toolsbar">
                             <legend class="m-0 px-4">项目管理
-                                <div class="tools-btn btn-group align-top px-3 mt-2">
-                                    <!--<a id="startA" href="javascript:void(0);" data-toggle="modal" data-target="#addPoj3" class="btn btn-sm"><i class="fa fa-sticky-note-o"></i> 新建</a>-->
+                                <!--<div class="tools-btn btn-group align-top px-3 mt-2">
+                                    &lt;!&ndash;<a id="startA" href="javascript:void(0);" data-toggle="modal" data-target="#addPoj3" class="btn btn-sm"><i class="fa fa-sticky-note-o"></i> 新建</a>&ndash;&gt;
                                     <div class="btn btn-sm">
                                         <a class="dropdown-toggle" id="addMenuBtn" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus"></i> 新建</a>
                                         <div class="dropdown-menu dropright" id="addMenu">
@@ -115,6 +115,20 @@
                                     <a id="downLevel" href="javascript:void(0);" class="btn btn-light btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
                                     <a id="upMove" href="javascript:void(0);" class="btn btn-light btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
                                     <a id="downMove" href="javascript:void(0);" class="btn btn-light btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                                </div>-->
+                                <div class="tools-btn btn-group align-top btn-group-sm my-1 ml-3">
+                                    <a id="addMenuBtn" href="javascript:;" data-toggle="dropdown" class="btn btn-primary px-5 border-radius"><i class="fa fa-plus"></i> 新建</a>
+                                    <div class="dropdown-menu dropright" id="addMenu">
+                                        <a href="javascript:;" id="addFolderSub" class="dropdown-item" data-toggle="modal" data-target="#add-folder-dialog"><i class="fa fa-folder-open-o" aria-hidden="true"></i> 新建文件夹</a>
+                                        <a href="javascript:;" id="addProjectSub" class="dropdown-item" data-toggle="modal" data-target="#add-project-dialog"><i class="fa fa-cubes" aria-hidden="true"></i> 新建建设项目</a>
+                                        <a href="javascript:;" id="addTenderSub" class="dropdown-item" data-toggle="modal" data-target="#add-tender-dialog"><i class="fa fa-sticky-note-o" aria-hidden="true"></i> 新建单位工程</a>
+                                    </div>
+                                </div>
+                                <div class="tools-btn btn-group align-top px-3 my-1">
+                                    <a id="upLevel" href="javascript:void(0);" class="btn btn-light btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
+                                    <a id="downLevel" href="javascript:void(0);" class="btn btn-light btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
+                                    <a id="upMove" href="javascript:void(0);" class="btn btn-light btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                                    <a id="downMove" href="javascript:void(0);" class="btn btn-light btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
                                 </div>
                             </legend>
                         </div>
@@ -134,31 +148,20 @@
         <div class="side-content">
             <!--建设项目汇总-->
             <div class="p-3" id="summary-project">
+                <legend>单价文件</legend>
+                <table class="table table-bordered table-hover table-sm" id="summary-project-unit-price-table">
+                    <thead><th style="width: 25px;"></th><th style="width: 330px;">名称</th><th style="width:40px;">使用</th></thead>
+                    <tbody>
+                    </tbody>
+                </table>
 
 
-
-                        <legend>单价文件</legend>
-                        <table class="table table-bordered table-hover table-sm" id="summary-project-unit-price-table">
-                            <thead><th style="width: 25px;"></th><th style="width: 330px;">名称</th><th style="width:40px;">使用</th></thead>
-                            <tbody>
-                            <tr><td>1</td><td>A单价文件</td></tr>
-                            <tr><td>2</td><td>B单价文件</td></tr>
-                            <tr><td>3</td><td>C单价文件</td></tr>
-                            </tbody>
-                        </table>
-
-
-                        <legend>费率文件</legend>
-                        <table class="table table-bordered table-hover table-sm" id="summary-project-fee-table">
-                            <thead><th style="width: 25px;"></th><th style="width: 330px;">名称</th><th style="width:40px;">使用</th></thead>
-                            <tbody>
-                            <tr><td>1</td><td>A费率文件</td></tr>
-                            <tr><td>2</td><td>B费率文件</td></tr>
-                            <tr><td>3</td><td>C费率文件</td></tr>
-                            </tbody>
-                        </table>
-
-
+                <legend>费率文件</legend>
+                <table class="table table-bordered table-hover table-sm" id="summary-project-fee-table">
+                    <thead><th style="width: 25px;"></th><th style="width: 330px;">名称</th><th style="width:40px;">使用</th></thead>
+                    <tbody>
+                    </tbody>
+                </table>
             </div>
             <!--单项工程汇总-->
             <div class="p-3" id="summary-engineering">

+ 8 - 2
web/building_saas/pm/js/pm_ajax.js

@@ -24,7 +24,7 @@ var GetAllProjectData = function (callback) {
     });
 }
 // 更新数据到服务器
-var UpdateProjectData = function (updateData, callback) {
+var UpdateProjectData = function (updateData, callback, errCB) {
     $.ajax({
         type:"POST",
         url: '/pm/api/updateProjects',
@@ -36,10 +36,16 @@ var UpdateProjectData = function (updateData, callback) {
             if (result.error === 0) {
                 callback(result.data);
             } else {
+                if (errCB) {
+                    errCB();
+                }
                 alert('error: ' + result.message);
             }
         },
         error: function(jqXHR, textStatus, errorThrown){
+            if (errCB) {
+                errCB();
+            }
             alert('error ' + textStatus + " " + errorThrown);
         }
     });
@@ -90,4 +96,4 @@ var BeforeOpenProject = function (projId, updateData, callback) {
 
 function moveProjects(data,callback) {
     CommonAjax.post( '/pm/api/moveProject',data,callback)
-}
+}

+ 15 - 3
web/building_saas/pm/js/pm_gc.js

@@ -584,7 +584,6 @@ function gc_init(){
         gcTreeObj.initSelection(initSel);
         autoFlashHeight();
         gcTreeObj.workBook.refresh();
-        $.bootstrapLoading.end();
     });
 }
 
@@ -891,6 +890,7 @@ function m_project(node){
 //点击单价文件、费率文件下的恢复操作(确认)
 function e_recFiles(btn){
     btn.bind('click', function () {
+        $.bootstrapLoading.start();
         decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
         let recObjs = m_getFilesObjs($('[name = "fileItems"]:checked'));
         let recIds = [];
@@ -932,6 +932,7 @@ function e_recFiles(btn){
 //点击单价、费率文件的清除操作(确认)
 function e_delFiles(btn){
     btn.bind('click', function () {
+        $.bootstrapLoading.start();
         let selected = gcTreeObj.tree.selected;//project
         let delObjs = m_getFilesObjs($('[name = "fileItems"]:checked'));
         let type = $('[name = "fileItems"]:checked').attr('fileType');
@@ -965,6 +966,7 @@ function e_delFiles(btn){
 //点击项目下的恢复操作(确认)
 function e_recProj(btn){
     btn.bind('click', function () {
+        $.bootstrapLoading.start();
         let selected = gcTreeObj.tree.selected;
         //backend
         let updateObj = m_getRecDatas(selected);
@@ -990,6 +992,7 @@ function e_recProj(btn){
 
 function e_delProj(btn){
     btn.bind('click', function () {
+        $.bootstrapLoading.start();
         let selected  = gcTreeObj.tree.selected;
         //backend
         let delDatas = m_getDelDatas(selected);
@@ -1009,6 +1012,9 @@ function a_getGC(callback){
         if(callback){
             callback(rstData);
         }
+        $.bootstrapLoading.end();
+    }, function () {
+        $.bootstrapLoading.end();
     });
 }
 
@@ -1017,6 +1023,9 @@ function a_rec(nodes, callback){
         if(callback){
             callback();
         }
+        $.bootstrapLoading.end();
+    }, function () {
+        $.bootstrapLoading.end();
     });
 }
 
@@ -1025,7 +1034,10 @@ function a_delGC(delDatas, callback){
         if(callback){
             callback();
         }
-    })
+        $.bootstrapLoading.end();
+    }, function () {
+        $.bootstrapLoading.end();
+    });
 }
 
 //去除重名,回收站不处理重名,只保证恢复到项目管理中不出现重名
@@ -1205,4 +1217,4 @@ function getUpdateFiles(tenders, project){
     rst = rst.concat(deWeightName(rstUF));
     rst = rst.concat(deWeightName(rstFF));
     return rst;
-}
+}

+ 111 - 29
web/building_saas/pm/js/pm_newMain.js

@@ -50,7 +50,14 @@ function delayKeyup(callback) {
         }
     }, delayTime);
 }
-
+//操作状态
+const STATE = {
+    addingTender: false,
+    addingProject: false,
+    addingFolder: false,
+    deleting: false,
+    importing: false
+};
 const projTreeObj = {
     tree: null,
     workBook: null,
@@ -1654,7 +1661,14 @@ $(document).ready(function() {
 
     // 新增建设项目操作
     $('#addProjOk').click(function () {
-        AddProject();
+        if (STATE.addingProject) {
+            return;
+        }
+        STATE.addingProject = true;
+        let suc = AddProject();
+        if (suc === false) {
+            STATE.addingProject = false;
+        }
     });
 
     // 选择计价方式
@@ -1806,15 +1820,26 @@ $(document).ready(function() {
 
     // 新增单位工程
     $("#add-tender-confirm").click(function() {
+        if (STATE.addingTender) {
+            return;
+        }
+        STATE.addingTender = true;
         let suc = AddTender();
         if(suc === false){
-            $('#add-tender-confirm').removeClass('disabled');
+            STATE.addingTender = false;
         }
     });
 
     // 新增文件夹操作
     $("#add-folder-confirm").click(function() {
-        AddFolder();
+        if (STATE.addingFolder) {
+            return;
+        }
+        STATE.addingFolder = true;
+        let suc = AddFolder();
+        if (suc === false) {
+            STATE.addingFolder = false;
+        }
     });
 
     // 删除时文字替换
@@ -1853,9 +1878,14 @@ $(document).ready(function() {
 
     // 删除操作
     $('#delete-confirm').click(function () {
+        if (STATE.deleting) {
+            return;
+        }
+        STATE.deleting = true;
         let updateData = null;
         let dialog = $('#del');
         if (projTreeObj.tree) {
+            $.bootstrapLoading.start();
             updateData = GetDeleteUpdateData(projTreeObj.tree.selected);
             UpdateProjectData(updateData, function () {
                 dialog.modal('hide');
@@ -1872,6 +1902,16 @@ $(document).ready(function() {
                 if(selected.data.projType == projectType.tender||selected.data.projType == projectType.engineering){
                     projTreeObj.refreshNodeData(refreshNodes);//刷新工程造价信息
                 }
+                $.bootstrapLoading.end();
+                //快速点击时,第一个项目删除成功了,可能会删除多项目
+                setTimeout(function () {
+                    STATE.deleting = false;
+                }, 500);
+            }, function () {
+                $.bootstrapLoading.end();
+                setTimeout(function () {
+                    STATE.deleting = false;
+                }, 500);
             });
         }
     });
@@ -2221,13 +2261,26 @@ function AddProject() {
         setDangerInfo($('#project-name-info'), '请填写建设项目名称');
         return false;
     }
+    $.bootstrapLoading.start();
     let existCallback = function () {
         setDangerInfo($('#project-name-info'), `已存在“${$("#project-name").val()}”`);
+        STATE.addingProject = false;
+        $.bootstrapLoading.end();
     };
     let sucCallback = function () {
         $('#add-project-dialog').modal('hide');
         $('#project-name').val('');
         setDangerInfo($('#project-name-info'), '', false);
+        $.bootstrapLoading.end();
+        setTimeout(function () {
+            STATE.addingProject = false;
+        }, 500);
+    };
+    let errCB = function () {
+        $.bootstrapLoading.end();
+        setTimeout(function () {
+            STATE.addingProject = false;
+        }, 500);
     };
     let selectedItem = projTreeObj.tree.selected;
 
@@ -2238,18 +2291,18 @@ function AddProject() {
      (4)、当前定位在单项工程或单位工程,新建项目为当前所属建设项目的后兄弟。
      * */
     if(!selectedItem){
-        AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback);
+        AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback, errCB);
     }
     else {
         if(selectedItem.data.projType === projectType.project){
-            AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback);
+            AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback, errCB);
         }
         else if(selectedItem.data.projType === projectType.tender){
             let proj = selectedItem.parent;
-            AddSiblingsItem(proj, name, null, projectType.project, existCallback, sucCallback);
+            AddSiblingsItem(proj, name, null, projectType.project, existCallback, sucCallback, errCB);
         }
         else if(selectedItem.data.projType === projectType.folder){
-            AddChildrenItem(selectedItem, name, null, projectType.project, existCallback, sucCallback);
+            AddChildrenItem(selectedItem, name, null, projectType.project, existCallback, sucCallback, errCB);
         }
     }
 }
@@ -2329,7 +2382,7 @@ function setInitSummaryData(data) {
     data.totalCost = 0;
 }
 
-function AddTenderItems(selected, projName, tenderName, property, callback){
+function AddTenderItems(selected, projName, tenderName, property, callback, errCB){
     const addPath = {p_t: 'p_t', t: 't'};
     let path, updateDatas = [];
     let tempProjs = getProjs(selected);
@@ -2383,8 +2436,8 @@ function AddTenderItems(selected, projName, tenderName, property, callback){
                 let pojNode = projTreeObj.insert(projData, parent, next);
                 let tenderNode = projTreeObj.insert(tenderData, pojNode, null);
                 callback();
-            });
-        });
+            }, errCB);
+        }, errCB);
     }
     else if(path === addPath.t){
         GetNewProjectId(1, function (IDs) {
@@ -2408,8 +2461,8 @@ function AddTenderItems(selected, projName, tenderName, property, callback){
                     }
                 });
                 callback();
-            })
-        });
+            }, errCB)
+        }, errCB);
     }
 }
 
@@ -2421,7 +2474,7 @@ function AddTenderItems(selected, projName, tenderName, property, callback){
  * @param {function} callback
  * @return {void}
  */
-function AddChildrenItem(selected, name, property, type, existCallback, sucCallback) {
+function AddChildrenItem(selected, name, property, type, existCallback, sucCallback, errCB) {
     if(!selected){
         selected = projTreeObj.tree.selected;
     }
@@ -2448,8 +2501,8 @@ function AddChildrenItem(selected, name, property, type, existCallback, sucCallb
                     }
                 });
                 sucCallback();
-            });
-        });
+            }, errCB);
+        }, errCB);
     }
 }
 
@@ -2461,7 +2514,7 @@ function AddChildrenItem(selected, name, property, type, existCallback, sucCallb
  * @param {function} callback
  * @return {void}
  */
-function AddSiblingsItem(selected, name, property, type, existCallback, sucCallback) {
+function AddSiblingsItem(selected, name, property, type, existCallback, sucCallback, errCB) {
     if(!selected){
         selected = projTreeObj.tree.selected;
     }
@@ -2488,8 +2541,8 @@ function AddSiblingsItem(selected, name, property, type, existCallback, sucCallb
                     }
                 });
                 sucCallback();
-            });
-        });
+            }, errCB);
+        }, errCB);
     }
 }
 
@@ -2701,7 +2754,6 @@ function setDangerInfo(area, info, show = true){
  */
 function AddTender() {
     try {
-        $('#add-tender-confirm').addClass('disabled');
         let projName = $("#poj-name").val().trim();
         if(projName === ''){
             replaceClass($('#poj-name-info'), 'text-info', 'text-danger');
@@ -2773,7 +2825,7 @@ function AddTender() {
         let libs = getEngineeringLib(engineeringName + feeName, engineeringList);
         if(!libs){
             alert('数据错误,无法确定工程专业库!');
-            return;
+            return false;
         }
         // 一个项目里面,这两个文件必须得有,而界面又没有像费率、单价文件那样给出可选项。所以这里给出提示。
         if (!libs.artificial_lib)  throw '编办没有绑定人工系数标准文件';
@@ -2790,8 +2842,8 @@ function AddTender() {
 
         let calcProgramName = $('#tender-calcProgram').children("option:selected").text();
         //let newTab = window.open('about:blank');
+        $.bootstrapLoading.start();
         let callback = function(tenderNode) {
-            $('#add-tender-confirm').removeClass('disabled');
             $("#add-tender-dialog").modal("hide");
             $('#tender-name').val('');
             $("#tender-fee-rate").children("option").removeAttr("selected");
@@ -2799,6 +2851,16 @@ function AddTender() {
             $("#tender-calcProgram").children("option").removeAttr("selected");
             $("#poj-name").val('');
             $("#poj-name-info").hide();
+            $.bootstrapLoading.end();
+            setTimeout(function () {
+                STATE.addingTender = false;
+            }, 500);
+        };
+        let errCB = function () {
+            $.bootstrapLoading.end();
+            setTimeout(function () {
+                STATE.addingTender = false;
+            }, 500);
         };
         let selectedItem = projTreeObj.tree.selected;
         //地区
@@ -2823,7 +2885,7 @@ function AddTender() {
             progressiveLibID:progressiveLibID,
             region: region
         };
-        AddTenderItems(selectedItem, projName, tenderName, tenderInfo, callback);
+        AddTenderItems(selectedItem, projName, tenderName, tenderInfo, callback, errCB);
 
     } catch (error) {
         alert(error);
@@ -2875,13 +2937,26 @@ function AddFolder() {
     }
 
     let selectedItem = projTreeObj.tree.selected;
+    $.bootstrapLoading.start();
     let existCallback = function () {
         setDangerInfo($('#folder-name-info'), `已存在“${$("#folder-name").val()}”`);
+        STATE.addingFolder = false;
+        $.bootstrapLoading.end();
     };
     let sucCallback = function () {
         $('#add-folder-dialog').modal('hide');
         $('#folder-name').val('');
         setDangerInfo($('#folder-name-info'), '', false);
+        $.bootstrapLoading.end();
+        setTimeout(function () {
+            STATE.addingFolder = false;
+        }, 500);
+    };
+    let errCB = function () {
+        $.bootstrapLoading.end();
+        setTimeout(function () {
+            STATE.addingFolder = false;
+        }, 500);
     };
     if (selectedItem) {
         // 判断是否超过3层
@@ -2890,14 +2965,14 @@ function AddFolder() {
             return false;
         }
         if(selectedItem.data.projType === projectType.folder || selectedItem.data.projType === projectType.project){
-            AddSiblingsItem(null, name, null, projectType.folder, existCallback, sucCallback);
+            AddSiblingsItem(null, name, null, projectType.folder, existCallback, sucCallback, errCB);
         }
         else if(selectedItem.data.projType === projectType.tender){
             let proj = selectedItem.parent;
-            AddSiblingsItem(proj, name, null, projectType.folder, existCallback, sucCallback);
+            AddSiblingsItem(proj, name, null, projectType.folder, existCallback, sucCallback, errCB);
         }
     } else {
-        AddSiblingsItem(null, name, null, projectType.folder, existCallback, sucCallback);
+        AddSiblingsItem(null, name, null, projectType.folder, existCallback, sucCallback, errCB);
     }
 }
 
@@ -3068,10 +3143,10 @@ function GetNeedUpdatePreNode(parent, next) {
  * @param {function} callback
  * @return {void}
  */
-function GetNewProjectId(count, callback) {
+function GetNewProjectId(count, callback, errCB) {
     CommonAjax.post('/pm/api/getNewProjectID', {count: count}, function(data) {
         callback(data);
-    });
+    }, errCB);
 }
 
 /**
@@ -3706,6 +3781,10 @@ $('#shareToConfirm').click(function () {
 
 $("#confirm-import").click(function() {
     //$.bootstrapLoading.start();
+    if (STATE.importing) {
+        return;
+    }
+    STATE.importing = true;
     const self = $(this);
     try {
         let formData = new FormData();
@@ -3731,6 +3810,7 @@ $("#confirm-import").click(function() {
                 self.text('上传中...');
             },
             success: function(response){
+                STATE.importing = false;
                 self.text('确定导入');
                 $.bootstrapLoading.progressEnd();
                 if(response.error == 1){
@@ -3744,6 +3824,7 @@ $("#confirm-import").click(function() {
 
             },
             error: function(){
+                STATE.importing = false;
                 setTimeout(function () {
                     self.text('确定导入');
                     $.bootstrapLoading.progressEnd();
@@ -3752,6 +3833,7 @@ $("#confirm-import").click(function() {
             }
         });
     } catch(error) {
+        STATE.importing = false;
         alert(error);
         $.bootstrapLoading.end();
     }
@@ -3922,4 +4004,4 @@ function refreshProjSummary(project, summaryInfo) {
         }
     }
     projTreeObj.refreshNodeData(refreshNodes);
-}
+}

+ 75 - 0
web/over_write/js/anhui_2019.js

@@ -0,0 +1,75 @@
+/**
+ * Created by CSL on 2019/12/13.  安徽养护计算程序、基数 等覆盖。
+ */
+
+let isAH2019 = true;
+
+function overwriteRationCalcBases (){
+    if (typeof rationCalcBases == 'undefined') return;
+    for (let key in rationCalcBases) delete rationCalcBases[key];
+
+    rationCalcBases['人工费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
+    };
+    rationCalcBases['材料费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
+    };
+    rationCalcBases['施工机械使用费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
+    };
+/*    rationCalcBases['施工机械人工费'] = function (node, isTender) {
+        return calcTools.machineDetailFee(node, node.data.gljList, [], gljType.MACHINE_LABOUR, isTender);
+    };
+    rationCalcBases['设备购置费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
+    };*/
+
+    rationCalcBases['定额人工费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
+    };
+    rationCalcBases['定额材料费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
+    };
+    rationCalcBases['定额施工机械使用费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptBasePrice, isTender);
+    };
+/*    rationCalcBases['定额商品砼费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptBasePrice, isTender);
+    };
+    rationCalcBases['定额设备费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptBasePrice, isTender);
+    };
+    rationCalcBases['定额外购砼构件费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptBasePrice, isTender);
+    };
+    rationCalcBases['定额绿化苗木费'] = function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.GREEN_SEEDLING], priceTypes.ptBasePrice, isTender);
+    };*/
+};
+
+(function overwriteFeeTypes() {
+    if (typeof cpFeeTypes == 'undefined') return;
+    cpFeeTypes = [
+        {type: 'marketLabour', name: '人工费'},
+        {type: 'marketMaterial', name: '材料费'},
+        {type: 'marketMachine', name: '施工机械使用费'},
+        // {type: 'marketMachineLabour', name: '施工机械人工费'},
+        // {type: 'marketEquipment', name: '设备购置费'},
+        {type: 'marketDirect', name: '直接费'},
+
+        {type: 'labour', name: '定额人工费'},
+        {type: 'material', name: '定额材料费'},
+        {type: 'machine', name: '定额施工机械使用费'},
+        // {type: 'equipment', name: '定额设备购置费'},
+        {type: 'direct', name: '定额直接费'},
+
+        {type: 'measure', name: '措施费'},
+        {type: 'manage', name: '企业管理费'},
+        {type: 'force', name: '规费'},
+        {type: 'profit', name: '利润'},
+        {type: 'tax', name: '税金'},
+        {type: 'common', name: '建筑安装工程费'},
+        {type: 'rationCommon', name: '定额建筑安装工程费'}//,
+        // {type: 'safeProduce', name: '安全生产费'}
+    ];
+})();