'use strict'; /** * 清单设置 数据模型 * @author LanJianRong * @date 2020/6/30 * @version */ const materialConst = require('../const/material'); module.exports = app => { class MaterialChecklist extends app.BaseService { /** * 构造函数 * * @param {Object} ctx - egg全局变量 * @return {void} */ constructor(ctx) { super(ctx); this.tableName = 'material_checklist'; } async resetData(pushData, removeData, updateData) { if (!this.ctx.tender || !this.ctx.material) { throw '数据错误'; } const transaction = await this.db.beginTransaction(); try { if (pushData.length > 0) { const insertDatas = []; for (const p of pushData) { p.mid = this.ctx.material.id; p.tid = this.ctx.tender.id; insertDatas.push(p); } await transaction.insert(this.tableName, insertDatas); } if (removeData.length > 0) { for (const r of removeData) { await transaction.delete(this.tableName, { id: r }); } } if (updateData.length > 0) { await transaction.updateRows(this.tableName, updateData); } await transaction.commit(); const materialChecklistData = await this.getAllDataByCondition({ where: { tid: this.ctx.tender.id } }); const self = this; return await materialChecklistData.sort(function(a, b) { return self.ctx.helper.compareCode(a.b_code, b.b_code); }); } catch (err) { console.log(err); await transaction.rollback(); throw err; } } async updateHadBills(transaction, id, had_bills) { if (!this.ctx.tender || !this.ctx.material) { throw '数据错误'; } return await transaction.update(this.tableName, { id, had_bills }); } async addExportCB(addChecklist, addBillsList) { if (!this.ctx.tender || !this.ctx.material) { throw '数据错误'; } const transaction = await this.db.beginTransaction(); try { if (addChecklist.length > 0) { const insertDatas = []; for (const p of addChecklist) { p.mid = this.ctx.material.id; p.tid = this.ctx.tender.id; insertDatas.push(p); } await transaction.insert(this.tableName, insertDatas); } if (addBillsList.length > 0) { let order = await this.ctx.service.materialBills._getMaxOrder(this.ctx.tender.id); const pushBills = []; for (const b of addBillsList) { const newBills = { tid: this.ctx.tender.id, mid: this.ctx.material.id, code: b.code, name: b.name, unit: b.unit, order: order + 1, in_time: new Date(), }; pushBills.push(newBills); ++order; } // 新增工料 const result = await transaction.insert(this.ctx.service.materialBills.tableName, pushBills); // 获取刚批量添加的所有list for (let j = 0; j < pushBills.length; j++) { pushBills[j].id = result.insertId + j; } if (this.ctx.material.is_stage_self) { await this.ctx.service.materialStageBills.adds(transaction, pushBills); } const material_month = this.ctx.material.months ? this.ctx.material.months.split(',') : []; if (material_month.length > 0) { const insertArray = []; for (const pb of pushBills) { for (const ym of material_month) { const one_month = { tid: this.ctx.tender.id, mid: this.ctx.material.id, mb_id: pb.id, msg_tp: null, yearmonth: ym, }; insertArray.push(one_month); } } if (insertArray.length !== 0) await transaction.insert(this.ctx.service.materialMonth.tableName, insertArray); } } await transaction.commit(); const materialChecklistData = await this.getAllDataByCondition({ where: { tid: this.ctx.tender.id } }); const searchsql = { tid: this.ctx.tender.id }; let midList = []; if (this.ctx.material.highOrder !== this.ctx.material.order) { midList = await this.ctx.service.material.getPreMidList(this.ctx.tender.id, this.ctx.material.order); searchsql.mid = midList; } searchsql.t_type = materialConst.t_type[0].value; const materialBillsData = await this.ctx.service.materialBills.getAllDataByCondition({ where: searchsql, orders: [['order', 'asc']] }); // 取对应期的截取上期的调差金额和应耗数量 if (this.ctx.material.highOrder !== this.ctx.material.order) { for (const [mindex, mb] of materialBillsData.entries()) { const result = await this.ctx.service.materialBillsHistory.getByMbId(this.ctx.material.id, this.ctx.material.order, mb.id); this._.forEach(result, function(value, key) { if (key === 'mb_id') { materialBillsData[mindex].id = result ? result[key] : null; } else { materialBillsData[mindex][key] = result ? result[key] : null; } }); } } const materialStageBillsData = this.ctx.material.is_stage_self ? await this.ctx.service.materialStageBills.getAllDataByCondition({ where: { tid: this.ctx.tender.id, mid: this.ctx.material.id } }) : []; const self = this; return { materialChecklistData: await materialChecklistData.sort(function(a, b) { return self.ctx.helper.compareCode(a.b_code, b.b_code); }), materialBillsData, materialStageBillsData }; } catch (err) { console.log(err); await transaction.rollback(); throw err; } } } return MaterialChecklist; };