123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- /**
- * Created by zhang on 2018/2/9.
- */
- let mongoose = require('mongoose');
- import SearchDao from '../../complementary_ration_lib/models/searchModel';
- const scMathUtil = require('../../../public/scMathUtil').getUtil();
- let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade")
- let quantity_detail = require("../facade/quantity_detail_facade");
- let ration_glj = mongoose.model('ration_glj');
- let ration_coe = mongoose.model('ration_coe');
- let ration_model = require('../models/ration');
- let bill_model = require('../models/bills');
- let decimal_facade = require('./decimal_facade');
- import installationFeeModel from "../models/installation_fee";
- import rationInstallationModel from "../models/ration_installation";
- const uuidV1 = require('uuid/v1');
- let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');
- let coeMolde = mongoose.model('std_ration_lib_coe_list');
- let _= require('lodash');
- module.exports = {
- replaceRations: replaceRations,
- addNewRation:addNewRation
- };
- async function addNewRation(data) {
- let query = data.itemQuery;
- let stdRation = null;
- if(query){
- let searchDao = new SearchDao();
- stdRation = await searchDao.getRationItem(query.userID,query.rationRepId,query.code);
- data.newData.code = query.code;
- }
- if(data.brUpdate.length>0){
- await updateSerialNo(data.brUpdate);
- }
- let newRation =await insertNewRation(data.newData,stdRation,data.calQuantity);
- if(stdRation){
- return await addRationSubList(stdRation,newRation);
- }else {
- return {ration:newRation};
- }
- }
- async function updateSerialNo(serialNoUpdate){
- let tasks=[];
- for(let data of serialNoUpdate){
- let task={
- updateOne:{
- filter:{
- ID:data.ID,
- projectID:data.projectID
- },
- update :{
- serialNo:data.serialNo
- }
- }
- };
- tasks.push(task);
- }
- await ration_model.model.bulkWrite(tasks);
- }
- async function insertNewRation(newData,std,calQuantity) {//插入新的定额
- if(std){
- newData.name = std.name;
- newData.caption = std.caption;
- newData.unit = std.unit;
- newData.libID = std.rationRepId;
- newData.content = std.jobContent;
- if (std.chapter) {
- newData.comments = std.chapter.explanation;
- newData.ruleText = std.chapter.ruleText;
- }
- newData.from = std.type === 'complementary' ? 'cpt' : 'std';
- newData.programID = std.feeType;
- newData.rationAssList = createRationAss(std);
- // calculate ration Quantity
- }
- if(calQuantity){
- await CalculateQuantity(newData,newData.billsItemID,newData.projectID);
- }
- let newRation = await ration_model.model.create(newData);
- return newRation;
- }
- async function replaceRations(userID,data) {
- let searchDao = new SearchDao();
- let recodes = [];
- for(let recode of data.nodeInfo){
- let stdRation = await searchDao.getRationItem(userID,data.libID,recode.newCode);
- let newRecode = await replaceRation(recode,stdRation,data.projectID,data.calQuantity);
- if(newRecode){
- recodes.push(newRecode);
- }else {
- break;
- }
- }
- return recodes;
- }
- async function replaceRation(nodeInfo,stdRation,projectID,calQuantity) {
- if(stdRation){
- await deleRationSubRecode(projectID,nodeInfo.ID);
- let newRation = await updateRation(stdRation,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
- return await addRationSubList(stdRation,newRation);
- }else {
- return null;
- }
- }
- async function addRationSubList(stdRation,newRation) {
- let ration_gljs = await addRationGLJ(stdRation,newRation);
- let ration_coes = await addRationCoe(stdRation,newRation);
- let ration_installs = await addRationInstallFee(stdRation,newRation);
- return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installs:ration_installs};
- }
- async function addRationInstallFee(std,newRation) {
- let install_fee_list = [];
- if(std.hasOwnProperty('rationInstList') && std.rationInstList.length > 0){
- let installFee = await installationFeeModel.findOne({'projectID': newRation.projectID});
- for(let ri of std.rationInstList){
- let feeItem = _.find(installFee.installFeeItem,{'ID':ri.feeItemId});
- let section = _.find(installFee.installSection,{'ID':ri.sectionId});
- if(feeItem&§ion){
- let tem_r_i = {
- libID:installFee.libID,
- projectID:newRation.projectID,
- rationID:newRation.ID,
- feeItemId:feeItem.ID,
- sectionId:section.ID,
- itemName:feeItem.feeItem,
- feeType:feeItem.feeType,
- sectionName:section.name,
- unifiedSetting:1,
- ruleId:''
- };
- if(feeItem.isCal==1&§ion.feeRuleId&§ion.feeRuleId!=''){//勾选记取时并且有规则ID时才读取
- let feeRule = _.find(installFee.feeRule,{'ID':section.feeRuleId});
- if(feeRule){
- tem_r_i.ruleId = feeRule.ID;
- }
- }
- tem_r_i.ID = uuidV1();
- install_fee_list.push(tem_r_i);
- }
- }
- if(install_fee_list.length>0){
- await rationInstallationModel.insertMany(install_fee_list);
- }
- }
- return install_fee_list;
- }
- async function addRationCoe(std,newRation) {
- let ration_coe_list = [];
- let seq = 0;
- if(std.hasOwnProperty('rationCoeList')&&std.rationCoeList.length>0){//添加标准库的工料机
- for(let sub of std.rationCoeList){
- let libCoe = await coeMolde.findOne({'libID':std.rationRepId,'ID':sub.ID,"$or": [{"isDeleted": null}, {"isDeleted": false}]});//std.rationRepId;
- if(libCoe){
- let newCoe = {};
- newCoe.ID = uuidV1();
- newCoe.coeID = sub.ID;
- newCoe.seq = seq;
- newCoe.name = libCoe.name;
- newCoe.content = libCoe.content;
- newCoe.isAdjust=0;
- newCoe.coes = libCoe.coes;
- newCoe.rationID = newRation.ID;
- newCoe.projectID = newRation.projectID;
- seq++;
- ration_coe_list.push(newCoe);
- }
- }
- }
- let lastCoe ={
- coeID:-1,
- name : '自定义系数',
- content:'人工×1,材料×1,机械×1,主材×1,设备×1',
- isAdjust:0,
- seq:seq,
- rationID : newRation.ID,
- projectID : newRation.projectID
- };
- lastCoe.ID = uuidV1();
- lastCoe.coes = getCustomerCoeData();
- ration_coe_list.push(lastCoe);
- await ration_coe.insertMany(ration_coe_list);
- return ration_coe_list;
- }
- function getCustomerCoeData() {
- var coeList = [];
- coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'定额'});
- coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'人工'});
- coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'材料'});
- coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'机械'});
- coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'主材'});
- coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'设备'});
- return coeList;
- };
- async function addRationGLJ(std,newRation) {
- let newRationGLJList = [];
- let rationGLJShowList = [];
- if(std.hasOwnProperty('rationGljList') && std.rationGljList.length > 0){
- for(let sub of std.rationGljList){
- let newGLJ = {};
- newGLJ.ID = uuidV1();
- newGLJ.projectID = newRation.projectID;
- newGLJ.GLJID = sub.gljId;
- newGLJ.rationID = newRation.ID;
- newGLJ.billsItemID = newRation.billsItemID;
- newGLJ.rationItemQuantity = sub.consumeAmt;
- newGLJ.quantity = sub.consumeAmt;
- newGLJ.glj_repository_id = std.rationRepId;
- let std_glj = await std_glj_lib_gljList_model.findOne({'ID':sub.gljId});
- if(std_glj){
- newGLJ.name = std_glj.name;
- newGLJ.code = std_glj.code;
- newGLJ.original_code = std_glj.code;
- newGLJ.unit = std_glj.unit;
- newGLJ.specs = std_glj.specs;
- newGLJ.basePrice = std_glj.basePrice;
- newGLJ.shortName = std_glj.shortName;
- newGLJ.type = std_glj.gljType;
- newGLJ.repositoryId = std_glj.repositoryId;
- newGLJ.adjCoe = std_glj.adjCoe;
- let info = await ration_glj_facade.getInfoFromProjectGLJ(newGLJ);
- newGLJ = ration_glj_facade.createNewRecord(info);
- newRationGLJList.push(newGLJ);
- rationGLJShowList.push(info);
- }
- }
- }
- if(newRationGLJList.length>0){
- await ration_glj.insertMany(newRationGLJList);
- }
- return rationGLJShowList;
- }
- async function deleRationSubRecode(projectID,rationID) {//删除挂在定额下的数据,如工程量明细,定额工料机等
- let delete_query={projectID: projectID, rationID: rationID};
- //删除工程量明细
- await quantity_detail.deleteByQuery(delete_query) ;
- await ration_coe.deleteMany(delete_query);//删除附注条件
- await ration_glj.deleteMany(delete_query);//删除定额工料机
- await rationInstallationModel.deleteMany(delete_query);//删除安装增加费
- }
- async function updateRation(std,rationID,billsItemID,projectID,calQuantity) {
- // insertNewRation
- let ration ={};
- ration.code = std.code;
- ration.name = std.name;
- ration.caption = std.caption;
- ration.unit = std.unit;
- ration.libID = std.rationRepId;
- ration.content = std.jobContent;
- ration.adjustState = '';
- ration.isFromDetail=0;
- ration.isSubcontract=false;
- ration.fees=[];
- if (std.chapter) {
- ration.comments = std.chapter.explanation;
- ration.ruleText = std.chapter.ruleText;
- }
- ration.from = std.type === 'complementary' ? 'cpt' : 'std';
- ration.programID = std.feeType;
- ration.rationAssList = createRationAss(std);//生成辅助定额
- if(calQuantity){
- await CalculateQuantity(ration,billsItemID,projectID);
- }
- let unsetObject = {
- "marketUnitFee":1,
- 'marketTotalFee':1,
- "maskName":1
- }
- let newRation = await ration_model.model.findOneAndUpdate({ID:rationID,projectID:projectID},{"$set":ration,"$unset":unsetObject},{new: true});//;
- return newRation;
- }
- function createRationAss(std) {
- let rationAssList = [];//生成辅助定额
- if(std.hasOwnProperty('rationAssList')&&std.rationAssList.length>0){
- for(let i=0;i<std.rationAssList.length;i++){
- let ass = std.rationAssList[i];
- ass.actualValue = ass.stdValue;
- rationAssList.push(ass);
- }
- }
- return rationAssList;
- }
- async function CalculateQuantity (ration,billsItemID,projectID) {
- // calculate ration Quantity
- let decimalObject =await decimal_facade.getProjectDecimal(projectID);
- let quantity_decimal = (decimalObject&&decimalObject.ration&&decimalObject.ration.quantity)?decimalObject.ration.quantity:3;
- let pbill = await bill_model.model.findOne({projectID:projectID,ID:billsItemID});
- let billsQuantity = pbill.quantity ? pbill.quantity : 0;
- let bill_decimal = await decimal_facade.getBillsQuantityDecimal(projectID,pbill.unit);
- billsQuantity=scMathUtil.roundForObj(billsQuantity,bill_decimal);
- ration.quantityEXP="QDL";
- ration.quantity = scMathUtil.roundForObj(billsQuantity / FilterNumberFromUnit(ration.unit),quantity_decimal);//不管是否打勾都做转换
- ration.contain = scMathUtil.roundForObj(ration.quantity/billsQuantity,6);
- };
- function FilterNumberFromUnit (unit) {
- let reg = new RegExp('^[0-9]+');
- if (reg.test(unit)) {
- return parseInt(unit.match(reg)[0]);
- } else {
- return 1;
- }
- };
|