Просмотр исходного кода

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

Tony Kang 7 месяцев назад
Родитель
Сommit
c72e219a74

+ 6 - 5
app/controller/spss_controller.js

@@ -390,12 +390,13 @@ module.exports = app => {
             });
             if (!stage) return [bills, pos];
 
-            const preStage = stage.preCheckedStage ? await this.ctx.service.stageBillsFinal.getFinalData(tender, stage.order) : [];
+            const preStage = await this.ctx.service.stageBillsFinal.getFinalData(tender, stage.order);
             this.ctx.helper.assignRelaData(bills, [
                 { data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid' },
             ]);
 
-            const preStagePos = stage.preCheckedStage ? await this.ctx.service.stagePosFinal.getFinalData(tender, stage.preCheckedStage.order) : [];
+            const preStagePos = await this.ctx.service.stagePosFinal.getFinalData(tender, stage.order);
+            console.log(stage.in_time, preStage.length, preStagePos.length);
             this.ctx.helper.assignRelaData(pos, [
                 { data: preStagePos, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid' },
             ]);
@@ -713,9 +714,9 @@ module.exports = app => {
 
             const data = await this.ctx.service.stageOther.getStageData(stage);
             for (const d of data) {
-                d.pre_tp = pd.tp;
-                d.end_tp = pd.tp;
-                pd.tp = 0;
+                d.pre_tp = d.tp;
+                d.end_tp = d.tp;
+                d.tp = 0;
             }
             return data;
         }

+ 3 - 3
app/public/js/material_exponent.js

@@ -142,7 +142,7 @@ $(document).ready(() => {
         },
     };
 
-    const needUpdateArray = ['m_price', 'remark'];
+    const needUpdateArray = ['weight_num', 'm_price', 'remark'];
 
     const materialExponentSpreadObj = {
         getMaterialExponentData: function (msid = null, mnid = null) {
@@ -379,7 +379,7 @@ $(document).ready(() => {
                         validText = ZhCalc.round(num, 3);
                         num = ZhCalc.round(num, 3);
                     }
-                    const total_weight = ZhCalc.add(ZhCalc.sub(ZhCalc.sum(_.map(materialExponentData, 'weight_num')), parseFloat(orgValue)), num);
+                    const total_weight = showStageExponent || exponent_nodes ? ZhCalc.add(ZhCalc.sub(ZhCalc.sum(_.map(materialExponentShardData, 'weight_num')), parseFloat(orgValue)), num) : ZhCalc.add(ZhCalc.sub(ZhCalc.sum(_.map(materialExponentData, 'weight_num')), parseFloat(orgValue)), num);
                     if (total_weight > 1) {
                         toastr.error('加权系数总和不能大于1');
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -591,7 +591,7 @@ $(document).ready(() => {
                             validText = ZhCalc.round(num, 3);
                             num = ZhCalc.round(num, 3);
                         }
-                        const total_weight = ZhCalc.add(ZhCalc.sub(_.sumBy(materialExponentData, 'weight_num'), parseFloat(orgValue)), num);
+                        const total_weight = showStageExponent || exponent_nodes ? ZhCalc.add(ZhCalc.sub(ZhCalc.sum(_.map(materialExponentShardData, 'weight_num')), parseFloat(orgValue)), num) : ZhCalc.add(ZhCalc.sub(ZhCalc.sum(_.map(materialExponentData, 'weight_num')), parseFloat(orgValue)), num);
                         if (total_weight > 1) {
                             toastMessageUniq(getPasteHint(hint.weightNumberCan, hintRow));
                             bPaste = false;

+ 20 - 7
app/public/js/shares/tender_permission.js

@@ -15,20 +15,20 @@ const MemberPermission = function() {
     let oldSearchVal = null;
 
     const syncSelectedMarks = function() {
-        const selectedUids = new Set(); 
+        const selectedUids = new Set();
         $('#member-list tr[uid]').each(function() {
-            const uid = parseInt($(this).attr('uid'), 10); 
+            const uid = parseInt($(this).attr('uid'), 10);
             if (!isNaN(uid)) {
                 selectedUids.add(uid);
             }
         });
         $('.dropdown-menu .book-list dd[data-id]').each(function() {
-            const userId = parseInt($(this).data('id'), 10); 
-            const $mark = $(this).find('.selected-mark'); 
+            const userId = parseInt($(this).data('id'), 10);
+            const $mark = $(this).find('.selected-mark');
 
             if (!isNaN(userId) && $mark.length > 0) {
                 if (selectedUids.has(userId)) {
-                    $mark.show(); 
+                    $mark.show();
                 } else {
                     $mark.hide();
                 }
@@ -109,6 +109,7 @@ const MemberPermission = function() {
             return;
         }
         $('#member-list').append(getUserPermissionHtml({ uid: user.id, name: user.name, role: user.role }));
+        $("#member-table").bootstrapTable('resetView');
         syncSelectedMarks();
     });
 
@@ -139,18 +140,30 @@ const MemberPermission = function() {
         data.parts = permissionBlock.map(x => { return x.key; });
         const result = await postDataAsync(setting.loadUrl, data );
         $('#member-list').html(getPermissionHtml(result));
+        $("#member-table").bootstrapTable('resetView');
         syncSelectedMarks();
     };
-
     const show = async function(info) {
         setting = info;
-        await loadMemberPermission();
         $('#member').modal('show');
+        await loadMemberPermission();
         syncSelectedMarks();
     };
+    let first = 1;
+    $('#member').on('shown.bs.modal', async function () {
+        if (first) {
+            const option = {
+                locale: 'zh-CN',
+                height: 400,
+            }
+            $("#member-table").bootstrapTable('destroy').bootstrapTable(option);
+            first = 0;
+        }
+    });
 
     $('#member').on('click', 'a[name="del-member"]', function () {
         $(this).parent().parent().remove();
+        $("#member-table").bootstrapTable('resetView');
         syncSelectedMarks();
     });
 

+ 2 - 2
app/public/js/spss_gather_stage.js

@@ -230,14 +230,14 @@ $(document).ready(() => {
 
                 treeSetting.calcFields = ['sum_total_price', 'sum_contract_tp', 'sum_qc_tp', 'sum_gather_tp', 'sum_end_contract_tp', 'sum_end_qc_tp', 'sum_end_gather_tp'];
                 for (let i = 1; i <= result.length; i++) {
-                    treeSetting.calcFields.push('total_price_' + i, 'contract_tp_' + i, 'qc_tp_' + i, 'gather_tp_' + i, 'end_contract_tp_' + i, 'end_qc_tp_' + i, 'end_gather_tp_' + i);
+                    treeSetting.calcFields.push('total_price_' + i, 'contract_tp_' + i, 'qc_tp_' + i, 'gather_tp_' + i, 'end_contract_tp_' + i, 'end_qc_tp_' + i, 'end_gather_tp_' + i, 'pre_contract_tp_' + i, 'pre_qc_tp_' + i, 'pre_gather_tp_' + i);
                 }
 
                 const tenderTreeSetting = {
                     id: 'ledger_id', pid: 'ledger_pid', order: 'order', level: 'level',
                     rootId: -1,
                     keys: ['id', 'tender_id', 'ledger_id'],
-                    calcFields: ['total_price', 'contract_tp', 'qc_tp', 'gather_tp', 'end_contract_tp', 'end_qc_tp', 'end_gather_tp'],
+                    calcFields: ['total_price', 'contract_tp', 'qc_tp', 'gather_tp', 'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp', 'end_contract_tp', 'end_qc_tp', 'end_gather_tp'],
                     calcFun: function(node) {
                         if (!node.children || node.children.length === 0) {
                             node.pre_gather_qty = ZhCalc.add(node.pre_contract_qty, node.pre_qc_qty);

+ 8 - 7
app/service/material_exponent.js

@@ -225,7 +225,7 @@ module.exports = app => {
 
         async _updateOneExponentData(transaction, data, ms_id = null, mn_id = null) {
             // 当以下值和exponent值不相同时,需要同步更新最新的计算表达式和金额到stage表里,无需更新到exponentShard表
-            const updateColsArray = ['symbol', 'symbol_desc', 'code', 'weight_num', 'basic_price', 'is_summary', 'basic_times'];
+            const updateColsArray = ['symbol', 'symbol_desc', 'code', 'basic_price', 'is_summary', 'basic_times'];
             const updateCalcArray = ['weight_num', 'basic_price', 'is_summary'];
             let needCalc = false;
             let needUp = false;
@@ -331,8 +331,8 @@ module.exports = app => {
             if (mn_id !== null) mesCondition.mn_id = mn_id;
             const mesList = await transaction.select(this.ctx.service.materialExponentShard.tableName, { where: mesCondition });
             console.log(mesList);
-            const materialExponentColArray = ['symbol', 'symbol_desc', 'code', 'weight_num', 'basic_price', 'is_summary', 'basic_times'];
-            const materialExponentShardColArray = ['m_price', 'remark'];
+            const materialExponentColArray = ['symbol', 'symbol_desc', 'code', 'basic_price', 'is_summary', 'basic_times'];
+            const materialExponentShardColArray = ['weight_num', 'm_price', 'remark'];
             const updateCalcArray = ['weight_num', 'basic_price', 'm_price', 'is_summary'];
             const updateMeArray = [];
             const udpateMseArray = [];
@@ -412,19 +412,19 @@ module.exports = app => {
                 };
                 const result = await transaction.insert(this.tableName, insert_data);
                 // 获取所有期数据
-                const materials = await this.ctx.service.material.getAllDataByCondition({
+                const materials = await this.ctx.service.material.getAllDataByCondition({ where: {
                     tid: this.ctx.tender.id,
-                });
+                } });
                 // const qi_order = high_material.status === auditConst.status.uncheck || high_material.status === auditConst.status.checkNo ? high_material.order - 1 : high_material;
                 // const qi_order = high_material.status === auditConst.status.uncheck || high_material.status === auditConst.status.checkNo ? high_material.order - 1 : high_material;
                 const insert_history_data = [];
                 const insert_stage_data = [];
                 for (const m of materials) {
                     if (m.is_stage_self && m.is_new_exponent) {
-                        const materialStages = await this.ctx.service.materialStage.getAllDataByCondition({
+                        const materialStages = await this.ctx.service.materialStage.getAllDataByCondition({ where: {
                             tid: this.ctx.tender.id,
                             mid: m.id,
-                        });
+                        } });
                         for (const ms of materialStages) {
                             const one_stage_insert = {
                                 tid: this.ctx.tender.id,
@@ -464,6 +464,7 @@ module.exports = app => {
                 if (insert_stage_data.length > 0) await transaction.insert(this.ctx.service.materialExponentShard.tableName, insert_stage_data);
                 await transaction.commit();
             } catch (err) {
+                console.log(err);
                 await transaction.rollback();
                 throw err;
             }

+ 7 - 5
app/service/material_exponent_shard.js

@@ -12,7 +12,7 @@ const auditConst = require('../const/audit').material;
 const materialConst = require('../const/material');
 const MaterialCalculator = require('../lib/material_calc');
 
-const needUpdateArray = ['m_price', 'remark'];
+const needUpdateArray = ['weight_num', 'm_price', 'remark'];
 
 module.exports = app => {
     class MaterialExponentShard extends app.BaseService {
@@ -167,14 +167,14 @@ module.exports = app => {
             let sumByChange = 0;
             let constant = 0;
             for (const ex of exponentList) {
+                const stageEx = this._.find(stageExponentList, { me_id: ex.id });
                 if (ex.type === materialConst.ex_type[0].value) {
-                    constant = ex.weight_num ? ex.weight_num : 0;
+                    constant = stageEx.weight_num ? stageEx.weight_num : 0;
                     expr += constant.toString();
                 } else if (ex.type === materialConst.ex_type[1].value) {
-                    const stageEx = this._.find(stageExponentList, { me_id: ex.id });
-                    const calc_num = ex.basic_price > 0 ? this.ctx.helper.mul(ex.weight_num, this.ctx.helper.div(stageEx.m_price, ex.basic_price)) : 0;
+                    const calc_num = ex.basic_price > 0 ? this.ctx.helper.mul(stageEx.weight_num, this.ctx.helper.div(stageEx.m_price, ex.basic_price)) : 0;
                     const change = calc_num ? this.ctx.helper.round(calc_num, decimal.qty) : 0;
-                    expr = expr + (change !== 0 ? '+' + ex.weight_num.toString() + '*(' + stageEx.m_price.toString() + '/' + ex.basic_price.toString() + ')' : '');
+                    expr = expr + (change !== 0 ? '+' + stageEx.weight_num.toString() + '*(' + stageEx.m_price.toString() + '/' + ex.basic_price.toString() + ')' : '');
                     sumByChange = this.ctx.helper.add(sumByChange, change);
                 }
             }
@@ -270,6 +270,7 @@ module.exports = app => {
                         ms_id: materialStageInfo.id,
                         me_id: me.id,
                         type: me.type,
+                        weight_num: me.weight_num,
                         m_price: me.m_price,
                         remark: me.remark,
                     };
@@ -298,6 +299,7 @@ module.exports = app => {
                         me_id: e.id,
                         ms_id: ms.id,
                         type: e.type,
+                        weight_num: e.weight_num,
                         m_price: e.m_price,
                     };
                     insertStageExponentData.push(oneStageExponentData);

+ 2 - 2
app/service/tender_permission.js

@@ -99,7 +99,7 @@ module.exports = app => {
 
         parsePermission(data) {
             const _ = this.ctx.helper._;
-            const datas = data instanceof Array ? data : [data];
+            const datas = data ? (data instanceof Array ? data : [data]) : [];
             datas.forEach(x => {
                 for (const p in this.PermissionConst) {
                     x[p] = x[p] ? _.map(x[p].split(','), _.toInteger) : [];
@@ -113,7 +113,7 @@ module.exports = app => {
             for (const block of this.PermissionBlock) {
                 const per = {};
                 for(const p of block.permission) {
-                    per[p.key] = permission[block.key].indexOf(p.value) >= 0;
+                    per[p.key] = permission ? permission[block.key].indexOf(p.value) >= 0 : false;
                 }
                 result[block.key] = per;
             }

+ 2 - 2
app/view/schedule/list_sub_menu.ejs

@@ -1,6 +1,6 @@
 <div class="panel-sidebar" id="sub-menu">
-    <div class="sidebar-title text-center" data-toggle="tooltip" data-placement="right" data-original-title="<%- ctx.subProject.name %>">
-        <%- (ctx.subProject.name.length > 15 ? ctx.subProject.name.substring(0,15) + '...' : ctx.subProject.name) %>
+    <div class="sidebar-title" data-toggle="tooltip" data-placement="right" data-original-title="<%- ctx.tender.data.name %>">
+        <%- (ctx.tender.data.name.length > 15 ? ctx.tender.data.name.substring(0,15) + '...' : ctx.tender.data.name) %>
     </div>
     <div class="scrollbar-auto">
         <% include ./list_sub_menu_list.ejs %>

+ 2 - 2
app/view/schedule/modal.ejs

@@ -6,12 +6,12 @@
             <div class="modal-header">
                 <h5 class="modal-title">进度台账</h5>
             </div>
-            <% if (tender.user_id !== ctx.session.sessionUser.accountId) { %>
+            <% if (!ctx.tender.user_permission.schedule.edit) { %>
             <div class="modal-body">
                 <h5>未设置进度台账无法查看</h5>
             </div>
             <div class="modal-footer">
-                <a href="/tender/<%- ctx.tender.id %>" class="btn btn-sm btn-primary">回到标段概况</a>
+                <a href="/sp/<%- ctx.subProject.id %>/schedule/tender" class="btn btn-sm btn-secondary">关闭页面</a>
             </div>
             <% } else { %>
             <div class="modal-body">

+ 63 - 46
app/view/shares/tender_permission_modal.ejs

@@ -1,3 +1,18 @@
+<link href="/public/css/bootstrap/bootstrap-table.min.css" rel="stylesheet">
+<link href="/public/css/bootstrap/bootstrap-table-fixed-columns.min.css" rel="stylesheet">
+<style>
+    /*.bootstrap-table .fixed-table-container.fixed-height:not(.has-footer) {*/
+    /*border-bottom: 0;*/
+    /*}*/
+    @-moz-document url-prefix() {
+        table {
+            table-layout: fixed;
+        }
+    }
+    .customize-header tr th .th-inner{
+        padding: 0.3rem!important;
+    }
+</style>
 <!--成员管理-->
 <div class="modal" id="member" data-backdrop="static">
     <div class="modal-dialog modal-lg" role="document">
@@ -5,55 +20,55 @@
             <div class="modal-header">
                 <h5 class="modal-title">成员管理</h5>
             </div>
-            <div class="modal-body" style="overflow-y: auto; height: 480px">
-                <div class="dropdown">
-                    <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                        添加用户
-                    </button>
-                    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" style="width:220px">
-                        <div class="mb-2 p-2"><input class="form-control form-control-sm" placeholder="姓名/手机 检索" id="member-search" autocomplete="off"></div>
-                        <dl class="list-unstyled book-list">
-                            <% accountGroup.forEach((group, idx) => { %>
-                            <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
-                            <div class="dd-content" data-toggleid="<%- idx %>">
-                                <% group.groupList.forEach(item => { %>
-                                <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
-                                    <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
-                                                class="ml-auto"><%- item.mobile %></span>
-                                    <span class="selected-mark text-success ml-2" style="display:none;"><i class="fa fa-check"></i></span>
-                                    </p>
-                                    <span class="text-muted"><%- item.role %></span>
-                                </dd>
-                                <% });%>
-                            </div>
-                            <% }) %>
-                        </dl>
+            <div class="modal-body pt-0">
+                <div class="d-flex flex-row bg-graye">
+                    <div class="dropdown p-2">
+                        <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                            添加用户
+                        </button>
+                        <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" style="width:220px">
+                            <div class="mb-2 p-2"><input class="form-control form-control-sm" placeholder="姓名/手机 检索" id="member-search" autocomplete="off"></div>
+                            <dl class="list-unstyled book-list">
+                                <% accountGroup.forEach((group, idx) => { %>
+                                <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
+                                <div class="dd-content" data-toggleid="<%- idx %>">
+                                    <% group.groupList.forEach(item => { %>
+                                    <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
+                                        <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
+                                                    class="ml-auto"><%- item.mobile %></span>
+                                        <span class="selected-mark text-success ml-2" style="display:none;"><i class="fa fa-check"></i></span>
+                                        </p>
+                                        <span class="text-muted"><%- item.role %></span>
+                                    </dd>
+                                    <% });%>
+                                </div>
+                                <% }) %>
+                            </dl>
+                        </div>
                     </div>
                 </div>
-                <div class="mt-1">
-                    <table class="table table-bordered">
-                        <thead class="text-center">
-                        <tr>
-                            <th class="align-middle" rowspan="2">成员名称</th>
-                            <th class="align-middle" rowspan="2">角色/职位</th>
-                            <% for (const pb of permissionBlock) { %>
-                            <th colspan="<%- pb.permission.filter(x => { return !x.isDefault; }).length %>"><%- pb.name %></th>
+                <table class="table table-bordered" data-height="400" data-toggle="table" id="member-table">
+                    <thead class="text-center">
+                    <tr>
+                        <th class="align-middle" rowspan="2">成员名称</th>
+                        <th class="align-middle" rowspan="2">角色/职位</th>
+                        <% for (const pb of permissionBlock) { %>
+                        <th colspan="<%- pb.permission.filter(x => { return !x.isDefault; }).length %>"><%- pb.name %></th>
+                        <% } %>
+                        <th class="align-middle" rowspan="2">操作</th>
+                    </tr>
+                    <tr>
+                        <% for (const pb of permissionBlock) { %>
+                            <% for (const p of pb.permission) { %>
+                                <% if (p.isDefault) continue; %>
+                                <th><%- p.title %></th>
                             <% } %>
-                            <th class="align-middle" rowspan="2">操作</th>
-                        </tr>
-                        <tr>
-                            <% for (const pb of permissionBlock) { %>
-                                <% for (const p of pb.permission) { %>
-                                    <% if (p.isDefault) continue; %>
-                                    <th><%- p.title %></th>
-                                <% } %>
-                            <% } %>
-                        </tr>
-                        </thead>
-                        <tbody id="member-list">
-                        </tbody>
-                    </table>
-                </div>
+                        <% } %>
+                    </tr>
+                    </thead>
+                    <tbody id="member-list">
+                    </tbody>
+                </table>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
@@ -62,6 +77,8 @@
         </div>
     </div>
 </div>
+<script src="/public/js/bootstrap/bootstrap-table.min.js"></script>
+<script src="/public/js/bootstrap/locales/bootstrap-table-zh-CN.min.js"></script>
 <script>
     const accountList = JSON.parse(unescape('<%- escape(JSON.stringify(accountList)) %>'));
     const accountGroup = JSON.parse(unescape('<%- escape(JSON.stringify(accountGroup)) %>'));

+ 14 - 0
sql/update.sql

@@ -40,6 +40,20 @@ CREATE TABLE `zh_material_exponent_node`  (
   PRIMARY KEY (`id`)
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '调差指数分项价格指数表';
 
+CREATE TABLE `zh_material_exponent_shard` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `mid` int(11) NOT NULL COMMENT '调差期id',
+  `ms_id` int(11) DEFAULT NULL COMMENT '调差多期单独计价期id(可以为空)',
+  `mn_id` int(11) DEFAULT NULL COMMENT '调差分项指数id(可以为空)',
+  `me_id` int(11) NOT NULL COMMENT '指数工料id',
+  `type` tinyint(1) NOT NULL DEFAULT '2' COMMENT '类型(1定值或2变值)',
+  `weight_num` decimal(30,8) DEFAULT NULL COMMENT '加权系数',
+  `m_price` decimal(30,8) DEFAULT NULL COMMENT '现行价格指数',
+  `remark` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='指数调差分表(独立期和分项价格指数结合)';
+
 ALTER TABLE `zh_sub_project_info`
 ADD COLUMN `lx_tp_unit` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '元' COMMENT '立项-金额单位' AFTER `lx_tp`,
 ADD COLUMN `cb_tp_unit` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '元' COMMENT '初步-金额单位' AFTER `cb_tp`,