| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 | /** * 单价业务模型 * * @author CaiAoLin * @date 2017/6/30 * @version */import BaseModel from "../../common/base/base_model"import GLJTypeConst from "../../common/const/glj_type_const"import CounterModel from "./counter_model"import {default as UnitPriceSchema, collectionName as collectionName} from "./schemas/unit_price";class UnitPriceModel extends BaseModel {    /**     * 构造函数     *     * @return {void}     */    constructor() {        let parent = super();        parent.model = UnitPriceSchema;        parent.init();    }    /**     * 根据单价文件id获取单价数据     *     * @param {Number} fileId     * @return {Promise}     */    async getDataByFileId(fileId) {        fileId = parseInt(fileId);        if (isNaN(fileId) || fileId <= 0) {            return null;        }        let unitPriceList = await this.db.model.find({unit_price_file_id: fileId});        if (unitPriceList.length <= 0) {            return null;        }        // 整理数据        let result = {};        for(let tmp of unitPriceList) {            result[tmp.code + tmp.name] = tmp;        }        return result;    }    /**     * 设置场景     *     * @param {string} scene     * @return {void}     */    setScene(scene = '') {        switch (scene) {            // 新增数据的验证规则            case 'add':                this.model.schema.path('base_price').required(true);                this.model.schema.path('market_price').required(true);                this.model.schema.path('name').required(true);                this.model.schema.path('code').required(true);                this.model.schema.path('unit').required(true);                this.model.schema.path('type').required(true);                this.model.schema.path('unit_price_file_id').required(true);        }    }    /**     * 新增单价数据     *     * @param {Object} data     * @param {Number} unitPriceFileId     * @param {Number} gljCount     * @return {Promise} 返回数据以及是否新增     */    async addUnitPrice(data, unitPriceFileId, gljCount = 0) {        if (data.code === undefined || data.project_id === undefined || data.name === undefined            || data.market_price === undefined) {            return [null, false];        }        // 先查找是否有同code的单价记录 @todo 后续可能会加入单位这个字段进一步确定唯一性        let unitPriceData = await this.findDataByCondition({code: data.code, unit_price_file_id: unitPriceFileId}, null, false);        // 如果有记录,判断是否存在一样的市场单价,有则直接返回数据        let unitPriceIndex = this.isPriceIncluded(unitPriceData, data.market_price);        if (unitPriceData && unitPriceIndex >= 0) {            return [unitPriceData[unitPriceIndex], false];        }        // 如果不存在基价单价,则在数据源中获取        if (data.base_price === undefined) {            let firstUnitPrice = unitPriceData[0] !== undefined ? unitPriceData[0] : [];            data.base_price = firstUnitPrice.base_price !== undefined ? firstUnitPrice.base_price : 0;            data.type = firstUnitPrice.type !== undefined ? firstUnitPrice.type : 0;            data.unit = firstUnitPrice.unit !== undefined ? firstUnitPrice.unit : 0;        }        // 更改名称        if (gljCount > 0) {            let regular = /\(\d\)/;            let changeString = '(' + gljCount + ')';            data.name = regular.test(data.name) ? data.name.replace(regular, changeString) :                data.name + changeString;        }        let insertData = {            code: data.code,            base_price: data.base_price,            market_price: data.market_price,            unit_price_file_id: unitPriceFileId,            name: data.name,            type: data.type,            unit: data.unit        };        let addPriceResult = await this.add(insertData);        return [addPriceResult, true];    }    /**     * 新增记录     *     * @param {object} data     * @return {Promise}     */    async add(data) {        let counterModel = new CounterModel();        let unitPriceId = await counterModel.getId(collectionName);        data.id = unitPriceId;        this.setScene('add');        return this.db.model.create(data);    }    /**     * 判断数据中是否包含某个市场价格的记录     *     * @param {Array} data     * @param {Number} price     * @return {Number}     */    isPriceIncluded(data, price) {        let index = -1;        if (data.length <= 0) {            return index;        }        for(let tmp in data) {            if (data[tmp].market_price === price) {                index = tmp;                break;            }        }        return index;    }    /**     * 更新市场单价     *     * @param {Number} id     * @param {Object} updateData     * @return {Promise}     */    async updatePriceById(id, updateData) {        id = parseInt(id);        if (isNaN(id) || id <= 0 || Object.keys(updateData).length <= 0) {            return false;        }        // 首先查找相应的数据判断工料机类型        let unitPriceData = await this.findDataByCondition({id: id});        if (!unitPriceData) {            throw '找不到对应的单价数据';        }        // 基价单价的计算        switch (unitPriceData.type) {            // 主材、设备自动赋值基价单价=市场单价            case GLJTypeConst.MAIN_MATERIAL:            case GLJTypeConst.EQUIPMENT:                updateData.base_price = updateData.market_price;                break;        }        let result = await this.updateById(id, updateData);        return result;    }}export default UnitPriceModel;
 |