|
在Teamcenter 2007中,系统本身提供了一个action handler为EMP-attach-item-revision-targets,这个handler的功能是将Item Revision下面所有相关的附件如DataSet,BOM View等放入到流程的目标文件夹下,以在流程中利用添加状态的action handler将Item Revision及其相关文件受控。但EMP-attach-item-revision-targets在执行时有以下问题:
9 u" o. c( I2 B# Q1 }. Z* y1 q8 Q- S# P g) ]
1 对多个Item Revision引用到的同一个DataSet无法进行过滤,只会给出错误信息"CR_in_release_process:Object XXX is already in process of beiing released",导致流程无法提交;- ^3 F1 x9 r6 g- M/ _+ D
, }3 f; |$ h: ~0 i
2 对已经受控的DataSet也没有进行过滤,也放入到目标文件夹中,产生重复;8 R6 u) x8 d7 a) H0 w2 q
, b; l3 j7 J& Z1 P [; D# z( J8 y# d现在自己做一个handler来取代系统定义的EMP-attach-item-revision-targets,要解决以上2个问题,主要需要用到emp.h里相应的EPM_add_attachments方法,思路如下:* Z9 ?* ^$ o! P
0 x. n: A, m) _* I) Y7 [1 遍历目标里所有的Item Revision,通过AOM_ask_value_tags获取到这个Item Revision下所有的数据集;
1 w: Z$ L* _+ p2 h3 _5 B& y/ K+ L% r) z( z! k
2 对数据集是否已经处于发布状态和流程状态进行判断;
6 |( y/ E8 c9 d. Q% `; S8 f5 |5 ^ k5 ^: `# J$ z
3 就是通过动态遍历所有已经准备添加至目标文件夹的数据集进行是否重复的判断,这是为了解决问题1;$ K) y! \! F; G& ?/ ?+ E+ Q6 Z
: x) j5 W: z, s/ p4 将满足所有条件的数据集对象添加至对象数组中;
" u4 h8 @0 t7 ]5 ?/ v: b. ], W0 W, V0 d% P
5 在遍历完目标文件夹中所有的Item Revision后,执行EPM_add_attachments方法,即可将所有符合条件的对象添加至目标文件夹中,以方便在后续流程中受控。
! r% R3 J! l$ G6 ]" Z$ B
8 x6 d/ _' r9 R因为在对象的属性里,目标文件夹中的对象可能有多个、Item Revision下的数据集可能有多个、是否处于工作状态和发布状态的属性也是List形式的,所以代码里不可避免地需要多层嵌套的循环,好在有了清晰的思路,循环多了也没什么。
* C9 H* @$ q" l: S' @# |1 e" D. U$ U$ ^/ p8 Y, {0 w
extern int custom_add_dataset_to_targetsfolder(EPM_action_message_t msg). {% p) P- a; v3 ~
{
$ x s0 ^9 S. t) u. J/ Kint recode=ITK_ok;6 B" T K! i, {2 n( ]$ {* }
char itemType[ITEM_type_size_c+1];
1 Z9 ^" r3 Z+ T5 l! P) l2 ]3 F7 O2 Qint i;
1 `' r( @0 S! k$ u Sint j;
% @, v6 a7 {$ }! p: T" N: p9 v, Pint k;
$ H8 u+ J0 D1 u3 O0 @int m;; _7 H- ^9 _2 A
int n;
9 p& M% t* f+ {6 [5 n7 o1 |( x2 e! pint p;5 p5 Z9 d& d" [
int q;7 I; ^, P2 D1 i6 c
1 g( b4 ^& D+ P& m: W# b8 _
tag_t job = NULLTAG;, Y' T) P5 b9 z" J
tag_t root_task = NULLTAG;
3 p/ ~, \6 l; k2 \, X. qint attachObjectCount = 0;
2 l/ }1 b6 y" g" ytag_t * attachObjectTags = NULL;# b' M C2 u% C& ?: h" l- d9 n& L
tag_t target_tag = NULLTAG;
7 W6 `. u# t4 bint length;3 x( |* n' v% H ?: `
char *test;
0 }. c5 s2 U/ w5 G4 k! W" `char *message;4 ?0 H9 P) P- F1 h- L8 {2 \
7 _; P+ q" \, e; {int status=ITK_ok;& A8 E; x# p3 I: F
int propCount;' _8 I" N) ~6 t9 B* V) e& X6 |
char **propNames;; \6 @2 F9 y9 a, f% i( w! M
7 P( V2 g5 T( G' f( [
int count;6 `) ^ r% y8 l# f' |! I. C( L* \
tag_t *tags;, r! a5 d3 q: q6 I+ i+ @2 r
4 E; ?5 N9 K: d- V7 C) p% g! a
int statusNum;
8 K: ^5 n) ^* G5 [6 `; qchar *statusName;
( N- q/ _' s$ J1 s: v# A# ktag_t *statusList=NULL;
! h! D8 n: X+ c+ `! N* t8 X1 V) a5 x) M# `( j0 V( o$ [
int objectCount=0;
+ q5 f1 ?5 x6 y- rtag_t *addObjects=NULL;
4 K$ e% [6 \; o: Uint *objectTypes=NULL;" c8 n% X8 E" R8 | N u
- g. Q# w+ @4 h, |! L7 U; _char *uId1;) i# Z7 c9 r. e2 Z# w
char *uId2; k3 c2 B3 Z9 g L9 N8 P' f$ z
; j- M: h- d' \6 N5 Q
int processStateCount;; U' Z. S, N3 n# n$ Y3 n
tag_t *processStateList=NULL;
+ i# h! u: J$ f. a
6 Q0 |5 d) D# j5 x( c) |int rcode=0;: N, @6 }) a" [! l8 W5 B* l+ D
test=(char *) MEM_alloc( 9 * sizeof (char ) );
5 }3 k( r4 s h+ {addObjects=(tag_t *) MEM_alloc( 100 * sizeof (tag_t ) );) }, e0 ^4 x8 z6 Z' S: @
objectTypes=(int *) MEM_alloc( 100 * sizeof (int ) );
0 w+ ^1 p$ Z1 v* U$ f9 S8 X6 y1 c/ Y) R( b+ q: t
EPM_ask_job( msg.task, &job);, N, w% }% }% Y: \* g0 ~# w+ b( T
EPM_ask_root_task( job, &root_task );
" q; i& B1 N @4 Y6 k
, ^! d2 R9 q; ^6 T; L! ~0 k% v//获取所有目标的附件 $ q% @: d8 z4 P
EPM_ask_attachments( root_task,EPM_target_attachment,&attachObjectCount,&attachObjectTags);
3 R4 E3 D& B% I' fif(attachObjectCount>0)
3 D$ L4 L4 U+ c+ [0 P {
9 _5 V" V9 ?8 k) f7 \. Q) | for (i=0; i< attachObjectCount; i++)
! }& [, h4 N: ?2 R4 Y2 A {
; i" d y5 `& ?( V- B7 _! c status=ITEM_ask_type(attachObjectTags[i],itemType);
5 T- S- o3 P5 l0 P
) F7 X; V: G' Y/ D if(status==ITK_ok)
2 K* v9 Q- W& B+ Q {
& u8 b: s6 q+ J( V: I, V3 w: t printf("item type is %s\n",itemType);( }9 }" @8 j, B$ e4 T3 ?$ b
}
5 z4 M6 n3 H# j5 X
* E$ U5 }+ T i status=AOM_ask_prop_names(attachObjectTags[i],&propCount,&propNames);2 m4 y! d: l9 K- ?1 m# X$ z _! \% @
if(status==ITK_ok)
, X5 [& ?" M2 Q7 X& { {: B- h- C* l2 d6 Q! N* S' j! R5 t
for(j=0;j<propCount;j++)4 m1 r: B1 c0 ?6 C" a
{
1 ], w) k& \4 B+ e; Q3 p if(strcmp(propNames[j],"item_id")==0)
5 N& g5 g3 T0 w5 k- V/ I X7 \5 \ {
$ \5 u4 j7 W7 y3 A$ t+ z9 F length=strlen(itemType);
1 _$ c- }/ G/ Q; @& h2 _ if(length>8)0 f* h% {% f0 N9 Q5 w# |. u
{' Z$ U4 S2 o5 S' U. W% K7 d: M
strncpy(test,itemType+(length-8),length);; c* w- z$ u2 o w+ J0 M
if(strcmp(test,"Revision")==0)
& W' q4 u# A- G4 k. V {
. d) S% Q. V1 w* h5 l AOM_ask_value_tags(attachObjectTags[i],"IMAN_specification",&count,&tags); //获取所有数据集3 e& C) ^; I) R' q4 H5 w
printf("count 1 is[%d]\n",count);4 ]0 W. {+ s8 g! F! _
if(count>0)1 H/ F3 D1 x+ X; {
{+ |" i S' Q9 B% o+ ]
for(k=0;k<count;k++)6 j' w3 b8 b8 m* P
{% d6 m E0 m3 h. \6 r; Y; F
AOM_ask_value_tags(tags[k],"release_status_list",&statusNum,&statusList);3 P/ M* S, b9 q
if(statusNum==0)" | d8 S$ T! \2 j) i. p9 o8 h
{
* n6 t% d+ ~8 ~7 _1 \ AOM_ask_value_tags(tags[k],"process_stage_list",&processStateCount,&processStateList);
( z8 t. Q8 L( H6 R% T if(processStateCount==0)
& m& l- q8 X0 Y3 ]" b {7 \% Q+ L9 g" s
ITK__convert_tag_to_uid(tags[k],&uId1);) `3 B# G9 \) `# C/ j
q=0;
- S& z$ y/ k# c6 O9 [+ J' H& n& }6 r for(p=0;p<objectCount;p++): j X$ i8 ~; W
{
- {2 c+ _ a! q9 m4 ? ITK__convert_tag_to_uid(addObjects[p],&uId2);* _* P9 Q; e$ D7 U' V
if(strcmp(uId1,uId2)==0)3 [* a% D/ R1 s9 t* ?
{" D* y2 s/ q1 }2 s
q+=1;
3 z4 D" t a: w/ W4 J) n: Y }
5 L5 D0 `0 K: f/ d }: z) d6 K2 k' G5 t. c. U5 y
if(q==0)
) v. f0 z* `4 Z( n) S' \ {+ R8 T; Y# G- n% z! P6 ]! t+ S
addObjects[objectCount]=tags[k];
0 A& r0 M) m/ Y Q2 a2 M objectTypes[objectCount]=EPM_target_attachment;2 X. E: x2 q+ J3 ]4 ?7 T8 h
objectCount+=1;" r0 T; u" B% v, T, T- @" B: n# v4 O
}. y7 k u7 @' u9 i. a0 [
}7 Q, u5 |' x7 h' A D: e
}- }% R1 {' t/ j8 ~" f. \2 z
else
: P! V) ~# n6 j) z {
( L" v5 d1 c+ c9 Z n=0;
9 s6 Q) n Z: {; P/ t( [ for(m=0;m<statusNum;m++)6 N, {! {. k* v6 \" c
{4 J8 \, Q) R. q+ l- K
AOM_ask_value_string(statusList[m],"name",&statusName);; M$ |' C; S7 I
if(strcmp(statusName,"Released")==0)
Y F3 m% d9 O5 B9 B* W* ? {
& y$ _) |# e8 Y9 G+ v n+=1;" D) h! e1 h: L# \0 W% m$ V2 ?
}: c$ ^7 f- R6 T3 b
}& \6 X r1 J% ~0 R* _" j( d F( J
if(n==0). @4 `" l! `* j- _5 C
{
5 N- I- c6 u, C, }; d2 _2 g AOM_ask_value_tags(tags[k],"process_stage_list",&processStateCount,&processStateList);
- z. p! b3 q8 i3 U5 [+ _+ B if(processStateCount==0)
: I# X" f0 I3 x1 n# s$ m7 r5 ` {; L! Z4 Y1 ?9 V2 `% h/ {: y$ ]
ITK__convert_tag_to_uid(tags[k],&uId1);
- f5 S/ [8 |* g3 a q=0;
- j2 t0 i b2 q8 I+ A for(p=0;p<objectCount;p++)
X5 Y! ~* p* t3 f {' t6 B9 u& a8 f2 X D0 C
ITK__convert_tag_to_uid(addObjects[p],&uId2);
6 l9 A: i8 h# K, } if(strcmp(uId1,uId2)==0)9 O y! @- Q k6 l u- E7 w2 E* b. \- e
{
! m. O) X1 \9 p/ B; y q+=1;+ }/ Q! B1 I: J8 \$ d2 l
}
- h1 ^/ a. L8 T3 {5 E5 P }
" |) X+ O" n4 Q! u8 G7 K% k if(q==0)
) a, | R0 \! p; S: g8 E+ | {
G; F g4 k2 T, _+ m6 ~ addObjects[objectCount]=tags[k];0 G+ |7 ~& a) _8 y
objectTypes[objectCount]=EPM_target_attachment;
- _, e9 }" F0 y9 R6 I objectCount+=1;
1 E& T& a3 Z/ a/ Y! A+ K }! x4 |6 \0 x+ k, F% f8 T; _, n2 }; m
}
) N& D8 g2 Q6 J y3 l* R }# C) V, M( I/ n; }, y- e/ P4 K
}
& B9 }$ U; ~ K8 f9 G4 ] M! L }
- i# W3 K+ R! u2 d" n- I; l }. \0 d2 W- y. @& n9 o
* B$ N$ l0 ?; v/ x. v9 w }
- R) y1 m) e4 ^) S1 K1 I8 k }# K( b( H" g' y3 x5 s4 E
}1 O) O2 V) E% B5 \7 r& d
}; {1 z3 i1 m# X$ W" Z7 W1 j7 k
}
' B8 V; k' G% m! I& l7 G } ! i' z, W) p% ?
4 q H1 a4 } m% w1 r2 |& b printf("No status DataSet-[%d]\n",objectCount);
' G! d* ~; y0 Z0 h) W$ y if(objectCount>0)
% b/ t7 R' d9 {5 W! m+ L2 b { & Q V/ W1 f6 n# q4 }
status=EPM_add_attachments(root_task,objectCount,addObjects,objectTypes);
- O& v% m3 D% v8 B: _+ o if(status==ITK_ok)5 m, D# |% w& H5 K, _: @
{; a* \$ u% \: M& b, L; V
printf("成功添加数据集[%d]个!\n",objectCount);7 c% x" T+ h$ _7 t$ k8 T
}6 k6 q! _( t9 L3 ?/ R6 ^& x& S
else
9 e" ]' Q K& y6 ^5 ~ {
+ x# o v! Q& \/ g& _% h EMH_ask_error_text(status, &message);& m9 [7 [! l; }/ F
printf("Add error is [%s]\n", message);$ B+ v/ I/ j8 f0 A" ]
}
9 i5 K a% c4 Z5 F } 1 K, x4 k7 o& e$ [( G
}
# O% {/ o) E6 M' s. _
; C4 _! r! d4 M) Sif(propNames!=NULL)
& O y; b& O) D# q1 d9 a4 T7 _ {
7 I, a8 A1 R# K# j MEM_free(propNames);. u5 U0 m, U* `9 M5 d& g2 ~
}
* b) e4 r! i4 b6 jif(attachObjectTags!=NULL)
4 Y$ I4 X! S0 k9 u, c+ _6 K {
4 _. \5 E1 W8 o& d MEM_free(attachObjectTags);! t0 f5 r3 T. }$ j: h
}
4 @# y7 M! E" p# Kif(tags!=NULL)+ q/ H5 o, I; @. J* R
{% T) ^# H. [; y/ \4 K
MEM_free(tags);9 J: b: r: Y- ]6 `
} ' t/ s+ j1 }$ u, Y F3 V, p
if(addObjects!=NULL): E$ _6 `, ?3 H& g% w: _
{& ?; }! Z$ k- Z- d
MEM_free(addObjects);% M J" W% H' q! v; ~3 o* M+ i
} V \8 Y- }1 f6 }# `
if(objectTypes!=NULL)
" B6 z' Q8 @' Z+ q5 g4 Y {
" o [, x0 |4 e2 S$ H MEM_free(objectTypes);/ `6 y; s2 p( L! f! O& S
} % W: }9 W- A' J g: X+ a, D
if(processStateList!=NULL)
) q( F* I; ~$ Y {. z/ g. k* D! v. S) b
MEM_free(processStateList);( M1 w% ^. P+ s5 y# E1 |/ S
}
) m/ t) o" S% N$ o% w* _ 4 M& o1 d2 a$ Z. I
return recode;
5 x: ~9 z/ R8 B9 B0 `} |
|