Bläddra i källkod

成本分析,导入关联成本数据调整

MaiXinRong 1 dag sedan
förälder
incheckning
417c1f228e
3 ändrade filer med 46 tillägg och 59 borttagningar
  1. 6 41
      app/service/cost_stage_book_detail.js
  2. 37 17
      app/service/cost_stage_detail.js
  3. 3 1
      sql/update.sql

+ 6 - 41
app/service/cost_stage_book_detail.js

@@ -57,46 +57,12 @@ module.exports = app => {
             return result;
             return result;
         }
         }
         async getEndData(stage) {
         async getEndData(stage) {
-            const commonDetailSql =
-                'SELECT sd.cost_id, sd.code, sd.name, sd.tax, sd.is_deal, sd.id AS source_cid, sd.pay_tp, sd.cut_tp, sd.yf_tp, sd.sf_tp, sd.yf_excl_tax_tp, sd.sf_excl_tax_tp, sbd.in_tp, sbd.in_excl_tax_tp ' +
-                `  FROM ${this.ctx.service.costStageDetail.tableName} sd LEFT JOIN ${this.tableName} sbd ON sbd.detail_id = sd.id` +
-                '  WHERE sbd.tender_id = ? AND sbd.stage_order <= ? AND sd.is_deal = 0 ORDER BY sd.code ASC';
-            const commonDetail = await this.db.query(commonDetailSql, [stage.tid, stage.stage_order]);
-            // 以下sql需要8.0的mysql才支持
-            // const dealDetailSql =
-            //     'SELECT * FROM ( ' +
-            //     '  SELECT sd.cost_id, sd.code, sd.name, sd.tax, sd.source_cid AS source_id,' +
-            //     '      sum(sd.pay_tp) OVER (PARTITION BY sd.source_cid) AS pay_tp,' +
-            //     '      sum(sd.cut_tp) OVER (PARTITION BY sd.source_cid) AS cut_tp,' +
-            //     '      sum(sd.yf_tp) OVER (PARTITION BY sd.source_cid) AS yf_tp,' +
-            //     '      sum(sd.sf_tp) OVER (PARTITION BY sd.source_cid) AS sf_tp,' +
-            //     '      sum(sd.yf_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS yf_excl_tax_tp,' +
-            //     '      sum(sd.sf_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS sf_excl_tax_tp,' +
-            //     '      sum(sbd.in_tp) OVER (PARTITION BY sd.source_cid) AS in_tp,' +
-            //     '      sum(sbd.in_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS in_excl_tax_tp,' +
-            //     '      ROW_NUMBER() OVER (PATITION BY sd.source_cid ORDER BY create_time DESC) AS rn' +
-            //     `    FROM ${this.ctx.service.costStageDetail.tableName} sd LEFT JOIN ${this.tableName} sbd ON sbd.detail_id = sd.id` +
-            //     `      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 = 1' +
-            //     '  ) t WHERE t.rn = 1';
-            const dealDetailSql =
-                'SELECT a.code, a.name, a.tax, a.is_deaL, a.party_b, b.* FROM (' +
-                '  SELECT sd.cost_id, sd.code, sd.name, sd.party_b, sd.tax, sd.is_deal, sd.source_cid' +
-                '    FROM (' +
-                '      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.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 csbd.tender_id = ? AND csbd.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' +
-                '  ORDER BY a.code ASC';
-            const dealDetail = await this.db.query(dealDetailSql, [stage.tid, stage.stage_order, stage.tid, stage.stage_order]);
-            return [...commonDetail, ...dealDetail];
+            const allStages = await this.db.query(`SELECT rela_stage FROM ${this.ctx.service.costStage.tableName} WHERE tid = ? AND stage_type = 'book' AND stage_order <= ?`, [stage.tid, stage.stage_order]);
+            const relaStageIds = allStages.map(x => {
+                const rs = JSON.parse(x.rela_stage);
+                return rs.sid;
+            });
+            return await this.ctx.service.costStageDetail.getEndDataByStageId(stage.tid, relaStageIds);
         }
         }
 
 
         async _getBookUpdateData(data, ledger_id, details) {
         async _getBookUpdateData(data, ledger_id, details) {
@@ -211,7 +177,6 @@ module.exports = app => {
             return { detail: { update: [...insertDetail, ...updateDetail] }, ledger: bookUpdate };
             return { detail: { update: [...insertDetail, ...updateDetail] }, ledger: bookUpdate };
         }
         }
 
 
-
         async auditCache(transaction, stageId, auditInfo) {
         async auditCache(transaction, stageId, auditInfo) {
             const leaf = await this.getAllDataByCondition({ where: { stage_id: stageId } });
             const leaf = await this.getAllDataByCondition({ where: { stage_id: stageId } });
             const updateData = [];
             const updateData = [];

+ 37 - 17
app/service/cost_stage_detail.js

@@ -57,41 +57,61 @@ module.exports = app => {
             });
             });
             return result;
             return result;
         }
         }
