| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- module.exports = {
- getData: getData,
- updateItem:updateItem,
- updateCoeAdjust:updateCoeAdjust
- };
- let mongoose = require('mongoose');
- let divideModel = mongoose.model("divide_setting");
- let consts = require('../models/project_consts');
- let calculate_facade = require("../../ration_glj/facade/glj_calculate_facade");
- let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade");
- let projectConsts = consts.projectConst;
- const uuidV1 = require('uuid/v1');
- async function updateItem(data){
- let ID = data.ID;
- let tasks= [];
- let udatas = [];
- let proportioRationID = null;
- for(let u of data.updateDatas){
- if(u.type == 'add'){
- tasks.push({updateOne: {filter: {ID: ID}, update: {"$push":{divideList:u.doc} }}});
- }
- if(u.type == "update"){
- let ndoc = {};
- let pre = "divideList.$."
- if(u.model) pre= u.model+".$.";
- for(let key in u.doc){
- ndoc[pre+key] = u.doc[key]
- }
- if(u.model){//改定额工料机的自定消耗或者子目换算时,要重算消耗量,所以就不走task流程了,另外算
- let query = {"ID": ID};
- query[u.model+".ID"] = u.ID;
- if(u.updateProportion == true){//更新稳定土的时候要先把所有定额工料机更新后,再计算消耗量,所以放在builkWrite后面
- tasks.push({updateOne: {filter: query, update: ndoc}});
- proportioRationID = u.rationID;
- }else{
- await divideModel.update(query,ndoc);
- //重新计算消耗量
- let [ntasks,ndatas] = await calculate_facade.calculateQuantityFromDivide(ID,u.rationID);
- if(ntasks.length > 0) tasks = tasks.concat(ntasks);
- if(ndatas.length > 0) udatas = udatas.concat(ndatas);
- }
- }else if(u.updateAss == true){//修改辅助定额
- await divideModel.update({"ID": ID,"divideList.ID":u.ID},ndoc);
- let [ntasks,ndatas] = await calculate_facade.calculateQuantityFromDivide(ID,u.ID);
- if(ntasks.length > 0) tasks = tasks.concat(ntasks);
- if(ndatas.length > 0) udatas = udatas.concat(ndatas);
- }else{
- tasks.push({updateOne: {filter: {"ID": ID,"divideList.ID":u.ID}, update: ndoc}});
- }
- }
- if(u.type == "delete"){
- tasks.push({updateOne: {filter: {ID: ID}, update: {"$pull":{divideList:{ID:u.ID}} }}});
- if(u.itemType == "定额"){
- await divideModel.update(
- {ID:ID},
- { $pull: {ration_gljs:{rationID:u.ID},ration_coes:{rationID:u.ID}}},
- { multi: true })
- }
- }
- }
- if(tasks.length > 0) await divideModel.bulkWrite(tasks);
- if(udatas.length > 0) data.updateDatas = data.updateDatas.concat(udatas);
- if(proportioRationID!=null){//说明更新了稳定土
- let [ptasks,pdatas] = await calculate_facade.calculateQuantityFromDivide(ID,proportioRationID);
- if(ptasks.length > 0) await divideModel.bulkWrite(ptasks);
- if(pdatas.length > 0) data.updateDatas = data.updateDatas.concat(pdatas);
- }
- return data;
- }
- async function updateCoeAdjust(data,compilation){
- let replace = [],projectGLJList=[],ration_gljs=[];
- let result = {updateDatas:[]}
- let ndoc = {};
- let pre = "ration_coes.$."
- for(let key in data.doc){
- ndoc[pre+key] = data.doc[key]
- }
- await divideModel.update({ID:data.divideID,"ration_coes.ID":data.ID},ndoc);
- result.updateDatas.push({ID:data.ID,type:'update',model:'ration_coes',doc:data.doc});
- //添加单个工料机的情况
- if (data.add.length > 0){
- let [tg,pl] = await ration_glj_facade.insertAddTypeGLJ(data.add,compilation,false);
- await divideModel.update({ID:data.divideID},{$push:{ration_gljs:{$each:tg}}});
- ration_gljs = ration_gljs.concat(tg);
- if(pl.length > 0) projectGLJList = projectGLJList.concat(pl);
- }
- //删除的情况
- if(data.delete.length > 0){
- await divideModel.update({ID:data.divideID},{$pull:{ration_gljs:{$in: data.delete}}});
- }
- //替换工料机的情况
- if (data.replace.length > 0){
- let rationGLJlist = await getRationGLJs(data.divideID,data.rationID);
- for(let r of data.replace){
- let ration_glj_ID = r.ID;
- if(data.toCommercial == true) ration_glj_ID = r.originalID;
- let r_result = await ration_glj_facade.replaceGLJByData(r,compilation,false,rationGLJlist);
- let rdoc = {};
- for(let key in r_result.data){
- rdoc[pre+key] = result.data[key]
- }
- //修改定额工料机
- await divideModel.update({ID:data.divideID,"ration_gljs.ID":ration_glj_ID},rdoc);
- result.updateDatas.push({ID:data.ID,type:'update',model:'ration_gljs',doc:r_result.data});
- projectGLJList.push(r_result.projectGLJ);
-
- //新增定额工料机
- if(r_result.newRecodes.length > 0){
- await divideModel.update({ID:data.divideID},{$push:{ration_gljs:{$each:r_result.newRecodes}}});
- ration_gljs = ration_gljs.concat(r_result.newRecodes);
- }
- //删除定额工料机
- if(r_result.deleteList.length > 0){
- await divideModel.update({ID:data.divideID},{$pull:{ration_gljs:{$in: r_result.deleteList}}});
- data.delete = data.delete.concat(r_result.deleteList);
- }
- }
- }
- let [ptasks,pdatas] = await calculate_facade.calculateQuantityFromDivide(data.divideID,data.rationID);
- if(ptasks.length > 0) await divideModel.bulkWrite(ptasks);
- if(pdatas.length > 0) result.updateDatas = result.updateDatas.concat(pdatas);
- result.ration_gljs= ration_gljs;
- result.projectGLJList = projectGLJList;
- result.delete = data.delete;
- return result;
- }
- async function getRationGLJs(divideID,rationID){
- let gljList = [];
- let divide_setting = await divideModel.findOne({ID:divideID}).lean();
- for(let rg of divide_setting.ration_gljs){
- if(rg.rationID == rationID) gljList.push(rg);
- }
- return gljList;
- }
- function getData(projectID, callback) {
- divideModel.findOne({projectID: projectID}, '-_id', async function (err, datas) {
- if (!err) {
- // 旧项目没有人工系数文件,默认给它生成一个。
- if (!datas) {
- datas = {
- ID: uuidV1(),
- projectID:projectID,
- divideList:[],
- ration_gljs:[],
- ration_coes:[]
- }
- await divideModel.create(datas);
- callback(0, projectConsts.DIVIDE_SETTING, datas);
- } else {
- callback(0, projectConsts.DIVIDE_SETTING, datas);
- };
- } else {
- callback(1, projectConsts.DIVIDE_SETTING, null);
- };
- });
- }
|