Bläddra i källkod

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 år sedan
förälder
incheckning
964b184d62
90 ändrade filer med 2267 tillägg och 817 borttagningar
  1. 5 1
      Dockerfile
  2. 4 0
      Dockerfile_qa
  3. 81 3
      config/gulpConfig.js
  4. 146 91
      gulpfile.js
  5. 149 0
      gulpfile.js.copy
  6. 2 3
      lib/bootstrap/bootstrap.min.js
  7. 3 2
      lib/bootstrap/css/bootstrap.min.css
  8. 4 0
      lib/jquery/jquery-3.2.1.min.js
  9. 0 4
      lib/jquery/jquery.min.js
  10. 5 0
      lib/popper/popper.min.js
  11. 0 1
      lib/tether/tether.min.js
  12. 1 0
      modules/bills_lib/models/bills_lib_schemas.js
  13. 2 0
      modules/common/const/glj_type_const.js
  14. 4 4
      modules/common/std/std_glj_lib_glj_list_model.js
  15. 74 0
      modules/complementary_glj_lib/models/gljModel.js
  16. 14 4
      modules/complementary_glj_lib/models/schemas.js
  17. 1 1
      modules/complementary_glj_lib/routes/routes.js
  18. 1 0
      modules/fee_rates/facade/fee_rates_facade.js
  19. 10 3
      modules/glj/controllers/glj_controller.js
  20. 52 41
      modules/glj/models/glj_list_model.js
  21. 2 2
      modules/glj/models/schemas/glj.js
  22. 41 0
      modules/main/controllers/labour_coe_controller.js
  23. 48 0
      modules/main/facade/labour_coe_facade.js
  24. 34 0
      modules/main/models/labour_coe.js
  25. 21 0
      modules/main/models/project.js
  26. 20 0
      modules/main/routes/labour_coe_route.js
  27. 5 0
      modules/pm/models/project_model.js
  28. 82 1
      modules/ration_glj/controllers/ration_glj_controller.js
  29. 171 26
      modules/ration_glj/facade/ration_glj_facade.js
  30. 4 1
      modules/ration_glj/models/ration_glj.js
  31. 20 0
      modules/ration_glj/routes/ration_glj_route.js
  32. 1 0
      modules/ration_repository/models/coe.js
  33. 1 0
      modules/ration_repository/models/ration_item.js
  34. 1 0
      modules/ration_repository/models/ration_section_tree.js
  35. 2 7
      package.json
  36. 3 0
      public/web/common_ajax.js
  37. 61 1
      public/web/sheet/sheet_common.js
  38. 52 40
      public/web/sheet/sheet_data_helper.js
  39. 1 0
      public/web/tree_sheet/tree_sheet_controller.js
  40. 34 32
      public/web/tree_sheet/tree_sheet_helper.js
  41. 5 2
      server.js
  42. 6 30
      web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html
  43. 13 22
      web/building_saas/complementary_glj_lib/js/components.js
  44. 71 57
      web/building_saas/complementary_glj_lib/js/glj.js
  45. 20 12
      web/building_saas/complementary_glj_lib/js/gljComponent.js
  46. 0 37
      web/building_saas/complementary_glj_lib/js/sheetOpr.js
  47. 4 0
      web/building_saas/css/main.css
  48. 0 4
      web/building_saas/fee_rates/fee_rate.html
  49. 0 5
      web/building_saas/glj/html/glj_index.html
  50. 1 1
      web/building_saas/glj/js/common_spread.js
  51. 37 21
      web/building_saas/glj/js/project_glj.js
  52. 79 6
      web/building_saas/glj/js/project_glj_spread.js
  53. 0 3
      web/building_saas/main/html/calc_program_manage.html
  54. 91 28
      web/building_saas/main/html/main.html
  55. 54 48
      web/building_saas/main/js/calc/bills_calc.js
  56. 2 1
      web/building_saas/main/js/controllers/project_controller.js
  57. 28 2
      web/building_saas/main/js/models/bills.js
  58. 0 1
      web/building_saas/main/js/models/calc_program.js
  59. 26 0
      web/building_saas/main/js/models/project.js
  60. 24 0
      web/building_saas/main/js/models/ration.js
  61. 92 14
      web/building_saas/main/js/models/ration_glj.js
  62. 6 2
      web/building_saas/main/js/models/volume_price.js
  63. 3 0
      web/building_saas/main/js/views/calc_program_view.js
  64. 272 1
      web/building_saas/main/js/views/glj_view.js
  65. 57 0
      web/building_saas/main/js/views/glj_view_contextMenu.js
  66. 7 1
      web/building_saas/main/js/views/main_tree_col.js
  67. 172 114
      web/building_saas/main/js/views/project_view.js
  68. 7 114
      web/building_saas/pm/html/project-management.html
  69. 7 5
      web/common/html/header.html
  70. BIN
      web/dest/css/fonts/fontawesome-webfont.woff2
  71. BIN
      web/dest/css/img/diy/1_close.png
  72. BIN
      web/dest/css/img/diy/1_open.png
  73. BIN
      web/dest/css/img/diy/2.png
  74. BIN
      web/dest/css/img/diy/3.png
  75. BIN
      web/dest/css/img/diy/4.png
  76. BIN
      web/dest/css/img/diy/5.png
  77. BIN
      web/dest/css/img/diy/6.png
  78. BIN
      web/dest/css/img/diy/7.png
  79. BIN
      web/dest/css/img/diy/8.png
  80. BIN
      web/dest/css/img/diy/9.png
  81. BIN
      web/dest/css/img/line_conn.gif
  82. BIN
      web/dest/css/img/loading.gif
  83. BIN
      web/dest/css/img/zTreeStandard.gif
  84. BIN
      web/dest/css/img/zTreeStandard.png
  85. 2 2
      web/src/html/pm/project-management.html
  86. 5 5
      web/users/html/login-infoinput.html
  87. 8 5
      web/users/html/login.html
  88. 2 2
      web/users/html/user-info.html
  89. 2 2
      web/users/html/user-safe.html
  90. 2 2
      web/users/html/user-set.html

+ 5 - 1
Dockerfile

@@ -4,7 +4,11 @@ COPY . ConstructionCost
 
 WORKDIR ConstructionCost
 
-RUN cnpm install 
+RUN cnpm install -g gulp
+
+RUN cnpm install
+
+RUN gulp build
 
 EXPOSE 6060
 

+ 4 - 0
Dockerfile_qa

@@ -4,8 +4,12 @@ COPY . ConstructionCost
 
 WORKDIR ConstructionCost
 
+RUN cnpm install -g gulp
+
 RUN cnpm install
 
+RUN gulp build
+
 EXPOSE 6060
 
 ENV NODE_ENV=qa

+ 81 - 3
config/gulpConfig.js

@@ -5,8 +5,8 @@
 module.exports = {
     version:'1.0.1',
     common_jspaths:[
-        'lib/jquery/jquery.min.js',
-        'lib/tether/tether.min.js',
+        'lib/jquery/jquery-3.2.1.min.js',
+        'lib/popper/popper.min.js',
         'lib/bootstrap/bootstrap.min.js',
         'web/building_saas/js/*.js'
     ],
@@ -26,5 +26,83 @@ module.exports = {
         'public/web/common_ajax.js',
         'web/building_saas/pm/js/**/*.js',
         'lib/ztree/*.js'
+    ],
+    main_css:[
+        'lib/ztree/css/zTreeStyle.css',
+        'lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css',
+        'lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css',
+        'lib/jquery-contextmenu/jquery.contextMenu.css'
+    ],
+    main_jspaths:[
+        'lib/JSExpressionEval_src/*.js',
+        '!lib/JSExpressionEval_src/JsHashMap.js',
+        'lib/jquery-contextmenu/*.js',
+        'lib/lodash/lodash.js',
+        'web/building_saas/glj/js/project_glj.js',
+        'web/building_saas/glj/js/composition.js',
+        'web/building_saas/glj/js/common_spread.js',
+        'web/building_saas/glj/js/composition_spread.js',
+        'web/building_saas/glj/js/project_glj_spread.js',
+        'web/building_saas/glj/js/socket.io.slim.js',
+        'public/web/socket/connection.js',
+        'public/web/uuid.js',
+        'public/web/sheet/sheet_common.js',
+        'web/building_saas/main/js/models/calc_program.js',
+        'web/building_saas/main/js/views/calc_program_manage.js',
+        'public/web/common_ajax.js',
+        'public/web/url_util.js',
+        'public/web/number_util.js',
+        'public/web/sheet/sheet_common.js',
+       // 'lib/ztree/*.js',
+        'lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1',
+       // 'lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js',
+       // "lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js",
+      //  'lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js',
+        'web/building_saas/main/js/models/main_consts.js',
+        'web/building_saas/main/js/models/project.js',
+        'web/building_saas/main/js/models/bills.js',
+        'web/building_saas/main/js/models/ration.js',
+        'web/building_saas/main/js/models/glj.js',
+        'web/building_saas/main/js/models/project_glj.js',
+        'web/building_saas/main/js/models/fee_rate.js',
+        'web/building_saas/main/js/models/ration_glj.js',
+        'web/building_saas/main/js/models/ration_coe.js',
+        'web/building_saas/main/js/models/ration_ass.js',
+        'web/building_saas/main/js/models/volume_price.js',
+        'public/web/id_tree.js',
+        'test/tmp_data/test_ration_calc/ration_calc_base.js',
+        'web/building_saas/main/js/models/cache_tree.js',
+        'web/building_saas/main/js/calc/calc_fees.js',
+        'web/building_saas/main/js/calc/ration_calc.js',
+        'web/building_saas/main/js/calc/bills_calc.js',
+        'public/calc_util.js',
+        'public/web/tree_sheet/tree_sheet_controller.js',
+        'public/web/tree_sheet/tree_sheet_helper.js',
+        'public/web/sheet/sheet_data_helper.js',
+        'web/building_saas/main/js/views/main_tree_col.js',
+        'web/building_saas/main/js/views/project_info.js',
+        'web/building_saas/main/js/views/project_view.js',
+        'web/building_saas/main/js/views/options_view.js',
+        'web/building_saas/main/js/main_ajax.js',
+        'web/building_saas/main/js/main.js',
+        'web/building_saas/main/js/controllers/project_controller.js',
+        'web/building_saas/main/js/views/side_tools.js',
+        'web/building_saas/main/js/views/std_bills_lib.js',
+        'web/building_saas/main/js/views/std_ration_lib.js',
+        'web/building_saas/main/js/models/quantity_detail.js',
+        'web/building_saas/main/js/views/glj_view_contextMenu.js',
+        'web/building_saas/main/js/views/calc_program_view.js',
+        'public/web/treeDataHelper.js',
+        'public/web/ztree_common.js',
+        'public/web/rpt_tpl_def.js',
+        'web/building_saas/main/js/rpt/rpt_main.js',
+        'web/building_saas/main/js/rpt/rpt_cfg_const.js',
+        'web/building_saas/main/js/views/character_content_view.js',
+        'web/building_saas/main/js/views/glj_view.js',
+        'web/building_saas/main/js/views/sub_view.js',
+        'web/building_saas/main/js/views/fee_rate_view.js',
+        'web/building_saas/main/js/views/sub_fee_rate_views.js',
+        'web/building_saas/main/js/views/project_property_labour_coe_view.js'
     ]
-}
+}
+

+ 146 - 91
gulpfile.js

@@ -7,7 +7,6 @@ let gulpLoadPlugins = require('gulp-load-plugins');
 let del = require('del');
 let uglify = require('gulp-uglify-es').default;
 let config = require("./config/gulpConfig.js");
-let  runSequence = require('run-sequence');
 
 const $ = gulpLoadPlugins();
 let common_jspaths=config.common_jspaths;
@@ -18,122 +17,178 @@ let login_jspaths=config.login_jspaths;
 let main_jspaths=config.main_jspaths;
 let main_csspaths=config.main_css;
 let version=config.version;
+let cssDest='web/dest/css';
+let scriptsDest='web/dest/scripts';
+
+let commonOptions={
+    jspaths:common_jspaths,
+    csspaths:common_css,
+    concatName:'common.all.min'
+};
+
+let headerOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    concatName:'header.all.min',
+    srcHtml:'web/src/html/common/header.html',
+    htmlDest:'web/common/html',
+    htmlName:'header.html',
+    injectList:['web/dest/scripts/common.all.min.'+version+'.js']
+};
+
+let loginOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    jspaths:login_jspaths,
+    concatName:'login.all.min',
+    srcHtml:'web/src/html/login/login.html',
+    htmlDest:'web/users/html',
+    htmlName:'login.html',
+    injectList:[  'web/dest/scripts/common.all.min.'+version+'.js',
+        'web/dest/scripts/login.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.'+version+'.css']
+}
 
-let taskObject={};
-function task_init(options) {
-    taskObject=options;
-    taskObject.version=version;
-    taskObject.scriptsDest='web/dest/scripts';
+let pmOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    jspaths:pm_jspaths,
+    csspaths:pm_csspaths,
+    concatName:'pm.all.min',
+    srcHtml:'web/src/html/pm/!*.html',
+    htmlDest:'web/building_saas/pm/html',
+    htmlName:'project-management.html',
+    injectList:['web/dest/scripts/pm.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.'+version+'.css',
+        'web/dest/css/pm.all.min.'+version+'.css']
+};
+
+let mainOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    jspaths:main_jspaths,
+    csspaths:main_csspaths,
+    concatName:'main.all.min',
+    srcHtml:'web/src/html/main/main.html',
+    htmlDest:'web/building_saas/main/html',
+    htmlName:'main.html',
+    injectList:['web/dest/scripts/main.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.'+version+'.css',
+        'web/dest/css/main.all.min.'+version+'.css']
 }
 
