123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- /**
- * Created by Zhong on 2017/8/22.
- */
- const mongoose = require('mongoose');
- const complementaryGljModel = mongoose.model('complementary_glj_lib');
- const stdGljModel = mongoose.model('std_glj_lib_gljList');
- const gljClassModel = mongoose.model('std_glj_lib_gljClass');
- const compleClassModel = mongoose.model('complementary_glj_section');
- const _ = require('lodash');
- const counter = require("../../../public/counter/counter");
- const async = require("async");
- const STDGLJLibGLJListModel = require("../../common/std/std_glj_lib_glj_list_model");
- const libType = {
- stdGLJ: 1,
- complementaryGLJs: 2
- };
- class GljDao {
- getGljTypes (gljLibId, callback){
- gljClassModel.find({"repositoryId": gljLibId},function(err,data){
- if(data.length) {
- callback(0,data);
- }
- else if(err) callback("获取人材机类型错误!",false);
- })
- }
- _exist(data, attr){
- return data && data[attr] !== 'undefined' && data[attr];
- }
- sortToNumber(datas){
- for(let i = 0, len = datas.length; i < len; i++){
- let data = datas[i]._doc;
- if(this._exist(data, 'basePrice')){
- data['basePrice'] = parseFloat(data['basePrice']);
- }
- if(this._exist(data, 'component')){
- for(let j = 0, jLen = data['component'].length; j < jLen; j++){
- let comGljObj = data['component'][j]._doc;
- if(this._exist(comGljObj, 'consumeAmt')){
- comGljObj['consumeAmt'] = parseFloat(comGljObj['consumeAmt']);
- }
- }
- }
- }
- }
- async getQueryByType (condition) {
- const {
- userID,
- compilationId,
- gljLibId, code,
- type,
- queryExtend,
- replace,
- location,
- classList,
- search
- } = condition;
- let model = null,
- query = {},
- countQuery = {},
- matchLocation = false;
- if (type === libType.stdGLJ) {
- model = stdGljModel;
- query.repositoryId = gljLibId;
- } else {
- model = complementaryGljModel;
- query.userId = userID;
- query.compilationId = compilationId;
- }
- // 分类树
- if (classList.length) {
- query.gljClass = {$in: classList};
- }
- // 定位
- if (location) {
- // 替换定位,则先看看能不能找到替换的人材机,能找到的话就能定位要被替换人材机所在分类树
- const replaceQuery = {...query, ...replace};
- const replaceData = await model.findOne(replaceQuery);
- if (replaceData) {
- query.gljClass = replaceData.gljClass;
- matchLocation = true;
- }
- }
- // 替换过滤类型
- if (replace) {
- // 人材机类型是“混凝土、砂浆、配合比、商品混凝土、商品砂浆”时,筛选的可替换的人材机类型应是“混凝土、或砂浆、或配合比、或商品混凝土、或商品砂浆”。
- const materialTypes = [202, 203, 204, 205, 206];
- query.gljType = materialTypes.includes(replace.gljType) ? {$in: materialTypes} : replace.gljType;
- }
- // 添加组成物时的查询扩展
- if (queryExtend) {
- Object.assign(query, queryExtend);
- }
- // 搜索关键字
- if (search) {
- query.$or = [{code: {'$regex': search, $options: '$i'}}, {name: {'$regex': search, $options: '$i'}}];
- }
- countQuery = {...query};
- // 上一次分页的最末人材机编码
- if (code) {
- query.code = {$gt: code};
- }
- return {
- model,
- query,
- countQuery,
- matchLocation
- };
- }
- async getGLJPaging (condition) {
- const queryData = await this.getQueryByType(condition);
- // 定位(替换初始化)
- // 替换触发的人材机选择界面,只有在初始化时才定位,其他操作下是正常的分页
- if (queryData.matchLocation) {
- // 返回的数据,为编码小于等于替换的编码,再加附加条数
- const limitQuery = _.cloneDeep(queryData.query);
- limitQuery.code = {$lte: condition.replace.code};
- const lteLimit = await queryData.model.count(limitQuery);
- const additionalLimit = 10;
- const limit = lteLimit + additionalLimit;
- // 显示的数据不能太少,否则数据没有占满整个表格区域(实际上数据条目应该超过表格显示区域),让人误以为数据只有那么点,不再滚动触发分页
- condition.limit = limit > condition.limit ? limit : condition.limit;
- }
- //const gljs = await queryData.model.find(queryData.query).lean().sort({code: 1}).skip(condition.index).limit(condition.limit);
- // 分页使用skip的话,跳过的条数多的话性能会下降,因此不使用
- const gljs = await queryData.model.find(queryData.query).lean().sort({code: 1}).limit(condition.limit);
- const total = await queryData.model.find(queryData.countQuery).count();
- return condition.type === libType.stdGLJ
- ? {stdGLJ: gljs, complementaryGLJs: [], total: total}
- : {stdGLJ: [], complementaryGLJs: gljs, total: total}
- }
- async getGLJDataSync (gljLibId, userId, compilationId) {
- const stdGljs = await stdGljModel.find({repositoryId: gljLibId}).lean();
- const complementaryGljs = await complementaryGljModel.find({userId, compilationId}).lean();
- return {
- stdGljs,
- complementaryGljs
- }
- }
- //获得用户的补充工料机和用户当前所在编办的标准工料机
- async getGljItems(stdGljLibId, userId, compilationId, projection, callback) {
- let me = this;
- let rst = { stdGljs: [], complementaryGljs: [] };
- //批量获取异步
- async.parallel([
- async function (cb) {
- try {
- let stdGljs = stdGljLibId ? await stdGljModel.find({ repositoryId: stdGljLibId }, projection).lean() : [];
- me.sortToNumber(stdGljs);
- rst.stdGljs = stdGljs;
- cb(null);
- }
- catch (err) {
- cb(err);
- }
- },
- function (cb) {
- if (!userId || !compilationId) {
- rst.complementaryGljs = [];
- cb(null);
- return;
- }
- complementaryGljModel.find({ userId: userId, compilationId: compilationId }, '-_id', { lean: true }, function (err, complementaryGljs) {
- if (err) {
- cb(err);
- }
- else {
- me.sortToNumber(complementaryGljs);
- rst.complementaryGljs = complementaryGljs;
- cb(null);
- }
- });
- }
- ], function (err) {
- if (err) {
- callback(err, null);
- }
- else {
- callback(0, rst);
- }
- })
- }
- async getStdItems (stdGljLibId, projection, callback) {
- try {
- let stdItems = await stdGljModel.find({repositoryId: stdGljLibId}, projection).lean();
- callback(0, stdItems);
- } catch (err) {
- callback(1, null);
- }
- }
- getGljItemsByCode (repositoryId, codes, callback){
- gljModel.find({"repositoryId": repositoryId,"code": {"$in": codes}},function(err,data){
- if(err) callback(true, "")
- else callback(false, data);
- })
- };
- updateComponent(userId, updateArr, callback){
- let parallelFucs = [];
- for(let i = 0; i < updateArr.length; i++){
- parallelFucs.push((function(obj){
- return function (cb) {
- if(typeof obj.component === 'undefined'){
- obj.component = [];
- }
- complementaryGljModel.update({userId: userId, ID: obj.ID}, obj, function (err, result) {
- if(err){
- cb(err);
- }
- else{
- cb(null, obj);
- }
- })
- }
- })(updateArr[i]));
- }
- async.parallel(parallelFucs, function (err, result) {
- if(err){
- callback(err, '更新组成物错误!', null);
- }
- else{
- callback(0, '成功!', result);
- }
- });
- }
- //-oprtor
- mixUpdateGljItems (userId, compilationId, updateItems, addItems, rIds, callback) {
- if (updateItems.length == 0 && rIds.length == 0) {
- GljDao.addGljItems(userId, compilationId, addItems, callback);
- }
- else if(rIds.length > 0 && updateItems.length > 0){
- async.parallel([
- function (cb) {
- GljDao.removeGljItems(rIds, cb);
- },
- function (cb) {
- GljDao.updateGljItems(userId, compilationId, updateItems, cb);
- }
- ], function (err) {
- if(err){
- callback(true, "Fail to update and delete", false)
- }
- else{
- callback(false, "Save successfully", false);
- }
- })
- }
- else if (rIds.length > 0 && updateItems.length === 0) {
- GljDao.removeGljItems(rIds, callback);
- }
- else if(updateItems.length > 0 || addItems.length > 0){
- GljDao.updateGljItems(userId, compilationId, updateItems, function(err, results){
- if (err) {
- callback(true, "Fail to update", false);
- } else {
- if (addItems && addItems.length > 0) {
- GljDao.addGljItems(userId, compilationId, addItems, callback);
- } else {
- callback(false, "Save successfully", results);
- }
- }
- });
- }
- }
- static removeGljItems (rIds, callback) {
- if (rIds && rIds.length > 0) {
- complementaryGljModel.collection.remove({ID: {$in: rIds}}, null, function(err, docs){
- if (err) {
- callback(true, "Fail to remove", false);
- } else {
- callback(false, "Remove successfully", docs);
- }
- })
- } else {
- callback(false, "No records were deleted!", null);
- }
- }
- static addGljItems (userId, compilationId, items, callback) {
- if (items && items.length > 0) {
- counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, items.length, function(err, result){
- var maxId = result.sequence_value;
- var arr = [];
- for (var i = 0; i < items.length; i++) {
- var obj = new complementaryGljModel(items[i]);
- obj.ID = (maxId - (items.length - 1) + i);
- obj.userId = userId;
- obj.compilationId = compilationId;
- arr.push(obj);
- }
- complementaryGljModel.collection.insert(arr, null, function(err, docs){
- if (err) {
- callback(true, "Fail to add", false);
- } else {
- callback(false, "Add successfully", docs);
- }
- });
- });
- } else {
- callback(true, "No source", false);
- }
- }
- static updateGljItems(userId, compilationId, items, callback) {
- var functions = [];
- for (var i=0; i < items.length; i++) {
- functions.push((function(doc) {
- return function(cb) {
- var filter = {};
- if (doc.ID) {
- filter.ID = doc.ID;
- } else {
- filter.userId = userId;
- filter.compilationId = compilationId;
- filter.code = doc.code;
- }
- complementaryGljModel.update(filter, doc, cb);
- };
- })(items[i]));
- }
- async.parallel(functions, function(err, results) {
- callback(err, results);
- });
- }
- /**
- * 获取组成物数据
- *
- * @param {Number} gljId
- * @return {Promise}
- */
- async getComponent(gljId) {
- let result = [];
- let libGljData = await complementaryGljModel.findOne({ID: gljId});
- if (libGljData === null || libGljData.component.length <= 0) {
- return result;
- }
- // 标准工料机库
- let componentIdListStd = [];
- // 补充工料机库
- let componentIdListCpt = [];
- let componentConsume = {};
- // 整理数据
- for (let component of libGljData.component) {
- if (component.isStd) {
- componentIdListStd.push(component.ID);
- } else {
- componentIdListCpt.push(component.ID);
- }
- let isStdFlag = component.isStd ? 'std' : 'cpt';
- if(component.consumeAmt != undefined && component.consumeAmt != null) {
- componentConsume[component.ID + '_' + isStdFlag] = component.consumeAmt;
- }else if(component.consumeAmtProperty){
- componentConsume[component.ID + '_' + isStdFlag] = component.consumeAmtProperty;
- }
- }
- // 查找标准库数据
- let condition = {};
- let componentStdGljData = [];
- if (componentIdListStd.length > 0) {
- let gljListModel = new STDGLJLibGLJListModel();
- condition = {ID: {$in: componentIdListStd}};
- componentStdGljData = await gljListModel.findDataByCondition(condition, null, false);
- }
- // 查找补充库数据
- let componentCptGljData = [];
- if (componentIdListCpt.length > 0) {
- condition = {ID: {$in: componentIdListCpt}};
- componentCptGljData = await complementaryGljModel.find(condition);
- }
- if (componentCptGljData === null && componentStdGljData === null) {
- return result;
- }
- // 整理数据
- if (componentStdGljData.length > 0) {
- componentStdGljData = JSON.stringify(componentStdGljData);
- componentStdGljData = JSON.parse(componentStdGljData);
- for(let gljData of componentStdGljData) {
- gljData.connectCode = libGljData.code;
- gljData.consumption = componentConsume[gljData.ID + '_std'];
- gljData.from='std';
- result.push(gljData);
- }
- }
- if (componentCptGljData.length > 0) {
- componentCptGljData = JSON.stringify(componentCptGljData);
- componentCptGljData = JSON.parse(componentCptGljData);
- for(let gljData of componentCptGljData) {
- gljData.connectCode = libGljData.code;
- gljData.consumption = componentConsume[gljData.ID + '_cpt'];
- gljData.from='cpt';
- result.push(gljData);
- }
- }
- return result;
- }
- async getMixedTree(gljLibId, userId, compilationId){
- let rst = {std: [], comple: []};
- if (gljLibId) {
- rst.std = await gljClassModel.find({repositoryId: gljLibId}).lean();
- }
- if (userId && compilationId) {
- rst.comple = await compleClassModel.find({userId: userId, compilationId: compilationId}).lean();
- }
- return rst;
- }
- }
- module.exports = GljDao;
|