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

成本分析,新建期调整

MaiXinRong 1 день назад
Родитель
Сommit
097003a309

+ 1 - 1
app/controller/cost_controller.js

@@ -149,7 +149,7 @@ module.exports = app => {
                 let validRelaStages = await this.ctx.service.costStage.getAllCheckedStages(ctx.tender.id, analysisType, 'DESC');
                 if (stages.length > 0) {
                     const checkedStage = stages.find(x => { return x.audit_status === audit.common.status.checked; });
-                    if (checkedStage) validRelaStages = validRelaStages.filter( x => { return x.stage_order > checkedStage.rela_stage.stage_order; });
+                    if (checkedStage) validRelaStages = validRelaStages.filter( x => { return x.stage_order > checkedStage.rela_stage.sorder; });
                 }
                 const renderData = {
                     stage_type,

+ 27 - 15
app/service/cost_stage_analysis.js

@@ -212,11 +212,8 @@ module.exports = app => {
             const insertData = [], insertDetailData = [];
             let maxId = 0;
 
-            const preBills = await this.getAllDataByCondition({
-                where: { stage_id: preStage.id },
-                columns: costFields.readQueryFields
-            });
-            const preLedger = Ledger.baseTree(this.ctx, {
+            const preBills = await this.getReadData(preStage);
+            const preLedger = new Ledger.baseTree(this.ctx, {
                 id: 'tree_id', pid: 'tree_pid', order: 'tree_order',
                 level: 'tree_level', isLeaf: 'tree_is_leaf', fullPath: 'tree_full_path',
                 rootId: -1, calcField: [],
@@ -232,6 +229,7 @@ module.exports = app => {
                 const idata = {};
                 this._getDefaultData(idata, stage);
                 idata.cost_id = pl.cost_id;
+                idata.node_type = pl.node_type;
                 for (const prop of costFields.preCopyFields) {
                     idata[prop] = pl[prop];
                 }
@@ -239,7 +237,7 @@ module.exports = app => {
                 insertData.push(idata);
             }
 
-            const relaStage = await this.service.costStage.getStage(stage.rela_stage.sid);
+            const relaStage = await this.service.costStage.getStage(JSON.parse(stage.rela_stage).sid);
             const costStageLedger = await this.getCostStageData(relaStage);
             const costNode = insertData.find(x => { return x.node_type === 2 && x.tree_level === 1; });
             if (costStageLedger.nodes.length > 0) costNode.tree_is_leaf = 0;
@@ -261,15 +259,17 @@ module.exports = app => {
                 ln.name = node.name;
                 ln.unit = node.unit;
                 ln.tax = node.tax;
-                ln.yf_excl_tax_tp = node.end_yf_excl_tax_tp;
-                ln.in_excl_tax_tp = node.end_in_excl_tax_tp;
-                ln.sf_excl_tax_tp = node.end_sf_excl_tax_tp;
+                ln.yf_excl_tax_tp = node.end_yf_excl_tax_tp || 0;
+                ln.in_excl_tax_tp = node.end_in_excl_tax_tp || 0;
+                ln.sf_excl_tax_tp = node.end_sf_excl_tax_tp || 0;
+                ln.postil = '';
+                ln.sf_percent = 0;
                 insertData.push(ln);
                 const preSource = preLedger.nodes.find(x => { return x.cost_id === node.cost_id; });
                 for (const prop of costFields.selfTextFields) {
                     ln[prop] = preSource ? preSource[prop] : '';
                 }
-                if (!node.detail) {
+                if (!node.detail || node.detail.length === 0) {
                     for (const prop of costFields.selfCalcFields) {
                         ln[prop] = preSource ? preSource[prop] : 0;
                     }
@@ -281,15 +281,15 @@ module.exports = app => {
                             ledger_id: ln.id, cost_id: ln.cost_id, source_id: d.source_cid,
                             d_order: i+1,
                             code: d.code, name: d.name, party_b: d.party_b || '', tax: ln.tax || 0,
-                            yf_excl_tax_tp: d.yf_excl_tax_tp, in_excl_tax_tp: d.in_excl_tax_tp, sf_excl_tax_tp: d.sf_excl_tax_tp,
+                            yf_excl_tax_tp: d.yf_excl_tax_tp || 0, in_excl_tax_tp: d.in_excl_tax_tp || 0, sf_excl_tax_tp: d.sf_excl_tax_tp || 0,
                             is_deal: d.is_deal,
                         };
-                        const preDetailSource = preSource ? preSource.detail.find(x => { return x.source_id === d.source_cid; }) : null;
+                        const preDetailSource = preSource ? preSource.detail.find(x => { return x.source_id === d.source_cid; }) : undefined;
                         for (const prop of costFields.selfTextFields) {
                             ld[prop] = preDetailSource ? preDetailSource[prop] : '';
                         }
                         for (const prop of costFields.selfCalcFields) {
-                            ld[prop] = preDetailSource ? preDetailSource[prop] : 0;
+                            ld[prop] = preDetailSource ? preDetailSource[prop] || 0 : 0;
                             ln[prop] = this.ctx.helper.add(ln[prop], ld[prop]);
                         }
                         insertDetailData.push(ld);
@@ -675,8 +675,20 @@ module.exports = app => {
         }
 
         async getSum(stage) {
-            const sumFields = costFields.calcFields.map(f => { return `SUM(${f}) AS ${f}`});
-            const result = await this.db.queryOne(`SELECT ${sumFields.join(', ')} FROM ${this.tableName} where stage_id = ?`, [stage.id]);
+            const field = 'num_h';
+            const topNode = await this.db.query(`SELECT * FROM ${this.tableName} where stage_id = ? and tree_level = 1`, [stage.id]);
+            const result = {};
+            for (const tn of topNode) {
+                if (topNode.node_type === 2) {
+                    result.out_tp = tn[field];
+                } else if (topNode.node_type === 3) {
+                    result.profit = tn[field];
+                } else if (topNode.node_type === 4) {
+                    result.profit_percent = tn[field];
+                } else {
+                    result.in_tp = tn[field];
+                }
+            }
             return result;
         }
     }

+ 4 - 3
app/service/cost_stage_analysis_detail.js

@@ -18,6 +18,7 @@ const costFields = {
     taxFields: ['tax'],
     baseFields: ['id', 'cost_id', 'tender_id', 'stage_id', 'ledger_id', 'source_id', 'is_deal'],
 };
+costFields.sumFields = [...costFields.calcFields, ...costFields.selfCalcFields];
 costFields.preCopyFields = [...costFields.selfTextFields, ...costFields.calcFields, ...costFields.selfCalcFields, ...costFields.taxFields];
 costFields.editQueryFields = [...costFields.baseFields, ...costFields.textFields, ...costFields.selfTextFields, ...costFields.calcFields, ...costFields.selfCalcFields, ...costFields.taxFields];
 costFields.readQueryFields = [...costFields.baseFields, ...costFields.textFields, ...costFields.selfTextFields, ...costFields.readFields, ...costFields.taxFields];
@@ -127,13 +128,13 @@ module.exports = app => {
             const updateData = [];
             for (const l of leaf) {
                 l.calc_read = l.calc_read ? JSON.parse(l.calc_read) : {};
-                const diff = costFields.calcFields.find(x => {
+                const diff = costFields.sumFields.find(x => {
                     return l[x] !== l.calc_read[x];
                 });
                 if (diff) {
                     const data = { id: l.id, calc_read: {} };
                     // cache read
-                    for (const f of costFields.calcFields) {
+                    for (const f of costFields.sumFields) {
                         data.calc_read[f] = l[f];
                     }
                     data.calc_read = JSON.stringify(data.calc_read);
@@ -142,7 +143,7 @@ module.exports = app => {
                     const fi = his.find(x => { return x.audit_times === auditInfo.audit_times && x.active_order === auditInfo.active_order; });
                     if (fi >= 0) his.splice(fi, 1);
                     const newHis = { ...auditInfo };
-                    for (const f of costFields.calcFields) {
+                    for (const f of costFields.sumFields) {
                         newHis[f] = data[f];
                     }
                     his.push(newHis);

+ 6 - 6
app/service/cost_stage_book_detail.js

@@ -81,20 +81,20 @@ module.exports = app => {
             //     '    WHERE cs.tid = ? AND cs.stage_order <= ? AND sd.is_deal = 1' +
             //     '  ) t WHERE t.rn = 1';
             const dealDetailSql =
-                'SELECT a.cost_id, a.code, a.name, a.tax, a.is_deaL, b.* FROM (' +
+                'SELECT a.code, a.name, a.tax, a.is_deaL, b.* FROM (' +
                 '  SELECT sd.cost_id, sd.code, sd.name, sd.tax, sd.is_deal, sd.source_cid' +
                 '    FROM (' +
-                '      SELECT source_cid, max(add_time) AS latest_time FROM zh_cost_stage_detail WHERE tender_id = ? AND stage_order <= ? AND is_deal = 1 GROUP BY source_cid' +
-                '    ) lastTable LEFT JOIN zh_cost_stage_detail sd ON lastTable.latest_time = sd.add_time AND sd.source_cid = lastTable.source_cid' +
+                '      SELECT cost_id, source_cid, max(add_time) AS latest_time FROM zh_cost_stage_detail WHERE tender_id = ? AND stage_order <= ? AND is_deal = 1 GROUP BY cost_id, source_cid' +
+                '    ) lastTable LEFT JOIN zh_cost_stage_detail sd ON lastTable.latest_time = sd.add_time AND sd.cost_id = lastTable.cost_id AND sd.source_cid = lastTable.source_cid' +
                 '  ) a' +
                 '  LEFT JOIN ( ' +
-                '    SELECT csd.source_cid, sum(csd.pay_tp) AS pay_tp, sum(csd.cut_tp) AS cut_tp, ' +
+                '    SELECT csd.cost_id, csd.source_cid, sum(csd.pay_tp) AS pay_tp, sum(csd.cut_tp) AS cut_tp, ' +
                 '        sum(csd.yf_tp) AS yf_tp, sum(csd.sf_tp) AS sf_tp, ' +
                 '        sum(csd.yf_excl_tax_tp) AS yf_excl_tax_tp, sum(csd.sf_excl_tax_tp) AS sf_excl_tax_tp,' +
                 '        sum(csbd.in_tp) AS in_tp, sum(csbd.in_excl_tax_tp) As in_excl_tax_tp' +
                 '      FROM zh_cost_stage_detail csd LEFT JOIN zh_cost_stage_book_detail csbd ON csd.id = csbd.detail_id' +
-                '      WHERE csd.tender_id = ? AND csd.stage_order <= ? AND csd.is_deal = 1 GROUP BY csd.source_cid' +
-                '  ) b ON a.source_cid = b.source_cid';
+                '      WHERE csd.tender_id = ? AND csd.stage_order <= ? AND csd.is_deal = 1 GROUP BY csd.cost_id, csd.source_cid' +
+                '  ) b ON a.cost_id = b.cost_id AND a.source_cid = b.source_cid';
             const dealDetail = await this.db.query(dealDetailSql, [stage.tid, stage.stage_order, stage.tid, stage.stage_order]);
             return [...commonDetail, ...dealDetail];
         }

+ 7 - 7
app/service/cost_stage_detail.js

@@ -62,7 +62,7 @@ module.exports = app => {
                 `  FROM ${this.tableName} sd LEFT JOIN ${this.ctx.service.costStage.tableName} cs ON sd.stage_id = cs.id` +
                 '  WHERE cs.tid = ? AND cs.stage_order <= ? AND sd.is_deal = 0';
             const commonDetail = await this.db.query(commonDetailSql, [stage.tid, stage.stage_order]);
-            // 下sql只有在mysqlV8.0以后才可使用
+            // 下sql只有在mysqlV8.0以后才可使用
             // const dealDetailSql =
             //     'SELECT * FROM ( ' +
             //     '  SELECT sd.cost_id, sd.code, sd.name, sd.tax, source_cid AS source_id,' +
@@ -77,18 +77,18 @@ module.exports = app => {
             //     '    WHERE cs.tid = ? AND cs.stage_order <= ? AND sd.is_deal = 1' +
             //     '  ) t WHERE t.rn = 1';
             const dealDetailSql =
-                'SELECT a.cost_id, a.code, a.name, a.tax, b.* FROM (' +
+                'SELECT a.code, a.name, a.tax, b.* FROM (' +
                 '  SELECT sd.cost_id, sd.code, sd.name, sd.tax, sd.source_cid' +
                 '    FROM (' +
-                '      SELECT source_cid, max(add_time) AS latest_time FROM zh_cost_stage_detail WHERE tender_id = ? AND stage_order <= ? AND is_deal = 1 GROUP BY source_cid' +
-                '    ) lastTable LEFT JOIN zh_cost_stage_detail sd ON lastTable.latest_time = sd.add_time AND sd.source_cid = lastTable.source_cid' +
+                '      SELECT source_cid, max(add_time) AS latest_time FROM zh_cost_stage_detail WHERE tender_id = ? AND stage_order <= ? AND is_deal = 1 GROUP BY cost_id, source_cid' +
+                '    ) lastTable LEFT JOIN zh_cost_stage_detail sd ON lastTable.latest_time = sd.add_time AND sd.cost_id = lastTable.cost_id AND sd.source_cid = lastTable.source_cid' +
                 '  ) a' +
                 '  LEFT JOIN ( ' +
-                '    SELECT source_cid, sum(pay_tp) AS pay_tp, sum(cut_tp) AS cut_tp, ' +
+                '    SELECT cost_id, source_cid, sum(pay_tp) AS pay_tp, sum(cut_tp) AS cut_tp, ' +
                 '        sum(yf_tp) AS yf_tp, sum(sf_tp) AS sf_tp, ' +
                 '        sum(yf_excl_tax_tp) AS yf_excl_tax_tp, sum(sf_excl_tax_tp) AS sf_excl_tax_tp' +
-                '      FROM zh_cost_stage_detail WHERE tender_id = ? AND stage_order <= ? AND is_deal = 1 GROUP BY source_cid' +
-                ') b ON a.source_cid = b.source_cid';
+                '      FROM zh_cost_stage_detail WHERE tender_id = ? AND stage_order <= ? AND is_deal = 1 GROUP BY cost_id, source_cid' +
+                ') b ON a.cost_id = b.cost_id AND a.source_cid = b.source_cid';
             const dealDetail = await this.db.query(dealDetailSql, [stage.tid, stage.stage_order, stage.tid, stage.stage_order]);
             return [...commonDetail, ...dealDetail];
         }

+ 3 - 3
app/view/dashboard/workspace.ejs

@@ -148,10 +148,10 @@
                                             <% if (dashboardStatus.shenpi.costStageLedger !== 0) { %>
                                             <option value="costStageLedger">成本报审(<%- dashboardStatus.shenpi.costStageLedger %>)</option>
                                             <% } %>
-                                            <% if (dashboardStatus.shenpi.costStageLedger !== 0) { %>
+                                            <% if (dashboardStatus.shenpi.costStageBook !== 0) { %>
                                             <option value="costStageBook">财务账面(<%- dashboardStatus.shenpi.costStageBook %>)</option>
                                             <% } %>
-                                            <% if (dashboardStatus.shenpi.costStageLedger !== 0) { %>
+                                            <% if (dashboardStatus.shenpi.costStageAnalysis !== 0) { %>
                                             <option value="costStageAnalysis">成本分析(<%- dashboardStatus.shenpi.costStageAnalysis %>)</option>
                                             <% } %>
                                         </select>
@@ -503,7 +503,7 @@
                                                             <td><%- (am.begin_time ? ctx.moment(am.begin_time).format('YYYY/MM/DD HH:mm') : '') %></td>
                                                             <td><a href="/sp/<%- am.spid %>/cost/tender/<%- am.tid %>/book/<%- am.stage_order %>/stage" class="btn btn-sm btn-table <%- (am.audit_order === 0 ? 'btn-outline-warning text-warning' : 'btn-outline-primary') %>" role="button"><%- (am.audit_order === 0 ? '重新上报' : '审批')%></a></td>
                                                         </tr>
-                                                    <% } else if (db.shenpi_type === 'costStageAnalaysis') { %>
+                                                    <% } else if (db.shenpi_type === 'costStageAnalysis') { %>
                                                         <% const am = db; %>
                                                         <tr data-type="costStageAnalysis">
                                                             <% if (am.start_audit === 2) { %><td class="text-center text-danger"><i class="fa fa-exclamation-triangle"></i></td><% } else if (am.start_audit === 1) { %><td class="text-center text-warning"><i class="fa fa-bell"></i></td><% } else { %><td></td><% } %>