-gulp.task('minify', function (){
-    if(taskObject.jspaths){
-        return gulp.src(taskObject.jspaths)
+function minify(options) {
+    if(options.jspaths){
+        return gulp.src(options.jspaths)
+            .pipe($.plumber())
+           // .pipe(uglify())
+            .pipe($.concat(options.concatName+"."+version+".js"))
+            .pipe(gulp.dest(scriptsDest));
+    }
+    return;
+}
+
+function css(options) {
+    if(options.csspaths){
+        return gulp.src(options.csspaths)
             .pipe($.plumber())
-            .pipe(uglify())
-            .pipe($.concat(taskObject.concatName+"."+version+".js"))
-            .pipe(gulp.dest(taskObject.scriptsDest));
+            .pipe($.cssnano())
+            .pipe($.concat(options.concatName+"."+version+".css"))
+            .pipe(gulp.dest(cssDest));
     }
-   return;
+    return;
+}
+
+function inject(options) {
+    var target = gulp.src(options.htmlDest+'/'+options.htmlName);
+    var sources = gulp.src(options.injectList, {read: false});
+
+    return target.pipe($.plumber())
+        .pipe($.inject(sources))
+        .pipe(gulp.dest(options.htmlDest));
+}
+
+function htmlmin(options) {
+    return gulp.src(options.htmlDest+'/*.html')
+    //  .pipe($.htmlmin({collapseWhitespace: true}))
+        .pipe(gulp.dest(options.htmlDest));
+}
+
+
+gulp.task('minify', function (){
+    return minify(commonOptions);
 });
 
+gulp.task('css',function () {
+    return css(commonOptions);
+})
 
-gulp.task('copy',function () {
-    return gulp.src(taskObject.srcHtml)
-            .pipe($.plumber())
-            .pipe(gulp.dest(taskObject.htmlDest));
+gulp.task('common', ['minify','css']);
+
+gulp.task('login_minify',['common'], function (){
+    return minify(loginOptions);
+});
+
+gulp.task('login_css',function () {
+    return css(loginOptions);
+})
+
+gulp.task('login_inject',['login_minify','login_css'],function () {
+    return inject(loginOptions);
 })
 
-gulp.task('inject',['copy','minify','css'], function () {
-    var target = gulp.src(taskObject.htmlDest+'/'+taskObject.htmlName);
-    var sources = gulp.src(taskObject.injectList, {read: false});
+gulp.task('login',['login_inject'], function (){
+    return htmlmin(loginOptions);
+});
 
-    return target.pipe($.plumber())
-         .pipe($.inject(sources))
-         .pipe(gulp.dest(taskObject.htmlDest));
+
+gulp.task('header_minify',['common'], function (){
+    return minify(headerOptions);
 });
 
-gulp.task('htmlmin',function () {
-    return gulp.src(taskObject.htmlDest+'/*.html')
-      //  .pipe($.htmlmin({collapseWhitespace: true}))
-        .pipe(gulp.dest(taskObject.htmlDest));
+gulp.task('header_css',function () {
+    return css(headerOptions);
 })
 
-gulp.task('css',function () {
-    if(taskObject.pm_csspaths){
-        return gulp.src(taskObject.pm_csspaths)
-            .pipe($.plumber())
-            .pipe($.cssnano())
-            .pipe($.concat(taskObject.concatName+"."+version+".css"))
-            .pipe(gulp.dest(taskObject.cssDest));
-    }
-    return;
+gulp.task('header_inject',['header_minify','header_css'],function () {
+    return inject(headerOptions);
 })
 
-gulp.task('common', function (){
-    let options = {
-        jspaths:common_jspaths,
-        pm_csspaths:common_css,
-        concatName:'common.all.min',
-        cssDest:'web/dest/css'
-    }
-    task_init(options);
-    runSequence('minify','css');
+gulp.task('header',['header_inject'], function (){
+    return htmlmin(headerOptions);
 });
 
-gulp.task('header', function (){
-    let options = {
-        concatName:'header.all.min',
-        srcHtml:'web/src/html/common/header.html',
-        htmlDest:'web/common/html',
-        htmlName:'header.html',
-        injectList:['web/dest/scripts/common.all.min.'+version+'.js']
-    };
-    task_init(options);
-    runSequence('inject','htmlmin');
+gulp.task('pm_minify',['common'], function (){
+    return minify(pmOptions);
 });
 
+gulp.task('pm_css',function () {
+    return css(pmOptions);
+})
 
-gulp.task('login', function (){
-    let options = {
-        jspaths:login_jspaths,
-        concatName:'login.all.min',
-        srcHtml:'web/src/html/login/login.html',
-        htmlDest:'web/users/html',
-        htmlName:'login.html',
-        injectList:[  'web/dest/scripts/common.all.min.'+version+'.js',
-                        'web/dest/scripts/login.all.min.'+version+'.js',
-                        'web/dest/css/common.all.min.'+version+'.css']
-    }
-    task_init(options);
-    runSequence('inject','htmlmin');
+gulp.task('pm_inject',['pm_minify','pm_css'],function () {
+    return inject(pmOptions);
+})
+
+gulp.task('pm',['pm_inject'], function (){
+    return htmlmin(pmOptions);
 });
 
-gulp.task('pm', function (){
-    let options = {
-        jspaths:pm_jspaths,
-        pm_csspaths:pm_csspaths,
-        concatName:'pm.all.min',
-        cssDest:'web/dest/css',
-        srcHtml:'web/src/html/pm/*.html',
-        htmlDest:'web/building_saas/pm/html',
-        htmlName:'project-management.html',
-        injectList:['web/dest/scripts/pm.all.min.'+version+'.js',
-                      'web/dest/css/common.all.min.'+version+'.css',
-                      'web/dest/css/pm.all.min.'+version+'.css']
-    }
-    task_init(options);
-    runSequence('inject','htmlmin');
+gulp.task('main_minify',['common'], function (){
+    return minify(mainOptions);
 });
 
-gulp.task('main',function () {
-    let options ={
-        jspaths:main_jspaths,
-        pm_csspaths:main_csspaths,
-        concatName:'main.all.min',
-    }
-    task_init(options);
-    runSequence('inject','htmlmin');
+gulp.task('main_css',function () {
+    return css(mainOptions);
+})
 
+gulp.task('main_inject',['main_minify','main_css'],function () {
+    return inject(mainOptions);
 })
 
+gulp.task('main',['main_inject'], function (){
+    return htmlmin(mainOptions);
+});
+
+
+gulp.task('build',['header','login','pm','main']);

+ 149 - 0
gulpfile.js.copy

@@ -0,0 +1,149 @@
+
+/**
+ * Created by chen on 2017/9/26.
+ */
+
+let gulp =require( 'gulp');
+let gulpLoadPlugins = require('gulp-load-plugins');
+let del = require('del');
+let uglify = require('gulp-uglify-es').default;
+let config = require("./config/gulpConfig.js");
+let  runSequence = require('run-sequence');
+
+const $ = gulpLoadPlugins();
+let common_jspaths=config.common_jspaths;
+let common_css=config.common_css;
+let pm_jspaths=config.pm_jspaths;
+let pm_csspaths=config.pm_css;
+let login_jspaths=config.login_jspaths;
+let main_jspaths=config.main_jspaths;
+let main_csspaths=config.main_css;
+let version=config.version;
+
+let taskObject={};
+function task_init(options) {
+    taskObject=options;
+    taskObject.version=version;
+    taskObject.scriptsDest='web/dest/scripts';
+}
+
+gulp.task('minify', function (){
+    if(taskObject.jspaths){
+        return gulp.src(taskObject.jspaths)
+            .pipe($.plumber())
+           // .pipe(uglify())
+            .pipe($.concat(taskObject.concatName+"."+version+".js"))
+            .pipe(gulp.dest(taskObject.scriptsDest));
+    }
+   return;
+});
+
+
+gulp.task('copy',function () {
+    return gulp.src(taskObject.srcHtml)
+            .pipe($.plumber())
+            .pipe(gulp.dest(taskObject.htmlDest));
+})
+
+gulp.task('inject',['minify','css'], function () {
+    var target = gulp.src(taskObject.htmlDest+'/'+taskObject.htmlName);
+    var sources = gulp.src(taskObject.injectList, {read: false});
+
+    return target.pipe($.plumber())
+         .pipe($.inject(sources))
+         .pipe(gulp.dest(taskObject.htmlDest));
+});
+
+gulp.task('htmlmin',function () {
+    return gulp.src(taskObject.htmlDest+'/*.html')
+      //  .pipe($.htmlmin({collapseWhitespace: true}))
+        .pipe(gulp.dest(taskObject.htmlDest));
+})
+
+gulp.task('css',function () {
+    if(taskObject.pm_csspaths){
+        return gulp.src(taskObject.pm_csspaths)
+            .pipe($.plumber())
+            .pipe($.cssnano())
+            .pipe($.concat(taskObject.concatName+"."+version+".css"))
+            .pipe(gulp.dest(taskObject.cssDest));
+    }
+    return;
+})
+
+gulp.task('common', function (){
+    let options = {
+        jspaths:common_jspaths,
+        pm_csspaths:common_css,
+        concatName:'common.all.min',
+        cssDest:'web/dest/css'
+    }
+    task_init(options);
+    runSequence('minify','css');
+});
+
+gulp.task('header', function (){
+    let options = {
+        concatName:'header.all.min',
+        srcHtml:'web/src/html/common/header.html',
+        htmlDest:'web/common/html',
+        htmlName:'header.html',
+        injectList:['web/dest/scripts/common.all.min.'+version+'.js']
+    };
+    task_init(options);
+    runSequence('inject','htmlmin');
+});
+
+
+gulp.task('login', function (){
+    let options = {
+        jspaths:login_jspaths,
+        concatName:'login.all.min',
+        srcHtml:'web/src/html/login/login.html',
+        htmlDest:'web/users/html',
+        htmlName:'login.html',
+        injectList:[  'web/dest/scripts/common.all.min.'+version+'.js',
+                        'web/dest/scripts/login.all.min.'+version+'.js',
+                        'web/dest/css/common.all.min.'+version+'.css']
+    }
+    task_init(options);
+    runSequence('inject','htmlmin');
+});
+
+gulp.task('pm', function (){
+    let options = {
+        jspaths:pm_jspaths,
+        pm_csspaths:pm_csspaths,
+        concatName:'pm.all.min',
+        cssDest:'web/dest/css',
+        srcHtml:'web/src/html/pm/*.html',
+        htmlDest:'web/building_saas/pm/html',
+        htmlName:'project-management.html',
+        injectList:['web/dest/scripts/pm.all.min.'+version+'.js',
+                      'web/dest/css/common.all.min.'+version+'.css',
+                      'web/dest/css/pm.all.min.'+version+'.css']
+    }
+    task_init(options);
+    runSequence('inject','htmlmin');
+});
+
+gulp.task('main',function () {
+    let options ={
+        jspaths:main_jspaths,
+        pm_csspaths:main_csspaths,
+        concatName:'main.all.min',
+        cssDest:'web/dest/css',
+        srcHtml:'web/src/html/main/main.html',
+        htmlDest:'web/building_saas/main/html',
+        htmlName:'main.html',
+        injectList:['web/dest/scripts/main.all.min.'+version+'.js',
+            'web/dest/css/common.all.min.'+version+'.css',
+            'web/dest/css/main.all.min.'+version+'.css']
+    }
+    task_init(options);
+    runSequence('inject','htmlmin');
+})
+
+gulp.task('build',['common'],function () {
+    runSequence('header',['login','pm','main']);
+});

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 2 - 3
lib/bootstrap/bootstrap.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 3 - 2
lib/bootstrap/css/bootstrap.min.css


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 4 - 0
lib/jquery/jquery-3.2.1.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 4
lib/jquery/jquery.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 5 - 0
lib/popper/popper.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 1
lib/tether/tether.min.js


+ 1 - 0
modules/bills_lib/models/bills_lib_schemas.js

@@ -44,6 +44,7 @@ let billsSchema = mongoose.Schema({
         name: String,
         unit: String,
         ruleText: String,
+        engineering: Number, //工程专业,填计算程序工程专业ID
         Expression: String,
         jobs: [],
         items: [],

+ 2 - 0
modules/common/const/glj_type_const.js

@@ -28,6 +28,8 @@ const gljType = {
     GENERAL_MACHINE: 301,
     // 机械组成物
     MACHINE_COMPOSITION: 302,
+    // 机上人工
+    MACHINE_LABOUR: 303,
     // ==============机械类型=================
     // 主材
     MAIN_MATERIAL: 4,

+ 4 - 4
modules/common/std/std_glj_lib_glj_list_model.js

@@ -49,12 +49,12 @@ class STDGLJLibGLJListModel extends BaseModel {
     /**
      * 获取对应组成物数据
      *
-     * @param {String} code
+     * @param {Number} gljId
      * @return {Promise}
      */
-    async getComponent(code) {
+    async getComponent(gljId) {
         let result = [];
-        let libGljData = await this.findDataByCondition({code: code});
+        let libGljData = await this.findDataByCondition({ID: gljId});
         if (libGljData === null || libGljData.component.length <= 0) {
             return result;
         }
@@ -78,7 +78,7 @@ class STDGLJLibGLJListModel extends BaseModel {
         componentGljData = JSON.stringify(componentGljData);
         componentGljData = JSON.parse(componentGljData);
         for(let gljData of componentGljData) {
-            gljData.connectCode = code;
+            gljData.connectCode = libGljData.code;
             gljData.consumption = componentConsume[gljData.ID];
             componentData.push(gljData);
         }

+ 74 - 0
modules/complementary_glj_lib/models/gljModel.js

@@ -4,6 +4,7 @@
 import {complementaryGljModel, stdGljModel, gljClassModel} from "./schemas";
 import counter from "../../../public/counter/counter";
 import async from "async";
+import STDGLJLibGLJListModel from "../../common/std/std_glj_lib_glj_list_model";
 
 class GljDao {
     getGljTypes (gljLibId, callback){
@@ -229,6 +230,79 @@ class GljDao {
             callback(err, results);
         });
     }
+
+    /**
+     * 获取组成物数据
+     *
+     * @param {Number} gljId
+     * @return {Promise}
+     */
+    async getComponent(gljId) {
+        let result = [];
+        let libGljData = await complementaryGljModel.find({ID: gljId});
+        if (libGljData === null || libGljData.component.length <= 0) {
+            return result;
+        }
+
+        // 标准工料机库
+        let componentIdListStd = [];
+        // 补充工料机库
+        let componentIdListCpt = [];
+        let componentConsume = {};
+        // 整理数据
+        for (let component of libGljData.component) {
+            if (component.isStd) {
+                componentIdListStd.push(component.ID);
+            } else {
+                componentIdListCpt.push(component.ID);
+            }
+            let isStdFlag = component.isStd ? 'std' : 'cpt';
+            componentConsume[component.ID + '_' + isStdFlag] = component.consumeAmt;
+        }
+
+        // 查找标准库数据
+        let condition = {};
+        let componentStdGljData = [];
+        if (componentIdListStd.length > 0) {
+            let gljListModel = new STDGLJLibGLJListModel();
+            condition = {ID: {$in: componentIdListStd}};
+            componentStdGljData = await gljListModel.findDataByCondition(condition, null, false);
+        }
+
+        // 查找补充库数据
+        let componentCptGljData = [];
+        if (componentIdListCpt.length > 0) {
+            condition = {ID: {$in: componentIdListCpt}};
+            componentCptGljData = await complementaryGljModel.find(condition);
+        }
+
+        if (componentCptGljData === null && componentStdGljData === null) {
+            return result;
+        }
+
+        // 整理数据
+        if (componentStdGljData.length > 0) {
+            componentStdGljData = JSON.stringify(componentStdGljData);
+            componentStdGljData = JSON.parse(componentStdGljData);
+            for(let gljData of componentStdGljData) {
+                gljData.connectCode = libGljData.code;
+                gljData.consumption = componentConsume[gljData.ID + '_std'];
+                result.push(gljData);
+            }
+        }
+
+        if (componentCptGljData.length > 0) {
+            componentCptGljData = JSON.stringify(componentCptGljData);
+            componentCptGljData = JSON.parse(componentCptGljData);
+            for(let gljData of componentCptGljData) {
+                gljData.connectCode = libGljData.code;
+                gljData.consumption = componentConsume[gljData.ID + '_cpt'];
+                result.push(gljData);
+            }
+        }
+
+        return result;
+    }
 }
 
 export default GljDao;

+ 14 - 4
modules/complementary_glj_lib/models/schemas.js

@@ -4,9 +4,19 @@
 import mongoose from "mongoose";
 
 let Schema = mongoose.Schema;
-let gjlComponentSchema = mongoose.Schema(
+//补充工料机的组成物可能来自标准工料机和补充工料机
+let comGjlComponentSchema = new Schema(
+    {
+        isStd: Boolean, //组成物里的工料机是否是标准的,否则是补充的
+        ID: Number,
+        consumeAmt: Number
+    },
+    {_id: false},
+    {versionKey: false}
+);
+//标准工料机的组成物只来自标准工料机
+let stdGjlComponentSchema = new Schema(
     {
-       // module: String, //"stdGlj"标准工料机 "complementaryGlj"
         ID: Number,
         consumeAmt: Number
     },
@@ -26,7 +36,7 @@ let complementaryGljSchema = new Schema({
     gljClass: Number,
     gljType: Number,
     shortName: String,
-    component: [gjlComponentSchema]
+    component: [comGjlComponentSchema]
 }, {versionKey: false});
 
 //标准工料机
@@ -42,7 +52,7 @@ let stdGljSchema = new Schema({
     gljType: Number,
     shortName: String,
     unit: String,
-    component: [gjlComponentSchema]
+    component: [stdGjlComponentSchema]
 },{versionKey: false});
 
 //标准工料机分类树

+ 1 - 1
modules/complementary_glj_lib/routes/routes.js

@@ -26,4 +26,4 @@ module.exports = function (app) {
 
     app.use("/complementartGlj/api", router);
 
-};
+};

+ 1 - 0
modules/fee_rates/facade/fee_rates_facade.js

@@ -202,6 +202,7 @@ async function getFeeRateData(projectID) {
                 feeRateData._doc.rates = feeRate?feeRate.rates:[];
                 //
                 feeRateData._doc.usageProjects=await getUsageProjects(feeRateData.ID);
+                console.log(feeRateData._doc);
                 result.datas = feeRateData;
             }
         }else {

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

@@ -97,6 +97,7 @@ class GLJController extends BaseController {
     async updateData(request, response) {
         let field = request.body.field;
         let value = request.body.value;
+        let extend = request.body.extend;
         value = value === 'true' ? 1 : value;
         value = value === 'false' ? 0 : value;
         let id = request.body.id;
@@ -107,7 +108,8 @@ class GLJController extends BaseController {
         };
         try {
             // 可编辑的字段
-            let editableField = ['is_evaluate', 'unit_price.market_price', 'is_adjust_price', 'mix_ratio.consumption'];
+            let editableField = ['is_evaluate', 'unit_price.market_price', 'is_adjust_price', 'mix_ratio.consumption',
+                'supply'];
             if (editableField.indexOf(field) < 0) {
                 throw '对应字段不能编辑';
             }
@@ -126,13 +128,18 @@ class GLJController extends BaseController {
             let model = null;
             switch (modelString) {
                 case 'glj':
+                    if (extend !== '') {
+                        extend = JSON.parse(extend);
+                        for (let code in extend) {
+                            updateData[code] = extend[code];
+                        }
+                    }
+                    console.log(updateData);
                     model = new GLJListModel();
                     // 更新数据
                     result = await model.updateById(id, updateData);
-
                     break;
                 case 'unit_price':
-                    let extend = request.body.extend;
                     model = new UnitPriceModel();
                     // 更新数据
                     result = await model.updatePrice({id: id}, updateData, extend);

+ 52 - 41
modules/glj/models/glj_list_model.js

@@ -13,8 +13,9 @@ import UnitPriceFileModel from "./unit_price_file_model";
 import GLJTypeConst from "../../common/const/glj_type_const";
 import RationGLJFacade from "../../ration_glj/facade/ration_glj_facade";
 import STDGLJLibGLJListModel from "../../common/std/std_glj_lib_glj_list_model";
-import STDGLJType from "../../../public/cache/std_glj_type_util";
 import MixRatioModel from "./mix_ratio_model";
+import GljModel from "../../complementary_glj_lib/models/gljModel";
+const ProjectModel = require('../../pm/models/project_model').project;
 
 class GLJListModel extends BaseModel {
 
@@ -91,14 +92,8 @@ class GLJListModel extends BaseModel {
 
             // 整理获取工料机ID list
             let gljIdList = [];
-            // 整理获取有组成物的项目工料机编码
-            let projectGLJCode = [];
             for(let tmp of gljData) {
                 gljIdList.push(tmp.id);
-                // 有组成物的类型才入数组
-                if (this.ownCompositionTypes.indexOf(tmp.type)) {
-                    projectGLJCode.push(tmp.code);
-                }
             }
             // 从定额工料机库中获取消耗量
             condition = {
@@ -109,9 +104,22 @@ class GLJListModel extends BaseModel {
             let quantityList = {};
             // 整理数据
             for (let tmp of quantityData) {
-                quantityList[tmp.projectGLJID] = tmp.quantity;
+                let tmpNum = parseInt(tmp.rationQuantity);
+                tmpNum = isNaN(tmpNum) ? 1 : tmpNum;
+                if (quantityList[tmp.projectGLJID] === undefined) {
+                    quantityList[tmp.projectGLJID] = tmp.quantity * tmpNum;
+                } else {
+                    quantityList[tmp.projectGLJID] += tmp.quantity * tmpNum;
+                }
+            }
+            // 整理获取有组成物的项目工料机编码
+            let projectGLJCode = [];
+            for(let tmp of gljData) {
+                // 有组成物的类型且消耗量大于0才查找
+                if (quantityList[tmp.id] !== undefined) {
+                    projectGLJCode.push(tmp.code);
+                }
             }
-
             // 查找组成物的消耗量
             let totalComposition = {};
             let mixRatioData = {};
@@ -122,7 +130,7 @@ class GLJListModel extends BaseModel {
                 for (let tmp of mixRatioList) {
                     totalComposition[tmp.connect_code] = totalComposition[tmp.connect_code] === undefined ? tmp.consumption :
                         totalComposition[tmp.connect_code] + tmp.consumption;
-                    totalComposition[tmp.connect_code] = Number(totalComposition[tmp.connect_code].toFixed(2));
+                    totalComposition[tmp.connect_code] = Number(totalComposition[tmp.connect_code].toFixed(4));
 
                     if (mixRatioData[tmp.glj_id] !== undefined) {
                         mixRatioData[tmp.glj_id].push(tmp);
@@ -138,8 +146,7 @@ class GLJListModel extends BaseModel {
                 }
             }
             // 组合单价数据
-            this.combineData(gljData, unitPriceList, quantityList, mixRatioData, totalComposition);
-
+            gljData = this.combineData(gljData, unitPriceList, quantityList, mixRatioData, totalComposition);
             // 排序
             gljData.sort(function (a, b) {
                 a.unit_price = a.unit_price === null ? 0 : a.unit_price;
@@ -163,7 +170,7 @@ class GLJListModel extends BaseModel {
      * @param {object} quantityList
      * @param {object} mixRatioData 组合物明细数据
      * @param {object} totalComposition 组合物父工料机统计数据
-     * @return {void}
+     * @return {Array}
      */
     combineData(gljList, unitPriceList, quantityList = {}, mixRatioData = {}, totalComposition = {}) {
         // 整理组成物消耗量(只有在总列表显示的时候才需用到,获取单项项目工料机内容则忽略)
@@ -177,8 +184,10 @@ class GLJListModel extends BaseModel {
 
             }
         }
+        let result = [];
         // 循环组合数据
-        for(let glj of gljList) {
+        for(let index in gljList) {
+            let glj = gljList[index];
             if (glj.code === undefined) {
                 continue;
             }
@@ -189,19 +198,23 @@ class GLJListModel extends BaseModel {
             }
 
             let gljId = glj.glj_id + '';
+            let projectGljId = glj.id + '';
+
             // 消耗量赋值
-            glj.quantity = quantityList[glj.id] !== undefined ? quantityList[glj.id] : 0;
+            glj.quantity = quantityList[projectGljId] !== undefined ? quantityList[projectGljId] : 0;
             glj.quantity = totalComposition[glj.code] !== undefined ? totalComposition[glj.code] : glj.quantity;
             glj.quantity = compositionConsumption[gljId] !== undefined ?  glj.quantity + compositionConsumption[gljId] : glj.quantity;
 
             // 组成物数据
-            glj.ratio_data = mixRatioData[gljId] !== undefined ? mixRatioData[gljId] : [];
+            gljList[index].ratio_data = mixRatioData[gljId] !== undefined ? mixRatioData[gljId] : [];
 
+            glj.unit_price.base_price = parseFloat(glj.unit_price.base_price).toFixed(2);
+            glj.unit_price.market_price = parseFloat(glj.unit_price.market_price).toFixed(2);
             // 计算调整基价
             switch (glj.unit_price.type + '') {
                 // 人工: 调整基价=基价单价*调整系数
                 case GLJTypeConst.LABOUR:
-                    glj.adjust_price = glj.adjustment * glj.unit_price.base_price;
+                    glj.adjust_price = parseFloat(glj.adjustment * glj.unit_price.base_price).toFixed(2);
                     break;
                 // 机械类型的算法
                 case GLJTypeConst.MACHINE:
@@ -211,8 +224,9 @@ class GLJListModel extends BaseModel {
                 default:
                     glj.adjust_price = glj.unit_price.base_price;
             }
-
+            result.push(glj);
         }
+        return result;
     }
 
     /**
@@ -242,17 +256,15 @@ class GLJListModel extends BaseModel {
             }
 
             // 获取标段对应的单价文件id
-            let unitPriceFileModel = new UnitPriceFileModel();
-            let unitPriceFile = await unitPriceFileModel.getDataByProject(data.project_id);
-            if (!unitPriceFile) {
+            let unitPriceFileId = await ProjectModel.getUnitPriceFileId(data.project_id);
+            if (unitPriceFileId <= 0) {
                 throw '没有对应的单价文件';
             }
-            let unitPriceFileId = unitPriceFile.id;
 
             // 判断类型,如果是混凝土、砂浆或者配合比则查找对应的组成物(前提是没有对应的项目工料机数据)
             if (isAddProjectGLJ && (data.type === GLJTypeConst.CONCRETE || data.type === GLJTypeConst.MORTAR ||
                 data.type === GLJTypeConst.MIX_RATIO || data.type === GLJTypeConst.GENERAL_MACHINE)) {
-                this.compositionInit(data.code, data.project_id, unitPriceFileId);
+                this.compositionInit(data, unitPriceFileId);
             }
 
             // 新增单价文件
@@ -402,14 +414,20 @@ class GLJListModel extends BaseModel {
      * 工料机中组成物操作
      * 该方法只在确保没有对应项目工料机的时候才会调用
      *
-     * @param {String} code
+     * @param {Object} data
      * @param {Number} projectId
-     * @param {Number} unitPriceFileId
      * @return {void}
      */
-    async compositionInit(code, projectId, unitPriceFileId) {
+    async compositionInit(data, unitPriceFileId) {
+        let gljId = data.glj_id === undefined ? 0 : data.glj_id;
+        let projectId = data.project_id === undefined ? 0 : data.project_id;
+        if (code === 0 || projectId === 0) {
+            throw '参数错误';
+        }
+        let fromTable = data.from === undefined ? 'std' : data.from;
+
         // 查找对应组成物的项目工料机数据
-        let [projectGljList, compositionGljList] = await this.getCompositionGLJList(code, projectId, 'name');
+        let [projectGljList, compositionGljList] = await this.getCompositionGLJList(gljId, projectId, 'name', fromTable);
 
         // 整理配合比待插入数据
         let mixRatioInsertData = [];
@@ -437,13 +455,6 @@ class GLJListModel extends BaseModel {
             return;
         }
 
-        // 获取工料机类型以及整理数据
-        let gljTypeList = STDGLJType.getStdGljTypeCacheObj().toArray();
-        let gljType = {};
-        for (let tmp of gljTypeList) {
-            gljType[tmp.fullName] = tmp.ID;
-        }
-
         // 整理插入的数据
         let gljInsertData = [];
         let unitPriceInsertData = [];
@@ -470,8 +481,7 @@ class GLJListModel extends BaseModel {
                 code: tmp.code,
                 name: tmp.name,
                 unit_price_file_id: unitPriceFileId,
-                // 如果没有对应的工料机类型则默认设置为普通材料
-                type: gljType[tmp.gljDistType] !== undefined ? gljType[tmp.gljDistType] : GLJTypeConst.GENERAL_MATERIAL
+                type: tmp.gljType
             };
             unitPriceInsertData.push(unitPriceData);
         }
@@ -543,7 +553,7 @@ class GLJListModel extends BaseModel {
                 unitPriceData[tmp.code + tmp.name] = tmp;
             }
 
-            this.combineData(gljData, unitPriceData, [], mixRatioData);
+            gljData = this.combineData(gljData, unitPriceData, [], mixRatioData);
 
             // 排序
             gljData.sort(function (a, b) {
@@ -561,15 +571,16 @@ class GLJListModel extends BaseModel {
     /**
      * 获取混凝土等有组成物相关工料机对应的组成物项目工料机数据
      *
-     * @param {String} code
+     * @param {Number} gljId
      * @param {Number} projectId
      * @param {String} indexBy
+     * @param {String} fromTable
      * @return {Promise} 返回组成物工料机数据和组成物列表数据
      */
-    async getCompositionGLJList(code, projectId, indexBy = null) {
+    async getCompositionGLJList(gljId, projectId, indexBy = null, fromTable = 'std') {
         // 获取对应的组成物数据
-        let stdGljLibGljListModel = new STDGLJLibGLJListModel();
-        let componentGljList = await stdGljLibGljListModel.getComponent(code);
+        let gljListModel = fromTable === 'std' ? new STDGLJLibGLJListModel() : new GljModel();
+        let componentGljList = await gljListModel.getComponent(gljId);
 
         if (componentGljList.length <= 0) {
             throw '不存在对应的组成物';

+ 2 - 2
modules/glj/models/schemas/glj.js

@@ -34,8 +34,8 @@ let modelSchema = {
     },
     // 供货方式
     supply: {
-        type: String,
-        default: ''
+        type: Number,
+        default: 0
     },
     // 甲供数量
     supply_quantity: {

+ 41 - 0
modules/main/controllers/labour_coe_controller.js

@@ -0,0 +1,41 @@
+/**
+ * Created by CSL on 2017-10-10.
+ */
+
+let mongoose = require('mongoose');
+let labourCoeFacade = require('../facade/labour_coe_facade');
+
+module.exports = {
+    getProjectLabourCoe: getProjectLabourCoe,
+    getStdLabourCoe: getStdLabourCoe
+};
+
+async function getProjectLabourCoe(req, res) {
+    let result={error: 0};
+
+    try {
+        let projLC = await labourCoeFacade.getProjectLabourCoe(req.body.data.labourCoeID);
+        result.data= projLC;
+    }catch (err){
+        console.log(err);
+        result.error = 1;
+        result.message = err.message;
+    }
+
+    res.json(result);
+};
+
+async function getStdLabourCoe(req, res) {
+    let result={error: 0};
+
+    try {
+        let stdLC = await labourCoeFacade.getStdLabourCoe(req.body.data.libID);
+        result.data= stdLC;
+    }catch (err){
+        console.log(err);
+        result.error = 1;
+        result.message = err.message;
+    }
+
+    res.json(result);
+};

+ 48 - 0
modules/main/facade/labour_coe_facade.js

@@ -0,0 +1,48 @@
+/**
+ * Created by CSL on 2017-10-10.
+ */
+
+const uuidV1 = require('uuid/v1');
+let logger = require("../../../logs/log_helper").logger;
+let mongoose = require('mongoose');
+let stdLabourCoesModel = mongoose.model('std_labour_coes');
+let projectLabourCoesModel = mongoose.model('labour_coes');
+let EngineeringLibModel = require("../../users/models/engineering_lib_model");
+
+module.exports = {
+    newProjectLabourCoe: newProjectLabourCoe,
+    getProjectLabourCoe: getProjectLabourCoe,
+    getStdLabourCoe: getStdLabourCoe
+};
+
+async function newProjectLabourCoe(data) {
+    let valid_LC_libs = [];
+    let egnrID = data.property.engineering_id;
+    let egnrModel = new EngineeringLibModel();
+    let egnr = await egnrModel.getEngineering(egnrID);
+    if(egnr){ valid_LC_libs = egnr._doc.artificial_lib };
+    // 绑定多个人工系数标准文件时,默认取第一个作为标准模板。
+    let stdLC = await getStdLabourCoe(valid_LC_libs[0].id);
+    let doc={
+        ID: uuidV1(),
+        projectID: data.ID,
+        name: data.name,
+        libID: stdLC.ID,
+        libName: stdLC.libName,
+        coes: stdLC.coes
+    };
+    await projectLabourCoesModel.create(doc);
+    let newLC = {ID: doc.ID, name: doc.name};
+    return newLC;
+};
+
+async function getProjectLabourCoe(ID) {
+    let projLC = await projectLabourCoesModel.findOne({ID:ID});
+    return projLC;
+};
+
+
+async function getStdLabourCoe(libID) {
+    let stdLC = await stdLabourCoesModel.findOne({ID:libID});
+    return stdLC;
+};

+ 34 - 0
modules/main/models/labour_coe.js

@@ -0,0 +1,34 @@
+/**
+ * Created by CSL on 2017-09-28.
+ */
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+
+let coeSchema = new Schema({
+    ID: Number,
+    ParentID: Number,
+    name: String,
+    coe: Number,
+    _id: false
+},{versionKey:false});
+
+let stdLabourCoes = new Schema({
+    ID: Number,
+    region: String,
+    libName: String,
+    coes: [coeSchema],
+    _id: false
+},{versionKey:false});
+
+let projectLabourCoes = new Schema({
+    ID: String,
+    projectID: Number,
+    name: String,
+    libID: Number,
+    libName: String,
+    coes: [coeSchema]//,
+   // _id: false
+},{versionKey:false});
+
+mongoose.model('std_labour_coes', stdLabourCoes, 'std_labour_coes');
+mongoose.model('labour_coes', projectLabourCoes, 'labour_coes');

+ 21 - 0
modules/main/models/project.js

@@ -105,4 +105,25 @@ Project.prototype.getData = function(projectID, callback){
 
 };
 
+Project.prototype.getFilterData = function (projectID, filter) {
+    let functions = [];
+    let getModuleData = function (moduleName) {
+        return function (cb) {
+            moduleMap[moduleName].getData(projectID, function (err, name, data) {
+                cb(err, {'moduleName': name, 'data': data})
+            });
+        }
+    }
+    for (let itemName of filter) {
+        functions.push(getModuleData(itemName));
+    }
+    async.parallel(functions, function (err, results) {
+        if (err) {
+            throw '获取项目数据出错';
+        } else {
+            return results;
+        }
+    });
+}
+
 module.exports = new Project();

+ 20 - 0
modules/main/routes/labour_coe_route.js

@@ -0,0 +1,20 @@
+/**
+ * Created by CSL on 2017-10-12.
+ */
+
+let express = require('express');
+let lcController = require('../controllers/labour_coe_controller');
+
+module.exports = function (app) {
+
+    var lcRouter = express.Router();
+
+    lcRouter.post('/getProjectLabourCoe', lcController.getProjectLabourCoe);
+    lcRouter.post('/getStdLabourCoe', lcController.getStdLabourCoe);
+
+    app.use('/labourCoe',lcRouter);
+}
+
+
+
+

+ 5 - 0
modules/pm/models/project_model.js

@@ -7,6 +7,7 @@ let counter = require("../../../public/counter/counter.js");
 let newProjController = require('../controllers/new_proj_controller');
 let copyProjController = require('../controllers/copy_proj_controller');
 let feeRateFacade = require('../../fee_rates/facade/fee_rates_facade');
+let labourCoeFacade = require('../../main/facade/labour_coe_facade');
 let logger = require("../../../logs/log_helper").logger;
 
 let Projects = require("./project_schema");
@@ -92,6 +93,10 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callbac
                 if(data.updateData.projType==='Tender'){
                     let  feeRateFileID = await feeRateFacade.newFeeRateFile(data.updateData);
                     newProject.property.feeFile = feeRateFileID?feeRateFileID:-1;
+
+                    // 新建人工系数文件 CSL, 2017.10.13
+                    let lcFile = await labourCoeFacade.newProjectLabourCoe(data.updateData);
+                    newProject.property.labourCoeFile = lcFile ? lcFile : null;
                 }
                 newProject.save(async function (err, result) {
                     if (!err && result._doc.projType === projectType.tender) {

+ 82 - 1
modules/ration_glj/controllers/ration_glj_controller.js

@@ -3,10 +3,16 @@
  */
 let mongoose = require("mongoose")
 let ration_glj_facade = require('../facade/ration_glj_facade')
+import EngineeringLibModel from "../../users/models/engineering_lib_model";
+let logger = require("../../../logs/log_helper").logger;
 
 module.exports={
     createRationGLJ:createRationGLJ,
-    testGetQuantify:testGetQuantify
+    testGetQuantify:testGetQuantify,
+    getGLJData:getGLJData,
+    addGLJ:addGLJ,
+    replaceGLJ:replaceGLJ,
+    mReplaceGLJ:mReplaceGLJ
 }
 function createRationGLJ() {
     let gls = mongoose.model('ration_glj');
@@ -28,6 +34,81 @@ async function testGetQuantify() {
     }catch (err){
         console.log(err);
     }
+}
 
+async function getGLJData(req, res) {
+    let result={
+        error:0
+    }
+    try {
+        let info = await ration_glj_facade.getLibInfo(req);
+        console.log(info);
+        ration_glj_facade.getGLJData(info,function (err,datas) {
+            if(err){
+                result.error=1;
+                result.message = err.message;
+            }else {
+                result.datas = datas;
+            }
+            res.json(result);
+        });
+    }catch (err){
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+        res.json(result);
+    }
+}
 
+async function addGLJ(req, res){
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        data = JSON.parse(data);
+        let datas= await ration_glj_facade.addGLJ(data);
+        result.data=datas;
+    }catch (err){
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
 }
+
+async function replaceGLJ(req, res){
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        data = JSON.parse(data);
+        console.log(data);
+        let datas= await ration_glj_facade.replaceGLJ(data);
+        result.data=datas;
+    }catch (err){
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}
+
+async function mReplaceGLJ(req, res){
+    let result={
+        error:0
+    }
+    try {
+        let data = req.body.data;
+        data = JSON.parse(data);
+        console.log(data);
+        let datas= await ration_glj_facade.mReplaceGLJ(data);
+        result.data=datas;
+    }catch (err){
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+    }
+    res.json(result);
+}

+ 171 - 26
modules/ration_glj/facade/ration_glj_facade.js

@@ -18,13 +18,21 @@ let std_ration_lib_ration_items = mongoose.model('std_ration_lib_ration_items');
 let glj_calculate_facade = require('./glj_calculate_facade');
 let quantity_detail_facade = require('./quantity_detail_facade');
 let logger = require("../../../logs/log_helper").logger;
+import stdgljutil  from "../../../public/cache/std_glj_type_util";
+import EngineeringLibModel from "../../users/models/engineering_lib_model";
+import GljDao from "../../complementary_glj_lib/models/gljModel";
 
 
 module.exports={
     save:save,
     getData:getData,
     deleteByRation:deleteByRation,
-    getQuantityByProjectGLJ:getQuantityByProjectGLJ
+    getQuantityByProjectGLJ:getQuantityByProjectGLJ,
+    getLibInfo:getLibInfo,
+    getGLJData:getGLJData,
+    addGLJ:addGLJ,
+    replaceGLJ:replaceGLJ,
+    mReplaceGLJ:mReplaceGLJ
 }
 
 let operationMap={
@@ -55,29 +63,48 @@ async function getQuantityByProjectGLJ(condition) {
         ]
     }
 
+    let results = await  ration_glj.find(query,['projectGLJID','quantity','rationID'],{sort: {projectGLJID: 1}});
+    let rationList = _.uniq(_.map(results,'rationID'));
 
-    let results = await   ration_glj.find(query,['projectGLJID','quantity']);
-    return combineQuantity(results);
+    let rationQuery={
+        $and:[
+            {'projectID':condition.projectID},
+            {'ID':{$in:rationList}},
+            {'deleteInfo': null}
+        ]
+    }
+    let rations = await ration.find(rationQuery,['ID','quantity']);
+    return combineQuantity(results,rations);
 }
 
-function combineQuantity(results) {
-    var resultMap = {};
+function combineQuantity(results,rations) {
+    let resultList=[];
     _.forEach(results,function (data) {
-        if(resultMap.hasOwnProperty(data.projectGLJID)){
+        let tmp = {
+            projectGLJID:data.projectGLJID,
+            quantity: data.quantity
+        }
+        let ration=_.find(rations,{ID:data.rationID});
+        if(ration){
+            tmp.rationID=ration.ID;
+            tmp.rationQuantity=ration.quantity?Number(ration.quantity):undefined;
+        }
+        resultList.push(tmp);
+      /*  if(resultMap.hasOwnProperty(data.projectGLJID)){
             resultMap[data.projectGLJID] += data.quantity;
         }else {
             resultMap[data.projectGLJID] = data.quantity;
-        }
-    })
+        }*/
+    });
 
-    var resultList =[];
+ /*   var resultList =[];
     for(let key in resultMap){
        let newObject = {
             'projectGLJID':key,
             'quantity':resultMap[key]
         }
         resultList.push(newObject)
-    }
+    }*/
     return resultList;
 }
 
@@ -95,7 +122,7 @@ function get_lib_glj_info(ration_glj) {
                 ration_glj.basePrice = glj.basePrice;
                 ration_glj.shortName = glj.shortName;
                 ration_glj.type = glj.gljType;
-                ration_glj.repositoryId = glj.ration_glj
+                ration_glj.repositoryId = glj.repositoryId;
                 getInfoFromProjectGLJ(ration_glj).then(function (info) {
                     if(info){
                         let tem={};
@@ -127,6 +154,8 @@ function createNewRecord(ration_glj) {
     newRecoed.code = ration_glj.code;
     newRecoed.unit = ration_glj.unit;
     newRecoed.specs = ration_glj.specs;
+    newRecoed.from=ration_glj.from?ration_glj.from:undefined;
+    newRecoed.createType=ration_glj.createType?ration_glj.createType:undefined;
     newRecoed.shortName = ration_glj.shortName;
     newRecoed.type = ration_glj.type;
     newRecoed.repositoryId = ration_glj.repositoryId;
@@ -135,20 +164,7 @@ function createNewRecord(ration_glj) {
 }
 
 async function getInfoFromProjectGLJ(ration_glj) {
-     let data = {
-         glj_id: ration_glj.GLJID,
-         project_id: ration_glj.projectID,
-         code: ration_glj.code,
-         name: ration_glj.name,
-         specs: ration_glj.specs,
-         unit: ration_glj.unit,
-         type: ration_glj.type,
-         type_of_work: ration_glj.type,
-         base_price: ration_glj.basePrice,
-         market_price: ration_glj.basePrice,
-         repositoryId:ration_glj.repositoryId
-     };
-
+     let data = getGLJSearchInfo(ration_glj);
      try {
          let projectGljModel = new GLJListModel();
          let result = await projectGljModel.addList(data);
@@ -522,6 +538,134 @@ function save (user_id, datas, callback) {
     })
 }
 
+async function getLibInfo(req){
+    let gljLibId = null, engineeringId, sessionCompilation = req.session.sessionCompilation,
+        rationValuation = sessionCompilation.ration_valuation,
+        billValuation = sessionCompilation.bill_valuation,
+        engineeringLibModel = new EngineeringLibModel();
+    if(rationValuation[0]){
+        let engineeringList = rationValuation[0].engineering_list;
+        engineeringId = engineeringList.length > 0 ? engineeringList[0].engineering_id : null;
+        let engineeringInfo = await engineeringLibModel.getEngineering(engineeringId);
+        gljLibId = engineeringInfo.glj_lib.length > 0 && typeof engineeringInfo.glj_lib !== 'undefined' ? engineeringInfo.glj_lib[0].id : null;
+    }
+    else if(billValuation[0]){
+        let engineeringList = billValuation[0].engineering_list;
+        engineeringId = engineeringList.length > 0 ? engineeringList[0].engineering_id : null;
+        let engineeringInfo = await engineeringLibModel.getEngineering(engineeringId);
+        gljLibId = engineeringInfo.glj_lib.length > 0 && typeof engineeringInfo.glj_lib !== 'undefined' ? engineeringInfo.glj_lib[0].id : null;
+    }
+    let  data = {
+        userID: req.session.sessionUser.ssoId,
+        gljLibId: gljLibId,
+        compilationId: sessionCompilation._id
+    };
+    return data;
+}
+
+function getGLJData(info,callback) {
+    let gljDao = new GljDao();
+    let datas={};
+    let gljDistTypeCache = stdgljutil.getStdGljTypeCacheObj().toArray();
+    datas.distTypeTree=gljDistTypeCache;
+    async_n.parallel([
+        function (cb) {
+            gljDao.getGljTypes(info.gljLibId,function (err,data) {
+                if(err){
+                    cb(err);
+                }else {
+                    datas.treeData=data;
+                    cb(null);
+                }
+            })
+        },
+        function (cb) {
+            gljDao.getGljItems(info.gljLibId,info.userID,info.compilationId, function (err,data) {
+                if(err){
+                    cb(err);
+                }else {
+                    datas.stdGLJ=data.stdGljs;
+                    datas.complementaryGLJs=data.complementaryGljs;
+                    cb(null);
+                }
+            });
+        }
+    ], function (err) {
+        if(err){
+            callback(true, null);
+        }
+        else{
+            callback(false, datas);
+        }
+    })
+
+}
+
+function getGLJSearchInfo(ration_glj) {
+    let data = {
+        glj_id: ration_glj.GLJID,
+        project_id: ration_glj.projectID,
+        code: ration_glj.code,
+        name: ration_glj.name,
+        specs: ration_glj.specs,
+        unit: ration_glj.unit,
+        type: ration_glj.type,
+        type_of_work: ration_glj.type,
+        base_price: ration_glj.basePrice,
+        market_price: ration_glj.basePrice,
+        repositoryId:ration_glj.repositoryId,
+        from:ration_glj.from?ration_glj.from:'std'//std:标准工料机库, cpt:补充工料机库
+    };
+    return data;
+}
+
+
+async function addGLJ(rgList) {
+    let newRecodes = [];
+   for(let g of rgList){
+       let projectGljModel = new GLJListModel();
+       let result = await projectGljModel.addList(getGLJSearchInfo(g));
+       g.marketPrice=result.unit_price.market_price;
+       g.adjustPrice=result.unit_price.base_price;
+       g.basePrice=result.unit_price.base_price;
+       g.projectGLJID=result.id;
+       g.isEstimate=result.is_evaluate;
+       g.ID=uuidV1();
+       newRecodes.push(createNewRecord(g));
+   }
+    await ration_glj.insertMany(newRecodes);
+    let result={
+        newRecodes:newRecodes,
+        showData:rgList
+    }
+   return result;
+}
+
+async function replaceGLJ(data) {
+    let projectGljModel = new GLJListModel();
+    let result = await projectGljModel.addList(getGLJSearchInfo(data));
+    data.marketPrice=result.unit_price.market_price;
+    data.adjustPrice=result.unit_price.base_price;
+    data.basePrice=result.unit_price.base_price;
+    data.projectGLJID=result.id;
+    data.isEstimate=result.is_evaluate;
+    let updateResult=await ration_glj.findOneAndUpdate({ID:data.ID,projectID:data.projectID},data);
+    return data
+}
+async function mReplaceGLJ(data) {
+    let projectGljModel = new GLJListModel();
+    let result = await projectGljModel.addList(getGLJSearchInfo(data.doc));
+    data.doc.marketPrice=result.unit_price.market_price;
+    data.doc.adjustPrice=result.unit_price.base_price;
+    data.doc.basePrice=result.unit_price.base_price;
+    data.doc.projectGLJID=result.id;
+    data.doc.isEstimate=result.is_evaluate;
+    let updateResult=await ration_glj.update(data.query,data.doc,{multi: true});
+    console.log(updateResult);
+    return data
+}
+
+
 function getData(projectID, callback) {
     ration_glj.find({'projectID':projectID},(err,datas)=>{
         if(err){
@@ -538,4 +682,5 @@ function commonCallback(callback,result,err) {
     }else {
         callback(null,result);
     }
-}
+}
+

+ 4 - 1
modules/ration_glj/models/ration_glj.js

@@ -13,6 +13,7 @@ var ration_glj = new Schema({
     projectGLJID:Number,
     name:String,
     code:String,
+    rcode:String,
     specs:String,
     unit:String,
     shortName:String,
@@ -20,7 +21,9 @@ var ration_glj = new Schema({
     quantity:Number,
     customQuantity:Number,
     rationItemQuantity:Number,
-    marketPriceAdjust:Number
+    marketPriceAdjust:Number,
+    createType: {type: String,default:'normal'},//normal、add、replace  正常、添加工料机、替换工料机
+    from:{type: String,default:'std'}//std, cpt  来自标准工料机库、补充工料机库
 },{versionKey:false});
 
 mongoose.model('ration_glj', ration_glj);

+ 20 - 0
modules/ration_glj/routes/ration_glj_route.js

@@ -0,0 +1,20 @@
+/**
+ * Created by CSL on 2017-03-22.
+ */
+
+let express = require('express');
+let rgController = require('../controllers/ration_glj_controller');
+
+module.exports = function (app) {
+
+    var rgRouter = express.Router();
+    rgRouter.get('/getGLJData', rgController.getGLJData);
+    rgRouter.post('/addGLJ',rgController.addGLJ);
+    rgRouter.post('/replaceGLJ',rgController.replaceGLJ);
+    rgRouter.post('/mReplaceGLJ',rgController.mReplaceGLJ);
+    app.use('/rationGlj',rgRouter);
+}
+
+
+
+

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

@@ -20,6 +20,7 @@ var coeSchema = mongoose.Schema({
 var coeListSchema = mongoose.Schema({
     libID: Number,                      // 所属定额定ID
     ID: Number,                         // 系数ID(流水号ID)
+    serialNo: Number,                  //编号
     name: String,                       // 名称
     content: String,                    // 说明
     coes: [coeSchema]

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

@@ -36,6 +36,7 @@ var rationItemSchema = mongoose.Schema({
     caption: String,
     feeType: Number,
     jobContent: String,
+    annotation: String,
     rationGljList: [rationGljItemSchema],
     rationCoeList: Array,
     rationAssList: [rationAssItemSchema]

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

@@ -17,6 +17,7 @@ var rationChapterTreeSchema = new Schema({//章节树  //生成唯一id改为sec
     explanation: String,//说明
     ruleText: String,//计算规则,
     jobContentSituation: String,//工作内容适用情况,ALL适用本项全部定额,PARTIAL适用本项部分定额
+    annotationSituation: String,//附注适用情况,ALL适用本项全部定额,PARTIAL适用本项部分定额
     isDeleted: Boolean
 });
 var rationChapterTreeModel = chapterTreeDb.model("std_ration_lib_ration_chapter_trees", rationChapterTreeSchema, "std_ration_lib_ration_chapter_trees");

+ 2 - 7
package.json

@@ -8,7 +8,7 @@
     "babel-preset-es2015": "^6.24.1",
     "babel-preset-stage-2": "^6.24.1",
     "express": "^4.13.1",
-    "mongoose": "^4.8.5",
+    "mongoose": "~4.10.7",
     "async": "^2.1.5",
     "connect-mongo": "^1.3.2",
     "cookie-parser": "~1.4.3",
@@ -36,25 +36,20 @@
     "gulp-autoprefixer": "^3.0.1",
     "gulp-babel": "^6.1.1",
     "babel-core": "^6.4.0",
-    "gulp-cache": "^0.2.8",
     "gulp-cssnano": "^2.0.0",
     "gulp-eslint": "^0.13.2",
     "gulp-htmlmin": "^1.3.0",
-    "gulp-if": "^1.2.5",
     "gulp-imagemin": "^2.2.1",
     "gulp-load-plugins": "^0.10.0",
     "gulp-plumber": "^1.0.1",
     "gulp-sass": "^2.0.0",
     "gulp-size": "^1.2.1",
-    "gulp-sourcemaps": "^1.5.0",
     "gulp-uglify": "^1.1.0",
-    "gulp-useref": "^3.0.0",
     "gulp-inject":"^4.3.0",
     "gulp-concat": "^2.6.1",
     "main-bower-files": "^2.5.0",
     "wiredep": "^2.2.2",
-    "gulp-uglify-es":"^0.1.3",
-    "run-sequence":"^2.2.0"
+    "gulp-uglify-es":"^0.1.3"
   },
   "scripts": {
     "start": "C:\\Users\\mai\\AppData\\Roaming\\npm\\babel-node.cmd server.js"

+ 3 - 0
public/web/common_ajax.js

@@ -3,6 +3,9 @@
  */
 
 var CommonAjax = {
+    get:function (url,data,cb,dataType) {
+        $.get(url,data,cb,dataType)
+    },
     post: function (url, data, successCallback, errorCallback) {
         $.ajax({
             type:"POST",

+ 61 - 1
public/web/sheet/sheet_common.js

@@ -90,7 +90,7 @@ var sheetCommonObj = {
             area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
         }
     },
-    showData: function(sheet, setting, data) {
+    showData: function(sheet, setting, data,distTypeTree) {
         var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
         sheet.suspendPaint();
         sheet.suspendEvent();
@@ -132,6 +132,16 @@ var sheetCommonObj = {
                 if(val!=null&&setting.header[col].cellType === "checkBox"){
                     this.setCheckBoxCell(row,col,sheet,val)
                  }
+                 if(setting.owner==='gljTree'){
+                    if(setting.header[col].cellType === "checkBox"){
+                        val==1?val:0;
+                        this.setCheckBoxCell(row,col,sheet,val);
+                    }
+                    if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
+                        let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
+                        val=distTypeVal;
+                    }
+                 }
                 sheet.setValue(row, col, val, ch);
             }
         }
@@ -207,5 +217,55 @@ var sheetCommonObj = {
             }
         }
         return rst;
+    },
+    //add by zhong 2017-10-10
+    //动态下拉框,配合EnterCell, args.sheet.repaint();
+    getDynamicCombo: function () {
+        let ComboCellForActiveCell = function () { };
+        ComboCellForActiveCell.prototype = new GC.Spread.Sheets.CellTypes.ComboBox();
+        ComboCellForActiveCell.prototype.paintValue = function (ctx, value, x, y, w, h, style, options) {
+            let sheet = options.sheet;
+            if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex()) {
+                GC.Spread.Sheets.CellTypes.ComboBox.prototype.paintValue.apply(this, arguments);
+
+            } else {
+                GC.Spread.Sheets.CellTypes.Base.prototype.paintValue.apply(this, arguments);
+            }
+        };
+        ComboCellForActiveCell.prototype.getHitInfo = function (x, y, cellStyle, cellRect, options) {
+            let sheet = options.sheet;
+            if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex()) {
+                return GC.Spread.Sheets.CellTypes.ComboBox.prototype.getHitInfo.apply(this, arguments);
+
+            } else {
+                return GC.Spread.Sheets.CellTypes.Base.prototype.getHitInfo.apply(this, arguments);
+            }
+        };
+        return new ComboCellForActiveCell();
+    },
+    setDynamicCombo: function (sheet, beginRow, col, rowCount, items, itemsHeight, itemsType) {
+        let me = this;
+        sheet.suspendPaint();
+        let combo = me.getDynamicCombo();
+        for(let i = 0, len = rowCount; i < len; i++){
+            if(itemsHeight) combo.itemHeight(itemsHeight);
+            if(itemsType === 'value') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+            else if(itemsType === 'text') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
+            else combo.items(items);
+            sheet.getCell(beginRow + i, col).cellType(combo);
+        }
+        sheet.resumePaint();
+    },
+    setStaticCombo: function (sheet, beginRow, col, rowCount, items, itemsHeight, itemsType) {
+        sheet.suspendPaint();
+        let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
+        for(let i = 0, len = rowCount; i < len; i++){
+            if(itemsHeight) combo.itemHeight(itemsHeight);
+            if(itemsType === 'value') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+            else if(itemsType === 'text') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
+            else combo.items(items);
+            sheet.getCell(beginRow + i, col).cellType(combo);
+        }
+        sheet.resumePaint();
     }
 }

+ 52 - 40
public/web/sheet/sheet_data_helper.js

@@ -55,35 +55,44 @@ var SheetDataHelper = {
         spread.getActiveSheet().setRowCount(3);
         return spread;
     },
+    massOperationSheet: function (sheet, Operation) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        Operation();
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    },
     loadSheetHeader: function (setting, sheet) {
-        if (setting.frozenCols) {
-            sheet.frozenColumnCount(setting.frozenCols);
-        }
-        sheet.setColumnCount(setting.cols.length);
-        sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
-        if (setting.headRowHeight) {
-            setting.headRowHeight.forEach(function (rowHeight, index) {
-                sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
-            });
-        }
-        if (setting.cols) {
+        this.massOperationSheet(sheet, function () {
+            if (setting.frozenCols) {
+                sheet.frozenColumnCount(setting.frozenCols);
+            }
             sheet.setColumnCount(setting.cols.length);
-            setting.cols.forEach(function (col, index) {
-                var i, iRow = 0, cell;
-                for (i = 0; i < col.head.spanCols.length; i++) {
-                    if (col.head.spanCols[i] !== 0) {
-                        cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
-                        cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
-                    }
-                    if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
-                        sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
-                    }
-                    iRow += col.head.spanRows[i];
-                };
-                sheet.setColumnWidth(index, col.width);
-                sheet.setColumnVisible(index, col.visible);
-            });
-        }
+            sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
+            if (setting.headRowHeight) {
+                setting.headRowHeight.forEach(function (rowHeight, index) {
+                    sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
+                });
+            }
+            if (setting.cols) {
+                sheet.setColumnCount(setting.cols.length);
+                setting.cols.forEach(function (col, index) {
+                    var i, iRow = 0, cell;
+                    for (i = 0; i < col.head.spanCols.length; i++) {
+                        if (col.head.spanCols[i] !== 0) {
+                            cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
+                            cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                        }
+                        if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
+                            sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
+                        }
+                        iRow += col.head.spanRows[i];
+                    };
+                    sheet.setColumnWidth(index, col.width);
+                    sheet.setColumnVisible(index, col.visible);
+                });
+            }
+        });
     },
     protectdSheet: function (sheet) {
         var option = {
@@ -127,25 +136,28 @@ var SheetDataHelper = {
             let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
             if (setting.pos && text && text !== '') {
                 if (!this._toolTipElement) {
-                    var div = document.createElement("div");
-                    $(div).css("position", "absolute")
-                        .css("border", "1px #C0C0C0 solid")
-                        .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
-                        .css("font", "9pt Arial")
-                        .css("background", "white")
-                        .css("padding", 5);
-
+                    let div = $('#autoTip')[0];
+                    if (!div) {
+                        div = document.createElement("div");
+                        $(div).css("position", "absolute")
+                            .css("border", "1px #C0C0C0 solid")
+                            .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
+                            .css("font", "9pt Arial")
+                            .css("background", "white")
+                            .css("padding", 5)
+                            .attr("id", 'autoTip');
+                        $(div).hide();
+                        document.body.insertBefore(div, null);
+                    }
                     this._toolTipElement = div;
+                    $(this._toolTipElement).text(text).css("top", setting.pos.y + hitinfo.y + 15).css("left", setting.pos.x + hitinfo.x + 15);
+                    $(this._toolTipElement).show("fast");
                 }
-                $(this._toolTipElement).text(text).css("top", setting.pos.y + hitinfo.y + 15).css("left", setting.pos.x + hitinfo.x + 15);
-                $(this._toolTipElement).hide();
-                document.body.insertBefore(this._toolTipElement, null);
-                $(this._toolTipElement).show("fast");
             }
         };
         TipCellType.prototype.processMouseLeave = function (hininfo) {
             if (this._toolTipElement) {
-                document.body.removeChild(this._toolTipElement);
+                $(this._toolTipElement).hide();
                 this._toolTipElement = null;
             }
         }

+ 1 - 0
public/web/tree_sheet/tree_sheet_controller.js

@@ -18,6 +18,7 @@ var TREE_SHEET_CONTROLLER = {
         controller.prototype.showTreeData = function () {
             var that = this;
             TREE_SHEET_HELPER.showTreeData(this.setting, this.sheet, this.tree);
+            this.sheet.unbind(GC.Spread.Sheets.Events.SelectionChanged);
             this.sheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) {
                 that.setTreeSelected(that.tree.items[info.newSelections[0].row]);
             });

+ 34 - 32
public/web/tree_sheet/tree_sheet_helper.js

@@ -156,11 +156,11 @@ var TREE_SHEET_HELPER = {
         });
     },
     showTreeData: function (setting, sheet, tree) {
-        var indent = 20;
-        var halfBoxLength = 5;
-        var halfExpandLength = 3;
+        let indent = 20;
+        let halfBoxLength = 5;
+        let halfExpandLength = 3;
 
-        var TreeNodeCellType = function () {
+        let TreeNodeCellType = function () {
         };
         TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
@@ -173,7 +173,7 @@ var TREE_SHEET_HELPER = {
                 ctx.clearRect(x, y, w, h);
             }
             // ������(x1, y1)���(��, ��), (x2, y2)�յ�(��, ��), ��ɫ
-            var drawLine = function (canvas, x1, y1, x2, y2, color) {
+            let drawLine = function (canvas, x1, y1, x2, y2, color) {
                 ctx.save();
                 // ����ƫ����
                 ctx.translate(0.5, 0.5);
@@ -184,8 +184,8 @@ var TREE_SHEET_HELPER = {
                 ctx.stroke();
                 ctx.restore();
             };
-            var drawExpandBox = function (ctx, x, y, w, h, centerX, centerY, expanded) {
-                var rect = {}, h1, h2, offset = 1;
+            let drawExpandBox = function (ctx, x, y, w, h, centerX, centerY, expanded) {
+                let rect = {}, h1, h2, offset = 1;
                 rect.top = centerY - halfBoxLength;
                 rect.bottom = centerY + halfBoxLength;
                 rect.left = centerX - halfBoxLength;
@@ -221,16 +221,15 @@ var TREE_SHEET_HELPER = {
                     }
                 }
             }
-            var node = tree.items[options.row];
-            var showTreeLine = true;
+            let node = tree.items[options.row];
+            let showTreeLine = true;
 
             if (!node) { return; }
 
-            var iLevel = node.depth();
-            var centerX = Math.floor(x) + node.depth() * indent + indent / 2;
-            var x1 = centerX + indent / 2;
-            var centerY = Math.floor((y + (y + h)) / 2);
-            var y1;
+            let centerX = Math.floor(x) + node.depth() * indent + indent / 2;
+            let x1 = centerX + indent / 2;
+            let centerY = Math.floor((y + (y + h)) / 2);
+            let y1;
             // Draw Sibling Line
             if (showTreeLine) {
                 // Draw Horizontal Line
@@ -280,17 +279,17 @@ var TREE_SHEET_HELPER = {
             };
         };
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
-            var offset = -1;
-            var node = tree.items[hitinfo.row];
+            let offset = -1;
+            let node = tree.items[hitinfo.row];
             tree.selected = node;
             if (!node || node.children.length === 0) { return; }
-            var centerX = hitinfo.cellRect.x + offset + node.depth() * indent + indent / 2;
-            var centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
+            let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + indent / 2;
+            let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
 
             if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) {
                 node.setExpanded(!node.expanded);
                 TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () {
-                    var iCount = node.posterityCount(), i, child;
+                    let iCount = node.posterityCount(), i, child;
                     for (i = 0; i < iCount; i++) {
                         child = tree.items[hitinfo.row + i + 1];
                         hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.visible, hitinfo.sheetArea);
@@ -320,25 +319,28 @@ var TREE_SHEET_HELPER = {
             let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
             if (setting.pos && text && text !== '') {
                 if (!this._toolTipElement) {
-                    var div = document.createElement("div");
-                    $(div).css("position", "absolute")
-                        .css("border", "1px #C0C0C0 solid")
-                        .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
-                        .css("font", "9pt Arial")
-                        .css("background", "white")
-                        .css("padding", 5);
-
+                    let div = $('#autoTip')[0];
+                    if (!div) {
+                        div = document.createElement("div");
+                        $(div).css("position", "absolute")
+                            .css("border", "1px #C0C0C0 solid")
+                            .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
+                            .css("font", "9pt Arial")
+                            .css("background", "white")
+                            .css("padding", 5)
+                            .attr("id", 'autoTip');
+                        $(div).hide();
+                        document.body.insertBefore(div, null);
+                    }
                     this._toolTipElement = div;
+                    $(this._toolTipElement).text(text).css("top", setting.pos.y + hitinfo.y + 15).css("left", setting.pos.x + hitinfo.x + 15);
+                    $(this._toolTipElement).show("fast");
                 }
-                $(this._toolTipElement).text(text).css("top", setting.pos.y + hitinfo.y + 15).css("left", setting.pos.x + hitinfo.x + 15);
-                $(this._toolTipElement).hide();
-                document.body.insertBefore(this._toolTipElement, null);
-                $(this._toolTipElement).show("fast");
             }
         };
         TipCellType.prototype.processMouseLeave = function (hitinfo) {
             if (this._toolTipElement) {
-                document.body.removeChild(this._toolTipElement);
+                $(this._toolTipElement).hide();
                 this._toolTipElement = null;
             }
         }

+ 5 - 2
server.js

@@ -28,6 +28,9 @@ fileUtils.getGlobbedFiles('./modules/reports/models/*.js').forEach(function(mode
     require(path.resolve(modelPath));
 })
 
+// 引入人工系数模块
+require('./modules/main/models/labour_coe');
+
 //config.setupCache();
 let cfgCacheUtil = require("./config/cacheCfg");
 cfgCacheUtil.setupDftCache();
@@ -42,8 +45,8 @@ app.engine('.html', require('ejs').__express);
 app.set('view engine', 'html');
 
 let bodyParser = require('body-parser');
-app.use(bodyParser.urlencoded({extended: false}));
-app.use(bodyParser.json());
+app.use(bodyParser.urlencoded({limit: '3mb', extended: false}));
+app.use(bodyParser.json({limit: '3mb'}));
 
 app.use(session({
     name: 'usersSession',

+ 6 - 30
web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html

@@ -19,33 +19,8 @@
 </head>
 <body>
     <div class="header">
-        <!-- <div class="top-msg clearfix">
-            <div class="alert alert-warning mb-0 py-0" role="alert">
-                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
-                  <span aria-hidden="true">&times;</span>
-                </button>
-                <strong>Warning!</strong> Better check yourself, you're not looking too good.
-            </div>
-        </div> -->
-        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
-            <span class="header-logo px-2">Smartcost</span>
-            <div class="navbar-text"><a href="/pm">项目管理</a></div>
-            <div class="float-lg-right navbar-text pt-0">
-                <div class="dropdown d-inline-block">
-                    <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown">陈特</button>
-                    <div class="dropdown-menu dropdown-menu-right">
-                        <a class="dropdown-item" href="user-info.html" target="_blank">账号资料</a>
-                        <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
-                        <a class="dropdown-item" href="user-set.html" target="_blank">偏好设置</a>
-                    </div>
-                </div>
-                <span class="btn btn-link btn-sm new-msg">
-                  <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
-                </span>
-                <button class="btn btn-link btn-sm">注销</button>
-            </div>
-        </nav>
-        <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+        <%include ../../../common/html/header.html %>
+        <nav class="navbar navbar-expand-lg justify-content-between navbar-light p-0">
             <ul class="nav navbar-nav px-1">
                 <li class="nav-item">
                     <a class="nav-link" href="#" aria-expanded="false"><i class="fa fa-sliders"></i> 选项</a>
@@ -110,7 +85,7 @@
           <div class="modal-dialog modal-lg" role="document" id="modalCon">
               <div class="modal-content" >
                   <div class="modal-header">
-                    <h5 class="modal-title">内容</h5>
+                    <h5 class="modal-title">选择组成物</h5>
                       <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                         <span aria-hidden="true">&times;</span>
                       </button>
@@ -201,10 +176,10 @@
         </div>
     </div>
     <!-- JS. -->
-    <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/lib/jquery/jquery-3.2.1.min.js"></script>
     <script src="/lib/jquery-contextmenu/jquery.contextMenu.min.js"></script>
     <script src="/lib/jquery-contextmenu/jquery.ui.position.js"></script>
-    <script src="/lib/tether/tether.min.js"></script>
+    <script src="/lib/popper/popper.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
     <!-- zTree -->
@@ -219,6 +194,7 @@
     <script type="text/javascript" src="/web/building_saas/complementary_glj_lib/js/gljComponent.js"></script>
     <script type="text/javascript" src="/web/building_saas/complementary_glj_lib/js/components.js"></script>
     <script type="text/javascript" src="/public/web/ztree_common.js"></script>
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
     <script type="text/javascript" src="/web/building_saas/complementary_glj_lib/js/sheetOpr.js"></script>
     <script type="text/javascript" src="/public/web/storageUtil.js"></script>
     <SCRIPT type="text/javascript">

+ 13 - 22
web/building_saas/complementary_glj_lib/js/components.js

@@ -17,7 +17,7 @@ let componentOprObj = {
             {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:120,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
             {headerName:"规格型号",headerWidth:80,dataCode:"specs", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName:"计量单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"单价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
             {headerName:"类型",headerWidth:80,dataCode:"gljType", dataType: "String",  hAlign: "center", vAlign: "center"}
         ]
@@ -27,11 +27,18 @@ let componentOprObj = {
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 1, "@", GC.Spread.Sheets.SheetArea.viewport);
-        me.workBook.getSheet(0).options.isProtected = true;
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.workBook.bind(GC.Spread.Sheets.Events.ButtonClicked, me.onButtonClicked);//复选框点击事件
         me.componentsBtnOpr($('#componentsConf'));
         me.radiosChange();
     },
+    onClipboardPasting: function (sender, args) {
+        args.cancel = true;
+    },
+    onCellEditStart: function (sender, args) {
+        args.cancel = true;
+    },
     onButtonClicked: function (sender, args) {
         let me = componentOprObj, re = repositoryGljObj;
         let val = args.sheet.getValue(args.row, args.col);
@@ -61,19 +68,6 @@ let componentOprObj = {
                         break;
                     }
                 }
-            /*    if($("input[name='glj']:checked").val() === 'selectedGljs'){//radio为已选工料机时
-                    me.showGljList = [];
-                    me.setShowGljList(me.selectedList, false);
-                    re.sortGlj(me.showGljList);
-                    //重新显示
-                    me.showGljItems(me.showGljList, me.gljCurTypeId);
-                    if (re.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {//更新cache
-                        me.currentOprParent = 1;
-                        me.currentCache = me.getParentCache(re.parentNodeIds["_pNodeId_" + me.gljCurTypeId]);
-                    } else {
-                        me.currentCache = me.getCache();
-                    }
-                }*/
             }
         }
     },
@@ -108,7 +102,7 @@ let componentOprObj = {
     //初始默认radio
     initRadio: function () {
         let that = repositoryGljObj, me = componentOprObj;
-        $('#searchGlj').val('');//恢复搜索文本
+        //$('#searchGlj').val('');//恢复搜索文本
         //初始化组成物列表
         me.selectedList = [].concat(that.currentComponent);
         //默认radio所有工料机
@@ -133,8 +127,6 @@ let componentOprObj = {
             let val = $("input[name='glj']:checked").val();
             me.radiosSelected = val;
             //选择改变,数据重新筛选显示
-            //清空选中的组成物列表
-            //me.selectedList = [];
             me.showGljList = [];
             if(me.radiosSelected === 'allGljs'){
                 me.setShowGljList(re.stdGljList);
@@ -209,9 +201,7 @@ let componentOprObj = {
             }
             sheetOpr.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
             sheetOpr.showData(me.workBook.getSheet(0), me.setting, cacheSection, re.distTypeTree);
-            me.workBook.getSheet(0).options.isProtected = true;
             me.workBook.getSheet(0).setRowCount(cacheSection.length);
-            sheetOpr.setLockCols(me.workBook.getSheet(0), [4], true);
             cacheSection = null;
         }
     },
@@ -227,13 +217,14 @@ let componentOprObj = {
                 let isExist = false;
                 for(let j = 0, jLen = re.currentGlj.component.length; j < jLen; j++){
                     if(me.selectedList[i].ID === re.currentGlj.component[j].ID){
-                        newComponent.push({ID: me.selectedList[i].ID, consumeAmt: re.currentGlj.component[j].consumeAmt});
+                        newComponent.push({isStd: typeof me.selectedList[i].isStd !== 'undefined' ? me.selectedList[i].isStd : false
+                            , ID: me.selectedList[i].ID, consumeAmt: re.currentGlj.component[j].consumeAmt});
                         isExist = true;
                         break;
                     }
                 }
                 if(!isExist){
-                    newComponent.push({ID: me.selectedList[i].ID, consumeAmt: 0});
+                    newComponent.push({isStd: typeof me.selectedList[i].isStd !== 'undefined' ? me.selectedList[i].isStd : false, ID: me.selectedList[i].ID, consumeAmt: 0});
                 }
                 //re.currentGlj.component.push({ID: me.selectedList[i].ID, consumeAmt: 0});
             }

+ 71 - 57
web/building_saas/complementary_glj_lib/js/glj.js

@@ -21,7 +21,6 @@ let pageOprObj = {
             repositoryGljObj.getGljTree(stdGljLibId, function () {
                 repositoryGljObj.getGljItems(me.stdGljLibId, me.userId, me.compilationId);
             });
-            sheetOpr.shieldAllCells(repositoryGljObj.workBook.getSheet(0), repositoryGljObj.setting);
         });
     }
 };
@@ -85,10 +84,6 @@ let repositoryGljObj = {
             }
         });
         distTypeTree.distTypesArr.forEach(function (distTypeObj) {
-           /* if(distTypeObj.children.length === 0 && distTypeObj.data.fullName !== '普通机械' &&distTypeObj.data.fullName !== '机械组成物'
-                && distTypeObj.data.fullName !== '机上人工'){
-                distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
-            }*/
             if(distTypeObj.data.fullName !== '材料' && distTypeObj.data.fullName !== '机械'){
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }
@@ -105,15 +100,11 @@ let repositoryGljObj = {
                 if(!result.error && callback){
                     me.distTypeTree = me.getComboData(result.data);
                     console.log(me.distTypeTree);
-                    let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-                    combo.items(me.distTypeTree.comboDatas).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
-                    me.workBook.getSheet(0).getCell(-1, 5, GC.Spread.Sheets.SheetArea.viewport).cellType(combo).value(me.distTypeTree.comboDatas[0].text);
                     callback();
                 }
             }
         })
     },
-
     getGljTree: function(gljLibId, callback) {
         let me = this;
         $.ajax({
@@ -156,6 +147,7 @@ let repositoryGljObj = {
                     me.complementaryGljList = result.data.complementaryGljs;
                     me.workBook.getSheet(0).setRowCount(me.stdGljList.length);
                     me.sortGlj(me.stdGljList);
+                    me.setProp('isStd', true, me.stdGljList);
                     me.sortGlj(me.complementaryGljList);
                     let rootNode = me.treeObj.getNodes()[0];
                     if(rootNode && rootNode.isParent && rootNode.isFirstNode){
@@ -184,6 +176,8 @@ let repositoryGljObj = {
             }
             sheetOpr.cleanData(me.workBook.getSheet(0), me.setting, -1);
             sheetOpr.showData(me.workBook.getSheet(0), me.setting, cacheSection, me.distTypeTree);
+            sheetCommonObj.setStaticCombo(me.workBook.getActiveSheet(), 0, 5, cacheSection.length, me.distTypeTree.comboDatas, false, 'text');
+            sheetCommonObj.setDynamicCombo(me.workBook.getActiveSheet(), cacheSection.length, 5, me.workBook.getActiveSheet().getRowCount() - cacheSection.length, me.distTypeTree.comboDatas, false, 'text');
 
             cacheSection = null;
         }
@@ -198,6 +192,7 @@ let repositoryGljObj = {
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.SelectionChanged, me.onSelectionChanged);
+        me.workBook.bind(GC.Spread.Sheets.Events.ButtonClicked, me.onButtonClicked);//复选框点击事件
     },
     getCurrentComponent: function (gljComponent) {
         let me = repositoryGljObj, rst = [];
@@ -205,6 +200,7 @@ let repositoryGljObj = {
             let obj = {};
             for(let j = 0; j < me.complementaryGljList.length; j++){
                 if(gljComponent[i].ID == me.complementaryGljList[j].ID){
+                    obj.isStd = false;
                     obj.ID = me.complementaryGljList[j].ID;
                     obj.code = me.complementaryGljList[j].code;
                     obj.name = me.complementaryGljList[j].name;
@@ -216,6 +212,7 @@ let repositoryGljObj = {
             }
             for(let j = 0; j < me.stdGljList.length; j++){
                 if(gljComponent[i].ID == me.stdGljList[j].ID){
+                    obj.isStd = true;
                     obj.ID = me.stdGljList[j].ID;
                     obj.code = me.stdGljList[j].code;
                     obj.name = me.stdGljList[j].name;
@@ -288,11 +285,6 @@ let repositoryGljObj = {
         //混凝土202、砂浆203、配合比204、机械3
         if(typeof info.oldSelections || info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
             let row = info.newSelections[0].row;
-            sheetOpr.lockCells(that.workBook.getSheet(0), that.setting);
-            that.workBook.getSheet(0).getRange(-1, 0 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-            that.workBook.getSheet(0).getRange(-1, 4 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-            that.isLocked = true;
-            //that.workBook.getSheet(0).options.isProtected = true;
             sheetOpr.cleanSheet(that.workBook.getSheet(0), that.setting, -1);
             me.workBook.focus(true);
             me.currentComponent = [];
@@ -301,9 +293,6 @@ let repositoryGljObj = {
                 //标记当前工料机
                 me.currentGlj = me.currentCache[row];
                 if(me.allowComponent.indexOf(me.currentCache[row].gljType) !== -1){
-                    //that.workBook.getSheet(0).getRange(-1, 0 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-                    that.workBook.getSheet(0).getRange(-1, 4 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-                    that.isLocked = false;
                     //展示数据
                     if(me.currentGlj.component.length > 0){
                         me.currentComponent = me.getCurrentComponent(me.currentGlj.component);
@@ -320,6 +309,7 @@ let repositoryGljObj = {
     },
     onEnterCell: function (sender, args) {
         let me = repositoryGljObj;
+        args.sheet.repaint();
         me.cellRowIdx = args.row;
         let isHasData = false;
         if(me.addGljObj){
@@ -361,24 +351,13 @@ let repositoryGljObj = {
                 }
                 else {
                     $('#gljAlertBtn').click();
-                    //me.workBook.getSheet(0).options.isProtected = true;
-                    sheetOpr.lockAllCells(args.sheet);
                     $('#aleConfBtn').click(function () {
-                        // me.workBook.getSheet(0).options.isProtected = false;
-                        sheetOpr.unLockAllCells(args.sheet);
-                        sheetOpr.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
                     $('#gljAleClose').click(function () {
-                        // me.workBook.getSheet(0).options.isProtected = false;
-                        sheetOpr.unLockAllCells(args.sheet);
-                        sheetOpr.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
                     $('#aleCanceBtn').click(function () {
-                        // me.workBook.getSheet(0).options.isProtected = false;
-                        sheetOpr.unLockAllCells(args.sheet);
-                        sheetOpr.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
                         me.addGljObj = null;
                         me.workBook.getSheet(0).suspendPaint();
                         me.workBook.getSheet(0).suspendEvent();
@@ -396,21 +375,31 @@ let repositoryGljObj = {
             }
         }
     },
+    onButtonClicked: function (sender, args) {
+        let me = repositoryGljObj;
+        if(args.col === 6 && args.row < me.currentCache.length){
+            args.sheet.setValue(args.row, args.col, true);
+        }
+    },
     onCellEditStart: function(sender, args) {
         let me = repositoryGljObj;
         let rObj = sheetOpr.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
         me.currentEditingGlj = rObj;
         me.orgCode = me.workBook.getSheet(0).getValue(args.row, 0);
-        let cacheSection = me.complementaryGljList;
-        if (cacheSection) {
-            for (let j = 0; j < cacheSection.length; j++) {
-                if (cacheSection[j][me.setting.header[0].dataCode] && cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
-                    rObj["ID"] = cacheSection[j]["ID"];
-                    rObj.gljClass = cacheSection[j].gljClass;
-                    break;
-                }
+        if(args.row < me.currentCache.length){
+            me.currentGlj = me.currentCache[args.row];
+            if(args.col === 0 || (args.col === 4 && me.allowComponent.indexOf(me.currentGlj.gljType) !== -1)
+                || args.col === 6){
+                args.cancel = true;
+            }
+            else {
+                rObj.ID = me.currentGlj.ID;
+                rObj.gljClass = me.currentGlj.gljClass;
             }
         }
+        else {
+            me.currentGlj = null;
+        }
     },
     onCellEditEnd: function(sender, args) {
         let me = repositoryGljObj, that = gljComponentOprObj,
@@ -450,7 +439,6 @@ let repositoryGljObj = {
                                     }
                                 }
                             sheetOpr.cleanData(that.workBook.getSheet(0), that.setting, 5);
-                            that.isLocked = me.allowComponent.indexOf(rObj.gljType) !== -1 ? false : true;
                         }
                         else if(rObj.basePrice !== me.currentEditingGlj.basePrice){//修改了单价,可修改单价的必为可成为组成物的
                             //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
@@ -533,7 +521,6 @@ let repositoryGljObj = {
         }
         if(updateArr.length >0 || addArr.length >0){
             me.currentEditingGlj = null;
-            //me.workBook.getSheet(0).setValue(11, 5, "人工");
             me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
@@ -607,12 +594,9 @@ let repositoryGljObj = {
                                 }
                                 $('#alertText').text(text + "不可为空!");
                                 $('#codeAlertBtn').click();
-                                sheet.options.isProtected = true;
                                 $('#codAleConfBtn').click(function () {
-                                    sheetOpr.lockSomeCodes(sheet, 0, cacheSection.length);
                                 });
                                 $('#codAleClose').click(function () {
-                                    sheetOpr.lockSomeCodes(sheet, 0, cacheSection.length);
                                 });
                             }
                         }
@@ -702,11 +686,12 @@ let repositoryGljObj = {
                             }
                         }
                     }
-                    tempObj.gljType = me.distTypeTree.comboDatas[i].value;
-                    tempObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + tempObj.gljType].data.shortName;
+                    tempObj.component = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.component : [];
                     if(me.allowComponent.indexOf(tempObj.gljType) !== -1){
-                        tempObj.basePrice = 0;
+                        tempObj.basePrice = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.basePrice : 0;
                     }
+                    tempObj.gljType = me.distTypeTree.comboDatas[i].value;
+                    tempObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + tempObj.gljType].data.shortName;
                     break;
                 }
             }
@@ -782,11 +767,39 @@ let repositoryGljObj = {
         pasteObj.gljClass = me.gljCurTypeId;
         return true;
     },
+    canPasted: function (info) {
+        let rst = true;
+        let me = repositoryGljObj;
+        if(me.gljCurTypeId < 0){
+            return false;
+        }
+        if(info.cellRange.col + info.cellRange.colCount - 1 > me.setting.header.length - 2){
+            return false;
+        }
+        if(info.cellRange.row < me.currentCache.length){
+            if(info.cellRange.col === 0){
+                return false;
+            }
+            else if(info.cellRange.col <= 4 && info.cellRange.col + info.cellRange.colCount - 1 >= 4){
+                for(let i = 0, len = info.cellRange.rowCount; i < len; i++){
+                    let row = i + info.cellRange.row;
+                    if(row < me.currentCache.length){
+                        if(me.allowComponent.indexOf(me.currentCache[row].gljType) !== -1){
+                            rst = false;
+                        }
+                    }
+                    else {
+                        break;
+                    }
+                }
+            }
+        }
+        return rst;
+    },
     onClipboardPasting: function(sender, args) {
         let me = repositoryGljObj;
         let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
-        //复制的列数超过正确的列数,不可复制
-        if (me.gljCurTypeId < 0 || maxCol >= me.setting.header.length -1) {
+        if (!me.canPasted(args)) {
             args.cancel = true;
         }
     },
@@ -957,11 +970,14 @@ let repositoryGljObj = {
                     }
                     else{
                         me.currentCache = me.getCache();
-                        //sheetOpr.unLockAllCells(me.workBook.getSheet(0));
-                        sheetOpr.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
-                        //sheetOpr.lockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
                     }
                     me.showGljItems(me.complementaryGljList, me.gljCurTypeId);
+                    //getCurrentGlj
+                    let row = me.workBook.getSheet(0).getSelections()[0].row;
+                    me.currentGlj = row < me.currentCache.length ? me.currentCache[row] : null;
+                    me.currentComponent = me.currentGlj ?  me.getCurrentComponent(me.currentGlj.component) : [];
+                    sheetOpr.cleanData(gljComponentOprObj.workBook.getSheet(0), gljComponentOprObj.setting, -1);
+                    sheetOpr.showData(gljComponentOprObj.workBook.getSheet(0), gljComponentOprObj.setting, me.currentComponent);
                 }
             },
             error:function(err){
@@ -1030,6 +1046,12 @@ let repositoryGljObj = {
         }
         //allgljs
     },
+    setProp: function (prop, value, gljList) {
+        let me = this;
+        for(let i = 0, len = gljList.length; i < len; i++){
+            gljList[i][prop] = value;
+        }
+    },
     sortGlj: function(gljList) {
         let me = this;
         gljList.sort(function(a, b){
@@ -1047,25 +1069,17 @@ let gljTypeTreeOprObj = {
             that = gljComponentOprObj,
             gljTypeId = treeNode.ID;
         me.gljCurTypeId = treeNode.ID;
-        that.isLocked = true;
         //消除新增到一半的数据
         me.addGljObj = null;
         //me.currentCache = me.getCache();
         sheetOpr.cleanData(that.workBook.getSheet(0), that.setting, 5);
-        that.workBook.getSheet(0).getRange(-1, 0 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-        that.workBook.getSheet(0).getRange(-1, 4 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-        me.workBook.getSheet(0).getRange(-1, 6 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-        //that.workBook.getSheet(0).options.isProtected = true;
         if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
             me.currentOprParent = 1;
             me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + treeNode.ID]);
-            sheetOpr.lockCodeCells(me.workBook.getSheet(0), me.currentCache.length);
             me.workBook.getSheet(0).setRowCount(me.currentCache.length);
         } else {
             me.currentOprParent = 0;
             me.currentCache = me.getCache();
-            sheetOpr.unLockAllCells(me.workBook.getSheet(0));
-            sheetOpr.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
         }
         me.showGljItems(me.complementaryGljList, gljTypeId);
     }

+ 20 - 12
web/building_saas/complementary_glj_lib/js/gljComponent.js

@@ -9,12 +9,12 @@ let gljComponentOprObj = {
         header:[
             {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:110,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"计量单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"单价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
             {headerName:"消耗量",headerWidth:80,dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center"}
         ],
         view: {
-            lockedCells:[0, 1, 2, 3]
+            lockedCols:[0, 1, 2, 3]
         }
     },
     buildSheet: function(container) {
@@ -22,7 +22,6 @@ let gljComponentOprObj = {
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 0, "@", GC.Spread.Sheets.SheetArea.viewport);
-        me.workBook.getSheet(0).options.isProtected = true;
         sheetOpr.cleanData(me.workBook.getSheet(0), me.setting, -1);
 
         me.onContextmenuOpr();//右键菜单
@@ -31,11 +30,6 @@ let gljComponentOprObj = {
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
         me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
-        /*me.gljComponentDelOpr();
-        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
-        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);*/
 
     },
     getRowData: function (sheet, row, setting) {
@@ -68,14 +62,17 @@ let gljComponentOprObj = {
                 let target = sheet.hitTest(x, y);
                 if(target.hitTestType === 3 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'){//在表格内
                     sheet.setActiveCell(target.row, target.col);
+                    //getCurrentGlj
+                    let thatRow = that.workBook.getSheet(0).getSelections()[0].row
+                    that.currentGlj = thatRow < that.currentCache.length ? that.currentCache[thatRow] : null;
+                    that.currentComponent = that.currentGlj ?  that.getCurrentComponent(that.currentGlj.component) : [];
                     //控制按钮是否可用
                     let insertDis = false,
                         delDis = false;
-                    if(me.isLocked){
+                    if(!(that.currentGlj && that.allowComponent.indexOf(that.currentGlj.gljType) !== -1)){
                         insertDis = true;
-                        delDis = true;
                     }
-                    if(typeof that.currentComponent !== 'undefined' && target.row >= that.currentComponent.length){//右键定位在有组成物的行,删除键才显示可用
+                    if(!that.currentGlj || typeof that.currentComponent === 'undefined' || (typeof that.currentComponent !== 'undefined' && target.row >= that.currentComponent.length)){//右键定位在有组成物的行,删除键才显示可用
                         delDis = true;
                     }
                     return {
@@ -209,6 +206,17 @@ let gljComponentOprObj = {
         let me = gljComponentOprObj, that = repositoryGljObj;
         let rObj = me.getRowData(args.sheet, args.row, me.setting);
         me.currentEditingComponent = rObj;
+        let thatRow = that.workBook.getSheet(0).getSelections()[0].row;
+        if(thatRow < that.currentCache.length){
+            that.currentGlj = that.currentCache[thatRow];
+            if(me.setting.view.lockedCols.indexOf(args.col) !== -1 || that.allowComponent.indexOf(that.currentGlj.gljType) === -1 ||
+                (args.col === 4 && (!that.currentComponent|| args.row >= that.currentComponent.length))){
+                args.cancel = true;
+            }
+        }
+        else {
+            args.cancel = true;
+        }
     },
     onCellEditEnd: function (sender, args) {
         let me = gljComponentOprObj, that = repositoryGljObj, updateBasePrc = [];
@@ -340,7 +348,7 @@ let gljComponentOprObj = {
         let me = gljComponentOprObj;
         let maxCol = info.cellRange.col + info.cellRange.colCount - 1;
         //复制的列数超过正确的列数,不可复制
-        if(maxCol >= me.setting.header.length){
+        if(info.cellRange.col !== 4 && info.cellRange.colCount > 1){
             args.cancel = true;
         }
     },

+ 0 - 37
web/building_saas/complementary_glj_lib/js/sheetOpr.js

@@ -119,11 +119,6 @@ let sheetOpr = {
         else{
             sheet.setRowCount(typeof repositoryGljObj !== 'undefined' && repositoryGljObj.currentOprParent === 1 ? data.length : data.length + 10);
         }
-        if(data.length === 0){
-            for(let i = 0; i < sheet.getRowCount(); i++){
-                sheet.getCell(i, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-            }
-        }
         for (var col = 0; col < setting.header.length; col++) {
             var hAlign = "left", vAlign = "center";
             if (setting.header[col].hAlign) {
@@ -137,23 +132,13 @@ let sheetOpr = {
                 sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
             }
             for (var row = 0; row < data.length; row++) {
-                //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
                 if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
-                    if(typeof repositoryGljObj !== 'undefined' && typeof repositoryGljObj.allowComponent !== 'undefined' && repositoryGljObj.allowComponent.indexOf(data[row].gljType) !== -1){
-                        sheet.getCell(row, 4, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-                    }
-                    else if(typeof repositoryGljObj !== 'undefined' && typeof repositoryGljObj.allowComponent !== 'undefined' && repositoryGljObj.allowComponent.indexOf(data[row].gljType) === -1){
-                        sheet.getCell(row, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-                    }
                     let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
                     sheet.setValue(row, col, distTypeVal, ch);
                 }
                 else {
                     sheet.setValue(row, col, data[row][setting.header[col].dataCode], ch);
                     sheet.setTag(row, 0, data[row].ID, ch);
-                    if(typeof setting.owner === 'undefined'){
-                        sheet.getCell(row, 0, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-                    }
                 }
                 //复选框
                 if(setting.header[col].dataCode === 'isComplementary'){
@@ -163,7 +148,6 @@ let sheetOpr = {
                 //新增组成物表,选择复选框
                 if(setting.header[col].dataCode === 'select'){
                     sheet.setCellType(row, col, checkBoxType)
-                    sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport).locked(false);
                     if(data[row].isChecked === true){
                         sheet.getCell(row, col).value(1);
                     }
@@ -171,7 +155,6 @@ let sheetOpr = {
             }
             for(let i = data.length; i < sheet.getRowCount(); i++){
                 sheet.setCellType(i, 6, null);
-                sheet.getCell(i, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
             }
         }
         sheet.resumeEvent();
@@ -228,28 +211,18 @@ let sheetOpr = {
                         isExist = false;
                     for(let i=0; i< stdGljList.length; i++){
                         if(stdGljList[i].code == sheet.getValue(row, col) && sheet.getValue(row, col)!== orgCode){
-                            me.lockAllCells(sheet);
                             $('#alertText').text("输入的编号已存在,请重新输入!");
                             $('#codeAlertBtn').click();
                             $('#codAleConfBtn').click(function () {
-                                // me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                me.unLockAllCells(sheet);
-                                me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                //sheet.setText(row, 0, '');
                                 sheet.getCell(row, 0).formatter("@");
                                 sheet.getCell(row, 0).text("");
                                 sheet.setActiveCell(row, 0);
                             });
                             $('#codAleClose').click(function () {
-                                //me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                me.unLockAllCells(sheet);
-                                me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                //sheet.setText(row, 0, '');
                                 sheet.getCell(row, 0).formatter("@");
                                 sheet.getCell(row, 0).text("");
                                 sheet.setActiveCell(row, 0);
                             });
-                            // sheet.setValue(row, col, orgCode);
                             isExist = true
                             break;
                         }
@@ -257,28 +230,18 @@ let sheetOpr = {
                     if(!isExist){
                         for(let i=0; i< complementaryGljList.length; i++){
                             if(complementaryGljList[i].code == sheet.getValue(row, col) && sheet.getValue(row, col)!== orgCode){
-                                me.lockAllCells(sheet);
                                 $('#alertText').text("输入的编号已存在,请重新输入!");
                                 $('#codeAlertBtn').click();
                                 $('#codAleConfBtn').click(function () {
-                                    // me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    me.unLockAllCells(sheet);
-                                    me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    //sheet.setText(row, 0, '');
                                     sheet.getCell(row, 0).formatter("@");
                                     sheet.getCell(row, 0).text("");
                                     sheet.setActiveCell(row, 0);
                                 });
                                 $('#codAleClose').click(function () {
-                                    //me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    me.unLockAllCells(sheet);
-                                    me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    //sheet.setText(row, 0, '');
                                     sheet.getCell(row, 0).formatter("@");
                                     sheet.getCell(row, 0).text("");
                                     sheet.setActiveCell(row, 0);
                                 });
-                                // sheet.setValue(row, col, orgCode);
                                 isExist = true
                                 break;
                             }

+ 4 - 0
web/building_saas/css/main.css

@@ -309,3 +309,7 @@ body {
   max-width: 200px;
   display: inline-block;
 }
+.gc-column-header-cell{
+    text-align: center!important;
+}
+.modal-lg{max-width: 1000px}

+ 0 - 4
web/building_saas/fee_rates/fee_rate.html

@@ -165,8 +165,4 @@
 
 
 </body>
-
-<script src="/web/building_saas/glj/js/socket.io.slim.js"></script>
-<script src="/public/web/socket/connection.js"></script>
-<script src="/public/web/uuid.js"></script>
 </html>

+ 0 - 5
web/building_saas/glj/html/glj_index.html

@@ -119,8 +119,3 @@
         </div>
     </div>
 </div>
-<script type="text/javascript" src="/web/building_saas/glj/js/project_glj.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/composition.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/common_spread.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/composition_spread.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/project_glj_spread.js"></script>

+ 1 - 1
web/building_saas/glj/js/common_spread.js

@@ -70,7 +70,7 @@ CommonSpreadJs.prototype.getFieldColumn = function(field) {
             break;
         }
     }
-
+    result = parseInt(result);
     return result;
 };
 

+ 37 - 21
web/building_saas/glj/js/project_glj.js

@@ -199,32 +199,44 @@ $(document).ready(function () {
  * @return {void|boolean}
  */
 function init() {
-    // 加载工料机数据
-    let data = projectObj.project.projectGLJ === null ? null : projectObj.project.projectGLJ.datas;
-    if (data === null) {
-        return false;
-    }
-    // 赋值
-    jsonData = data.gljList !== undefined && data.gljList.length > 0 ? data.gljList : [];
-    mixRatioConnectData = data.mixRatioConnectData !== undefined ? data.mixRatioConnectData : mixRatioConnectData;
+    projectObj.project.projectGLJ.loadData(function(data) {
+        if (jsonData.length <= 0) {
+            // 赋值
+            jsonData = data.gljList !== undefined && data.gljList.length > 0 ? data.gljList : [];
+            if (jsonData.length > 0) {
+                // 不显示消耗量为0的数据
+                let tmpData = [];
+                for(let data of jsonData) {
+                    if (data.quantity !== 0) {
+                        tmpData.push(data);
+                    }
+                }
+                jsonData = tmpData;
+            }
+            mixRatioConnectData = data.mixRatioConnectData !== undefined ? data.mixRatioConnectData : mixRatioConnectData;
+
+            host = data.constData.hostname !== undefined ? data.constData.hostname : '';
+            materialIdList = data.constData.materialIdList !== undefined ? data.constData.materialIdList : materialIdList;
+            roomId = data.constData.roomId !== undefined ? data.constData.roomId : roomId;
+            canNotChangeTypeId = data.constData.ownCompositionTypes !== undefined ?
+                data.constData.ownCompositionTypes : canNotChangeTypeId;
+            GLJTypeConst = data.constData.GLJTypeConst !== undefined ? JSON.parse(data.constData.GLJTypeConst) : GLJTypeConst;
 
-    host = data.constData.hostname !== undefined ? data.constData.hostname : '';
-    materialIdList = data.constData.materialIdList !== undefined ? data.constData.materialIdList : materialIdList;
-    roomId = data.constData.roomId !== undefined ? data.constData.roomId : roomId;
-    canNotChangeTypeId = data.constData.ownCompositionTypes !== undefined ?
-        data.constData.ownCompositionTypes : canNotChangeTypeId;
-    GLJTypeConst = data.constData.GLJTypeConst !== undefined ? JSON.parse(data.constData.GLJTypeConst) : GLJTypeConst;
+            let usedTenderList = data.usedTenderList !== undefined ? data.usedTenderList : [];
+            usedUnitPriceInfo = data.constData.usedUnitPriceInfo !== undefined ?
+                data.constData.usedUnitPriceInfo : {};
 
-    let usedTenderList = data.usedTenderList !== undefined ? data.usedTenderList : [];
-    usedUnitPriceInfo = data.constData.usedUnitPriceInfo !== undefined ?
-        data.constData.usedUnitPriceInfo : {};
+            // 连接socket服务器
+            socketInit();
 
-    // 连接socket服务器
-    socketInit();
+            unitPriceFileInit(usedUnitPriceInfo.name, usedTenderList);
 
-    unitPriceFileInit(usedUnitPriceInfo.name, usedTenderList);
+            setTimeout(spreadInit, 1);
+        } else {
+            projectObj.project.projectGLJ.loadCacheData();
+        }
 
-    setTimeout(spreadInit, 1);
+    });
 }
 
 /**
@@ -305,6 +317,10 @@ function successTrigger(field, info) {
             socket.emit('dataNotify', JSON.stringify(info));
             console.log(info);
             break;
+        case 'supply':
+            // 供货方式更改成功后
+            projectGLJSpread.changeSupplyType(info);
+            break;
     }
     // 重新加载数据到缓存
     projectObj.project.projectGLJ.loadData();

+ 79 - 6
web/building_saas/glj/js/project_glj_spread.js

@@ -17,6 +17,9 @@ function ProjectGLJSpread() {
     this.firstMachineRow = -1;
     this.firstMixRatioRow = -1;
     this.successCallback = null;
+    this.supplyType = ['自行采购', '部分甲供', '完全甲供', '甲定乙供'];
+    // 工料机类型是混凝土、砂浆、配合比、机械(不包括机械组成物)时,供货方式列只读。
+    this.supplyReadonlyType = [GLJTypeConst.CONCRETE, GLJTypeConst.MORTAR, GLJTypeConst.MIX_RATIO, GLJTypeConst.GENERAL_MACHINE];
 }
 
 /**
@@ -25,7 +28,17 @@ function ProjectGLJSpread() {
  * @return {object}
  */
 ProjectGLJSpread.prototype.init = function () {
-
+    // 供货方式类型
+    let supplySelect = [];
+    for(let index in this.supplyType) {
+        supplySelect.push({
+            text: this.supplyType[index],
+            value: index
+        });
+    }
+    let selectBox = new GC.Spread.Sheets.CellTypes.ComboBox();
+    selectBox.items(supplySelect);
+    selectBox.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
     let header = [
         {name: '编码', field: 'code', visible: true},
         {name: '名称', field: 'name', visible: true},
@@ -44,7 +57,7 @@ ProjectGLJSpread.prototype.init = function () {
             cellType: new GC.Spread.Sheets.CellTypes.CheckBox(),
             validator: 'boolean'
         },
-        {name: '供货方式', field: 'supply', visible: true},
+        {name: '供货方式', field: 'supply', visible: true, cellType: selectBox},
         {name: '甲供数量', field: 'supply_quantity', visible: true},
         {name: '交货方式', field: 'delivery', visible: true},
         {name: '送达地点', field: 'delivery_address', visible: true},
@@ -74,6 +87,7 @@ ProjectGLJSpread.prototype.init = function () {
     let basePriceColumn = this.sheetObj.getFieldColumn('unit_price.base_price');
     let adjustPriceColumn = this.sheetObj.getFieldColumn('adjust_price');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
+    let supplyColumn = this.sheetObj.getFieldColumn('supply');
 
     // 居中样式
     let centerStyleSetting = {hAlign: 1};
@@ -92,6 +106,7 @@ ProjectGLJSpread.prototype.init = function () {
     this.sheetObj.setColumnEditable(marketPriceColumn);
     this.sheetObj.setColumnEditable(isEvaluateColumn);
     this.sheetObj.setColumnEditable(isAdjustPriceColumn);
+    this.sheetObj.setColumnEditable(supplyColumn);
     this.sheetObj.setData(sourceData);
     // 取消正在加载字符提示
     $("#project-glj > p").hide();
@@ -179,6 +194,12 @@ ProjectGLJSpread.prototype.updateProjectGLJField = function(info, callback) {
         }
     }
 
+    // 如果是供货方式则需要处理数据
+    if (field === 'supply') {
+        value = this.supplyType.indexOf(value);
+        extend.supply_quantity = this.getSupplyQuantity(value, activeSheet, info);
+    }
+
     extend = Object.keys(extend).length > 0 ?  JSON.stringify(extend) : '';
     $.ajax({
         url: '/glj/update',
@@ -220,9 +241,9 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
     // 获取列号
     let isEvaluateColumn = this.sheetObj.getFieldColumn('is_evaluate');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
-
     let connectCodeColumn = this.sheetObj.getFieldColumn('connect_code');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
+    let supplyColumn = this.sheetObj.getFieldColumn('supply');
     let activeSheet = this.sheetObj.getSheet();
 
     for (let data of sourceData) {
@@ -230,20 +251,33 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
         if (materialIdList.indexOf(data.unit_price.type) < 0) {
             let string = new GC.Spread.Sheets.CellTypes.Text();
             activeSheet.setCellType(rowCounter, isEvaluateColumn, string, GC.Spread.Sheets.SheetArea.viewport);
+
             // 锁定该单元格
-            activeSheet.getRange(rowCounter, isEvaluateColumn, 1, 1).locked(true);
+            activeSheet.getCell(rowCounter, isEvaluateColumn, GC.Spread.Sheets.SheetArea.viewport).locked(true);
             activeSheet.setValue(rowCounter, isEvaluateColumn, '');
         }
 
-        // 如果类型为混凝土、砂浆、配合比、机械,则市场单价不能修改
+        // 供货方式数据
+        let supplyIndex = parseInt(data.supply);
+        supplyIndex = isNaN(supplyIndex) ? 0 : supplyIndex;
+        let supplyText = this.supplyType[supplyIndex] !== undefined ? this.supplyType[supplyIndex] : '自行采购';
+        activeSheet.setValue(rowCounter, supplyColumn, supplyText);
+        if (this.supplyReadonlyType.indexOf(data.unit_price.type) >= 0) {
+            // 锁定该单元格
+            activeSheet.getCell(rowCounter, supplyColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
+        }
+
+        // 如果类型为混凝土、砂浆、配合比、机械,则市场单价和供货方式不能修改
         if (canNotChangeTypeId.indexOf(data.unit_price.type) >= 0) {
             this.firstMixRatioRow = this.firstMixRatioRow === -1 && data.unit_price.type !== GLJTypeConst.GENERAL_MACHINE ?
                 rowCounter : this.firstMixRatioRow;
             this.firstMachineRow = this.firstMachineRow === -1 && data.unit_price.type === GLJTypeConst.GENERAL_MACHINE ?
                 rowCounter : this.firstMachineRow;
             // 锁定该单元格
-            activeSheet.getRange(rowCounter, marketPriceColumn, 1, 1).locked(true);
+            activeSheet.getCell(rowCounter, marketPriceColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
+            activeSheet.getCell(rowCounter, supplyColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
         }
+
         // 处理数据
         if (data.ratio_data !== undefined && data.ratio_data.length > 0) {
             let connectCode = [];
@@ -257,6 +291,7 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
             activeSheet.setValue(rowCounter, connectCodeColumn, connectCodeString);
             activeSheet.setValue(rowCounter, consumptionColumn, consumptionString);
         }
+
         rowCounter++;
     }
 };
@@ -377,4 +412,42 @@ ProjectGLJSpread.prototype.priceCalculate = function(info) {
             this.compositionParentUpdate(info.parentMarketPrice);
             break;
     }
+};
+
+/**
+ * 更改供货方式
+ *
+ * @param {Object} info
+ * @return {void}
+ */
+ProjectGLJSpread.prototype.changeSupplyType = function(info) {
+    let supply = info.newValue;
+    let supplyNumber = this.supplyType.indexOf(supply) > -1 ? this.supplyType.indexOf(supply) : 0;
+    let supplyQuantityColumn = this.sheetObj.getFieldColumn('supply_quantity');
+    let activeSheet = this.sheetObj.getSheet();
+
+    // 部分甲供时可更改甲供数量数据,其余则只读
+    let locked = supplyNumber === 1 ? false : true;
+    activeSheet.getCell(info.row, supplyQuantityColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(locked);
+
+    let supplyQuantity = this.getSupplyQuantity(supplyNumber, activeSheet, info);
+    activeSheet.setValue(info.row, supplyQuantityColumn, supplyQuantity);
+};
+
+/**
+ * 根据供货方式获取甲供数量
+ *
+ * @param {Number} supplyType
+ * @param {Object} activeSheet
+ * @param {Object} info
+ * @return {Number}
+ */
+ProjectGLJSpread.prototype.getSupplyQuantity = function(supplyType, activeSheet, info) {
+    let quantityColumn = this.sheetObj.getFieldColumn('quantity');
+    // 获取总消耗量
+    let quantity = activeSheet.getValue(info.row, quantityColumn);
+    // 自行采购和甲定乙供则把甲供数量设置为0,其余情况则设置为当前总消耗量
+    let supplyQuantity = supplyType === 0 || supplyType === 3 ? 0 : quantity;
+
+    return supplyQuantity;
 };

+ 0 - 3
web/building_saas/main/html/calc_program_manage.html

@@ -87,8 +87,5 @@
     </div>
 </body>
 
-<script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
-<script type="text/javascript" src="/web/building_saas/main/js/models/calc_program.js"></script>
-<script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_manage.js"></script>
 
 </html>

+ 91 - 28
web/building_saas/main/html/main.html

@@ -6,6 +6,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>造价书-Smartcost</title>
+    <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
@@ -16,6 +17,7 @@
     <link rel="stylesheet" href="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css">
     <!-- jquery.contextmenu -->
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
+    <!-- endinject -->
     <script>
         // 这里的变量供页面调用
         var userAccount = '<%- userAccount %>';
@@ -34,7 +36,7 @@
             </div>
         </div>
         <%include ../../../common/html/header.html %>
-        <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+        <nav class="navbar navbar-expand-lg justify-content-between navbar-light p-0">
             <ul class="nav navbar-nav px-1">
                 <li class="nav-item">
                     <a class="nav-link" href="#" aria-expanded="false" data-toggle="modal" data-target="#poj-set"><i class="fa fa-cube"></i> 项目属性</a>
@@ -97,7 +99,7 @@
                     <a href="javascript:void(0)" class="btn btn-sm" id="downMove"><i class="fa fa-arrow-down" aria-hidden="true"></i> 下移</a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="upMove"><i class="fa fa-arrow-up" aria-hidden="true"></i> 上移</a>
                   </div>
-                  <div>
+                  <div class="tools-btn">
                       <a href="javacript:void(0);" data-toggle="modal" data-target="#column" class="btn btn-sm"><i class="fa fa-table" aria-hidden="true"></i> 列设置</a>
                   </div>
                   <div class="side-tabs">
@@ -442,25 +444,25 @@
                                         <fieldset class="form-group">
                                             <div class="form-check">
                                                 <label class="form-check-label">
-                                                    <input class="form-check-input" name="optionsRadios" id="optionsRadios1" value="option1" checked="" type="radio">
+                                                    <input class="form-check-input" name="calcFlag" id="rationContent" value="0" checked="" type="radio">
                                                     子目含量取费
                                                 </label>
                                             </div>
                                             <div class="form-check">
                                                 <label class="form-check-label">
-                                                    <input class="form-check-input" name="optionsRadios" id="optionsRadios2" value="option2" type="radio">
+                                                    <input class="form-check-input" name="calcFlag" id="rationPrice" value="1" type="radio">
                                                     子目单价取费(反算):清单综合合价=清单综合单价*清单工程量
                                                 </label>
                                             </div>
                                             <div class="form-check">
                                                 <label class="form-check-label">
-                                                    <input class="form-check-input" name="optionsRadios" id="optionsRadios3" value="option3" type="radio">
+                                                    <input class="form-check-input" name="calcFlag" id="rationPriceConverse" value="2" type="radio">
                                                     子目单价取费(正算):清单综合合价=∑子目综合合价
                                                 </label>
                                             </div>
                                             <div class="form-check">
                                                 <label class="form-check-label">
-                                                    <input class="form-check-input" name="optionsRadios" id="optionsRadios4" value="option4" type="radio">
+                                                    <input class="form-check-input" name="calcFlag" id="billsPrice" value="3" type="radio">
                                                     清单单价取费
                                                 </label>
                                             </div>
@@ -487,7 +489,7 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="" class="btn btn-primary">确定</a>
+                    <a href="javascript:void(0);" class="btn btn-primary" id="property_ok" data-dismiss="modal">确定</a>
                 </div>
             </div>
         </div>
@@ -555,14 +557,85 @@
             </div>
         </div>
     </div>
+    <!--工料机选择窗口-->
+    <div class="modal fade" id="glj_tree_div" data-backdrop="static">
+        <div class="modal-dialog modal-lg" role="document" id="modalCon">
+            <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>
+                    <input type="hidden" id="actionType">
+                </div>
+                <div class="modal-body">
+                    <div class="row">
+                        <div class="col-4">
+                            <div  class="modal-auto-height" id="componentTreeDiv" style="overflow: hidden">
+                                <!--<div class="print-list">-->
+                                <div style="width: 100%; height: 100%; overflow: auto">
+                                    <ul id="gljTree" class="ztree"></ul>
+                                </div>
+                                <!--</div>-->
+                            </div>
+                        </div>
+                        <div class="col-8">
+                            <div class="row">
+                                <div class="col-12" id="gljRadios">
+                                    <input type="radio" class="glj-radio" name="glj" value="allGljs" checked>所有工料机&nbsp;&nbsp;
+                                    <input type="radio" class="glj-radio" name="glj" value="stdGLJ">标准工料机&nbsp;&nbsp;
+                                    <input type="radio" class="glj-radio" name="glj" value="complementaryGLJs">补充工料机&nbsp;&nbsp;
+                                    <!-- <div class="form-group"><input id="searchGlj" type="text" class="form-control-sm" placeholder="查询工料机"></div>-->
+                                </div>
+                                <div class="modal-auto-height col-12" style="overflow: hidden" id="gljLibSheet">
+
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" id="componentsCacnel" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                    <a href="javascript:void(0);" id="glj_selected_conf" class="btn btn-primary">确定</a>
+                </div>
+            </div>
+        </div>
+    </div>
+
     <!-- JS. -->
-    <script src="/lib/jquery/jquery.min.js"></script>
-    <script src="/lib/tether/tether.min.js"></script>
+    <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
+    <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
+    <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+
+    <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
+    <!--<script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>-->
+    <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
+    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+    <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+
+
+
+    <!-- inject:js -->
+
+    <script type="text/javascript" src="/web/building_saas/glj/js/project_glj.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/composition.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/common_spread.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/composition_spread.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/project_glj_spread.js"></script>
+
+    <script src="/web/building_saas/glj/js/socket.io.slim.js"></script>
+    <script src="/public/web/socket/connection.js"></script>
+    <script src="/public/web/uuid.js"></script>
+
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/models/calc_program.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_manage.js"></script>
+
+    <!-- JS. -->
+    <script src="/lib/popper/popper.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
-    <script type="text/javascript">
-        autoFlashHeight();
-    </script>
+
     <!--expression calculate-->
     <script src="/lib/JSExpressionEval_src/Date.js"></script>
     <script src="/lib/JSExpressionEval_src/Stack.js"></script>
@@ -578,15 +651,9 @@
     <script type="text/javascript" src="/public/web/number_util.js"></script>
     <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
     <!--报表 zTree -->
-    <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
-    <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
+
     <!-- SpreadJs -->
-    <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
-    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
-    <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
-    <!--<script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>-->
-    <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
-    <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+
     <!--<script src="/lib/spreadjs/views/locale/gc.spread.views.dataview.locale.zh-CN.10.0.0.min.js" type="text/javascript"></script>-->
     <!-- Model -->
     <script type="text/javascript" src="/web/building_saas/main/js/models/main_consts.js"></script>
@@ -602,7 +669,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/models/volume_price.js"></script>
 
     <script type="text/javascript" src="/public/web/id_tree.js"></script>
-	<script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>
+    <script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/cache_tree.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/calc/calc_fees.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/calc/ration_calc.js"></script>
@@ -639,16 +706,12 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/fee_rate_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/sub_fee_rate_views.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/project_property_labour_coe_view.js"></script>
+    <!-- endinject -->
 
-
-   <!-- <script src="/web/building_saas/fee_rates/fee_rate.js"></script>-->
     <script type="text/javascript">
-        /* autoFlashHeight();
-        loadStdFeeRateLibNames(region);*/
-        //loadProjectFeeRates(feeRateFileID);
+        autoFlashHeight();
     </script>
-
-
+    
     <script src="/public/debug.js"></script>
 
     <SCRIPT type="text/javascript">

+ 54 - 48
web/building_saas/main/js/calc/bills_calc.js

@@ -235,33 +235,10 @@ let baseCalcField = [
 ];
 
 class BillsCalcHelper {
-    constructor (project, CalcFlag) {
+    constructor (project, calcFlag) {
         this.project = project;
-        this.CalcFlag = CalcFlag;
-        this.calcField = JSON.parse(JSON.stringify(feeType));
-        for (let field of this.calcField) {
-            // unitFeeCalcFlag
-            if (this.calcFlag === rationContent) {
-                field.unitFeeFlag = rationContentUnitFeeFlag;
-            } else if ( this.calcFlag === billsPrice) {
-                field.unitFeeFlag = billsPriceUnitFeeFlag;
-            } else {
-                field.unitFeeFlag = averageQtyUnitFeeFlag;
-            }
-            // totalFeeCalcFlag
-            if (field.type === 'common') {
-                if (this.CalcFlag === rationPriceConverse) {
-                    field.totalFeeFlag = sumTotalFeeFlag;
-                } else {
-                    field.totalFeeFlag = totalFeeFlag;
-                }
-            } else {
-                field.totalFeeFlag = sumTotalFeeFlag;
-            }
-        }
-        this.InitFields(this.calcField);
+        this.InitFields(project.calcFields);
     };
-
     getBillsGLjs (node) {
         let rations = this.project.Ration.getBillsSortRation(node.source.getID());
         let gljs = this.project.ration_glj.getGatherGljArrByRations(rations);
@@ -270,14 +247,14 @@ class BillsCalcHelper {
         }
         return gljs;
     };
-    calcRationLeaf (node, fields) {
+    calcRationLeaf (node, fields, isIncre) {
         nodeCalcObj.node = node;
         nodeCalcObj.digit = this.project.Decimal.unitFee;
         calcFees.checkFields(node.data, fields);
         let nodeCalc = nodeCalcObj, virData= null;
 
         // 清单单价:套用定额计算程序
-        if (this.CalcFlag === billsPrice) {
+        if (this.project.calcFlag === billsPrice) {
             rationCalcObj.calcGljs = this.getBillsGLjs(node);
             console.log(rationCalcObj.calcGljs);
             rationCalcObj.calcFields = rationCalcFields;
@@ -299,30 +276,48 @@ class BillsCalcHelper {
                 default:
                     node.data.feesIndex[field.type].unitFee = 0;
             }
+            let value = 0;
             switch (field.totalFeeFlag) {
                 case sumTotalFeeFlag:
-                    node.data.feesIndex[field.type].totalFee = nodeCalcObj.sumTotalFee().toDecimal(this.project.Decimal.common.totalFee);
+                    value = nodeCalcObj.sumTotalFee().toDecimal(this.project.Decimal.common.totalFee);
                     break;
                 case totalFeeFlag:
-                    node.data.feesIndex[field.type].totalFee = nodeCalcObj.totalFee().toDecimal(this.project.Decimal.common.totalFee);
+                    value = nodeCalcObj.totalFee().toDecimal(this.project.Decimal.common.totalFee);
                     break;
                 default:
-                    node.data.feesIndex[field.type].totalFee = 0;
+                    value = 0;
             }
+            this.setTotalFee(node, field, value, isIncre);
         }
     };
-    calcVolumePriceLeaf (node, fields) {
+    calcVolumePriceLeaf (node, fields, isIncre) {
         let total = 0;
-        for (let child of this.node.children) {
-            total += this.getFee(child.data, 'feesIndex.common.totalFee');
+        for (let child of node.children) {
+            total += calcFees.getFee(child.data, 'feesIndex.common.totalFee');
         }
     };
-    calcParent (node, fields) {
+    calcParent (node, fields, isIncre) {
         nodeCalcObj.node = node;
         calcFees.checkFields(node.data, fields);
         for (let field of fields) {
             nodeCalcObj.field = field;
-            node.data.feesIndex[field.type].totalFee = nodeCalcObj.sumTotalFee().toDecimal(this.project.Decimal.common.totalFee);
+            let value = nodeCalcObj.sumTotalFee().toDecimal(this.project.Decimal.common.totalFee);
+            this.setTotalFee(node, field, value, isIncre);
+        }
+    };
+    calcNode(node, isIncre) {
+        if (node.source.children.length > 0) {
+            this.calcParent(node, this.project.calcFields, isIncre);
+        } else {
+            if (node.children.length > 0) {
+                if (node.firstChild().sourceType === this.project.Ration.getSourceType()) {
+                    this.calcRationLeaf(node, this.project.calcFields, isIncre);
+                } else {
+                    this.calcVolumePriceLeaf(node, this.project.calcFields, isIncre);
+                }
+            } else {
+
+            }
         }
     };
     calcNodes (nodes) {
@@ -330,21 +325,32 @@ class BillsCalcHelper {
             if (node.sourceType !== this.project.Bills.getSourceType()) {
                 return;
             }
-
             if (node.source.children.length > 0) {
                 this.calcNodes(node.children);
-                this.calcParent(node, this.calcField);
-            } else {
-                if (node.children.length > 0) {
-                    if (node.firstChild().sourceType === this.project.Ration.getSourceType()) {
-                        this.calcRationLeaf(node, this.calcField);
-                    } else {
-                        this.calcVolumePriceLeaf(node, this.calcField);
-                    }
-                } else {
-
-                }
             }
+            this.calcNode(node);
+        }
+    };
+    updateParent (parent, field, Incre) {
+        if (parent && parent.sourceType === this.project.Bills.getSourceType()) {
+            calcFees.checkFields(parent.data, [field]);
+            parent.data.feesIndex[field.type].totalFee = (parent.data.feesIndex[field.type].totalFee + Incre).toDecimal(this.project.Decimal.common.totalFee);
+            this.updateParent(parent.parent, field, Incre);
+        }
+    };
+    setTotalFee (node, field, value, isIncre) {
+        if (isIncre) {
+            let incre = value - node.data.feesIndex[field.type].totalFee;
+            node.data.feesIndex[field.type].totalFee = value;
+            this.updateParent(node.parent, field, incre);
+        } else {
+            node.data.feesIndex[field.type].totalFee = value;
+        }
+    };
+    converseCalc (node) {
+        if (node && node.sourceType === this.project.Bills.getSourceType()) {
+            this.calcNode(node);
+            this.converseCalc(node.parent);
         }
     };
     calcAll () {
@@ -362,5 +368,5 @@ class BillsCalcHelper {
             field.tenderTotalFee = 'feesIndex.' + field.type + '.tenderTotalFee';
             field.tenderTotalFeeSplit = field.tenderTotalFee.split('.');
         }
-    }
+    };
 }

+ 2 - 1
web/building_saas/main/js/controllers/project_controller.js

@@ -104,7 +104,8 @@ ProjectController = {
         }
     },
     calculateAll: function (project, sheetController, CalcType) {
-        let calc = new BillsCalcHelper(project, CalcType);
+        this.project.setCalcFlag(CalcType);
+        let calc = new BillsCalcHelper(project);
         calc.calcAll();
         sheetController.showTreeData();
         project.Bills.updateAll();

+ 28 - 2
web/building_saas/main/js/models/bills.js

@@ -32,6 +32,20 @@ var Bills = {
                     updateDatas.push(updateData);
                 });
                 return updateDatas;
+            },
+            formatBillsUpdateData: function (data) {
+                let uData = JSON.parse(JSON.stringify(data));
+                delete uData.feesIndex;
+                delete uData.flagsIndex;
+                if (uData.fees) {
+                    for (let fee of uData.fees) {
+                        fee.unitFee = fee.unitFee.toFixed(2);
+                        fee.totalFee = fee.totalFee.toFixed(2);
+                        fee.tenderUnitFee = fee.tenderUnitFee.toFixed(2);
+                        fee.tenderTotalFee = fee.tenderTotalFee.toFixed(2);
+                    }
+                }
+                return uData;
             }
         };
 
@@ -254,10 +268,22 @@ var Bills = {
                         fee.tenderTotalFee = fee.tenderTotalFee.toFixed(2);
                     }
                 }
-                updateData.push({'updateType': 'ut_update', 'updateData': data});
+                updateData.push({'updateType': 'ut_update', 'updateData': uData});
             }
             this.project.pushNow('updateAllBills', this.getSourceType(), updateData);
-        }
+        };
+
+        bills.prototype.updateNodes = function (nodes, updateNow) {
+            let updateData = [];
+            for (let node of nodes) {
+                updateData.push({'updateType': 'ut_update', 'updateData': tools.formatBillsUpdateData(node.data)});
+            }
+            if (updateNow) {
+                this.project.pushNow('updateBills', this.getSourceType(), updateData);
+            } else {
+                this.project.push(this.getSourceType(), updateData);
+            }
+        };
 
         return new bills(project);
     }

+ 0 - 1
web/building_saas/main/js/models/calc_program.js

@@ -164,7 +164,6 @@ let calcTemplates = [
                 name: "人工费价差",
                 fieldName: "labourDiff",
                 dispExpr: "[人工费价差]",
-                // expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
                 expression: "base('人工费价差')",
                 compiledExpr: "",
                 statement: "市场价格人工费-调整后的定额人工费(基价)"

+ 26 - 0
web/building_saas/main/js/models/project.js

@@ -287,6 +287,32 @@ var PROJECT = {
             }
         };
 
+        project.prototype.setCalcFlag = function (calcFlag) {
+            this.calcFlag = calcFlag;
+            if (this.calcFields) {
+                for (let field of this.calcFields) {
+                    // unitFeeCalcFlag
+                    if (this.calcFlag === rationContent) {
+                        field.unitFeeFlag = rationContentUnitFeeFlag;
+                    } else if ( this.calcFlag === billsPrice) {
+                        field.unitFeeFlag = billsPriceUnitFeeFlag;
+                    } else {
+                        field.unitFeeFlag = averageQtyUnitFeeFlag;
+                    }
+                    // totalFeeCalcFlag
+                    if (field.type === 'common') {
+                        if (this.calcFlag === rationPriceConverse) {
+                            field.totalFeeFlag = sumTotalFeeFlag;
+                        } else {
+                            field.totalFeeFlag = totalFeeFlag;
+                        }
+                    } else {
+                        field.totalFeeFlag = sumTotalFeeFlag;
+                    }
+                }
+            }
+        }
+
         return new project();
     }
 };

+ 24 - 0
web/building_saas/main/js/models/ration.js

@@ -6,6 +6,20 @@ var Ration = {
     createNew: function (project) {
         // 用户定义private方法
         var tools = {
+            formatRationUpdateData: function (data) {
+                let uData = JSON.parse(JSON.stringify(data));
+                delete uData.feesIndex;
+                delete uData.flagsIndex;
+                // if (uData.fees) {
+                //     for (let fee of uData.fees) {
+                //         fee.unitFee = fee.unitFee.toFixed(2);
+                //         fee.totalFee = fee.totalFee.toFixed(2);
+                //         fee.tenderUnitFee = fee.tenderUnitFee.toFixed(2);
+                //         fee.tenderTotalFee = fee.tenderTotalFee.toFixed(2);
+                //     }
+                // }
+                return uData;
+            }
         };
 
         // 所有通过this访问的属性,都不应在此单元外部进行写入操作
@@ -258,6 +272,16 @@ var Ration = {
             this.project.pushNow('updateBills', this.getSourceType(), updateData);
         };
 
+        ration.prototype.updateRation = function (ration, updateNow) {
+            let updateData = [];
+            updateData.push({'updateType': 'ut_update', 'updateData': tools.formatRationUpdateData(ration)});
+            if (updateNow) {
+                this.project.pushNow('updateRations', this.getSourceType(), updateData);
+            } else {
+                this.project.push(this.getSourceType(), updateData);
+            }
+        }
+
         return new ration(project);
     }
 };

+ 92 - 14
web/building_saas/main/js/models/ration_glj.js

@@ -11,7 +11,6 @@ var ration_glj = {
             this.gljTree = cacheTree.createNew(this);
            // this.project = proj;
             this.datas = [];
-
             var sourceType = ModuleNames.ration_glj;
             this.getSourceType = function () {
                 return sourceType;
@@ -139,6 +138,7 @@ var ration_glj = {
             _.remove(glj_list,data.query);
             _.remove(gljOprObj.sheetData,data.query);
             gljOprObj.showRationGLJSheetData();
+            projectObj.project.projectGLJ.loadData();
         };
         // CSL,2017.05.09
         ration_glj.prototype.modifyQuantity = function (data, newQuantity) {
@@ -167,15 +167,6 @@ var ration_glj = {
             this.project.push(this.getSourceType, data);
             this.project.endUpdate();
         };
-
-        ration_glj.prototype.replaceGLJ = function (data, newGLJID) {
-            this.project.beginUpdate('replaceGLJ');
-            data.GLJID = newGLJID;
-            data.updateType = 'ut_update';
-            this.project.push(this.getSourceType, data);
-            this.project.endUpdate();
-        };
-
         ration_glj.prototype.addRationGLJ = function (newRation,data) {
             var souceTypeList=[];
             var criteriaDataList = [];
@@ -315,14 +306,101 @@ var ration_glj = {
                 project_id:recode.projectID,
                 repositoryId:recode.repositoryId
             };
-         /*   code: '01010101',
-                market_price: '40',
-                name: '水泥',
-                project_id: projectId*/
             var updateData = this.getUpdateData('ut_update',query,doc,'marketPriceAdjustUpdate');
             project.pushNow('updateRationGLJ',[this.getSourceType()],updateData);
         };
+        ration_glj.prototype.getGLJData = function(cb){
+            CommonAjax.get('/rationGlj/getGLJData', function (data) {
+                cb(data);
+            })
+        };
+        ration_glj.prototype.addGLJByLib=function (GLJSelection,ration,callback) {
+          var gljList=[];
+          var allGLJ=gljOprObj.AllRecode;
+            GLJSelection.sort();
+          _.forEach(GLJSelection,function (g) {
+              var glj=_.find(allGLJ,{'code':g});
+              var ration_glj ={
+                  projectID:ration.projectID,
+                  GLJID:glj.ID,
+                  rationID:ration.ID,
+                  rationItemQuantity:0,
+                  quantity:0,
+                  name:glj.name,
+                  code:glj.code,
+                  unit:glj.unit,
+                  specs:glj.specs,
+                  basePrice:glj.basePrice,
+                  shortName:glj.shortName,
+                  type:glj.gljType,
+                  createType:'add',
+                  repositoryId:glj.repositoryId
+              }
+              if(glj.hasOwnProperty("compilationId")){
+                  ration_glj.from="cpt";
+              }
+              gljList.push(ration_glj);
+          });
+            CommonAjax.post("/rationGlj/addGLJ",gljList,callback);
+        };
+        ration_glj.prototype.replaceGLJ=function (selectCode,oldData,callback) {
+            var allGLJ=gljOprObj.AllRecode;
+            var glj=_.find(allGLJ,{'code':selectCode});
+            if(selectCode==oldData.code){
+                return callback(null);
+            }
+            oldData.createType='replace';
+            oldData.GLJID=glj.ID;
+            oldData.rationItemQuantity=0;
+            oldData.name=glj.name;
+            oldData.rcode=oldData.code;
+            oldData.code=glj.code;
+            oldData.unit=glj.unit;
+            oldData.specs=glj.specs;
+            oldData.basePrice=glj.basePrice;
+            oldData.repositoryId=glj.repositoryId;
+            if(glj.hasOwnProperty("compilationId")){
+                oldData.from="cpt";
+            }else {
+                oldData.from="std";
+            }
+            CommonAjax.post("/rationGlj/replaceGLJ",oldData,callback);
+        };
 
+        ration_glj.prototype.mReplaceGLJ=function (selectCode,oldData,callback) {
+            var allGLJ=gljOprObj.AllRecode;
+            var glj=_.find(allGLJ,{'code':selectCode});
+            if(selectCode==oldData.code){
+                return callback(null);
+            }
+            var query={
+                projectID:oldData.projectID,
+                code:oldData.code,
+                name:oldData.name
+            }
+            var doc={
+                GLJID:glj.ID,
+                createType:'replace',
+                rationItemQuantity:0,
+                name:glj.name,
+                rcode:oldData.code,
+                code:glj.code,
+                unit:glj.unit,
+                specs:glj.specs,
+                type:glj.gljType,
+                basePrice:glj.basePrice,
+                repositoryId:glj.repositoryId,
+                projectID:oldData.projectID
+            }
+            if(glj.hasOwnProperty("compilationId")){
+                doc.from="cpt";
+            }else {
+                doc.from="std";
+            }
+            CommonAjax.post("/rationGlj/mReplaceGLJ",{query:query,doc:doc},callback);
+
+
+        };
         return new ration_glj(project);
     }
 };

+ 6 - 2
web/building_saas/main/js/models/volume_price.js

@@ -148,7 +148,7 @@ var VolumePrice = {
                 volumePrice.feesIndex.common.totalFee = (volumePrice.feesIndex.common.unitFee * volumePrice.quantity).toDecimal(tools.owner.Decimal.common.totalFee);
                 volumePrice.needRefresh = true;
             }
-            updateField(volumePrice, field, newValue) {
+            updateField(volumePrice, field, newValue, updateNow) {
                 calcFees.setFee(volumePrice, field, newValue);
                 let updateData = [];
                 let data = {'ID': volumePrice.ID, 'projectID': this.getProject().ID()};
@@ -163,7 +163,11 @@ var VolumePrice = {
                     data[field] = newValue;
                 }
                 updateData.push({'updateType': 'ut_update', 'updateData': data});
-                tools.owner.pushNow('updateVolumePrice', this.getSourceType(), updateData);
+                if (updateNow) {
+                    tools.owner.pushNow('updateVolumePrice', this.getSourceType(), updateData);
+                } else {
+                    tools.owner.push(this.getSourceType(), updateData);
+                }
             }
         }
 

+ 3 - 0
web/building_saas/main/js/views/calc_program_view.js

@@ -227,6 +227,9 @@ let calcProgramObj = {
         me.treeNode = treeNode;
         if (treeNode.sourceType === projectObj.project.Ration.getSourceType()) {
             projectObj.project.calcProgram.calculate(treeNode);
+            if (treeNode.parent) {
+                projectObj.converseCalculateBills(treeNode.parent);
+            }
             me.datas = me.treeNode.data.calcTemplate.calcItems;
             sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
             sheetCommonObj.showData(me.sheet, me.setting, me.datas);

+ 272 - 1
web/building_saas/main/js/views/glj_view.js

@@ -14,6 +14,8 @@ var gljOprObj = {
     assSheetData:[],
     detailSheet:null,
     detailData:[],
+    GLJSelection:[],
+    parentNodeIds:{},
     setting: {
         header: [
             {headerName: "编码", headerWidth: 100, dataCode: "code", dataType: "String", formatter: "@"},
@@ -68,6 +70,64 @@ var gljOprObj = {
             lockColumns:[2,3]
         }
     },
+    gljTreeSetting:{
+        view: {
+            //addHoverDom: gljTypeTreeOprObj.addHoverDom,
+            //removeHoverDom: gljTypeTreeOprObj.removeHoverDom,
+            expandSpeed: "",
+            selectedMulti: false
+        },
+        edit: {
+            enable: false,
+            editNameSelectAll: true,
+            showRemoveBtn: true,
+            showRenameBtn: true,
+            removeTitle: "删除节点",
+            renameTitle: "更改名称"
+        },
+        data: {
+            keep: {
+                parent:true,
+                leaf:true
+            },
+            key: {
+                children: "items",
+                name: "Name"
+            },
+            simpleData: {
+                enable: false,
+                idKey: "ID",
+                pIdKey: "ParentID",
+                rootPId: -1
+            }
+        },
+        callback:{
+            onClick: function(event,treeId,treeNode) {
+                let me = gljOprObj, gljTypeId = treeNode.ID;
+                if(me.gljCurTypeId !== treeNode.ID){
+                    me.gljCurTypeId = treeNode.ID;
+                    me.filterLibGLJSheetData();
+                    me.showLibGLJSheetData();
+                }
+            }
+        }
+    },
+    gljLibSheetSetting:{
+        owner:'gljTree',
+        header: [
+            {headerName:"选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center",cellType:"checkBox"},
+            {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
+            {headerName:"名称",headerWidth:120,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"规格型号",headerWidth:80,dataCode:"specs", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"计量单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+            {headerName:"类型",headerWidth:80,dataCode:"gljType", dataType: "String",  hAlign: "center", vAlign: "center"}
+        ],
+        view:{
+            lockColumns:[0,1,2,3,4,5,6]
+        }
+    },
+    gljLibSheet:null,
     initSheet: function(sheet) {
         var me = this;
         me.sheet = sheet;
@@ -215,8 +275,10 @@ var gljOprObj = {
         }
         if(args.sheetName=='ration_coe'){
             gljOprObj.updateRationCoe(args,newval)
-        }else {
+        }else if(args.sheetName=='quantity_detail'){
             projectObj.project.quantity_detail.isSummationUpdate(args,gljOprObj.detailData,newval);
+        }else if(args.sheetName=='glj_lib'){
+            gljOprObj.setGLJSelection(args,newval);
         }
     },
     onCusButtonClick:function (sender,args){
@@ -628,8 +690,217 @@ var gljOprObj = {
         }
         return true;
     },
+    showLibGLJSheetData:function () {
+        this.gljLibSheetData=_.sortBy(this.gljLibSheetData, 'code');
+        this.gljLibSheet.setRowCount(this.gljLibSheetData.length);
+        sheetCommonObj.showData(this.gljLibSheet,this.gljLibSheetSetting,this.gljLibSheetData,gljOprObj.distTypeTree);
+    },
+    filterLibGLJSheetData:function () {
+        let me=this;
+        let val = $("input[name='glj']:checked").val();
+        if(val=='allGljs'){
+            me.gljLibSheetData =me.stdGLJ.concat(me.complementaryGLJs);
+        }else {
+            me.gljLibSheetData=me[val];
+        }
+        if($('#actionType').val()!='add'){
+            me.filterLibGLJByType();
+        }
+        if(me.gljCurTypeId==undefined){
+            return;
+        }
+        if (me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
+            me.gljLibSheetData= _.filter(me.gljLibSheetData, function(n) {
+                return _.includes(me.parentNodeIds["_pNodeId_" + me.gljCurTypeId],n.gljClass);
+            });
+        } else {
+            me.gljLibSheetData = _.filter(me.gljLibSheetData,{'gljClass':me.gljCurTypeId});
+        }
+    },
+    setGLJSelection:function (args,newVal) {
+        if($('#actionType').val()=='add'){
+            this.addGLJsSelection(args,newVal);
+        }else {
+            this.replaceGLJSelection(args,newVal);
+        }
+    },
+    addGLJsSelection:function (args,newVal) {
+        if(newVal==1){
+            this.GLJSelection.push(this.gljLibSheetData[args.row].code);
+            this.gljLibSheetData[args.row].select=1;
+        }else if(newVal==0){
+            _.pull(this.GLJSelection,this.gljLibSheetData[args.row].code);
+            this.gljLibSheetData[args.row].select=0;
+        }
+    },
+    replaceGLJSelection:function (args,newVal) {
+        var oldSelection=this.GLJSelection[0];
+        if(newVal==0){
+            args.sheet.getCell(args.row, args.col).value(1);
+            return;
+        }
+        this.GLJSelection=[this.gljLibSheetData[args.row].code];
+        this.gljLibSheetData[args.row].select=1;
+        var oindex = _.findIndex(this.gljLibSheetData,{'code':oldSelection});
+        if(oindex!=-1){
+            args.sheet.getCell(oindex, args.col).value(0);
+            this.gljLibSheetData[oindex].select=0;
+        }else {
+            var oldData = _.find(gljOprObj.AllRecode,{'code':oldSelection})
+            oldData.select=0;
+        }
+    },
+    filterLibGLJByType:function () {
+        var me=this;
+        var selected=me.sheetData[gljContextMenu.selectedRow];
+        me.gljLibSheetData=_.filter(me.gljLibSheetData,{'gljType':selected.type});
+    },
+    getComboData: function (gljDistType) {
+        let me = this;
+        let distType;
+        let distTypeTree = {
+            prefix : 'gljType',
+            distTypes: {},
+            comboDatas: [],
+            distTypesArr: []
+        };
+        gljDistType.forEach(function (typeData) {
+            let typeObj = {
+                data: typeData,
+                children: [],
+                parent: null
+            }
+            distTypeTree.distTypes[distTypeTree.prefix + typeData.ID] = typeObj;
+            distTypeTree.distTypesArr.push(typeObj);
+        });
+        gljDistType.forEach(function (typeData) {
+            distType = distTypeTree.distTypes[distTypeTree.prefix + typeData.ID];
+            let parent = distTypeTree.distTypes[distTypeTree.prefix + typeData.ParentID];
+            if(parent){
+                distType.parent = parent;
+                parent.children.push(distType);
+            }
+        });
+        distTypeTree.distTypesArr.forEach(function (distTypeObj) {
+            if(distTypeObj.data.fullName !== '材料' && distTypeObj.data.fullName !== '机械'){
+                distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
+            }
+        });
+        return distTypeTree;
+    },
+    doAddGLJ:function () {
+        var selected = projectObj.project.mainTree.selected;
+        var project= projectObj.project;
+        gljOprObj.GLJSelection= _.filter(gljOprObj.GLJSelection,function (n) {
+            return _.find(gljOprObj.sheetData,{'code':n})?false:true;
+        })
+        if(gljOprObj.GLJSelection.length>0&&selected&&selected.sourceType==ModuleNames.ration){
+            project.ration_glj.addGLJByLib(gljOprObj.GLJSelection,selected.data,function (result) {
+                if(result){
+                    project.ration_glj.datas = project.ration_glj.datas.concat(result.newRecodes);
+                    gljOprObj.sheetData = gljOprObj.sheetData.concat(result.showData)
+                    gljOprObj.showRationGLJSheetData();
+                    project.projectGLJ.loadData();
+                    $("#glj_tree_div").modal('hide');
+                }
+            });//doc.rationID=selected.data.ID;
+        }else {
+            $("#glj_tree_div").modal('hide');
+        }
+
+    },
+    doReplaceGLJ:function () {
+        var me=this;
+        var oldData=me.sheetData[gljContextMenu.selectedRow];
+        var project= projectObj.project;
+        var selectCode=gljOprObj.GLJSelection[0];
+        project.ration_glj.replaceGLJ(selectCode,oldData,function (result) {
+            if(result){
+                var index = _.findIndex(gljOprObj.sheetData,{'ID':result.ID});
+                gljOprObj.sheetData[index]=result;
+                gljOprObj.showRationGLJSheetData();
+                project.projectGLJ.loadData();
+            }
+            $("#glj_tree_div").modal('hide');
+        })
+    },
+    doMReplaceGLJ:function () {
+        var me=this;
+        var oldData=me.sheetData[gljContextMenu.selectedRow];
+        var project= projectObj.project;
+        var selectCode=gljOprObj.GLJSelection[0];
+        project.ration_glj.mReplaceGLJ(selectCode,oldData,function (result) {
+            _.forEach(project.ration_glj.datas,function (t) {
+                if(t.code==result.query.code&&t.name==result.query.name){
+                    me.updateProperty(t,result.doc);
+                }
+            })
+            gljOprObj.showRationGLJSheetData();
+            project.projectGLJ.loadData();
+            $("#glj_tree_div").modal('hide');
+        })
+    },
+    updateProperty:function (obj,doc) {
+        _.forEach(doc, function(n, key) {
+            obj[key] = n;
+        });
+    },
     refreshView:function () {
         this.showRationGLJData();
     }
 }
 
+$(function(){
+    $('#glj_tree_div').on('shown.bs.modal', function (e) {
+        if(gljOprObj.gljLibSpresd==undefined){
+            gljOprObj.gljLibSpresd=sheetCommonObj.buildSheet($('#gljLibSheet')[0], gljOprObj.gljLibSheetSetting, gljOprObj.stdGLJ.length+gljOprObj.complementaryGLJs.length);
+            gljOprObj.gljLibSpresd.bind(GC.Spread.Sheets.Events.ButtonClicked,gljOprObj.onButtonClick);
+            gljOprObj.gljLibSheet = gljOprObj.gljLibSpresd.getSheet(0);
+            gljOprObj.gljLibSheet.options.isProtected = true;
+            gljOprObj.gljLibSheet.name('glj_lib');
+        }
+        gljOprObj.gljLibSheetData =gljOprObj.AllRecode;
+        var selected=null;
+        if($('#actionType').val()=='add'){
+            gljOprObj.GLJSelection=[];
+        }else {
+             selected=gljOprObj.sheetData[gljContextMenu.selectedRow];
+            gljOprObj.GLJSelection=[selected.code];
+            gljOprObj.filterLibGLJByType();
+        }
+
+        if(selected!=null){
+            var r = _.find(gljOprObj.gljLibSheetData,{'code':selected.code});
+            r?r.select=1:"";
+        }
+        gljOprObj.showLibGLJSheetData();
+    });
+
+    $('.glj-radio').change(function () {
+        let val = $("input[name='glj']:checked").val();
+        if(val=='allGljs'){
+            gljOprObj.gljLibSheetData =gljOprObj.AllRecode;
+            gljOprObj.filterLibGLJSheetData();
+            gljOprObj.showLibGLJSheetData();
+        }else {
+            gljOprObj.gljLibSheetData=gljOprObj[val];
+            gljOprObj.filterLibGLJSheetData();
+            gljOprObj.showLibGLJSheetData();
+        }
+     })
+    $('#glj_selected_conf').click(function () {
+        if(gljOprObj.GLJSelection.length<1){
+            return;
+        }
+        if($('#actionType').val()=='add'){
+            gljOprObj.doAddGLJ();
+        }else if($('#actionType').val()=='replace'){
+            gljOprObj.doReplaceGLJ();
+        }else if($('#actionType').val()=='m_replace'){
+            gljOprObj.doMReplaceGLJ();
+        }
+    })
+})
+
+
+

+ 57 - 0
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -27,6 +27,50 @@ var gljContextMenu = {
                         var deleteRow = sheetData[gljContextMenu.selectedRow];
                         projectObj.project.ration_glj.updataOrdelete(deleteRow);
                     }
+                },
+                "add_glj": {
+                    name: '添加工料机',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        var selected = projectObj.project.mainTree.selected;
+                        if(selected&&selected.sourceType==ModuleNames.ration){
+                            return false;
+                        }
+                        return true;
+                    },
+                    callback:function () {
+                        getGLJData('add');
+                    }
+                },
+                "replace_glj": {
+                    name: '替换工料机',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        var sheetData = gljOprObj.sheetData;
+                        var disable = true;
+                        if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
+                            disable=false
+                        }
+                        return disable;
+                    },
+                    callback: function () {
+                        getGLJData('replace');
+                    }
+                },
+                "m_replace_glj": {
+                    name: '批量替换工料机',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        var sheetData = gljOprObj.sheetData;
+                        var disable = true;
+                        if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
+                            disable=false
+                        }
+                        return disable;
+                    },
+                    callback: function () {
+                        getGLJData('m_replace');
+                    }
                 }
             }
         });
@@ -126,5 +170,18 @@ var gljContextMenu = {
         //controller.setTreeSelected(controller.tree.items[target.row]);
         return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
     }
+}
 
+function getGLJData(actionType) {
+    $('#actionType').val(actionType);
+    projectObj.project.ration_glj.getGLJData(function (result) {
+        zTreeHelper.createTree(result.datas.treeData, gljOprObj.gljTreeSetting, "gljTree", gljOprObj);
+        gljOprObj.stdGLJ=result.datas.stdGLJ;
+        gljOprObj.complementaryGLJs=result.datas.complementaryGLJs;
+        gljOprObj.AllRecode=gljOprObj.stdGLJ.concat(gljOprObj.complementaryGLJs);
+        gljOprObj.distTypeTree=gljOprObj.getComboData(result.datas.distTypeTree);
+        $('#modalCon').width($(window).width()*0.5);
+        $("input[name='glj']").get(0).checked=true;
+        $("#glj_tree_div").modal({show:true});
+    })
 }

+ 7 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -38,12 +38,18 @@ let MainTreeCol = {
         billsParent: function (node) {
             return node.sourceType === projectObj.project.Bills.getSourceType() && node.source.children.length > 0;
         },
+        leafBillsWithDetail: function (node) {
+            return (!MainTreeCol.readOnly.billsParent(node)) && (node.children.length > 0);
+        },
         forCalcBase: function (node) {
             // to do according to billsParentType
             return MainTreeCol.readOnly.billsParent(node) || MainTreeCol.readOnly.non_bills(node);
         },
         forUnitFee: function (node) {
-            return MainTreeCol.readOnly.ration(node) || MainTreeCol.readOnly.billsParent(node);
+            return MainTreeCol.readOnly.ration(node) || MainTreeCol.readOnly.billsParent(node) || MainTreeCol.readOnly.leafBillsWithDetail(node);
+        },
+        forTotalFee: function (node) {
+            return MainTreeCol.readOnly.non_bills(node) || MainTreeCol.readOnly.billsParent(node) || (MainTreeCol.readOnly.leafBillsWithDetail(node));
         }
     },
     cellType: {

+ 172 - 114
web/building_saas/main/js/views/project_view.js

@@ -12,6 +12,78 @@ var projectObj = {
             subViewObj.saveComments(node);
         }*/
     },
+    treeSelectedChanged: function (node) {
+        let project = projectObj.project;
+        subViewObj.loadComments(node);
+        gljOprObj.showDataIfRationSelect(node);
+
+        // CSL.2017.07.25
+        if (SubActiveSheetNameIs('JSCX')) {
+            if (node.sourceType === project.Bills.getSourceType() || node.sourceType === project.Ration.getSourceType()) {
+                calcProgramObj.showData(node);
+            } else {
+                calcProgramObj.clearData();
+            };
+        };
+        //zhong 2017-9-1 特征及内容
+        if(pageCCOprObj.active){
+            pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];//mainSpread焦点单元格
+            if(node.sourceType === project.Bills.getSourceType()){
+                pageCCOprObj.setCacheAndShow(node);
+            }
+            else{
+                pageCCOprObj.clearData();
+            }
+        }
+    },
+    refreshBaseActn: function (tree) {
+        let setButtonValid = function (valid, btn) {
+            if (valid) {
+                btn.removeClass('disabled');
+            } else {
+                btn.addClass('disabled');
+            }
+        };
+        let selected = tree.selected, that = projectObj;
+        let canUpLevel = function (node) {
+            if (selected && selected.depth() > 0 && selected.canUpLevel()) {
+                if (selected.sourceType === that.project.Bills.getSourceType()) {
+                    return (!selected.nextSibling) || (selected.children.length === 0) || (selected.source.children.length > 0);
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        };
+        let canDownLevel = function (node) {
+            if (selected && selected.depth() > 0 && selected.canDownLevel()) {
+                if (selected.sourceType === that.project.Bills.getSourceType()) {
+                    return (selected.preSibling.children.length === 0) || (selected.preSibling.source.children.length > 0);
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        };
+        let canDelete = function (node) {
+            if (selected) {
+                if (selected.sourceType === that.project.Bills.getSourceType()) {
+                    return !(selected.data.flagsIndex && selected.data.flagsIndex.fixed && selected.data.flagsIndex.fixed.flag > 0);
+                } else {
+                    return true;
+                }
+            } else {
+                return false;
+            }
+        };
+        setButtonValid(canUpLevel(selected), $('#upLevel'));
+        setButtonValid(canDownLevel(selected), $('#downLevel'));
+        setButtonValid(selected && (selected.depth() > 0) && selected.canUpMove(), $('#upMove'));
+        setButtonValid(selected && (selected.depth() > 0) && selected.canDownMove(), $('#downMove'));
+        setButtonValid(canDelete(selected), $('#delete'));
+    },
     checkCommonField: function (editingText, colSetting) {
         let value;
         if (colSetting.data.decimal) {
@@ -27,7 +99,7 @@ var projectObj = {
         }
         return value;
     },
-    checkQuantityField: function (editingText, colSetting) {
+    checkFormulaValidField: function (editingText, colSetting) {
         let value = Number(editingText);
         if (!value) {
             try {
@@ -40,40 +112,86 @@ var projectObj = {
         }
         if (value) {
             value = value.toDecimal(colSetting.data.decimal);
-        } else {
+        } else if (editingText && editingText !== '') {
             value = null;
             alert('当前输入的数据类型不正确,请重新输入。');
         }
         return value;
     },
     checkSpreadEditingText: function (editingText, colSetting) {
-        if (colSetting.data.field === 'quantity') {
-            return this.checkQuantityField(editingText, colSetting);
+        if (colSetting.data.field === 'quantity' || colSetting.data.field === 'feesIndex.common.unitFee') {
+            return this.checkFormulaValidField(editingText, colSetting);
         } else {
             return this.checkCommonField(editingText, colSetting);
         }
     },
+    updateAndReCalculate: function (node, fieldName, value) {
+        let project = projectObj.project, calc = new BillsCalcHelper(project), nodes = [];
+        let getNodes = function (node) {
+            let cur = node, nodes = [];
+            while (cur) {
+                nodes.push(cur);
+                cur = cur.parent;
+            }
+            return nodes;
+        }
+        if (node.sourceType === projectObj.project.Bills.getSourceType()) {
+            calcFees.setFee(node.data, fieldName, value);
+            calc.calcNode(node, true);
+            nodes = getNodes(node);
+        } else if (node.sourceType === projectObj.project.VolumePrice.getSourceType()) {
+            project.beginUpdate('VolumePrice_QuantityChange');
+            project.VolumePrice.updateField(node.source, fieldName, value, false);
+            calc.calcNode(node.parent, true);
+            nodes = getNodes(node.parent);
+            project.Bills.updateNodes(nodes, false);
+            project.endUpdate();
+            nodes.push(node);
+        } else if (node.sourceType === projectObj.project.Ration.getSourceType()) {
+            project.beginUpdate('Ration_QuantityChange');
+            calcFees.setFee(node.data, fieldName, value);
+            node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);
+            // calcProgram.calculate的传参必须是cacheNode类型,故无法将计算放在Ration模块中。
+            project.calcProgram.calculate(node);
+            project.Ration.updateRation(node.source, false);
+            calc.calcNode(node.parent, true);
+            nodes = getNodes(node.parent);
+            project.Bills.updateNodes(nodes, false);
+            project.endUpdate();
+            nodes.push(node);
+        }
+        this.mainController.refreshTreeNode(nodes, false);
+        calc = null;
+    },
     mainSpreadEditEnded: function (sender, info) {
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
         let colSetting = projectObj.mainController.setting.cols[info.col];
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
+        // 检查输入类型等
         let value = projectObj.checkSpreadEditingText(info.editingText, colSetting);
-        let validate = project.quantity_detail.quantityEditChecking(value,node,fieldName);
 
-        if (colSetting.data.wordWrap) {
-            info.sheet.autoFitRow(info.row);
-        }
-        if (value && value != calcFees.getFee(node.data, fieldName)&&validate) {
-            if (node.sourceType === project.Bills.getSourceType()) {
-                project.Bills.updateField(node.source, fieldName, value);
-            } else if (node.sourceType === project.Ration.getSourceType()) {
-                project.Ration.updateField(node.source, fieldName, value);
-            } else if (node.sourceType === project.VolumePrice.getSourceType()) {
-                project.VolumePrice.updateField(node.source, fieldName, value);
+        if (value && value !== calcFees.getFee(node.data, fieldName)) {
+            if (fieldName === 'code') {
+
+            } else if (fieldName === 'quantity' && project.quantity_detail.quantityEditChecking(value,node,fieldName)) {
+                projectObj.updateAndReCalculate(node, fieldName, value);
+            } else if (fieldName === 'feesIndex.common.unitFee') {
+                projectObj.updateAndReCalculate(node, fieldName, value);
+            } else {
+                if (node.sourceType === project.Bills.getSourceType()) {
+                    project.Bills.updateField(node.source, fieldName, value, true);
+                } else if (node.sourceType === project.Ration.getSourceType()) {
+                    project.Ration.updateField(node.source, fieldName, value, true);
+                } else if (node.sourceType === project.VolumePrice.getSourceType()) {
+                    project.VolumePrice.updateField(node.source, fieldName, value, true);
+                }
+                if (colSetting.data.wordWrap) {
+                    info.sheet.autoFitRow(info.row);
+                }
+                projectObj.mainController.refreshTreeNode([node]);
             }
         }
-        projectObj.mainController.refreshTreeNode([node]);
     },
     checkMainSpread: function () {
         if (!this.mainSpread) {
@@ -91,6 +209,9 @@ var projectObj = {
         this.project = PROJECT.createNew(scUrlUtil.GetQueryString('project'), userID);
         this.project.loadDatas(function (err) {
             if (!err) {
+                that.project.calcFields = JSON.parse(JSON.stringify(feeType));
+                that.project.setCalcFlag(rationContent);
+
                 let str = JSON.stringify(that.project.projSetting.main_tree_col);
                 that.project.projSetting.mainGridSetting = JSON.parse(str);
                 that.project.projSetting.mainGridSetting.frozenCols = 4;
@@ -112,89 +233,15 @@ var projectObj = {
                         col.data.formatter = MainTreeCol.getNumberFormatter(col.data.decimal);
                     }
                 });
-                that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), that.project.projSetting.mainGridSetting);
-                that.mainController.showTreeData();
-                that.mainController.bind('refreshBaseActn', function (tree) {
-                    var setButtonValid = function (valid, btn) {
-                        if (valid) {
-                            btn.removeClass('disabled');
-                        } else {
-                            btn.addClass('disabled');
-                        }
-                    };
-                    let selected = tree.selected;
-                    let canUpLevel = function (node) {
-                        if (selected && selected.depth() > 0 && selected.canUpLevel()) {
-                            if (selected.sourceType === that.project.Bills.getSourceType()) {
-                                return (!selected.nextSibling) || (selected.children.length === 0) || (selected.source.children.length > 0);
-                            } else {
-                                return false;
-                            }
-                        } else {
-                            return false;
-                        }
-                    };
-                    let canDownLevel = function (node) {
-                        if (selected && selected.depth() > 0 && selected.canDownLevel()) {
-                            if (selected.sourceType === that.project.Bills.getSourceType()) {
-                                return (selected.preSibling.children.length === 0) || (selected.preSibling.source.children.length > 0);
-                            } else {
-                                return false;
-                            }
-                        } else {
-                            return false;
-                        }
-                    };
-                    let canDelete = function (node) {
-                        if (selected) {
-                            if (selected.sourceType === that.project.Bills.getSourceType()) {
-                                return !(selected.data.flagsIndex && selected.data.flagsIndex.fixed && selected.data.flagsIndex.fixed.flag > 0);
-                            } else {
-                                return true;
-                            }
-                        } else {
-                            return false;
-                        }
-                    };
-                    setButtonValid(canUpLevel(selected), $('#upLevel'));
-                    setButtonValid(canDownLevel(selected), $('#downLevel'));
-                    setButtonValid(selected && (selected.depth() > 0) && selected.canUpMove(), $('#upMove'));
-                    setButtonValid(selected && (selected.depth() > 0) && selected.canDownMove(), $('#downMove'));
-                    setButtonValid(canDelete(selected), $('#delete'));
-                });
-
-              /*  if(!projectObj.gljSpreed){
-                    projectObj.gljSpreed = gljView.buildSheet($("#gljSpread")[0]);
-                    that.loadGLJSpreadContextMenu();
-                }*/
 
                 that.project.calcProgram = new CalcProgram(that.project);
                 that.project.calcProgram.compileAllTemps();
 
+                that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), that.project.projSetting.mainGridSetting);
+                that.mainController.showTreeData();
+                that.mainController.bind('refreshBaseActn', that.refreshBaseActn);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
-                that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, function (node) {
-                    subViewObj.loadComments(node);
-                    gljOprObj.showDataIfRationSelect(node);
-
-                    // CSL.2017.07.25
-                    if (SubActiveSheetNameIs('JSCX')) {
-                        if (node.sourceType === that.project.Bills.getSourceType() || node.sourceType === that.project.Ration.getSourceType()) {
-                            calcProgramObj.showData(node);
-                        } else {
-                            calcProgramObj.clearData();
-                        };
-                    };
-                    //zhong 2017-9-1 特征及内容
-                    if(pageCCOprObj.active){
-                        pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];//mainSpread焦点单元格
-                        if(node.sourceType === that.project.Bills.getSourceType()){
-                            pageCCOprObj.setCacheAndShow(node);
-                        }
-                        else{
-                            pageCCOprObj.clearData();
-                        }
-                    }
-                });
+                that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
 
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
 
@@ -302,31 +349,34 @@ var projectObj = {
                 },
                 "spr2":'--------',
                 "calculateAll_RationContent": {
-                    name: '造价计算(子目含量取费)',
-                    callback: function () {
-                        ProjectController.calculateAll(project, controller, rationContent);
-                    }
-                },
-                "calculateAll_RationPrice": {
-                    name: '造价计算(子目单价取费)',
-                    callback: function () {
-                        ProjectController.calculateAll(project, controller, rationPrice);
-                    }
-                },
-                "calculateAll_RationPriceConverse": {
-                    name: '造价计算(子目单价取费-反算)',
-                    callback: function () {
-                        ProjectController.calculateAll(project, controller, rationPriceConverse);
-                    }
-                },
-                "calculateAll_BillsPrice": {
-                    name: '造价计算(清单单价取费)',
+                    name: '造价计算',
                     callback: function () {
-                        ProjectController.calculateAll(project, controller, billsPrice);
+                        projectObj.calculateAll();
                     }
                 }
             }
         });
+    },
+    // 计算node及node的所有父项
+    converseCalculateBills: function (node) {
+        let calc = new BillsCalcHelper(this.project);
+        calc.calcNode(node, true);
+        let cur = node, nodes = [];
+        while (cur) {
+            nodes.push(cur);
+            cur = cur.parent;
+        }
+        this.mainController.refreshTreeNode(nodes, false);
+        this.project.Bills.updateNodes(nodes, true);
+        calc = null;
+    },
+    // 计算全部清单
+    calculateAll: function () {
+        let calc = new BillsCalcHelper(this.project);
+        calc.calcAll();
+        this.mainController.showTreeData();
+        this.project.Bills.updateAll();
+        calc = null;
     }
 };
 
@@ -407,3 +457,11 @@ $('#downMove').click(function () {
     }
 });
 
+$('#rationContent').val(rationContent);
+$('#rationPrice').val(rationPrice);
+$('#rationPriceConverse').val(rationPriceConverse);
+$('#billsPrice').val(billsPrice);
+$('#property_ok').click(function () {
+    projectObj.project.setCalcFlag(parseInt($("input[name='calcFlag']:checked").val()));
+    projectObj.calculateAll();
+});

+ 7 - 114
web/building_saas/pm/html/project-management.html

@@ -6,11 +6,13 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>项目管理-Smartcost</title>
+    <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <!--zTree-->
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
+    <!-- endinject -->
 
     <script>
         // 这里的变量供页面调用
@@ -38,7 +40,7 @@
         </div>
     </div>
     <%include ../../../common/html/header.html %>
-    <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+    <nav class="navbar navbar-expand-lg justify-content-between navbar-light p-0">
         <ul class="nav navbar-nav px-1">
             <li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle" href="http://example.com" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">文件</a>
@@ -493,8 +495,9 @@
     </div>
 </div>
 <!-- JS. -->
-<script src="/lib/jquery/jquery.min.js"></script>
-<script src="/lib/tether/tether.min.js"></script>
+<!-- inject:js -->
+<script src="/lib/jquery/jquery-3.2.1.min.js"></script>
+<script src="/lib/popper/popper.min.js"></script>
 <script src="/lib/bootstrap/bootstrap.min.js"></script>
 <script src="/web/building_saas/js/global.js"></script>
 <script src="/public/web/date_util.js"></script>
@@ -505,118 +508,8 @@
 <!-- zTree -->
 <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
 <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
-<SCRIPT type="text/javascript">
-    <!--
-    var setting = {	};
+<!-- endinject -->
 
-    var zNodes =[
-        { name:"父节点1 - 展开", open:true,
-            children: [
-                { name:"父节点11 - 折叠",
-                    children: [
-                        { name:"叶子节点111"},
-                        { name:"叶子节点112"},
-                        { name:"叶子节点113"},
-                        { name:"叶子节点114"}
-                    ]},
-                { name:"父节点12 - 折叠",
-                    children: [
-                        { name:"叶子节点121"},
-                        { name:"叶子节点122"},
-                        { name:"叶子节点123"},
-                        { name:"叶子节点124"}
-                    ]},
-                { name:"父节点13 - 没有子节点", isParent:true}
-            ]},
-        { name:"父节点2 - 折叠",
-            children: [
-                { name:"父节点21 - 展开", open:true,
-                    children: [
-                        { name:"叶子节点211"},
-                        { name:"叶子节点212"},
-                        { name:"叶子节点213"},
-                        { name:"叶子节点214"}
-                    ]},
-                { name:"父节点22 - 折叠",
-                    children: [
-                        { name:"叶子节点221"},
-                        { name:"叶子节点222"},
-                        { name:"叶子节点223"},
-                        { name:"叶子节点224"}
-                    ]},
-                { name:"父节点23 - 折叠",
-                    children: [
-                        { name:"叶子节点231"},
-                        { name:"叶子节点232"},
-                        { name:"叶子节点233"},
-                        { name:"叶子节点234"}
-                    ]}
-            ]},
-        { name:"父节点3 - 没有子节点", isParent:true}
-
-    ];
-
-    $(document).ready(function(){
-        $.fn.zTree.init($("#treeDemo"), setting, zNodes);
-    });
-    //-->
-</SCRIPT>
-<SCRIPT type="text/javascript">
-    <!--
-    var setting = {	};
-
-    var zNodes =[
-        { name:"父节点1 - 展开", open:true,
-            children: [
-                { name:"父节点11 - 折叠",
-                    children: [
-                        { name:"叶子节点111"},
-                        { name:"叶子节点112"},
-                        { name:"叶子节点113"},
-                        { name:"叶子节点114"}
-                    ]},
-                { name:"父节点12 - 折叠",
-                    children: [
-                        { name:"叶子节点121"},
-                        { name:"叶子节点122"},
-                        { name:"叶子节点123"},
-                        { name:"叶子节点124"}
-                    ]},
-                { name:"父节点13 - 没有子节点", isParent:true}
-            ]},
-        { name:"父节点2 - 折叠",
-            children: [
-                { name:"父节点21 - 展开", open:true,
-                    children: [
-                        { name:"叶子节点211"},
-                        { name:"叶子节点212"},
-                        { name:"叶子节点213"},
-                        { name:"叶子节点214"}
-                    ]},
-                { name:"父节点22 - 折叠",
-                    children: [
-                        { name:"叶子节点221"},
-                        { name:"叶子节点222"},
-                        { name:"叶子节点223"},
-                        { name:"叶子节点224"}
-                    ]},
-                { name:"父节点23 - 折叠",
-                    children: [
-                        { name:"叶子节点231"},
-                        { name:"叶子节点232"},
-                        { name:"叶子节点233"},
-                        { name:"叶子节点234"}
-                    ]}
-            ]},
-        { name:"父节点3 - 没有子节点", isParent:true}
-
-    ];
-
-    $(document).ready(function(){
-        $.fn.zTree.init($("#treeDemo2"), setting, zNodes);
-    });
-    //-->
-</SCRIPT>
 </body>
 <script type="text/javascript">
     autoFlashHeight();

+ 7 - 5
web/common/html/header.html

@@ -1,12 +1,12 @@
-<nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
+<nav class="navbar navbar-expand-lg navbar-light bg-light p-0 justify-content-between">
     <span class="header-logo px-2">Smartcost</span>
     <div class="navbar-text navbar-crumb p-0" id="fullpath">
         <% if (action !== 'index' || controller !== 'pm') {%>
         <span class="text-truncate"><a href="/pm">项目管理</a></span>
         <% } %>
     </div>
-    <div class="float-lg-right navbar-text pt-0">
-        <div class="dropdown d-inline-block">
+    <div class="float-lg-right navbar-text p-0">
+        <div class="dropdown d-inline-block navbar-nav">
             <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><%= sessionUser.email %></button>
             <div class="dropdown-menu dropdown-menu-right">
                 <a class="dropdown-item" href="/user/info" target="_blank">账号资料</a>
@@ -57,6 +57,8 @@
         </div>
     </div>
 </div>
-<script src="/lib/jquery/jquery.min.js"></script>
+<!-- inject:js -->
+<script src="/lib/jquery/jquery-3.2.1.min.js"></script>
 <script type="text/javascript" src="/web/building_saas/js/moment.min.js"></script>
-<script type="text/javascript" src="/web/building_saas/js/message.js"></script>
+<script type="text/javascript" src="/web/building_saas/js/message.js"></script>
+<!-- endinject -->

BIN
web/dest/css/fonts/fontawesome-webfont.woff2


BIN
web/dest/css/img/diy/1_close.png


BIN
web/dest/css/img/diy/1_open.png


BIN
web/dest/css/img/diy/2.png


BIN
web/dest/css/img/diy/3.png


BIN
web/dest/css/img/diy/4.png


BIN
web/dest/css/img/diy/5.png


BIN
web/dest/css/img/diy/6.png


BIN
web/dest/css/img/diy/7.png


BIN
web/dest/css/img/diy/8.png


BIN
web/dest/css/img/diy/9.png


BIN
web/dest/css/img/line_conn.gif


BIN
web/dest/css/img/loading.gif


BIN
web/dest/css/img/zTreeStandard.gif


BIN
web/dest/css/img/zTreeStandard.png


+ 2 - 2
web/src/html/pm/project-management.html

@@ -40,7 +40,7 @@
         </div>
     </div>
     <%include ../../../common/html/header.html %>
-    <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+    <nav class="navbar navbar-expand-lg justify-content-between navbar-light p-0">
         <ul class="nav navbar-nav px-1">
             <li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle" href="http://example.com" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">文件</a>
@@ -496,7 +496,7 @@
 </div>
 <!-- JS. -->
 <!-- inject:js -->
-<script src="/lib/tether/tether.min.js"></script>
+<script src="/lib/popper/popper.min.js"></script>
 <script src="/lib/bootstrap/bootstrap.min.js"></script>
 <script src="/web/building_saas/js/global.js"></script>
 <script src="/public/web/date_util.js"></script>

+ 5 - 5
web/users/html/login-infoinput.html

@@ -17,13 +17,13 @@
 </div>
 <div class="container mt-3">
     <form class="row" method="post" action="/user/info" id="info-form">
-        <div class="col-lg-8 offset-lg-2">
+        <div class="col-lg-8 m-auto">
             <div class="card newuser-input">
-                <div class="card-block">
+                <div class="card-body">
                     <h4 class="card-title">在开始使用前,请填写以下信息。</h4>
                     <h6 class="card-subtitle text-muted">详细填写这些信息,可以让我们更好的服务您。</h6>
                 </div>
-                <div class="card-block">
+                <div class="card-body">
                     <div class="form-group">
                         <input class="form-control" placeholder="你的姓名" name="real_name" id="name">
                     </div>
@@ -69,8 +69,8 @@
     </form>
 </div>
 <!-- JS. -->
-<script src="/lib/jquery/jquery.min.js"></script>
-<script src="/lib/tether/tether.min.js"></script>
+<script src="/lib/jquery/jquery-3.2.1.min.js"></script>
+<script src="/lib/popper/popper.min.js"></script>
 <script src="/lib/bootstrap/bootstrap.min.js"></script>
 <script src="/web/building_saas/js/global.js"></script>
 <script src="/web/users/js/user.js"></script>

+ 8 - 5
web/users/html/login.html

@@ -5,11 +5,11 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>用户登录-Smartcost</title>
+    <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
-    <script src="/lib/jquery/jquery.min.js"></script>
-    <script src="/public/web/url_util.js"></script>
+    <!-- endinject -->
 </head>
 <body>
     <div class="container">
@@ -37,7 +37,6 @@
             </div>
         </form>
 
-        <script type="text/javascript" src="/web/users/js/login.js"></script>
     </div>
     <!--弹出信息-->
     <div class="modal fade" id="ver" data-backdrop="static">
@@ -69,10 +68,14 @@
         </div>
     </div>
     <!-- JS. -->
-
-    <script src="/lib/tether/tether.min.js"></script>
+    <!-- inject:js -->
+    <script src="/lib/jquery/jquery-3.2.1.min.js"></script>
+    <script src="/public/web/url_util.js"></script>
+    <script src="/lib/popper/popper.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
+    <script type="text/javascript" src="/web/users/js/login.js"></script>
+    <!-- endinject -->
 </body>
 
 </html>

+ 2 - 2
web/users/html/user-info.html

@@ -84,8 +84,8 @@
     </div>
 </div>
 <!-- JS. -->
-<script src="/lib/jquery/jquery.min.js"></script>
-<script src="/lib/tether/tether.min.js"></script>
+<script src="/lib/jquery/jquery-3.2.1.min.js"></script>
+<script src="/lib/popper/popper.min.js"></script>
 <script src="/lib/bootstrap/bootstrap.min.js"></script>
 <script src="/web/building_saas/js/global.js"></script>
 <script src="/web/users/js/user.js"></script>

+ 2 - 2
web/users/html/user-safe.html

@@ -10,8 +10,8 @@
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <!-- JS. -->
-    <script src="/lib/jquery/jquery.min.js"></script>
-    <script src="/lib/tether/tether.min.js"></script>
+    <script src="/lib/jquery/jquery-3.2.1.min.js"></script>
+    <script src="/lib/popper/popper.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script type="text/javascript" src="/lib/bootstrap/bootstrap-paginator.js"></script>
     <script src="/web/building_saas/js/global.js"></script>

+ 2 - 2
web/users/html/user-set.html

@@ -78,8 +78,8 @@
         </div>
     </div>
     <!-- JS. -->
-    <script src="/lib/jquery/jquery.min.js"></script>
-    <script src="/lib/tether/tether.min.js"></script>
+    <script src="/lib/jquery/jquery-3.2.1.min.js"></script>
+    <script src="/lib/popper/popper.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
 </body>