Генерация проектных спецификаций

Генерация проектных спецификаций#

Создает или связывает проектные спецификации на основе рабочих спецификаций, проекта и версии проекта. Используется для массового восстановления проектных документов по данным MCT.

Место применения: Сервис > Инструменты > Выполнить JEXL-скрипт

Внимание

Скрипт привязан к объектам конкретного модуля и требует проверки на целевой базе. Перед запуском проверьте идентификаторы, SQL-запросы, API-классы и условия обработки.

Тип: JEXL-скрипт

var nvCount = sql(`
	select count(*) as "nCount" 
	from (
		select s.sdesignation
		from mct_specification s 
		join bs_prj p on s.idprj = p.id 
		join bs_prjVer pv on s.idprjver = pv.id 
		join btk_objectType ot on s.idobjecttype = ot.id 
		join mct_objecttype mot on mot.idbtkobjecttype = ot.id 
		join mct_specificationver sv on sv.idmctdocument = s.id and sv.bislast = 1 
		left join mct_specification sp on sp.scode = s.sdesignation and sp.idPrj = s.idPrj 
		left join mct_objectType motsp on motsp.idbtkobjecttype = sp.idobjecttype 
		left join mct_objectType motp on s.idobjecttype = motp.idwrkdoc 
		left join mct_specification sop on sop.scode = s.sdesignation and sop.idPrj != s.idPrj 
		left join mct_document d on d.scode = s.sdesignation and getgidclass(d.gidref) != cast(44751 as bigint)
		where coalesce(p.bnotactive, 0) = 0
			and coalesce(pv.bnotactive, 0) = 0
			and pv.scode != 'ОЗР'
			and pv.scode != '00000'
			and coalesce(mot.bisprjdoc, 0) = 0 
			and ot.scode != 'UnitProduct'
			and s.gidprjdoc is null 
			and sv.idstatemc < 400
			and s.scode != s.sdesignation 
			and s.sdesignation != ''
			and (motsp.id is null or motsp.bisprjdoc = 1)
			and sop.id is null 
			and d.gidref is null 
		group by 
			s.sdesignation
			,sp.id
			,s.idPrj
			,s.idDepOwner
	) t 
	`).asSingle().nCount;
var nvIter = nvCount / 100 + 1;
for (i : (1 .. nvIter)){
	var select = sql(`
		select 
			s.sdesignation as "sDesignation"
			,sp.id as "idPrjSpec"
			,max(motp.idbtkobjecttype) as "idPrjObjectType"
			,array_agg(s.id) as "idaWrkDoc"
			,s.idPrj as "idPrj"
			,s.idDepOwner as "idDepOwner"
			,max(s.scaption) as "sCaption"
		from mct_specification s 
		join bs_prj p on s.idprj = p.id 
		join bs_prjVer pv on s.idprjver = pv.id 
		join btk_objectType ot on s.idobjecttype = ot.id 
		join mct_objecttype mot on mot.idbtkobjecttype = ot.id 
		join mct_specificationver sv on sv.idmctdocument = s.id and sv.bislast = 1 
		left join mct_specification sp on sp.scode = s.sdesignation and sp.idPrj = s.idPrj 
		left join mct_objectType motsp on motsp.idbtkobjecttype = sp.idobjecttype 
		left join mct_objectType motp on s.idobjecttype = motp.idwrkdoc 
		left join mct_specification sop on sop.scode = s.sdesignation and sop.idPrj != s.idPrj 
		left join mct_document d on d.scode = s.sdesignation and getgidclass(d.gidref) != cast(44751 as bigint)
		where coalesce(p.bnotactive, 0) = 0
		and coalesce(pv.bnotactive, 0) = 0
		and pv.scode != 'ОЗР'
		and pv.scode != '00000'
		and coalesce(mot.bisprjdoc, 0) = 0 
		and ot.scode != 'UnitProduct'
		and s.gidprjdoc is null 
		and sv.idstatemc < 400
		and s.scode != s.sdesignation 
		and s.sdesignation != ''
		and (motsp.id is null or motsp.bisprjdoc = 1)
		and sop.id is null 
		and d.gidref is null 
		group by 
			s.sdesignation
			,sp.id
			,s.idPrj
			,s.idDepOwner
		order by s.sdesignation
		limit 100
		`);
	select.foreach(function(r){
		var idvPrjSpec;
		if(r.idPrjSpec == null){
			var t = Mct_DocPkg.createSpecification(r.idPrjObjectType, r.idPrj, r.idDepOwner, null, null, null, null, null);
			var rop = Mct_SpecificationApi.load(t);
			Mct_SpecificationApi.setsCode(rop, r.sDesignation);
			Mct_SpecificationApi.setsCaption(rop, r.sCaption);
			idvPrjSpec = t;
		} else {
			idvPrjSpec = r.idPrjSpec
		};
		var ropPrjSpec = Mct_SpecificationApi.load(idvPrjSpec);
		var gidvPrjLastVer = Mct_DocumentApi.getGidLastVersionByDoc(ropPrjSpec.gid(), null, false, false);
		var ropList = sql(`
			select 
				s.id  
			from mct_specification s 
			join bs_prj p on s.idprj = p.id 
			join bs_prjVer pv on s.idprjver = pv.id 
			join btk_objectType ot on s.idobjecttype = ot.id 
			join mct_objecttype mot on mot.idbtkobjecttype = ot.id 
			join mct_specificationver sv on sv.idmctdocument = s.id and sv.bislast = 1 
			where sdesignation = '`+r.sDesignation+`'
			and idPrj =`+r.idPrj+`
			and coalesce(p.bnotactive, 0) = 0
			and coalesce(pv.bnotactive, 0) = 0
			and pv.scode != 'ОЗР'
			and pv.scode != '00000'
			and coalesce(mot.bisprjdoc, 0) = 0 
			and ot.scode != 'UnitProduct'
			and s.gidprjdoc is null 
			and sv.idstatemc < 400
			and s.scode != s.sdesignation 
		`).batchObjLoad(Mct_SpecificationApi, "id");
		for (ropCurWorkSpec : ropList){
			var gidvWorkSpecVer = Mct_DocumentApi.getGidLastVersionByDoc(ropCurWorkSpec.gid(), null, false, false);
			Mct_SpecificationApi.setgidPrjDoc(ropCurWorkSpec, ropPrjSpec.gid());
			//Создадим записи в связанных документах проектной СП
			Mct_LinkApi.registerByVer(ropPrjSpec.gid(),gidvWorkSpecVer, null, null);
			//Создадим записи в связанных документах рабочей СП
			Mct_LinkApi.registerByVer(ropCurWorkSpec.gid(),gidvPrjLastVer, null, null);
		};
	});
	commit();
}