Browse Source

1. 标段概况,计价类型
2. 标段概况,修改小数位数,计价类型,重算期相关

MaiXinRong 3 days ago
parent
commit
acd95d6d98
4 changed files with 125 additions and 11 deletions
  1. 5 2
      app/controller/tender_controller.js
  2. 101 9
      app/service/tender_info.js
  3. 16 0
      app/view/tender/detail_modal.ejs
  4. 3 0
      sql/update.sql

+ 5 - 2
app/controller/tender_controller.js

@@ -707,13 +707,16 @@ module.exports = app => {
         async saveTenderInfo2(ctx) {
             try {
                 const data = JSON.parse(ctx.request.body.data);
-                if (!data || (!data.ledger_check && !data.fun_rela && !data.s_type && !data.over_range_check)) throw '提交数据错误';
+                if (!data || (!data.ledger_check && !data.fun_rela && !data.s_type && !data.calc_type && !data.over_range_check)) throw '提交数据错误';
                 if (!ctx.session.sessionUser.is_admin) throw '您无权修改该内容';
 
                 const updateData = {};
                 if (data.ledger_check) updateData.ledger_check = data.ledger_check;
                 if (data.fun_rela) updateData.fun_rela = data.fun_rela;
-                await ctx.service.tenderInfo.saveTenderInfo(ctx.tender.id, data);
+                if (data.over_range_check) updateData.over_range_check = data.over_range_check;
+                if (data.s_type) updateData.s_type = data.s_type;
+                await ctx.service.tenderInfo.saveTenderInfo(ctx.tender.id, updateData);
+                if (data.calc_type !== undefined) await ctx.service.tenderInfo.saveCalcType(ctx.tender.id, data.calc_type);
 
                 ctx.body = { err: 0, msg: '', data: JSON.parse(ctx.request.body.data) };
             } catch (err) {

+ 101 - 9
app/service/tender_info.js

@@ -250,23 +250,19 @@ module.exports = app => {
             return changeBills;
         }
 
-        async _reCalcStageBills(tenderId, newDecimal, oldDecimal) {
-            const updateStageBills = [], insertStageBills = [];
-            const stages = await this.ctx.service.stage.getUnCompleteStages(tenderId);
-            if (stages.length === 0 || newDecimal.tp === oldDecimal.tp) return [updateStageBills, insertStageBills];
-
+        async _reCalcStageBillsUp(stages, updateStageBills, insertStageBills, decimal) {
             for (const stage of stages) {
                 const stageBills = await this.ctx.service.stageBills.getLastestStageData2(stage.tid, stage.id);
                 const bills = await this.ctx.service.ledger.getAllDataByCondition({
                     columns: ['id', 'unit_price'],
-                    where: { tender_id: tenderId, is_leaf: true },
+                    where: { tender_id: stage.tid, is_leaf: true },
                 });
                 for (const sb of stageBills) {
                     const b = bills.find(x => {return x.id === sb.lid});
                     if (!b) continue;
-                    const contract_tp = this.ctx.helper.mul(b.unit_price, sb.contract_qty, newDecimal.tp);
-                    const qc_tp = this.ctx.helper.mul(b.unit_price, sb.qc_qty, newDecimal.tp);
-                    const ex_stage_tp1 = this.ctx.helper.mul(b.unit_price, sb.ex_stage_qty1, newDecimal.tp);
+                    const contract_tp = this.ctx.helper.mul(b.unit_price, sb.contract_qty, decimal.tp);
+                    const qc_tp = this.ctx.helper.mul(b.unit_price, sb.qc_qty, decimal.tp);
+                    const ex_stage_tp1 = this.ctx.helper.mul(b.unit_price, sb.ex_stage_qty1, decimal.tp);
                     if (contract_tp == sb.contract_tp && qc_tp === sb.qc_tp && ex_stage_tp1 === sb.ex_stage_tp1) continue;
 
                     if (sb.times === stage.times && sb.order === 0) {
@@ -285,6 +281,67 @@ module.exports = app => {
                     }
                 }
             }
+        }
+
+        async _reCalcStageBillsTp(stages, updateStageBills, insertStageBills, decimal) {
+            stages.sort((x, y) => { return x.order - y.order; });
+            const preStage = stages[0].order > 1 ? await this.ctx.service.stage.getDataByCondition({ tid: stages[0].tid, order: stages[0].order - 1 }) : null;
+            const preStageBills = preStage ? await this.ctx.service.stageBillsFinal.getAllDataByCondition({ where: { tid: preStage.tid, sid: preStage.id } }) : [];
+            for (const stage of stages) {
+                const stageBills = await this.ctx.service.stageBills.getLastestStageData2(stage.tid, stage.id);
+                const bills = await this.ctx.service.ledger.getAllDataByCondition({
+                    columns: ['id', 'unit_price', 'quantity', 'total_price'],
+                    where: { tender_id: stage.tid, is_leaf: true },
+                });
+                for (const sb of stageBills) {
+                    const preSb = preStageBills.find(x => { return x.lid === sb.lid; });
+                    const b = bills.find(x => {return x.id === sb.lid});
+                    if (!b) continue;
+                    let activeQty = this.ctx.helper.add(b.quantity, sb.qc_minus_qty);
+                    let end_contract_qty = sb.contract_qty;
+                    if (preSb) {
+                        activeQty = this.ctx.helper.add(activeQty, preSb.qc_minus_qty);
+                        end_contract_qty = this.ctx.helper.add(end_contract_qty, preSb.contract_qty);
+                    }
+                    const end_contract_tp = this.ctx.helper.mul(this.ctx.helper.div(end_contract_qty, activeQty), b.total_price, decimal.tp);
+                    const contract_tp = preSb ? this.ctx.helper.sub(end_contract_tp, preSb.contract_tp) : end_contract_tp;
+                    const qc_tp = this.ctx.helper.mul(b.unit_price, sb.qc_qty, decimal.tp);
+                    const ex_stage_tp1 = this.ctx.helper.mul(b.unit_price, sb.ex_stage_qty1, decimal.tp);
+                    if (contract_tp == sb.contract_tp && qc_tp === sb.qc_tp && ex_stage_tp1 === sb.ex_stage_tp1) continue;
+
+                    if (sb.times === stage.times && sb.order === 0) {
+                        updateStageBills.push({
+                            id: sb.id, contract_tp, qc_tp, ex_stage_tp1,
+                        });
+                    } else {
+                        insertStageBills.push({
+                            tid: stage.tid, lid: sb.lid, sid: stage.id, said: this.ctx.session.sessionUser.accountId,
+                            times: stage.times, order: 0,
+                            contract_qty: sb.contract_qty, contract_expr: sb.contract_expr, contract_tp,
+                            qc_qty: sb.qc_qty, qc_tp,
+                            ex_stage_qty1: sb.ex_stage_qty1, ex_stage_tp1,
+                            postil: sb.postil,
+                        });
+                    }
+                }
+            }
+        }
+
+        async _reCalcStageBills(tenderId, newDecimal, oldDecimal) {
+            const updateStageBills = [], insertStageBills = [];
+            const stages = await this.ctx.service.stage.getUnCompleteStages(tenderId);
+            if (stages.length === 0 || newDecimal.tp === oldDecimal.tp) return [updateStageBills, insertStageBills];
+            switch (this.ctx.tender.info.calc_type) {
+                case 'up':
+                    await this._reCalcStageBillsUp(stages, updateStageBills, insertStageBills, newDecimal);
+                    break;
+                case 'tp':
+                    await this._reCalcStageBillsTp(stages, updateStageBills, insertStageBills, newDecimal);
+                    break;
+                default:
+                    await this._reCalcStageBillsUp(stages, updateStageBills, insertStageBills, newDecimal);
+                    break;
+            }
             return [updateStageBills, insertStageBills];
         }
 
@@ -386,6 +443,41 @@ module.exports = app => {
             }
         }
 
+        async _reCalcStageBills2(tenderId, calcType) {
+            const updateStageBills = [], insertStageBills = [];
+            const stages = await this.ctx.service.stage.getUnCompleteStages(tenderId);
+            if (stages.length === 0) return [updateStageBills, insertStageBills];
+            switch (calcType) {
+                case 'up':
+                    await this._reCalcStageBillsUp(stages, updateStageBills, insertStageBills, this.ctx.tender.info.decimal);
+                    break;
+                case 'tp':
+                    await this._reCalcStageBillsTp(stages, updateStageBills, insertStageBills, this.ctx.tender.info.decimal);
+                    break;
+                default:
+                    await this._reCalcStageBillsUp(stages, updateStageBills, insertStageBills, this.ctx.tender.info.decimal);
+                    break;
+            }
+            return [updateStageBills, insertStageBills];
+        }
+
+        async saveCalcType(tenderId, calcType) {
+            if (!this.ctx.tender.info.calc_type && calcType === 'up') return;
+            if (this.ctx.tender.info.calc_type && calcType === this.ctx.tender.info.calc_type) return;
+
+            const [updateStageBills, insertStageBills] = await this._reCalcStageBills2(tenderId, calcType);
+            const transaction = await this.db.beginTransaction();
+            try {
+                await transaction.update(this.tableName, { calc_type: calcType }, { where: { tid: tenderId } });
+                if (updateStageBills.length > 0) await transaction.updateRows(this.ctx.service.stageBills.tableName, updateStageBills);
+                if (insertStageBills.length > 0) await transaction.insert(this.ctx.service.stageBills.tableName, insertStageBills);
+                await transaction.commit();
+            } catch(err) {
+                await transaction.rollback();
+                throw '保存计价类型失败';
+            }
+        }
+
         /**
          * 获取标段审批相关信息 (审批设置用)
          * @param tenderId

+ 16 - 0
app/view/tender/detail_modal.ejs

@@ -1894,6 +1894,19 @@
                             </div>
                         </div>
                     </div>
+                    <div class="row">
+                        <div class="col-6 mb-2">
+                            <div class="input-group input-group-sm">
+                                <div class="input-group-prepend">
+                                    <span class="input-group-text" style="width:90px">计价类型</span>
+                                </div>
+                                <select class="form-control" id="tender-calc-type">
+                                    <option value="up">单价合同</option>
+                                    <option value="tp">总价合同</option>
+                                </select>
+                            </div>
+                        </div>
+                    </div>
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
@@ -2167,6 +2180,7 @@
 
         const loadSTypeProperty = function () {
             $('#tender-s-type').val(property.s_type);
+            $('#tender-calc-type').val(property.calc_type);
         };
 
         $('#bd-set-13').on('show.bs.modal', function () {
@@ -2175,10 +2189,12 @@
         function post13() {
             const prop = {
                 s_type: $('#tender-s-type').val(),
+                calc_type: $('#tender-calc-type').val(),
             }
             const tenderId = window.location.pathname.split('/')[2];
             postData('/tender/' + tenderId + '/save2', prop, function (data) {
                 property.s_type = data.s_type;
+                property.calc_type = data.calc_type;
                 $('#bd-set-13').modal('hide');
             });
         }

+ 3 - 0
sql/update.sql

@@ -22,6 +22,9 @@ ADD COLUMN `file_company` varchar(100) NOT NULL DEFAULT '' COMMENT '归档单位
 ALTER TABLE `zh_sub_project_permission`
 ADD COLUMN `last_time` timestamp NULL DEFAULT NULL COMMENT '最近使用时间' AFTER `tp_cache_time`;
 
+ALTER TABLE `zh_tender_info`
+ADD COLUMN `calc_type` varchar(20) NOT NULL DEFAULT 'up' COMMENT '计价类型(单价up,总价tp)' AFTER `s_type`;
+
 ------------------------------------
 -- 表数据
 ------------------------------------