|
@@ -0,0 +1,202 @@
|
|
|
+'use strict';
|
|
|
+
|
|
|
+/**
|
|
|
+ * 期 - 变更数据
|
|
|
+ *
|
|
|
+ * @author Mai
|
|
|
+ * @date
|
|
|
+ * @version
|
|
|
+ */
|
|
|
+
|
|
|
+const defaultPid = -1; // 非pid
|
|
|
+
|
|
|
+module.exports = app => {
|
|
|
+
|
|
|
+ class StageChange extends app.BaseService {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构造函数
|
|
|
+ *
|
|
|
+ * @param {Object} ctx - egg全局变量
|
|
|
+ * @return {void}
|
|
|
+ */
|
|
|
+ constructor(ctx) {
|
|
|
+ super(ctx);
|
|
|
+ this.tableName = 'stage_change';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询 调用的变更令
|
|
|
+ * @param {Number} tid - 标段id
|
|
|
+ * @param {Number} sid - 期id
|
|
|
+ * @param {Number} lid - 台账节点id
|
|
|
+ * @param {Number} pid - 部位明细id
|
|
|
+ * @returns {Promise<*>}
|
|
|
+ */
|
|
|
+ async getLastestStageData(tid, sid, lid, pid) {
|
|
|
+ const sql = 'SELECT c.* FROM ' + this.tableName + ' As c ' +
|
|
|
+ ' INNER JOIN ( ' +
|
|
|
+ ' SELECT MAX(`stimes`) As `stimes`, MAX(`sorder`) As `sorder`, `lid`, `pid` From ' + this.tableName +
|
|
|
+ ' WHERE tid = ? And sid = ? And lid = ? And pid = ?' +
|
|
|
+ ' ) As m ' +
|
|
|
+ ' ON c.stimes = m.stimes And c.sorder = m.sorder And c.lid = m.lid And c.pid = m.pid';
|
|
|
+ const sqlParam = [tid, sid, lid, pid ? pid : -1];
|
|
|
+ return await this.db.query(sql, sqlParam);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 调用变更令
|
|
|
+ * @param {Object} target - 台账|部位
|
|
|
+ * @param {Array} changes - 调用的变更令
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async billsChange(bills, changes) {
|
|
|
+ const self = this;
|
|
|
+ function getNewChange(cid, cbid, times, order, qty) {
|
|
|
+ return {
|
|
|
+ tid: self.ctx.tender.id,
|
|
|
+ sid: self.ctx.stage.id,
|
|
|
+ lid: bills.id,
|
|
|
+ pid: -1,
|
|
|
+ cid: cid,
|
|
|
+ cbid: cbid,
|
|
|
+ stimes: times,
|
|
|
+ sorder: order,
|
|
|
+ qty: qty
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const ledgerBills = await this.ctx.service.ledger.getDataById(bills.id);
|
|
|
+ if (!ledgerBills || ledgerBills.tender_id !== this.ctx.tender.id) {
|
|
|
+ throw '提交数据错误';
|
|
|
+ }
|
|
|
+ const precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, ledgerBills.unit);
|
|
|
+ // 获取原变更令
|
|
|
+ const oldChanges = await this.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, bills.id, -1);
|
|
|
+ const order = this.ctx.stage.curAuditor ? this.ctx.stage.curAuditor.order : 0;
|
|
|
+ // 获取更新数据
|
|
|
+ const updateChanges = [], newChanges = [];
|
|
|
+ let billsQty = 0;
|
|
|
+ for (const oc of oldChanges) {
|
|
|
+ const nc = this._.find(changes, {cid: oc.cid, cbid: oc.cbid});
|
|
|
+ if (!nc || nc.qty !== oc.qty) {
|
|
|
+ const qty = nc ? this.round(nc.qty, precision.value) : null;
|
|
|
+ const change = getNewChange(oc.cid, oc.cbid, this.ctx.stage.times, order, qty);
|
|
|
+ billsQty = this.ctx.helper.plus(billsQty, change.qty);
|
|
|
+ if (oc.stimes === this.ctx.stage.times && oc.sorder === order) {
|
|
|
+ change.id = oc.id;
|
|
|
+ updateChanges.push(change);
|
|
|
+ } else {
|
|
|
+ newChanges.push(change);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ billsQty = this.ctx.helper.plus(billsQty, oc.qty);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (const c of changes) {
|
|
|
+ const nc = this._.find(oldChanges, {cid: c.cid, cbid: c.cbid});
|
|
|
+ if (!nc) {
|
|
|
+ const change = getNewChange(c.cid, c.cbid, this.ctx.stage.times, order, this.round(c.qty, precision.value));
|
|
|
+ billsQty = this.ctx.helper.plus(billsQty, change.qty);
|
|
|
+ newChanges.push(change);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 更新数据
|
|
|
+ const transaction = await this.db.beginTransaction();
|
|
|
+ try {
|
|
|
+ if (newChanges.length > 0) {
|
|
|
+ await transaction.insert(this.tableName, newChanges);
|
|
|
+ }
|
|
|
+ for (const c of updateChanges) {
|
|
|
+ await transaction.update(this.tableName, c);
|
|
|
+ }
|
|
|
+ const stageBills = await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, bills.id);
|
|
|
+ await this.ctx.service.stageBills.updateStageBillsQty(transaction, ledgerBills, stageBills, { qc_qty: billsQty });
|
|
|
+ await transaction.commit();
|
|
|
+ } catch (err) {
|
|
|
+ await transaction.rollback();
|
|
|
+ throw err;
|
|
|
+ }
|
|
|
+ const result = await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, [bills.id]);
|
|
|
+ return { bills: result };
|
|
|
+ }
|
|
|
+
|
|
|
+ async posChange(pos, changes) {
|
|
|
+ const self = this;
|
|
|
+ function getNewChange(cid, cbid, times, order, qty) {
|
|
|
+ return {
|
|
|
+ tid: self.ctx.tender.id,
|
|
|
+ sid: self.ctx.stage.id,
|
|
|
+ lid: pos.lid,
|
|
|
+ pid: pos.id,
|
|
|
+ cid: cid,
|
|
|
+ cbid: cbid,
|
|
|
+ stimes: times,
|
|
|
+ sorder: order,
|
|
|
+ qty: qty
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const ledgerBills = await this.ctx.service.ledger.getDataById(pos.lid);
|
|
|
+ if (!ledgerBills || ledgerBills.tender_id !== this.ctx.tender.id) {
|
|
|
+ throw '提交数据错误';
|
|
|
+ }
|
|
|
+ const precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, ledgerBills.unit);
|
|
|
+ // 获取原变更令
|
|
|
+ const oldChanges = await this.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, pos.lid, pos.id);
|
|
|
+ const updateChanges = [], newChanges = [];
|
|
|
+ let posQty = 0;
|
|
|
+ for (const oc of oldChanges) {
|
|
|
+ const nc = this._.find(changes, {cid: oc.cid, cbid: oc.cbid});
|
|
|
+ if (!nc || nc.qty !== oc.qty) {
|
|
|
+ const qty = nc ? this.round(nc.qty, precision.value) : null;
|
|
|
+ const change = getNewChange(oc.cid, oc.cbid, this.ctx.stage.times, this.ctx.stage.flowOrder, qty);
|
|
|
+ posQty = this.ctx.helper.plus(posQty, change.qty);
|
|
|
+ if (oc.stimes === this.ctx.stage.times && oc.sorder === this.ctx.stage.flowOrder) {
|
|
|
+ change.id = oc.id;
|
|
|
+ updateChanges.push(change);
|
|
|
+ } else {
|
|
|
+ newChanges.push(change);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ posQty = this.ctx.helper.plus(posQty, oc.qty);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (const c of changes) {
|
|
|
+ const nc = this._.find(oldChanges, {cid: c.cid, cbid: c.cbid});
|
|
|
+ if (!nc) {
|
|
|
+ const change = getNewChange(c.cid, c.cbid, this.ctx.stage.times, this.ctx.stage.flowOrder, this.round(c.qty, precision.value));
|
|
|
+ posQty = this.ctx.helper.plus(posQty, change.qty);
|
|
|
+ newChanges.push(change);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 更新数据
|
|
|
+ const transaction = await this.db.beginTransaction();
|
|
|
+ try {
|
|
|
+ if (newChanges.length > 0) {
|
|
|
+ await transaction.insert(this.tableName, newChanges);
|
|
|
+ }
|
|
|
+ for (const c of updateChanges) {
|
|
|
+ await transaction.update(this.tableName, c);
|
|
|
+ }
|
|
|
+ await this.ctx.service.stagePos.updateChangeQuantity(transaction, pos, posQty);
|
|
|
+ await transaction.commit();
|
|
|
+ } catch (err) {
|
|
|
+ await transaction.rollback();
|
|
|
+ throw err;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取返回数据
|
|
|
+ try {
|
|
|
+ const data = {};
|
|
|
+ data.bills = await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, [pos.lid]);
|
|
|
+ data.pos = await this.ctx.service.stagePos.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, [pos.id])
|
|
|
+ return data;
|
|
|
+ } catch(err) {
|
|
|
+ throw '获取数据错误,请刷新页面';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return StageChange;
|
|
|
+
|
|
|
+};
|