| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 | 'use strict';/** * 期计量 数据模型 * * @author Mai * @date 2018/8/13 * @version */const auditConst = require('../const/audit').material;const materialConst = require('../const/material');const MaterialCalculator = require('../lib/material_calc');module.exports = app => {    class MaterialBills extends app.BaseService {        /**         * 构造函数         *         * @param {Object} ctx - egg全局变量         * @return {void}         */        constructor(ctx) {            super(ctx);            this.tableName = 'material_bills';        }        /**         * 添加工料         * @return {void}         */        async add() {            if (!this.ctx.tender || !this.ctx.material) {                throw '数据错误';            }            const newBills = {                tid: this.ctx.tender.id,                mid: this.ctx.material.id,                in_time: new Date(),            };            // 新增工料            const result = await this.db.insert(this.tableName, newBills);            if (result.affectedRows !== 1) {                throw '新增工料数据失败';            }            return await this.getDataById(result.insertId);        }        /**         * 删除工料         * @param {int} id 工料id         * @return {void}         */        async del(id) {            if (!this.ctx.tender || !this.ctx.material) {                throw '数据错误';            }            // 判断t_type是否为费用,且存在quantity,m_spread值            const transaction = await this.db.beginTransaction();            try {                const mbInfo = await this.getDataById(id);                await transaction.delete(this.tableName, { id });                let m_tp = this.ctx.material.m_tp;                if (mbInfo.t_type === materialConst.t_type[1].value && mbInfo.quantity !== null && mbInfo.m_spread !== null) {                    // 金额发生变化,则重新计算本期金额                    m_tp = await this.calcMaterialMTp(transaction);                }                await transaction.commit();                return m_tp;            } catch (err) {                await transaction.rollback();                throw err;            }        }        /**         * 修改工料信息         * @param {Object} data 工料内容         * @return {void}         */        async save(data) {            if (!this.ctx.tender || !this.ctx.material) {                throw '数据错误';            }            delete data.in_time;            delete data.m_tp;            // 判断是否可修改            // 判断t_type是否为费用            const transaction = await this.db.beginTransaction();            try {                await transaction.update(this.tableName, data);                const m_tp = await this.calcMaterialMTp(transaction);                await transaction.commit();                return m_tp;            } catch (err) {                await transaction.rollback();                throw err;            }        }        /**         * 更新新一期的quantity和截止上期金额并返回本期总金额         * @param transaction         * @param tid         * @param mid         * @returns {Promise<number>}         */        async updateNewMaterial(transaction, tid, mid, ctx, stage_id) {            const materialBillsData = await this.getAllDataByCondition({ where: { tid } });            let m_tp = 0;            const materialCalculator = new MaterialCalculator(ctx, stage_id, ctx.tender.info);            for (const mb of materialBillsData) {                const one_tp = await this.calcQuantityByMB(transaction, mid, mb, materialCalculator);                m_tp = this.ctx.helper.add(m_tp, one_tp);            }            return m_tp;        }        /**         * 修改quantity,m_spread值和返回单条调差金额(新增一期)         * @param transaction         * @param mid         * @param mb         * @returns {Promise<*>}         */        async calcQuantityByMB(transaction, mid, mb, materialCalculator) {            if (mb.t_type === materialConst.t_type[0].value) {                const sql = 'SELECT SUM(`gather_qty`*`quantity`) as quantity FROM ' + this.ctx.service.materialList.tableName + ' WHERE `mid`=? AND `mb_id`=? AND `is_join`=1';                const sqlParam = [mid, mb.id];                const mb_quantity = await transaction.queryOne(sql, sqlParam);                console.log(mb_quantity);                // 取历史期记录获取截止上期调差金额                const updateData = {                    id: mb.id,                    quantity: this.ctx.helper.round(mb_quantity.quantity, 3),                    pre_tp: mb.quantity && mb.m_spread !== null ? this.ctx.helper.round(this.ctx.helper.add(mb.pre_tp, this.ctx.helper.mul(mb.quantity, mb.m_spread)), 2) : mb.pre_tp,                };                await transaction.update(this.tableName, updateData);                return await this.ctx.helper.round(this.ctx.helper.mul(mb_quantity.quantity, mb.m_spread), 2);            } else if (mb.t_type === materialConst.t_type[1].value) {                const quantity = await materialCalculator.calculateExpr(mb.expr);                const updateData = {                    id: mb.id,                    quantity: quantity !== 0 && quantity !== null ? this.ctx.helper.round(quantity, 3) : null,                    pre_tp: mb.quantity && mb.m_spread !== null ? this.ctx.helper.round(this.ctx.helper.add(mb.pre_tp, this.ctx.helper.mul(mb.quantity, mb.m_spread)), 2) : mb.pre_tp,                };                await transaction.update(this.tableName, updateData);                return await this.ctx.helper.round(this.ctx.helper.mul(quantity, mb.m_spread), 2);            }        }        /**         * 修改 expr和quantity值,返回本期金额和单条数据         * @param data         * @returns {Promise<void>}         */        async updateFYQuantity(data) {            if (!this.ctx.tender || !this.ctx.material) {                throw '数据错误';            }            const transaction = await this.db.beginTransaction();            try {                const mbInfo = await this.getDataById(data.id);                await transaction.update(this.tableName, data);                let m_tp = this.ctx.material.m_tp;                if (mbInfo.quantity !== data.quantity) {                    m_tp = await this.calcMaterialMTp(transaction);                }                await transaction.commit();                const returnData = {                    m_tp,                    info: await this.getDataById(data.id),                }                return returnData;            } catch (err) {                await transaction.rollback();                throw err;            }        }        // 更改计算总金额并返回值        async calcMaterialMTp(transaction) {            // 金额发生变化,则重新计算本期金额            const sql = 'SELECT SUM(`m_spread`*`quantity`) as total_price FROM ' + this.tableName + ' WHERE `tid` = ?';            const sqlParam = [this.ctx.tender.id];            const tp = await transaction.queryOne(sql, sqlParam);            console.log(tp);            const updateData2 = {                id: this.ctx.material.id,                m_tp: tp.total_price,            };            await transaction.update(this.ctx.service.material.tableName, updateData2);            return tp.total_price;        }    }    return MaterialBills;};
 |