'use strict'; module.exports = app => { class ScheduleMonth extends app.BaseService { constructor(ctx) { super(ctx); this.tableName = 'schedule_month'; } async getLastPlanMonth() { const sql = 'SELECT `yearmonth` FROM ?? WHERE `tid` = ? ORDER BY `yearmonth` DESC Limit 0,1'; const sqlParam = [this.tableName, this.ctx.tender.id]; return await this.db.query(sql, sqlParam); } async add(data) { const transaction = await this.db.beginTransaction(); try { const insertData = []; for (const m of data) { insertData.push({ tid: this.ctx.tender.id, yearmonth: m }); } if (insertData.length > 0) await transaction.insert(this.tableName, insertData); await transaction.commit(); return true; } catch (err) { await transaction.rollback(); throw err; } } async del(data) { const transaction = await this.db.beginTransaction(); try { for (const m of data) { const delData = { tid: this.ctx.tender.id, yearmonth: m }; await transaction.delete(this.tableName, delData); await transaction.delete(this.ctx.service.scheduleLedgerMonth.tableName, delData); } // 重新计算总 计划金额和计划工程量 await this.calcPlan(transaction, this.ctx.tender.id); await transaction.commit(); return true; } catch (err) { await transaction.rollback(); throw err; } } async calcPlan(transaction, tid) { const sql = 'SELECT SUM(`plan_gcl`) as total_plan_gcl, SUM(`plan_tp`) as total_plan_tp FROM ?? WHERE tid = ?'; const sqlParam = [this.tableName, tid]; const result = await transaction.queryOne(sql, sqlParam); const updateData = { plan_gcl: result.total_plan_gcl, plan_tp: result.total_plan_tp, }; const option = { where: { tid, }, }; return await transaction.update(this.ctx.service.schedule.tableName, updateData, option); } async calcSj(transaction, tid) { const sql = 'SELECT SUM(`sj_gcl`) as total_sj_gcl, SUM(`sj_tp`) as total_sj_tp FROM ?? WHERE tid = ?'; const sqlParam = [this.tableName, tid]; const result = await transaction.queryOne(sql, sqlParam); const updateData = { sj_gcl: result.total_sj_gcl, sj_tp: result.total_sj_tp, }; const option = { where: { tid, }, }; return await transaction.update(this.ctx.service.schedule.tableName, updateData, option); } async addStageUsed(data) { const updateData = { id: data.id, stage_gcl_used: 1, }; return await this.db.update(this.tableName, updateData); } async delStageUsed(data) { const transaction = await this.db.beginTransaction(); try { const updateDatas = []; const updateLmDatas = []; for (const m of data) { updateDatas.push({ row: { stage_gcl_used: 0, sj_gcl: null, sj_tp: null }, where: { yearmonth: m, tid: this.ctx.tender.id } }); updateLmDatas.push({ row: { sj_gcl: null, sj_tp: null }, where: { yearmonth: m, tid: this.ctx.tender.id } }); } if (updateDatas.length > 0) await transaction.updateRows(this.tableName, updateDatas); if (updateLmDatas.length > 0) await transaction.updateRows(this.ctx.service.scheduleLedgerMonth.tableName, updateLmDatas); // 重新计算总 计划金额和计划工程量 await this.calcSj(transaction, this.ctx.tender.id); await transaction.commit(); return true; } catch (err) { await transaction.rollback(); throw err; } } } return ScheduleMonth; };