| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 | 
							- /**
 
-  * 单价业务模型
 
-  *
 
-  * @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的单价记录
 
-         let unitPriceData = await this.findDataByCondition({code: data.code, unit_price_file_id: unitPriceFileId}, null, false);
 
-         // 如果有记录,判断是否存在一样的市场单价,有则直接返回数据
 
-         data.market_price = parseFloat(data.market_price);
 
-         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;
 
-         }
 
-         // 更改名称
 
-         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,
 
-             short_name: data.shortName !== undefined ? data.shortName : '',
 
-             glj_id: data.glj_id
 
-         };
 
-         let addPriceResult = await this.add(insertData);
 
-         return [addPriceResult, true];
 
-     }
 
-     /**
 
-      * 新增记录
 
-      *
 
-      * @param {object} data
 
-      * @return {Promise}
 
-      */
 
-     async add(data) {
 
-         let counterModel = new CounterModel();
 
-         if (data instanceof Array) {
 
-             // 如果是批量新增
 
-             for(let tmp in data) {
 
-                 data[tmp].id = await counterModel.getId(collectionName);
 
-             }
 
-         } else {
 
-             data.id = await counterModel.getId(collectionName);
 
-         }
 
-         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 {Object} condition
 
-      * @param {Object} updateData
 
-      * @param {String} extend
 
-      * @return {Promise}
 
-      */
 
-     async updatePrice(condition, updateData, extend = '') {
 
-         if (Object.keys(condition).length <= 0 || Object.keys(updateData).length <= 0) {
 
-             return false;
 
-         }
 
-         // 首先查找相应的数据判断工料机类型
 
-         let unitPriceData = await this.findDataByCondition(condition);
 
-         if (!unitPriceData) {
 
-             throw '找不到对应的单价数据';
 
-         }
 
-         // 基价单价的计算
 
-         switch (unitPriceData.type) {
 
-             // 主材、设备自动赋值基价单价=市场单价
 
-             case GLJTypeConst.MAIN_MATERIAL:
 
-             case GLJTypeConst.EQUIPMENT:
 
-                 updateData.base_price = updateData.market_price;
 
-                 break;
 
-         }
 
-         // 额外更新数据
 
-         if (extend !== '') {
 
-             extend = JSON.parse(extend);
 
-             for (let code in extend) {
 
-                 let extendUpdateData = {
 
-                     market_price: extend[code].market_price,
 
-                 };
 
-                 let tmpCondition = {
 
-                     unit_price_file_id: unitPriceData.unit_price_file_id,
 
-                     code: code
 
-                 };
 
-                 let extendResult = await this.db.update(tmpCondition, extendUpdateData);
 
-                 if (!extendResult) {
 
-                     throw '更新额外数据,编码为' + code + '的数据失败!';
 
-                 }
 
-             }
 
-         }
 
-         let result = await this.db.update(condition, updateData);
 
-         return result.ok !== undefined && result.ok === 1;
 
-     }
 
-     /**
 
-      * 复制单价文件数据
 
-      *
 
-      * @param {Number} currentUnitPriceId
 
-      * @param {Number} changeUnitPriceId
 
-      * @return {Promise}
 
-      */
 
-     async copyNotExist(currentUnitPriceId, changeUnitPriceId) {
 
-         let result = false;
 
-         // 首先查找原单价文件id下的数据
 
-         let currentUnitList = await this.findDataByCondition({unit_price_file_id: currentUnitPriceId}, null, false);
 
-         if (currentUnitList === null) {
 
-             return result;
 
-         }
 
-         // 过滤mongoose格式
 
-         currentUnitList = JSON.stringify(currentUnitList);
 
-         currentUnitList = JSON.parse(currentUnitList);
 
-         let codeList = [];
 
-         for (let tmp of currentUnitList) {
 
-             if (codeList.indexOf(tmp.code) >= 0) {
 
-                 continue;
 
-             }
 
-             codeList.push(tmp.code);
 
-         }
 
-         // 查找即将更替的单价文件是否存在对应的工料机数据
 
-         let condition = {unit_price_file_id: changeUnitPriceId, code: {"$in": codeList}};
 
-         let targetUnitList = await this.findDataByCondition(condition, null, false, 'code');
 
-         // 如果没有重叠的数据则原有的数据都复制一份
 
-         let insertData = [];
 
-         for (let tmp of currentUnitList) {
 
-             if (targetUnitList !== null && targetUnitList[tmp.code] !== undefined) {
 
-                 continue;
 
-             }
 
-             // 删除原有id信息
 
-             delete tmp._id;
 
-             delete tmp.id;
 
-             tmp.unit_price_file_id = changeUnitPriceId;
 
-             insertData.push(tmp);
 
-         }
 
-         return insertData.length > 0 ? this.add(currentUnitList) : true;
 
-     }
 
- }
 
- export default UnitPriceModel;
 
 
  |