-        async getEndData(stage) {
-            const commonDetailSql = 'SELECT cost_id, id AS source_id, code, name, tax, pay_tp, cut_tp, yf_tp, sf_tp, yf_excl_tax_tp, sf_excl_tax_tp ' +
-                `  FROM ${this.tableName} WHERE tender_id = ? AND stage_order <= ? AND is_deal = 0 ORDER BY code ASC`;
-            const commonDetail = await this.db.query(commonDetailSql, [stage.tid, stage.stage_order]);
-            // 以下sql只有在mysqlV8.0以后才可使用
+        async getEndDataByStageId(tenderId, stageIds) {
+            if (!stageIds || stageIds.length === 0) return [];
+
+            const idSql = stageIds.map(x => { return `'${x}'`; }).join(', ');
+            const commonDetailSql =
+                'SELECT sd.cost_id, sd.code, sd.name, sd.tax, sd.is_deal, sd.id AS source_cid, sd.pay_tp, sd.cut_tp, sd.yf_tp, sd.sf_tp, sd.yf_excl_tax_tp, sd.sf_excl_tax_tp, sbd.in_tp, sbd.in_excl_tax_tp ' +
+                `  FROM ${this.ctx.service.costStageDetail.tableName} sd LEFT JOIN ${this.ctx.service.costStageBookDetail.tableName} sbd ON sbd.detail_id = sd.id` +
+                `  WHERE sd.tender_id = ? AND sd.stage_id in (${idSql}) AND sd.is_deal = 0 ORDER BY sd.code ASC`;
+            const commonDetail = await this.db.query(commonDetailSql, [tenderId]);
+            // 以下sql需要8.0的mysql才支持,暂不使用
             // const dealDetailSql =
             // const dealDetailSql =
             //     'SELECT * FROM ( ' +
             //     'SELECT * FROM ( ' +
-            //     '  SELECT sd.cost_id, sd.code, sd.name, sd.tax, source_cid AS source_id,' +
+            //     '  SELECT sd.cost_id, sd.code, sd.name, sd.tax, sd.source_cid AS source_id,' +
             //     '      sum(sd.pay_tp) OVER (PARTITION BY sd.source_cid) AS pay_tp,' +
             //     '      sum(sd.pay_tp) OVER (PARTITION BY sd.source_cid) AS pay_tp,' +
             //     '      sum(sd.cut_tp) OVER (PARTITION BY sd.source_cid) AS cut_tp,' +
             //     '      sum(sd.cut_tp) OVER (PARTITION BY sd.source_cid) AS cut_tp,' +
             //     '      sum(sd.yf_tp) OVER (PARTITION BY sd.source_cid) AS yf_tp,' +
             //     '      sum(sd.yf_tp) OVER (PARTITION BY sd.source_cid) AS yf_tp,' +
             //     '      sum(sd.sf_tp) OVER (PARTITION BY sd.source_cid) AS sf_tp,' +
             //     '      sum(sd.sf_tp) OVER (PARTITION BY sd.source_cid) AS sf_tp,' +
             //     '      sum(sd.yf_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS yf_excl_tax_tp,' +
             //     '      sum(sd.yf_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS yf_excl_tax_tp,' +
             //     '      sum(sd.sf_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS sf_excl_tax_tp,' +
             //     '      sum(sd.sf_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS sf_excl_tax_tp,' +
+            //     '      sum(sbd.in_tp) OVER (PARTITION BY sd.source_cid) AS in_tp,' +
+            //     '      sum(sbd.in_excl_tax_tp) OVER (PARTITION BY sd.source_cid) AS in_excl_tax_tp,' +
             //     '      ROW_NUMBER() OVER (PATITION BY sd.source_cid ORDER BY create_time DESC) AS rn' +
             //     '      ROW_NUMBER() OVER (PATITION BY sd.source_cid ORDER BY create_time DESC) AS rn' +
-            //     `    FROM ${this.tableName} sd LEFT JOIN ${this.ctx.service.costStage.tableName} cs ON sd.stage_id = cs.id` +
+            //     `    FROM ${this.ctx.service.costStageDetail.tableName} sd LEFT JOIN ${this.tableName} sbd ON sbd.detail_id = sd.id` +
+            //     `      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 = 1' +
             //     '    WHERE cs.tid = ? AND cs.stage_order <= ? AND sd.is_deal = 1' +
             //     '  ) t WHERE t.rn = 1';
             //     '  ) t WHERE t.rn = 1';
             const dealDetailSql =
             const dealDetailSql =
-                'SELECT a.code, a.name, a.tax, a.party_b, b.* FROM (' +
-                '  SELECT sd.cost_id, sd.code, sd.name, sd.party_b, sd.tax, sd.source_cid' +
+                'SELECT a.code, a.name, a.tax, a.is_deaL, a.party_b, b.* FROM (' +
+                '  SELECT sd.cost_id, sd.code, sd.name, sd.party_b, sd.tax, sd.is_deal, sd.source_cid' +
                 '    FROM (' +
                 '    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 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' +
+                `      SELECT cost_id, source_cid, max(add_time) AS latest_time FROM ${this.ctx.service.costStageDetail.tableName} ` +
+                `        WHERE tender_id = ? AND stage_id in(${idSql}) AND is_deal = 1 GROUP BY cost_id, source_cid` +
+                `    ) lastTable LEFT JOIN ${this.ctx.service.costStageDetail.tableName} sd ON lastTable.latest_time = sd.add_time AND sd.cost_id = lastTable.cost_id AND sd.source_cid = lastTable.source_cid` +
                 '  ) a' +
                 '  ) a' +
                 '  LEFT JOIN ( ' +
                 '  LEFT JOIN ( ' +
-                '    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 cost_id, source_cid' +
-                ') b ON a.cost_id = b.cost_id AND a.source_cid = b.source_cid' +
+                '    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 ${this.ctx.service.costStageDetail.tableName} csd LEFT JOIN ${this.ctx.service.costStageBookDetail.tableName} csbd ON csd.id = csbd.detail_id` +
+                `      WHERE csd.tender_id = ? AND csd.stage_id in (${idSql}) 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' +
                 '  ORDER BY a.code ASC';
                 '  ORDER BY a.code ASC';
-            const dealDetail = await this.db.query(dealDetailSql, [stage.tid, stage.stage_order, stage.tid, stage.stage_order]);
+            const dealDetail = await this.db.query(dealDetailSql, [tenderId, tenderId]);
             return [...commonDetail, ...dealDetail];
             return [...commonDetail, ...dealDetail];
         }
         }
+        async getEndData(stage) {
+            if (stage) return [];
+
+            const allStages = await this.db.query(`SELECT id FROM ${this.ctx.service.costStage.tableName} WHERE tid = ? AND stage_type = 'ledger' AND stage_order <= ?`, [stage.tid, stage.stage_order]);
+            const relaStageIds = allStages.map(x => {
+                return x.id;
+            });
+            await this.getEndDataByStageId(stage.tid, relaStageIds);
+        }
 
 
         async _getLedgerUpdateData(data, ledger_id, details) {
         async _getLedgerUpdateData(data, ledger_id, details) {
             const detailDatas = details || await this.getAllDataByCondition({ columns: ['id', 'ledger_id', ...costFields.curFields], where: { ledger_id, stage_id: this.ctx.costStage.id } });
             const detailDatas = details || await this.getAllDataByCondition({ columns: ['id', 'ledger_id', ...costFields.curFields], where: { ledger_id, stage_id: this.ctx.costStage.id } });

+ 3 - 1
sql/update.sql

@@ -3,9 +3,9 @@
 -- 2. 表名前不可有库名!!!
 -- 2. 表名前不可有库名!!!
 -- 3. 表结构部分,新添加的表,不可先创建后修改!!!
 -- 3. 表结构部分,新添加的表,不可先创建后修改!!!
 --
 --
+-- Version
+-- uat
+-- prod
 
 
 ------------------------------------
 ------------------------------------
 -- 表结构
 -- 表结构
@@ -536,7 +536,6 @@ ALTER TABLE `zh_tender_cache`
 MODIFY COLUMN `stage_flow_cur_info` varchar(5000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '期-当前流程信息(json)' AFTER `stage_flow_cur_uid`,
 MODIFY COLUMN `stage_flow_cur_info` varchar(5000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '期-当前流程信息(json)' AFTER `stage_flow_cur_uid`,
 MODIFY COLUMN `stage_flow_pre_info` varchar(5000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '期-上一流程信息(json)' AFTER `stage_flow_pre_uid`;
 MODIFY COLUMN `stage_flow_pre_info` varchar(5000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '期-上一流程信息(json)' AFTER `stage_flow_pre_uid`;
 
 
-
 CREATE TABLE `zh_contract_supplement` (
 CREATE TABLE `zh_contract_supplement` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `spid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '项目id',
   `spid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '项目id',