meansviewCtrl.js 121 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370
  1. app.controller('meansViewCtrl', ["$rootScope","$scope", "$state","$stateParams", "$timeout","$modal",'$parse', '$injector',"$interval", "$aside", "SweetAlert", "toaster", "Restangular", "api_bpm_domain", "api_configure_data", "api_cmdb", "api_configure_form", function ($rootScope, $scope, $state,$stateParams, $timeout,$modal,$parse, $injector,$interval, $aside, SweetAlert, toaster, Restangular, api_bpm_domain, api_configure_data, api_cmdb, api_configure_form) {
  2. var vm = this;
  3. vm.options = {};
  4. vm.exampleTitle = ['expressionProperties','model property'];
  5. vm.fields=[];
  6. vm.model={};
  7. vm.model["loginUser"] = $rootScope.user;
  8. var that=$injector;
  9. var parse=$parse;
  10. var formKey = "";
  11. var pdKey = "";
  12. if(angular.isDefined($state.current.pdKey)&&$state.current.pdKey!=""){
  13. pdKey = $state.current.pdKey;
  14. //console.log("pdKey::"+$state.current.pdKey);
  15. }
  16. if(angular.isDefined($stateParams.formKey)&&$stateParams.formKey!=""){
  17. formKey = $stateParams.formKey;
  18. //console.log("formKey::"+$stateParams.formKey);
  19. }
  20. //用户测试数据,后续从header的auth中获取
  21. var userId = 2;
  22. userId = $rootScope.user.id;
  23. //==============处理表单设计数据 开始====================
  24. //处理组件加载后台数据选项的方法
  25. function refreshSelectOptions(searchVal, field) {
  26. if(field.templateOptions.optionsUrl){
  27. var process = BpmRestangular.all("");
  28. if(field.templateOptions.ApiService){
  29. process = UserRestangular.all("");
  30. }
  31. process.customPOST({"idx":0,"sum":1000},field.templateOptions.optionsUrl).then(function(result){
  32. if(!field.templateOptions.options){
  33. field.templateOptions.options=[];
  34. }
  35. if(field.templateOptions.optionsDataKey){
  36. field.templateOptions.options =result[field.templateOptions.optionsDataKey];
  37. }else{
  38. field.templateOptions.options =result;
  39. }
  40. });
  41. }
  42. }
  43. // $scope.relationdata=[];
  44. // $scope.addData = function(model){
  45. // var modalInstance = $modal.open({
  46. // templateUrl: 'assets/views/means/tpl/relaform.html',
  47. // controller: function($scope, $modalInstance, APIService,Alert){
  48. // $scope.cancel = function() {
  49. // $modalInstance.dismiss('cancel');
  50. // };
  51. // $scope.savercode = function(reladata){
  52. // $modalInstance.close(reladata);
  53. // }
  54. // },
  55. // resolve: {
  56. // APIService: function(){
  57. // return api_configure_data;
  58. // },
  59. // Alert: function(){
  60. // return SweetAlert;
  61. // }
  62. // }
  63. // });
  64. // modalInstance.result.then(function(selectedItem) {
  65. // $scope.relationdata.push(selectedItem);
  66. // var fildata={'label':selectedItem.label,'fieldType':2,'cIEdgeType':{'id':model.id}}
  67. // api_configure_data.addData('ciEdgetypeAttribute',fildata).then(function(data){
  68. // if(data.status==200){
  69. // }else{
  70. // }
  71. // })
  72. // });
  73. // }
  74. $scope.vm = vm;
  75. $scope.refreshforms = function(id,fieldata){
  76. api_configure_data.fetchDataById('cIEdgeType',id).then(function(data){
  77. if(data.status==200){
  78. var myData=[];
  79. var formdataone={fields:[]};
  80. var formdatatwo={fields:[]};
  81. for(var i=0;i<data.fields.length;i++){
  82. if(data.fields[i].templateOptions.fieldType&&data.fields[i].templateOptions.fieldType==1){
  83. formdataone.fields.push(data.fields[i])
  84. // myData[0].push(formdata[])
  85. }else if(data.fields[i].templateOptions.fieldType&&data.fields[i].templateOptions.fieldType==2){
  86. // myData[1].form.push(data[i]);
  87. formdatatwo.fields.push(data.fields[i])
  88. }
  89. }
  90. myData[0]={'form':formdataone};
  91. myData[1]={'form':formdatatwo};
  92. // myData[0]={'form':Restangular.stripRestangular(data)};
  93. $scope.templateProps = myData;
  94. $scope.vm.tabs = myData;
  95. vm.model = {};
  96. angular.extend(vm.model,fieldata);
  97. $scope.vm.tabs[0].form.model={};
  98. // $scope.vm.tabs[0].form.model=vm.model;
  99. // angular.forEach($scope.vm.tabs, function(tab){
  100. angular.forEach($scope.vm.tabs[0].form.fields, function(item){
  101. $scope.vm.tabs[0].form.model[item.key]=vm.model[item.key];
  102. });
  103. var rel=[];
  104. console.log($scope.vm.tabs[0].form.model)
  105. for(var i=0;i<$scope.vm.tabs[1].form.fields.length;i++){
  106. // if(angular.isDefined(vm.model[$scope.vm.tabs[1].form.fields[i].key])){
  107. rel[i]={'label':$scope.vm.tabs[1].form.fields[i].templateOptions.label,
  108. 'name':vm.model[$scope.vm.tabs[1].form.fields[i].key],
  109. 'key':$scope.vm.tabs[1].form.fields[i].key
  110. };
  111. }
  112. angular.forEach(rel,function(item){
  113. if(angular.isUndefined(item.name)||item.name==null){
  114. }else{
  115. $scope.relationdata.push(item)
  116. }
  117. })
  118. // for(var i=0;i<$scope.relationdata.length;i++){
  119. // if(angular.isUndefined($scope.relationdata[i].name)||$scope.relationdata[i].name==null){
  120. // $scope.relationdata.splice(i, 1);
  121. // }
  122. // }
  123. console.log($scope.relationdata)
  124. // var reladatas={label:$scope.vm.tabs[1].form.fields}
  125. // $scope.relationdata.push()
  126. // vm.model["loginUser"]= $rootScope.user.name;
  127. vm.model=$scope.vm.model=decodeCIModel($scope.vm.tabs[0].form.model);
  128. decodeVMTabForm(vm.model, vm.tabs);
  129. }else{
  130. SweetAlert.swal({
  131. title: "系统错误",
  132. text: "系统错误,请稍后重试!",
  133. type: "error",
  134. confirmButtonColor: "#DD6B55"
  135. });
  136. };
  137. });
  138. }
  139. function decodeVMTabForm(model, tabs){
  140. var result = {model:{},tabs:[]};
  141. var mdata = angular.fromJson(model);
  142. angular.extend(result.model,mdata);
  143. angular.forEach(tabs, function(tab){
  144. tab.form.model = vm.model;
  145. angular.forEach(tab.form.fields,function(field){
  146. if(field.key==""){
  147. delete field.key;
  148. }
  149. if(angular.isDefined(field.extjson)&&field.extjson!=""){
  150. var extObj = angular.fromJson(field.extjson);
  151. angular.extend(field.templateOptions, extObj.templateOptions);
  152. delete extObj.templateOptions;
  153. for(var prop in extObj){
  154. if(new RegExp("Expression").test(prop)){
  155. //var obj = $scope.$eval(extObj[prop]);
  156. //extObj[prop] = $scope.$eval(extObj[prop]);
  157. if(extObj[prop]!=null){
  158. if(new RegExp("function").test(extObj[prop])){
  159. var propValue = eval(extObj[prop]);
  160. extObj[prop] = propValue;
  161. }else{
  162. //console.log(extObj[prop]);
  163. var obj = $scope.$eval(extObj[prop]);
  164. extObj[prop] = obj;
  165. //console.log(obj);
  166. }
  167. }
  168. }else if(new RegExp("expressionProperties").test(prop)){
  169. for(var p in extObj[prop]){
  170. if(new RegExp("function").test(extObj[prop][p])){
  171. var propValue = eval(extObj[prop][p]);
  172. extObj[prop][p] = propValue;
  173. }else{
  174. //if(p.indexOf("'")>=0){
  175. // var obj = $scope.$eval(extObj[prop][p]);
  176. // extObj[prop][$scope.$eval(p)]=obj;
  177. //}
  178. }
  179. }
  180. }else if("watcher"==prop){
  181. if(angular.isArray(extObj[prop])){
  182. angular.forEach(extObj[prop],function(item,index){
  183. for(var p in item){
  184. if(new RegExp("function").test(item[p])){
  185. var propValue = eval(item[p]);
  186. extObj[prop][index][p] = propValue;
  187. }
  188. }
  189. });
  190. }else if(angular.isObject(extObj[prop])){
  191. for(var p in extObj[prop]){
  192. if(new RegExp("function").test(extObj[prop][p])){
  193. var propValue = eval(extObj[prop][p]);
  194. extObj[prop][p] = propValue;
  195. }
  196. }
  197. }
  198. }
  199. }
  200. angular.extend(field,extObj);
  201. delete field.extjson;
  202. }
  203. if(field.extjson==""){
  204. delete field.extjson;
  205. }
  206. if(angular.isDefined(field.templateOptions)){
  207. var templateOs = field.templateOptions;
  208. for(var property in templateOs){
  209. //console.log(property);
  210. if(angular.isString(templateOs[property])&& !(new RegExp("[\u4e00-\u9fa5]").test(templateOs[property]))){
  211. if(new RegExp("function").test(templateOs[property])){
  212. var propValue = eval(templateOs[property]);
  213. field.templateOptions[property] = propValue;
  214. }else{
  215. if(that.has(templateOs[property])){
  216. field.templateOptions[property] = that.get(templateOs[property]);
  217. }else{
  218. field.templateOptions[property] = templateOs[property];
  219. }
  220. }
  221. }else if(templateOs[property]==null){
  222. //delete field.templateOptions[property];
  223. }else{
  224. }
  225. }
  226. }
  227. if(angular.isDefined(field.templateOptions) && angular.isDefined(field.templateOptions.extjson)){
  228. var extObj = angular.fromJson(field.templateOptions.extjson);//JSON.parse(field.extjson);
  229. angular.extend(field.templateOptions,extObj);
  230. delete field.templateOptions.extjson;
  231. }
  232. //...
  233. if(field.templateOptions){
  234. //处理远程获取数据控件方法调用
  235. if(field.templateOptions.optionsUrl){
  236. field.templateOptions.refresh = refreshSelectOptions;
  237. }
  238. //处理嵌套属性数据绑定/
  239. if(field.templateOptions.pkey){
  240. var pmodel,i= 0;
  241. angular.forEach(field.templateOptions.pkey.split("."),function(p){
  242. if(i==0){
  243. if(result.model[p]==null){
  244. result.model[p] = {};
  245. }
  246. pmodel = result.model[p];
  247. i++;
  248. }else{
  249. if(pmodel[p]==null){
  250. pmodel[p] = {};
  251. }
  252. pmodel = pmodel[p];
  253. }
  254. });
  255. if(pmodel!=null){
  256. field.model = pmodel;
  257. if(pmodel[field.key]==null){
  258. pmodel[field.key] = null;
  259. }
  260. }
  261. }else{
  262. if(result.model[field.key]==null){
  263. result.model[field.key] = null;
  264. }
  265. }
  266. //处理弹出框组件初始化
  267. if(field.type=="ui-input-selectmodal"){
  268. field.templateOptions.modal = $modal;
  269. //field.templateOptions.Restangular = Restangular;
  270. }else if(field.type=="ui-userselect"){
  271. field.templateOptions.modal = $modal;
  272. //field.templateOptions.Restangular = Restangular;
  273. }else if(field.type=="ui-multiuserselect"){
  274. field.templateOptions.modal = $modal;
  275. }else if(field.type=="ui-modelselect"){
  276. field.templateOptions.modal = $modal;
  277. //field.templateOptions.Restangular = Restangular;
  278. }else if(field.type=="ui-dropfile"){
  279. field.templateOptions.fileUploader = new FileUploader({
  280. url:'/uploader'
  281. });
  282. field.templateOptions.taskId = $stateParams.taskId;
  283. field.templateOptions.processInstanceId = $stateParams.processInstanceId;
  284. field.templateOptions.userId = $rootScope.user.id;
  285. //field.ApiService=api_bpm_domain;
  286. }else if(field.type=="ui-dropfiletable"){
  287. if(field.templateOptions.processInstanceId){
  288. }else{
  289. field.templateOptions.processInstanceId = $stateParams.processInstanceId;
  290. }
  291. }else if(field.type=="ui-repeatSection"){
  292. var repeatForm = {
  293. model:{
  294. },
  295. fields:field.templateOptions.fields
  296. };
  297. repeatForm.model[field.key]=[];
  298. decodeVMTabForm(repeatForm);
  299. }
  300. }
  301. // console.log(field);
  302. //field
  303. //result.fields.push(field);
  304. })
  305. });
  306. vm.originalTabs = angular.copy(vm.form);
  307. }
  308. //解析自定义表单设计数据
  309. function decodeVMForm(vmForm){
  310. var result = {model:{},tabs:[]};
  311. //设置模型实体数据 begin
  312. // var mdata = vmForm.model;
  313. //解析数据实体
  314. var mdata = angular.fromJson(vmForm.model);//JSON.parse(field.extjson);
  315. angular.extend(result.model,mdata);
  316. //设置模型实体数据 end
  317. //解析设计数据生成表单项 begin
  318. var fields = [];
  319. //处理修改设计数据中展示设置
  320. angular.forEach(vmForm.tabs, function(field){
  321. if(field.key==""){
  322. delete field.key;
  323. }
  324. if(angular.isDefined(field.extjson)){
  325. var extObj = angular.fromJson(field.extjson);//JSON.parse(field.extjson);
  326. angular.extend(field.templateOptions, extObj.templateOptions);
  327. delete extObj.templateOptions;
  328. for(var prop in extObj){
  329. if(new RegExp("Expression").test(prop)){
  330. //var obj = $scope.$eval(extObj[prop]);
  331. //extObj[prop] = $scope.$eval(extObj[prop]);
  332. if(extObj[prop]!=null){
  333. if(new RegExp("function").test(extObj[prop])){
  334. var propValue = eval(extObj[prop]);
  335. extObj[prop] = propValue;
  336. }else{
  337. //console.log(extObj[prop]);
  338. var obj = $scope.$eval(extObj[prop]);
  339. extObj[prop] = obj;
  340. //console.log(obj);
  341. }
  342. }
  343. }else if(new RegExp("expressionProperties").test(prop)){
  344. for(var p in extObj[prop]){
  345. if(new RegExp("function").test(extObj[prop][p])){
  346. var propValue = eval(extObj[prop][p]);
  347. extObj[prop][p] = propValue;
  348. }else{
  349. //if(p.indexOf("'")>=0){
  350. // var obj = $scope.$eval(extObj[prop][p]);
  351. // extObj[prop][$scope.$eval(p)]=obj;
  352. //}
  353. }
  354. }
  355. }else if("watcher"==prop){
  356. if(angular.isArray(extObj[prop])){
  357. angular.forEach(extObj[prop],function(item,index){
  358. for(var p in item){
  359. if(new RegExp("function").test(item[p])){
  360. var propValue = eval(item[p]);
  361. extObj[prop][index][p] = propValue;
  362. }
  363. }
  364. });
  365. }else if(angular.isObject(extObj[prop])){
  366. for(var p in extObj[prop]){
  367. if(new RegExp("function").test(extObj[prop][p])){
  368. var propValue = eval(extObj[prop][p]);
  369. extObj[prop][p] = propValue;
  370. }
  371. }
  372. }
  373. }
  374. }
  375. angular.extend(field,extObj);
  376. delete field.extjson;
  377. }
  378. if(angular.isDefined(field.templateOptions)){
  379. var templateOs = field.templateOptions;
  380. for(var property in templateOs){
  381. //console.log(property);
  382. if(angular.isString(templateOs[property])&& !(new RegExp("[\u4e00-\u9fa5]").test(templateOs[property]))){
  383. if(new RegExp("function").test(templateOs[property])){
  384. var propValue = eval(templateOs[property]);
  385. field.templateOptions[property] = propValue;
  386. }else{
  387. if(that.has(templateOs[property])){
  388. field.templateOptions[property] = that.get(templateOs[property]);
  389. }else{
  390. field.templateOptions[property] = templateOs[property];
  391. }
  392. }
  393. }else if(templateOs[property]==null){
  394. //delete field.templateOptions[property];
  395. }else{
  396. }
  397. }
  398. }
  399. console.log(field);
  400. if(angular.isDefined(field.templateOptions) && angular.isDefined(field.templateOptions.extjson)){
  401. var extObj = angular.fromJson(field.templateOptions.extjson);//JSON.parse(field.extjson);
  402. angular.extend(field.templateOptions,extObj);
  403. delete field.templateOptions.extjson;
  404. }
  405. //...
  406. if(field.templateOptions){
  407. //处理远程获取数据控件方法调用
  408. if(field.templateOptions.optionsUrl){
  409. field.templateOptions.refresh = refreshSelectOptions;
  410. }
  411. //处理嵌套属性数据绑定/
  412. if(field.templateOptions.pkey){
  413. var pmodel,i= 0;
  414. angular.forEach(field.templateOptions.pkey.split("."),function(p){
  415. if(i==0){
  416. if(result.model[p]==null){
  417. result.model[p] = {};
  418. }
  419. pmodel = result.model[p];
  420. i++;
  421. }else{
  422. if(pmodel[p]==null){
  423. pmodel[p] = {};
  424. }
  425. pmodel = pmodel[p];
  426. }
  427. });
  428. if(pmodel!=null){
  429. field.model = pmodel;
  430. if(pmodel[field.key]==null){
  431. pmodel[field.key] = null;
  432. }
  433. }
  434. }else{
  435. if(result.model[field.key]==null){
  436. result.model[field.key] = null;
  437. }
  438. }
  439. //处理弹出框组件初始化
  440. if(field.type=="ui-input-selectmodal"){
  441. field.templateOptions.modal = $modal;
  442. //field.templateOptions.Restangular = Restangular;
  443. }else if(field.type=="ui-userselect"){
  444. field.templateOptions.modal = $modal;
  445. //field.templateOptions.Restangular = Restangular;
  446. }else if(field.type=="ui-multiuserselect"){
  447. field.templateOptions.modal = $modal;
  448. }else if(field.type=="ui-modelselect"){
  449. field.templateOptions.modal = $modal;
  450. //field.templateOptions.Restangular = Restangular;
  451. }else if(field.type=="ui-dropfile"){
  452. field.templateOptions.fileUploader = new FileUploader({
  453. url:'/uploader'
  454. });
  455. field.templateOptions.taskId = $stateParams.taskId;
  456. field.templateOptions.processInstanceId = $stateParams.processInstanceId;
  457. field.templateOptions.userId = $rootScope.user.id;
  458. //field.ApiService=api_bpm_domain;
  459. }else if(field.type=="ui-dropfiletable"){
  460. if(field.templateOptions.processInstanceId){
  461. }else{
  462. field.templateOptions.processInstanceId = $stateParams.processInstanceId;
  463. }
  464. }else if(field.type=="ui-repeatSection"){
  465. var repeatForm = {
  466. model:{
  467. },
  468. fields:field.templateOptions.fields
  469. };
  470. repeatForm.model[field.key]=[];
  471. decodeVMForm(repeatForm);
  472. }
  473. }
  474. // console.log(field);
  475. result.fields.push(field);
  476. });
  477. angular.extend($scope.vm.fields,result.fields);
  478. angular.extend($scope.vm.model,result.model);
  479. $scope.formData = vmForm;
  480. //console.log($scope.vm);
  481. //解析设计数据生成表单项 end
  482. return result;
  483. }
  484. //======================处理表单设计数据 结束========================
  485. $scope.ldloading = {};
  486. function filter(obj) {
  487. angular.forEach(obj, function(key, value){
  488. if (value === "" || value === null){
  489. delete obj[key];
  490. } else if (Object.prototype.toString.call(value) === '[object Object]') {
  491. filter(value);
  492. } else if (angular.isArray(value)) {
  493. angular.forEach(value,function(item){
  494. filter(item);
  495. });
  496. }
  497. });
  498. }
  499. function invokeOnAllFormOptions(fn) {
  500. angular.forEach(vm.tabs, function(tab) {
  501. if (tab.form.options && tab.form.options[fn]) {
  502. tab.form.options[fn]();
  503. }
  504. });
  505. }
  506. function encodeCIData(data,ciId){
  507. /*
  508. create/update state:未审核
  509. create createtime:系统时间
  510. create/update lastupdatetime : 系统时间
  511. label:ci分类
  512. */
  513. if(ciId){
  514. var baseprop = ['uuid','name','type','label','status','createtime','lastupdatetime','props'];//state|audittime//createtime//removeflag|removetime//configperson//lastupdateperson//manager//useradmin
  515. var extraprop = 'props';
  516. data[extraprop] = {};
  517. for(var key in data){
  518. console.log(data[key]);
  519. if(_.indexOf(baseprop, key)>=0){
  520. continue;
  521. }else{
  522. data[extraprop][key] = data[key];
  523. delete data[key];
  524. }
  525. }
  526. if($rootScope.user){
  527. data[extraprop]['lastupdateperson']=$rootScope.user.name;
  528. data[extraprop]['configperson']=$rootScope.user.name;
  529. // var isCMAdminFlag = false;
  530. angular.forEach($rootScope.user.role,function(roleItem){
  531. if(roleItem.rolecode == "cmdb charge"){
  532. // isCMAdminFlag = true;
  533. }
  534. })
  535. // if(!isCMAdminFlag){
  536. // data[extraprop]['state']='1';
  537. // }
  538. }
  539. data.label=ciId;
  540. return data;
  541. }
  542. return undefined;
  543. }
  544. function decodeCIModel(data){
  545. var extraprop = 'props';
  546. if(data[extraprop]){
  547. for(var key in data[extraprop]){
  548. data[key] = data[extraprop][key];
  549. }
  550. delete data[extraprop];
  551. }
  552. // data['iscmadmin']=false;
  553. angular.forEach($rootScope.user.role,function(roleItem){
  554. if(roleItem.rolecode == "cmdb charge"){
  555. // data['iscmadmin'] = true;
  556. }
  557. })
  558. return data;
  559. }
  560. vm.remove = function(data, style){
  561. $scope.ldloading[style.replace('-', '_')] = true;
  562. var cidata = {
  563. label:data.label,
  564. id:$scope.ciId,
  565. uuid:data.uuid,
  566. name:data.name,
  567. props:{}
  568. };
  569. if($scope.ciId){
  570. cidata.props['removeflag']=true;
  571. //cidata.props['removetime']=new Date();
  572. api_cmdb.put(cidata,$scope.ciId).then(function(response){
  573. if(response){
  574. var resData = Restangular.stripRestangular(response);
  575. SweetAlert.swal({
  576. title: "保存成功!",
  577. confirmButtonColor: "#007AFF"
  578. },function(){
  579. refreshData($scope.classify);
  580. reinitTabForm($scope.classify);
  581. });
  582. }else{
  583. SweetAlert.swal({
  584. title: "系统错误",
  585. text: "系统错误,请稍后重试!",
  586. type: "error",
  587. confirmButtonColor: "#DD6B55"
  588. });
  589. }
  590. $scope.ldloading[style.replace('-', '_')] = false;
  591. });
  592. }else{
  593. $timeout(function () {
  594. $scope.ldloading[style.replace('-', '_')] = false;
  595. }, 2000);
  596. }
  597. }
  598. function formValid(){
  599. angular.forEach(vm.tabs,function(item){
  600. //item.
  601. })
  602. }
  603. $scope.closeModel = function(){
  604. if(angular.isDefined($stateParams.formKey)&&$stateParams.formKey!=""){
  605. if($stateParams.formKey=="means_editor"||$stateParams.formKey=="means_edit") {
  606. $state.go('app.means.list',{});
  607. }
  608. event.preventDefault();
  609. }
  610. }
  611. // vm.submit = function(data,ciId,style){
  612. // // $scope.ldloading[style.replace('-', '_')] = true;
  613. // console.log(vm.form.$$parentForm.$valid);
  614. // if (vm.form.$$parentForm.$valid) {
  615. // invokeOnAllFormOptions('updateInitialValue');
  616. // //alert(JSON.stringify(vm.model), null, 2);
  617. // //vm.options.updateInitialValue();
  618. // //console.log(vm.model);
  619. // var cidata = encodeCIData(vm.model,ciId);
  620. // if(cidata){
  621. // //var cidata = ;
  622. // if(cidata.props.id){
  623. // api_cmdb.put(cidata,ciId).then(function(response){
  624. // if(response){
  625. // var resData = Restangular.stripRestangular(response);
  626. // SweetAlert.swal({
  627. // title: "保存成功!",
  628. // confirmButtonColor: "#007AFF"
  629. // },function(){
  630. // reinitTabForm(ciId);
  631. // });
  632. // }else{
  633. // SweetAlert.swal({
  634. // title: "系统错误",
  635. // text: "系统错误,请稍后重试!",
  636. // type: "error",
  637. // confirmButtonColor: "#DD6B55"
  638. // });
  639. // }
  640. // $scope.ldloading[style.replace('-', '_')] = false;
  641. // });
  642. // }else{
  643. // api_cmdb.create(cidata).then(function(response){
  644. // if(response){
  645. // var resData = Restangular.stripRestangular(response);
  646. // SweetAlert.swal({
  647. // title: "保存成功!",
  648. // confirmButtonColor: "#007AFF"
  649. // },function(){
  650. // $state.go("app.means.list");
  651. // });
  652. // // if(resData.status){
  653. // // resData
  654. // // }
  655. // }else{
  656. // SweetAlert.swal({
  657. // title: "系统错误",
  658. // text: "系统错误,请稍后重试!",
  659. // type: "error",
  660. // confirmButtonColor: "#DD6B55"
  661. // });
  662. // }
  663. // $scope.ldloading[style.replace('-', '_')] = false;
  664. // });
  665. // }
  666. // }else{
  667. // SweetAlert.swal({
  668. // title: "错误",
  669. // text: "错误,请选择资产分类!",
  670. // type: "error",
  671. // confirmButtonColor: "#DD6B55"
  672. // });
  673. // }
  674. // //alert(JSON.stringify(cidata), null, 2);
  675. // $scope.ldloading[style.replace('-', '_')] = true;
  676. // return;
  677. // var _ = window._;
  678. // vm.model = (function filter(obj) {
  679. // var filtered = _.pick(obj, function (v) { return angular.isDefined(v) && v !== null && (angular.isArray(v)?v.length>0:true) && (_.isPlainObject(v)?(!_.isEmpty(v)):true); });
  680. // return _.cloneDeep(filtered, function (v) { return v !== filtered && _.isPlainObject(v) ? filter(v) : undefined; });
  681. // })(vm.model);
  682. // }else{
  683. // if(vm.form.$$parentForm.$error){
  684. // SweetAlert.swal({
  685. // title: "校验错误",
  686. // text: "请填写必填项!",
  687. // type: "error",
  688. // confirmButtonColor: "#DD6B55"
  689. // });
  690. // angular.forEach(vm.form.$$parentForm.$error.required, function(item){
  691. // angular.forEach(vm.tabs,function(tab){
  692. // angular.forEach(tab.form.fields,function(f){
  693. // if(f.name == item.$name){
  694. // f.validation.show = true;
  695. // tab.active=true;
  696. // }
  697. // })
  698. // })
  699. // });
  700. // $scope.ldloading[style.replace('-', '_')] = false;
  701. // }
  702. // }
  703. // };
  704. //
  705. // console.log(document.body.scrollWidth);
  706. // window.onresize = function () {
  707. // width=document.body.clientWidth-360;
  708. // }
  709. var width= $scope.width = document.body.clientWidth-360;
  710. // var width = $scope.width ="100%";
  711. var height = $scope.height = 400;
  712. var apple_selected, tree, treedata_avm, treedata_geography;
  713. $scope.my_tree_handler = function (branch) {
  714. //var _ref;
  715. var classify=$scope.classify=branch.prefix.toLowerCase()+branch.sign;
  716. api_cmdb.query({'sign':classify}).then(function(data){
  717. var myData = Restangular.stripRestangular(data);
  718. console.log(myData.data.node);
  719. if(myData.data&&myData.status==200){
  720. var ret = myData.data;
  721. redrawSvg(myData);
  722. }
  723. });
  724. };
  725. $scope.my_data = [];
  726. function convertListToTree(data, treeMap){
  727. var idToNodeMap = {}; //Keeps track of nodes using id as key, for fast lookup
  728. var root = null; //Initially set our loop to null
  729. var parentNode = null;
  730. //loop over data
  731. for(var i = 0; i < data.length; i++) {
  732. var datum = data[i];
  733. //each node will have children, so let's give it a "children" poperty
  734. datum.children = [];
  735. //add an entry for this node to the map so that any future children can
  736. //lookup the parent
  737. idToNodeMap[datum.id] = datum;
  738. //Does this node have a parent?
  739. if(typeof datum.parent === "undefined" || datum.parent == null) {
  740. //Doesn't look like it, so this node is the root of the tree
  741. root = datum;
  742. treeMap[datum.id] = root;
  743. } else {
  744. //This node has a parent, so let's look it up using the id
  745. parentNode = idToNodeMap[datum.parent.id];
  746. //We don't need this property, so let's delete it.
  747. delete datum.parent;
  748. //Let's add the current node as a child of the parent node.
  749. parentNode.children.push(datum);
  750. }
  751. }
  752. return root;
  753. }
  754. function convertParentToChildList(data){
  755. var treeMap = {};
  756. var list=[];
  757. convertListToTree(data, treeMap);
  758. angular.forEach(treeMap,function(item){
  759. list.push(item);
  760. });
  761. return list;
  762. }
  763. $scope.my_tree = tree = {};
  764. $scope.try_async_load = function () {
  765. $scope.my_data = [];
  766. $scope.select_treedata = [];
  767. $scope.doing_async = true;
  768. api_configure_data.fetchDataList('ciclassify',{'idx':0,'sum':100}).then(function(result){
  769. //console.log(result['list']);
  770. $scope.select_treedata = $scope.my_data = convertParentToChildList(result['list']);
  771. $scope.doing_async = false;
  772. // tree.expand_all();
  773. //console.log(treelist);
  774. });
  775. };
  776. $scope.select_treedata = [];
  777. $scope.propTypeOptions = [];
  778. $scope.try_async_load();
  779. $scope.onFilterCallback = function(item){
  780. //console.log(item);
  781. if(angular.isDefined(item.children)&&item.children.length>=1){
  782. //not valid
  783. }else{
  784. var tempclassify=item.prefix.toLowerCase()+item.sign;
  785. $scope.cifilter_classic=tempclassify;
  786. api_configure_form.renderTabForm(tempclassify).then(function(data){
  787. var myData = Restangular.stripRestangular(data);
  788. $scope.propTypeOptions[0] = myData[0].form.fields[0];
  789. $scope.propTypeOptions[1] = myData[0].form.fields[1];
  790. });
  791. }
  792. }
  793. // $scope.onPropTypeChange = function(form){
  794. // $scope.propOptions = form.fields;
  795. // }
  796. $scope.onPropChange = function(prop){
  797. $scope.cifilter_prop = prop;
  798. }
  799. $scope.searchCI = function(searchKey, propObj, ciclassify){
  800. //if(searchKey!=null&&searchKey.length>1){
  801. var searchData = {};
  802. if(angular.isUndefined(propObj)){
  803. propObj = $scope.cifilter_prop;
  804. }
  805. if(angular.isUndefined(ciclassify)){
  806. ciclassify = $scope.cifilter_classic;
  807. }
  808. searchData['sign']=ciclassify;
  809. if(angular.isDefined(propObj)){
  810. searchData[propObj.key] = searchKey;
  811. }
  812. api_cmdb.query(searchData).then(function(response){
  813. var data=Restangular.stripRestangular(response);
  814. //此处不清空nodes
  815. var node=data.data.node;
  816. var tempNode=[];
  817. //nodes 或者links 要去重
  818. for(var i=0;i<node.length;i++){
  819. var tmp=0;
  820. for(var j=0;j<nodes.length;j++){
  821. if(node[i].uuid==nodes[j].uuid){
  822. tmp++;
  823. break;
  824. }
  825. }
  826. if(tmp==0){
  827. tempNode.push(node[i]);
  828. }
  829. }
  830. for(var i=0;i<tempNode.length;i++){//nodes 不清空
  831. nodes.push(tempNode[i]);
  832. }
  833. restart();
  834. })
  835. //}
  836. }
  837. if($stateParams.model){
  838. var modeldata=JSON.parse($stateParams.model)
  839. }
  840. api_cmdb.query({'sign':modeldata.model.label}).then(function(data){
  841. if(data&&data.status==200){
  842. var ret={data:{node:[]}};
  843. var myData = Restangular.stripRestangular(data);
  844. for(var i=0;i<data.data.node.length;i++){
  845. if(data.data.node[i].id==modeldata.model.id){
  846. ret.data.node.push(myData.data.node[i])
  847. }else{
  848. // delete myData.data.node[i];
  849. }
  850. }
  851. // var ret = myData;
  852. redrawSvg(ret);
  853. }
  854. // var myData = Restangular.stripRestangular(data);
  855. // if(myData.data&&myData.status==200){
  856. // var ret = myData.data;
  857. // redrawSvg(myData);
  858. // }
  859. });
  860. // $scope.my_data = [];
  861. // window.onresize = function () {
  862. // width=document.body.clientWidth-360;
  863. // svg = d3.select('#cmdbSVG').append('svg').attr('width', width).attr('height', height);
  864. // }
  865. var svg = d3.select('#cmdbSVG').append('svg').attr('width', width).attr('height', height);
  866. // set up initial nodes and links
  867. // - nodes are known by 'id', not by index in array.
  868. // - reflexive edges are indicated on the node (as a bold black circle).
  869. // - links are always source < target; edge directions are set by 'left' and 'right'.
  870. var nodes = [],links = [];
  871. var treeNodes=[];
  872. //读取labels (node)
  873. var labels=[];
  874. $scope.labels=[];
  875. // function getlabels(){
  876. api_configure_data.fetchDataList('ciclassify',{'idx':0,'sum':100}).then(function(result){
  877. if(result.status==200){
  878. angular.forEach(result.list,function(item){
  879. $scope.labels.push(item);
  880. })
  881. }
  882. })
  883. // }
  884. // getlabels();
  885. function hideLinkForm(hide){
  886. $scope.hideLink=hide;
  887. }
  888. function hideFeedForm(hide){
  889. $scope.hideFeed=hide;
  890. }
  891. function redrawSvg(json){
  892. nodes.length=0;//先清空
  893. links.length=0;
  894. var data=json.data;
  895. for(var i=0;i<data.node.length;i++){
  896. nodes.push(data.node[i]);
  897. }
  898. //TODO
  899. //hideFeedForm(true);;
  900. //hideLinkForm(true);
  901. restart();
  902. }
  903. $scope.query = function(){
  904. //if(d3.event.keyCode=13){
  905. queryProp("","");
  906. //}
  907. }
  908. var queryProp = function(label, prop){
  909. var data = {sign:label,q:prop};
  910. api_cmdb.query(data).then(function(response){
  911. if(response&&(response.status==200)){
  912. var data=response.data;
  913. //此处不清空nodes
  914. for(var i=0;i<data.node.length;i++){
  915. nodes.push(data.node[i]);
  916. }
  917. restart();
  918. }else{
  919. SweetAlert.swal({
  920. title: "提示!",
  921. text: "访问服务器出错!",
  922. type: "error"
  923. });
  924. }
  925. })
  926. }
  927. /*
  928. //查询输入框 回车事件
  929. d3.select("#query").on('keyup',function(){
  930. if(d3.event.keyCode==13){
  931. var q=this.value;
  932. query("",q);
  933. }
  934. });
  935. //label 查询或者条件查询
  936. function query(label,q){
  937. $.ajax({
  938. type: "GET",
  939. url: window.basePath +"/api/cmdb/ci",
  940. data: {lb :label ,q: q},
  941. dataType: "json",
  942. success:function(json){
  943. nodes.length=0;//先清空
  944. links.length=0;
  945. var data=json.data;
  946. for(var i=0;i<data.node.length;i++){
  947. nodes.push(data.node[i]);
  948. }
  949. hideFeedForm(true);;
  950. hideLinkForm(true);
  951. restart();
  952. },
  953. error:function(){
  954. SweetAlert.swal({
  955. title: "提示!",
  956. text: "访问服务器出错!",
  957. type: "error"
  958. });
  959. }
  960. });
  961. }
  962. */
  963. //读取status (节点 连线)
  964. var statuses=[];
  965. api_configure_data.fetchDataList('cistatus',{'idx':0,'sum':100}).then(function(result){
  966. if (result&&result.status==200){
  967. d3.select('#nodeStatus').selectAll('option')
  968. .data(statuses).enter()
  969. .append('option')
  970. .attr('value',function(d){return d.code;})
  971. .html(function(d){ return d.desc;});
  972. }else{
  973. SweetAlert.swal({
  974. title: "提示!",
  975. text: "服务器请求异常!",
  976. type: "error"
  977. });
  978. }
  979. });
  980. //读取types (node)
  981. // api_configure_data.fetchDataList('cistatus',{'idx':0,'sum':100}).then(function(result){
  982. // if (result&&result.status==200){
  983. // d3.select('#nodeType').selectAll('option')
  984. // .data(types).enter()
  985. // .append('option')
  986. // .attr('value',function(d){return d.source;})
  987. // .html(function(d){ return d.description;});
  988. // }else{
  989. // SweetAlert.swal({
  990. // title: "提示!",
  991. // text: "服务器请求异常!",
  992. // type: "error"
  993. // });
  994. // }
  995. // });
  996. /*
  997. //读取所有params
  998. initParams();
  999. var params=[];
  1000. //更新加载最新的params
  1001. function initParams(){
  1002. d3.xhr(window.basePath+"/api/cm/dynparams").send("GET", function(error, json) {
  1003. if (!error){
  1004. params=JSON.parse(json.responseText);
  1005. if(selected_node){
  1006. shownode();
  1007. }else if(selected_link){
  1008. showLink();
  1009. }
  1010. }else{
  1011. jAlert("服务器请求异常","提示");
  1012. }
  1013. });
  1014. }
  1015. */
  1016. //查询relationship_type表 name 为表里的type,label为显示值
  1017. var linkType=[];
  1018. function fetchEdgeTypes(){
  1019. api_configure_data.fetchDataList('ciedgetype',{'idx':0,'sum':100}).then(function(response){
  1020. if(response){
  1021. if(response['list']){
  1022. linkType = response['list'];
  1023. d3.select('#linkName').selectAll('option')
  1024. .data(linkType).enter()
  1025. .append('option')
  1026. .attr('value',function(d){return d.type;})
  1027. .html(function(d){ return d.label;});
  1028. }else{
  1029. SweetAlert.swal({
  1030. title: "提示!",
  1031. text: "服务器请求异常!",
  1032. type: "error"
  1033. });
  1034. }
  1035. }else{
  1036. SweetAlert.swal({
  1037. title: "提示!",
  1038. text: "服务器请求异常!",
  1039. type: "error"
  1040. });
  1041. }
  1042. })
  1043. }
  1044. fetchEdgeTypes();
  1045. //设置cost 只能输入整形 最大值为1
  1046. // d3.select('#linkCost').on('keyup',function(){
  1047. // this.value= this.value.replace(/[^\d.]/g,function(){jAlert('只能输入数字!',"提示");return '';});
  1048. // if(this.value>1){
  1049. // jAlert('最大输入值为1','提示');
  1050. // this.value='';
  1051. // return;
  1052. // }
  1053. // });
  1054. //添加属性 属性类型
  1055. var proTypes=[
  1056. {id:1,key:'string',value:'文本类型'},
  1057. {id:2,key:'date',value:'日期类型'},
  1058. {id:3,key:'int',value:'数字类型'},
  1059. {id:4,key:'float',value:'浮点类型'}
  1060. ];
  1061. // init D3 force layout
  1062. var force = d3.layout.force()
  1063. .nodes(nodes)
  1064. .links(links)
  1065. .size([width, height])
  1066. .gravity(.05)
  1067. .linkDistance(150)
  1068. .linkStrength(2)
  1069. .charge(-500)
  1070. .on('tick', tick);
  1071. // define arrow markers for graph links
  1072. svg.append('svg:defs').append('svg:marker')
  1073. .attr('id', 'end-arrow')
  1074. .attr('viewBox', '0 -5 10 10')
  1075. .attr('refX', 6)
  1076. .attr('markerWidth', 3)
  1077. .attr('markerHeight', 3)
  1078. .attr('orient', 'auto')
  1079. .append('svg:path')
  1080. .attr('d', 'M0,-5L10,0L0,5')
  1081. .attr('fill', '#000');
  1082. svg.append('svg:defs').append('svg:marker')
  1083. .attr('id', 'start-arrow')
  1084. .attr('viewBox', '0 -5 10 10')
  1085. .attr('refX', 4)
  1086. .attr('markerWidth', 3)
  1087. .attr('markerHeight', 3)
  1088. .attr('orient', 'auto')
  1089. .append('svg:path')
  1090. .attr('d', 'M10,-5L0,0L10,5')
  1091. .attr('fill', '#000');
  1092. // line displayed when dragging new nodes
  1093. var drag_line = svg.append('svg:path')
  1094. .attr('class', 'link dragline hidden')
  1095. .attr('d', 'M0,0L0,0');
  1096. // handles to link and node element groups
  1097. //(1)var path = svg.append('svg:g').selectAll('g')
  1098. var path = svg.append('svg:g').selectAll('g'),
  1099. circle = svg.append('svg:g').selectAll('g');
  1100. // mouse event vars
  1101. var selected_node = null,
  1102. selected_link = null,
  1103. mousedown_link = null,
  1104. mousedown_node = null,
  1105. mouseup_node = null;
  1106. function resetMouseVars() {
  1107. mousedown_node = null;
  1108. mouseup_node = null;
  1109. mousedown_link = null;
  1110. }
  1111. // update force layout (called automatically each iteration)
  1112. function tick() {
  1113. // draw directed edges with proper padding from node centers
  1114. path.selectAll('path').attr('d', function(d) {
  1115. var deltaX = d.target.x - d.source.x,
  1116. deltaY = d.target.y - d.source.y,
  1117. dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
  1118. normX = deltaX / dist,
  1119. normY = deltaY / dist,
  1120. sourcePadding = d.left ? 27 : 22,
  1121. targetPadding = d.right ? 27 : 22,
  1122. sourceX = d.source.x + (sourcePadding * normX),
  1123. sourceY = d.source.y + (sourcePadding * normY),
  1124. targetX = d.target.x - (targetPadding * normX),
  1125. targetY = d.target.y - (targetPadding * normY);
  1126. return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
  1127. });
  1128. circle.attr('transform', function(d) {
  1129. return 'translate(' + d.x + ',' + d.y + ')';
  1130. });
  1131. }
  1132. // update graph (called when needed)
  1133. function restart() {
  1134. //绑定link 数据
  1135. path.datum(links);
  1136. // path (link) group
  1137. path = path.data(links,function(d) { return d.id; });
  1138. var p = path.enter().append('svg:g');
  1139. //update existing links
  1140. path.selectAll('path').classed('selected', function(d) { return d === selected_link; })
  1141. .style('marker-start', function(d) { return d.left ? 'url(#start-arrow)' : ''; })
  1142. .style('marker-end', function(d) { return d.right ? 'url(#end-arrow)' : ''; });
  1143. // add new links
  1144. p.append('svg:path')
  1145. .attr('class', 'link')
  1146. .attr('id', function(d) { return "path_" + d.id; })
  1147. // .attr('startOffset', '0%')
  1148. .classed('selected', function(d) { return d === selected_link; })
  1149. .style('marker-start', function(d) { return d.left ? 'url(#start-arrow)' : ''; })
  1150. .style('marker-end', function(d) { return d.right ? 'url(#end-arrow)' : ''; })
  1151. .on('mousedown', function(d) {
  1152. if(d3.event.ctrlKey) return;
  1153. //去除没有提交的连线
  1154. for(var i=0;i<links.length;i++){
  1155. if(links[i].id==-1 && d.id!=-1){
  1156. links.splice(i, 1);
  1157. }
  1158. }
  1159. // select link
  1160. mousedown_link = d;
  1161. if(mousedown_link === selected_link) {
  1162. selected_link = $scope.selected_link = null;
  1163. selected_node = $scope.selected_node = null;
  1164. // d3.select("#linkDetail").attr('style','display:none');
  1165. hideLinkForm(true);//return ;
  1166. } else {
  1167. selected_link = $scope.selected_link = mousedown_link;
  1168. selected_node = $scope.selected_node = null;
  1169. //linkName
  1170. d3.select("#linkDetail").attr('style','display:inline-block;width:100%;');
  1171. //showLink();
  1172. //show("linkNamebox");//return ;
  1173. openAside(selected_link, linkType);
  1174. }
  1175. selected_node = $scope.selected_node = null;
  1176. restart();
  1177. });
  1178. p.append('svg:text')
  1179. .attr('x', 30)
  1180. .attr('y', 20)
  1181. .attr('class','fontM')
  1182. .append('textPath')
  1183. .attr('xlink:xlink:href',function(d, i){ return "#path_" + d.id; })
  1184. .html(function(d){
  1185. for(var i=0;i<linkType.length;i++){
  1186. if(linkType[i].type==d.name){
  1187. return linkType[i].label;
  1188. }
  1189. }
  1190. });
  1191. // remove old links
  1192. path.exit().remove();
  1193. // circle (node) group
  1194. // NB: the function arg is crucial here! nodes are known by id, not by index!
  1195. circle.datum(nodes);
  1196. circle = circle.data(nodes, function(d) { return d.id; });
  1197. // update existing nodes (reflexive & selected visual states)
  1198. circle.selectAll('circle')
  1199. .style('fill', function(d) {return (d === selected_node) ?d3.rgb(colors(d.label)).brighter().toString() : colors(d.label); })
  1200. .style('fill-opacity', 0.75) // add by xi
  1201. .classed('reflexive', function(d) { return d.reflexive; });
  1202. // add new nodes
  1203. var g = circle.enter().append('svg:g');
  1204. //g.append('svg:circle').attr('r',22).style('fill','rgb(255,255,255)').style('stroke','rgb(255,255,255)').style('stroke-width','2');
  1205. //g.append('svg:circle').attr('r',24).style('fill','rgb(255,255,255)').style('stroke', function(d) { return d3.rgb(colors(d.label)).darker().toString(); }).style('stroke-width','2');
  1206. g.append('svg:circle').attr('r',24).style('fill', function(d){ return (d === selected_node) ? 'rgb(153,153,153)' : 'rgb(255,255,255)';}).style('stroke', function(d) { return d3.rgb(colors(d.label)).darker().toString(); }).style('stroke-width','2');
  1207. g.append('svg:circle')
  1208. .attr('class', 'node')
  1209. .attr('r', 18)
  1210. .style('fill', function(d) {
  1211. // for(var i=0;i<$scope.labels.length;i++){
  1212. // var regstring=$scope.labels[i].prefix+$scope.labels[i].sign;
  1213. // if(d.label==regstring.toLocaleLowerCase()){
  1214. // return (d === selected_node) ? d3.rgb(colors($scope.labels[i].la)).brighter().toString() : colors(d.label);
  1215. // }
  1216. // }
  1217. return (d === selected_node) ? d3.rgb(colors(d.label)).brighter().toString() : colors(d.label);
  1218. })
  1219. .style('stroke', function(d) { return d3.rgb(colors(d.label)).darker().toString(); })
  1220. .style('fill-opacity', 0.25) //add by xj
  1221. .style('stroke-opacity', 0.5) //add by xj
  1222. .classed('reflexive', function(d) { return d.reflexive; });
  1223. g.on('mouseover', function(d) {
  1224. // var title = d.name+"-["+d.uuid+"]";
  1225. // if(!d.props.state){d.props.state="空"}
  1226. // else if(d.props.state){
  1227. // if(d.props.state=="1"){d.props.state="未审核"}
  1228. // else if(d.props.state=="2"){d.props.state="已审核"}
  1229. // else if(d.props.state=="3"){d.props.state="不匹配"}
  1230. // else if(d.props.state=="4"){d.props.state="丢失"}
  1231. // };
  1232. // if(!d.name){d.name="空"};
  1233. // if(!d.status){d.statu="空"};
  1234. // if(!d.props.useradmin){d.props.useradmin="空"};
  1235. // toaster.pop({
  1236. // type: 'info',
  1237. // title: title,
  1238. // body: '<br/><p>搜索代码:' + d.uuid + '</p>' +
  1239. // '<p>配置标题:' + d.name + '</p>' +
  1240. // '<p>状态:' + d.status + '</p>' +
  1241. // '<p>审核状态:' + d.props.state + '</p>' +
  1242. // '<p>维护人员:' + d.props.useradmin + '</p>',
  1243. // bodyOutputType: 'trustedHtml',
  1244. // timeout: 500
  1245. // })
  1246. if(!mousedown_node || d === mousedown_node) return;
  1247. // enlarge target node
  1248. d3.select(this).attr('transform', 'scale(1.1)');
  1249. })
  1250. .on('mouseout', function(d) {
  1251. if(!mousedown_node || d === mousedown_node) return;
  1252. // unenlarge target node
  1253. d3.select(this).attr('transform', '');
  1254. })
  1255. .on('mousedown', function(d) {
  1256. if(d3.event.ctrlKey) return;
  1257. hideLinkForm(true);
  1258. //去除没有提交的连线
  1259. for(var i=0;i<links.length;i++){
  1260. if(links[i].id==-1 ){
  1261. links.splice(i, 1);
  1262. }
  1263. }
  1264. // select node
  1265. mousedown_node = d;
  1266. if(mousedown_node === selected_node) {
  1267. selected_node = $scope.selected_node = null;
  1268. hideFeedForm(true);;
  1269. }else {
  1270. selected_node = $scope.selected_node = mousedown_node;
  1271. selected_link = $scope.selected_link = null;
  1272. // 点击节点 查询关系及节点 /traversal/{id}/{relation}
  1273. api_cmdb.findRefById(selected_node.id).then(function(result) {
  1274. var d = result.data;
  1275. var node = d.node;
  1276. var link = d.edge;
  1277. var tempNode = [];
  1278. var tempLink = [];
  1279. //nodes 或者links 要去重
  1280. for (var i = 0; i < node.length; i++) {
  1281. var tmp = 0;
  1282. for (var j = 0; j < nodes.length; j++) {
  1283. if (node[i].id == nodes[j].id) {
  1284. tmp++;
  1285. break;
  1286. }
  1287. }
  1288. if (tmp == 0) {
  1289. tempNode.push(node[i]);
  1290. }
  1291. }
  1292. for (var i = 0; i < link.length; i++) {
  1293. var tmp = 0;
  1294. for (var j = 0; j < links.length; j++) {
  1295. if (link[i].id == links[j].id) {
  1296. tmp++;
  1297. break;
  1298. }
  1299. }
  1300. if (tmp == 0) {
  1301. tempLink.push(link[i]);
  1302. }
  1303. }
  1304. //数据写入页面
  1305. for (var i = 0; i < tempNode.length; i++) { //nodes 不清空
  1306. nodes.push(tempNode[i]);
  1307. }
  1308. for (var i = 0; i < tempLink.length; i++) { //link 不清空
  1309. links.push(tempLink[i]);
  1310. }
  1311. //links转换
  1312. for (var i = 0; i < links.length; i++) {
  1313. for (var j = 0; j < nodes.length; j++) {
  1314. if (links[i].source == nodes[j].id) {
  1315. links[i].source = nodes[j];
  1316. }
  1317. if (links[i].target == nodes[j].id) {
  1318. links[i].target = nodes[j];
  1319. }
  1320. }
  1321. }
  1322. restart();
  1323. });
  1324. /*
  1325. // 点击节点 查询关系及节点 /traversal/{id}/{relation}
  1326. $.ajax({
  1327. type: "GET",
  1328. url: window.basePath+"/api/cmdb/ci/"+selected_node.id+"/refs",
  1329. dataType: "json",
  1330. success:function(json){
  1331. var d=json.data;
  1332. var node=d.node;
  1333. var link=d.edge;
  1334. var tempNode=[];
  1335. var tempLink=[];
  1336. //nodes 或者links 要去重
  1337. for(var i=0;i<node.length;i++){
  1338. var tmp=0;
  1339. for(var j=0;j<nodes.length;j++){
  1340. if(node[i].id==nodes[j].id){
  1341. tmp++;
  1342. break;
  1343. }
  1344. }
  1345. if(tmp==0){
  1346. tempNode.push(node[i]);
  1347. }
  1348. }
  1349. for(var i=0;i<link.length;i++){
  1350. var tmp=0;
  1351. for(var j=0;j<links.length;j++){
  1352. if(link[i].id==links[j].id){
  1353. tmp++;
  1354. break;
  1355. }
  1356. }
  1357. if(tmp==0){
  1358. tempLink.push(link[i]);
  1359. }
  1360. }
  1361. //数据写入页面
  1362. for(var i=0;i<tempNode.length;i++){//nodes 不清空
  1363. nodes.push(tempNode[i]);
  1364. }
  1365. for(var i=0;i<tempLink.length;i++){//link 不清空
  1366. links.push(tempLink[i]);
  1367. }
  1368. //links转换
  1369. for(var i=0;i<links.length;i++){
  1370. for(var j=0;j<nodes.length;j++){
  1371. if(links[i].source==nodes[j].id){
  1372. links[i].source=nodes[j];
  1373. }
  1374. if(links[i].target==nodes[j].id){
  1375. links[i].target=nodes[j];
  1376. }
  1377. }
  1378. }
  1379. restart();
  1380. },
  1381. error:function(){jAlert("访问服务器出错!",'提示');}
  1382. });
  1383. */
  1384. //更改编辑内容
  1385. //shownode();
  1386. }
  1387. // reposition drag line
  1388. drag_line
  1389. .style('marker-end', 'url(#end-arrow)')
  1390. .classed('hidden', false)
  1391. .attr('d', 'M' + mousedown_node.x + ',' + mousedown_node.y + 'L' + mousedown_node.x + ',' + mousedown_node.y);
  1392. restart();
  1393. })
  1394. .on('mouseup', function(d) {
  1395. if(!mousedown_node) return;
  1396. // needed by FF
  1397. drag_line
  1398. .classed('hidden', true)
  1399. .style('marker-end', '');
  1400. // check for drag-to-self
  1401. mouseup_node = d;
  1402. if(mouseup_node === mousedown_node) { resetMouseVars(); return; }
  1403. // unenlarge target node
  1404. d3.select(this).attr('transform', '');
  1405. // add link to graph (update if exists)
  1406. // NB: links are strictly source < target; arrows separately specified by booleans
  1407. var source, target, direction;
  1408. if(mousedown_node.id < mouseup_node.id) {
  1409. source = mousedown_node;
  1410. target = mouseup_node;
  1411. direction = 'right';
  1412. } else {
  1413. source = mouseup_node;
  1414. target = mousedown_node;
  1415. direction = 'left';
  1416. }
  1417. var link;
  1418. link = links.filter(function(l) {
  1419. return (l.source === source && l.target === target);
  1420. })[0];
  1421. if(link) {
  1422. //变为双向 direction 方向
  1423. link[direction] = true;
  1424. //更新
  1425. selected_link=link;
  1426. var l= selected_link;
  1427. var idVal=l.id;
  1428. // 连线提交 TODO 双向提交 后台问题
  1429. console.log("put relation type");
  1430. //TODO
  1431. api_cmdb.createRef({'id':l.id,'name':l.name,'source':l.source.id,'target':l.target.id,'left':l.left,'right':l.right}).then(function(resposne){
  1432. if(response&&response.status==200){
  1433. selected_link.name=linkName;
  1434. links.push(selected_link);
  1435. restart();
  1436. }else{
  1437. }
  1438. })
  1439. // $.ajax({
  1440. // type: "PUT",
  1441. // contentType:"application/json; charset=UTF-8",
  1442. // url: window.basePath+"/api/cmdb/edge/"+idVal,
  1443. // data: JSON.stringify({'id':l.id,'name':l.name,'source':l.source.id,'target':l.target.id,'left':l.left,'right':l.right}),
  1444. // dataType: "json",
  1445. // success:function(data){
  1446. // if(data.status==200){
  1447. // console.log(data.data.edge[0]);
  1448. // selected_link.name=linkName;
  1449. // //selected_link.status=linkStatus;
  1450. // selected_link.cost=linkCost;
  1451. // restart();
  1452. // showLink();
  1453. // }
  1454. // },
  1455. // error: function(data){jAlert("服务器请求异常",'提示');}
  1456. // });
  1457. } else {
  1458. cancel();
  1459. //添加连线
  1460. link = {id:-1,source: source, target: target,name:'', left: false, right: false};
  1461. link[direction] = true;
  1462. selected_link=link;
  1463. links.push(link);
  1464. //d3.select("#linkDetail").attr('style','display:inline-block;width:100%;');
  1465. //showLink();
  1466. openAside(link, linkType);
  1467. //show("linkNamebox");
  1468. }
  1469. // select new link
  1470. selected_link = $scope.selected_link = link;
  1471. selected_node = $scope.selected_node = null;
  1472. restart();
  1473. });
  1474. // show node name
  1475. g.append('svg:text')
  1476. .attr('x', 0)
  1477. .attr('y', 34)
  1478. .attr('class', 'id')
  1479. .text(function(d) { return d.name; });//TODO 改为 d.name
  1480. //设置图片
  1481. g.append('svg:foreignObject')
  1482. .attr("width", 32)
  1483. .attr("height", 32)
  1484. .attr('x', "-16px")
  1485. .attr('y', "-14px")
  1486. .html(function(d){
  1487. for(var i=0;i<$scope.labels.length;i++){
  1488. var regstring=$scope.labels[i].prefix+$scope.labels[i].sign;
  1489. if(d.label==regstring.toLocaleLowerCase()){
  1490. return '<i class="icon iconfont">'+$scope.labels[i].iconname+'</i>';
  1491. }
  1492. }
  1493. });
  1494. // remove old nodes
  1495. circle.exit().remove();
  1496. // set the graph in motion
  1497. force.start();
  1498. }
  1499. function mousedown() {
  1500. // prevent I-bar on drag
  1501. //d3.event.preventDefault();
  1502. // because :active only works in WebKit?
  1503. svg.classed('active', true);
  1504. if(mousedown_node){
  1505. viewNode(mousedown_node);
  1506. }
  1507. if(d3.event.ctrlKey || mousedown_node || mousedown_link) return;
  1508. // insert new node at point 点击添加node
  1509. // var point = d3.mouse(this),
  1510. // node = {id: ++lastNodeId, reflexive: false};
  1511. // node.x = point[0];
  1512. // node.y = point[1];
  1513. // nodes.push(node);
  1514. restart();
  1515. }
  1516. function viewNode(node){
  1517. if($scope.selected_node.name){
  1518. var title = $scope.selected_node.name+"-["+$scope.selected_node.uuid+"]";
  1519. }
  1520. if(!$scope.selected_node.props.state){$scope.selected_node.props.state="空"}
  1521. else if($scope.selected_node.props.state){
  1522. if($scope.selected_node.props.state=="1"){$scope.selected_node.props.state="未审核"}
  1523. else if($scope.selected_node.props.state=="2"){$scope.selected_node.props.state="已审核"}
  1524. else if($scope.selected_node.props.state=="3"){$scope.selected_node.props.state="不匹配"}
  1525. else if($scope.selected_node.props.state=="4"){$scope.selected_node.props.state="丢失"}
  1526. };
  1527. if(!$scope.selected_node.name){$scope.selected_node.name="空"};
  1528. if(!$scope.selected_node.status){$scope.selected_node.statu="空"};
  1529. if(!$scope.selected_node.props.useradmin){$scope.selected_node.props.useradmin="空"};
  1530. toaster.pop({
  1531. // type: 'info',
  1532. // title: title,
  1533. body: '<br/><p>内部代码:' + $scope.selected_node.uuid + '</p>' +
  1534. '<p>配置标题:' + $scope.selected_node.name + '</p>' +
  1535. '<p>状态:' + $scope.selected_node.status + '</p>' +
  1536. // '<p>审核状态:' + $scope.selected_node.props.state + '</p>' +
  1537. '<p>资产管理员:' + $scope.selected_node.props.meansmanager + '</p>',
  1538. bodyOutputType: 'trustedHtml',
  1539. timeout: 3000
  1540. })
  1541. }
  1542. function mousemove() {
  1543. if(!mousedown_node) return;
  1544. // update drag line
  1545. drag_line.attr('d', 'M' + mousedown_node.x + ',' + mousedown_node.y + 'L' + d3.mouse(this)[0] + ',' + d3.mouse(this)[1]);
  1546. restart();
  1547. }
  1548. function mouseup() {
  1549. if(mousedown_node) {
  1550. // hide drag line
  1551. drag_line
  1552. .classed('hidden', true)
  1553. .style('marker-end', '');
  1554. }
  1555. // because :active only works in WebKit?
  1556. svg.classed('active', false);
  1557. // clear mouse event vars
  1558. resetMouseVars();
  1559. }
  1560. function spliceLinksForNode(node) {
  1561. var toSplice = links.filter(function(l) {
  1562. return (l.source === node || l.target === node);
  1563. });
  1564. toSplice.map(function(l) {
  1565. links.splice(links.indexOf(l), 1);
  1566. });
  1567. }
  1568. // only respond once per keydown
  1569. var lastKeyDown = -1;
  1570. function keydown() {
  1571. //d3.event.preventDefault();
  1572. if(lastKeyDown !== -1) return;
  1573. lastKeyDown = d3.event.keyCode;
  1574. // ctrl
  1575. if(d3.event.keyCode === 17) {
  1576. circle.call(force.drag);
  1577. svg.classed('ctrl', true);
  1578. }
  1579. if(!selected_node && !selected_link) return;
  1580. switch(d3.event.keyCode) {
  1581. case 8: // backspace
  1582. // case 46: // delete
  1583. // if(selected_node) {
  1584. // nodes.splice(nodes.indexOf(selected_node), 1);
  1585. // spliceLinksForNode(selected_node);
  1586. // } else if(selected_link) {
  1587. // links.splice(links.indexOf(selected_link), 1);
  1588. // }
  1589. // selected_link = null;
  1590. // selected_node = null;
  1591. // restart();
  1592. // break;
  1593. case 66: // B
  1594. if(selected_link) {
  1595. // set link direction to both left and right
  1596. selected_link.left = true;
  1597. selected_link.right = true;
  1598. }
  1599. restart();
  1600. break;
  1601. case 76: // L
  1602. if(selected_link) {
  1603. // set link direction to left only
  1604. selected_link.left = true;
  1605. selected_link.right = false;
  1606. }
  1607. restart();
  1608. break;
  1609. case 82: // R
  1610. if(selected_node) {
  1611. // toggle node reflexivity
  1612. selected_node.reflexive = !selected_node.reflexive;
  1613. } else if(selected_link) {
  1614. // set link direction to right only
  1615. selected_link.left = false;
  1616. selected_link.right = true;
  1617. }
  1618. restart();
  1619. break;
  1620. }
  1621. }
  1622. function keyup() {
  1623. lastKeyDown = -1;
  1624. // ctrl
  1625. if(d3.event.keyCode === 17) {
  1626. circle
  1627. .on('mousedown.drag', null)
  1628. .on('touchstart.drag', null);
  1629. svg.classed('ctrl', false);
  1630. }
  1631. }
  1632. // app starts here
  1633. svg.on('mousedown', mousedown)
  1634. .on('mousemove', mousemove)
  1635. .on('mouseup', mouseup);
  1636. d3.select(window)
  1637. .on('keydown', keydown)
  1638. .on('keyup', keyup);
  1639. //restart();
  1640. //GT 颜色与数值对照表
  1641. function colors(sign){
  1642. //num=num>20?num%20:parseInt(num);
  1643. for(var i=0;i<labels.length;i++){
  1644. var entity=labels[i];
  1645. if(sign==entity.sign){
  1646. return entity.color;
  1647. }
  1648. if(i==labels.length-1 && sign!=entity.sign){
  1649. return '#ffeeee';
  1650. }
  1651. }
  1652. }
  1653. function postion(sign){
  1654. for(var i=0;i<labels.length;i++){
  1655. var entity=labels[i];
  1656. if(sign==entity.sign){
  1657. return i;
  1658. }
  1659. }
  1660. return 1;
  1661. }
  1662. //添加设备
  1663. function addnode() {
  1664. //先编辑提交 到数据库添加一条数据得到ID 后显示节点
  1665. var assetNo=d3.select("#nodeAssetNo").property('value');//资产编号
  1666. var name=d3.select("#nodeName").property('value');//资产名称
  1667. var type=d3.select("#nodeType").property('value');//资产类型
  1668. var label=d3.select("#nodeLabel").property('value');//label
  1669. var status=d3.select("#nodeStatus").property('value');//资产状态
  1670. $.ajax({
  1671. type: "POST",
  1672. contentType:"application/json; charset=UTF-8",
  1673. url: window.basePath+"/api/cmdb/ci",
  1674. data: JSON.stringify({'name':name,'status':status,'type':type,'label':label,'assetNo':assetNo,props:selected_node.props }),
  1675. dataType: "json",
  1676. success:function(data){
  1677. //成功后得到ID
  1678. if(data.status==200){
  1679. var node=data.data.node[0];
  1680. node.x = 634;
  1681. node.y = 265.5625;
  1682. nodes.push(node);
  1683. selected_node=node;
  1684. restart();
  1685. hideFeedForm(true);;
  1686. }
  1687. },
  1688. error: function(data){jAlert("服务器请求异常",'提示');}
  1689. });
  1690. }
  1691. //显示节点信息
  1692. function shownode(){
  1693. d3.select("#nodeAssetNo").property('value',selected_node.assetNo==undefined?"":selected_node.assetNo);//资产编号
  1694. d3.select("#nodeName").property('value',selected_node.name==undefined?"":selected_node.name);//资产名称
  1695. d3.select("#nodeType").property('value',selected_node.type==undefined?"":selected_node.type);//资产类型
  1696. d3.select("#nodeLabel").property('value',selected_node.label==undefined?"":selected_node.label);//label
  1697. for(var i=0;i<treeNodes.length;i++){
  1698. if(selected_node.label==treeNodes[i].sign){
  1699. d3.select("#citySel").property('value',treeNodes[i].label);
  1700. break;
  1701. }
  1702. }
  1703. d3.select("#nodeStatus").property('value',selected_node.status==undefined?"":selected_node.status);//资产状态
  1704. //先移除div中原来的标签
  1705. d3.select('#nodeTab').selectAll('tr').remove('tr');
  1706. if(selected_node.label){
  1707. var label=null;
  1708. }
  1709. }
  1710. //关系列表
  1711. // api_configure_data.fetchDataList('ciedgetype',{'idx':0,'sum':100}).then(function(response){
  1712. // if(response){
  1713. // $scope.linktypeOptions = response.list;
  1714. // }
  1715. // })
  1716. //显示连线信息
  1717. //
  1718. // $scope.onchanges=function(modelData){
  1719. // $scope.modelData=modelData;
  1720. // $scope.refreshforms(modelData.id);
  1721. // }
  1722. $scope.meansrelaname=false;
  1723. var openAside = function (model, linkTypes) {
  1724. $scope.meansrelaname=true;
  1725. $scope.onchanges=function(modelData){
  1726. $scope.modelData=modelData;
  1727. $scope.relationdata=[];
  1728. $scope.refreshforms(modelData.id);
  1729. }
  1730. // api_configure_data.fetchDataList('ciedgetype',{'idx':0,'sum':100}).then(function(response){
  1731. // if(response){
  1732. $scope.linktypeOptions = linkTypes;
  1733. if(model.id==-1){
  1734. }else{
  1735. for(var i=0;i<linkTypes.length;i++){
  1736. if(linkTypes[i].type==model.name){
  1737. $scope.refreshforms(linkTypes[i].id,model.props);
  1738. $scope.modelData=linkTypes[i];
  1739. break;
  1740. }
  1741. }
  1742. }
  1743. // }
  1744. // })
  1745. $scope.relationdata=[];
  1746. $scope.addrelation=[];
  1747. $scope.addData = function(model){
  1748. var modalInstance = $modal.open({
  1749. templateUrl: 'assets/views/means/tpl/relaform.html',
  1750. controller: function($scope, $modalInstance, APIService,Alert){
  1751. $scope.cancel = function() {
  1752. $modalInstance.dismiss('cancel');
  1753. };
  1754. $scope.savercode = function(reladata){
  1755. var re=/^([\u4E00-\u9FA5]|\w)*$/;
  1756. if(re.test(reladata.label)){
  1757. $modalInstance.close(reladata);
  1758. }else{
  1759. SweetAlert.swal("名称中含有非法字符", "名称只能为中文,字母及数字,请重新填写", "error");
  1760. }
  1761. }
  1762. },
  1763. resolve: {
  1764. APIService: function(){
  1765. return api_configure_data;
  1766. },
  1767. Alert: function(){
  1768. return SweetAlert;
  1769. }
  1770. }
  1771. });
  1772. modalInstance.result.then(function(selectedItem) {
  1773. $scope.relationdata.push(selectedItem);
  1774. var fildata={'ciEdgetypeAttribute':{'fieldType':2,'label':selectedItem.label,'ciEdgeTypeId':model.id}}
  1775. // var fildata={'cIEdgeType':{'label':selectedItem.label,'fieldType':2,'ciEdgeType':{'id':model.id}}};
  1776. api_configure_data.addData('ciEdgetypeAttribute',fildata).then(function(data){
  1777. // var fielddata=selectedItem;
  1778. // angular.extend(fielddata,{'key':1})
  1779. // $scope.addrelation.push(fielddata);
  1780. if(data.status==200){
  1781. var fielddata=selectedItem;
  1782. angular.extend(fielddata,{'key':data.data.labelKey})
  1783. $scope.addrelation.push(fielddata);
  1784. }else{
  1785. }
  1786. })
  1787. });
  1788. }
  1789. $scope.removeopen=false;
  1790. // sessionStorage['removeopen']=false;
  1791. $scope.removeData = function(){
  1792. $scope.removeopen=!$scope.removeopen;
  1793. // vm.tabs[1]['removeopen']=$scope.removeopen;
  1794. console.log(vm.tabs)
  1795. // sessionStorage['removeopen']=$scope.removeopen;
  1796. }
  1797. $scope.cancel=function(item){
  1798. for(var i=0;i<$scope.relationdata.length;i++){
  1799. if($scope.relationdata[i].label==item.label){
  1800. // delete $scope.relationdata[i];
  1801. $scope.relationdata.splice(i, 1);
  1802. console.log($scope.relationdata);
  1803. }
  1804. }
  1805. }
  1806. $scope.closechange=function(){
  1807. $scope.removeopen=false;
  1808. }
  1809. vm.submit = function(data,style){
  1810. console.log($scope.relationdata)
  1811. if (vm.form.$$parentForm.$valid) {
  1812. var tomdata=data;
  1813. var addnews={};
  1814. for(var i=0;i<$scope.addrelation.length;i++){
  1815. addnews[$scope.addrelation[i].key]=$scope.addrelation[i].name;
  1816. }
  1817. angular.extend(tomdata,addnews);
  1818. for(var i=0;i<$scope.relationdata.length;i++){
  1819. tomdata[$scope.relationdata[i].key]=$scope.relationdata[i].name;
  1820. }
  1821. if(model.id==-1){
  1822. api_cmdb.createRef({'id':model.id,'name':$scope.modelData.type,'source':model.source.id,'target':model.target.id,'left':model.left,'right':model.right,'props':tomdata}).then(function(response){
  1823. if(response&&response.status==200){
  1824. // $scope.refreshforms(data.id);
  1825. SweetAlert.swal("新建关系成功!", "数据已经保存", "success");
  1826. }else{
  1827. SweetAlert.swal("新建关系失败!", "数据未保存", "error");
  1828. }
  1829. })
  1830. }else{
  1831. api_cmdb.putRef({'id':model.id,'name':$scope.modelData.type,'source':model.source.id,'target':model.target.id,'left':model.left,'right':model.right,'props':tomdata},model.id).then(function(response){
  1832. if(response&&response.status==200){
  1833. console.log(linkTypes)
  1834. // api_configure_data.fetchDataList('ciedgetype',{'idx':0,'sum':100}).then(function(result){
  1835. // if(result){
  1836. for(var i=0;i<linkTypes.length;i++){
  1837. if(linkTypes[i].type==response.data.edge[0].name){
  1838. // $scope.refreshforms(result.list[i].id,data);
  1839. // model=response.data.edge[0].props;
  1840. console.log(links);
  1841. for(var i=0;i<links.length;i++){
  1842. if(links[i].name==model.name){
  1843. links[i].props=response.data.edge[0].props;
  1844. links[i].id=response.data.edge[0].id;
  1845. break;
  1846. }
  1847. }
  1848. selected_link=response.data.edge[0];
  1849. break;
  1850. }
  1851. }
  1852. // }
  1853. // })
  1854. SweetAlert.swal("修改成功!", "数据已经保存", "success");
  1855. }else{
  1856. SweetAlert.swal("修改失败!", "数据未保存", "error");
  1857. }
  1858. })
  1859. }
  1860. }
  1861. }
  1862. // var modalInstance = $aside.open({
  1863. // templateUrl: 'assets/views/system/tpl/asideContent.html',
  1864. // placement: 'right',
  1865. // size: 'sm',
  1866. // backdrop: true,
  1867. // controller: function ($scope, $modalInstance, ModelData, optionLinkTypes) {
  1868. // $scope.modelData = ModelData;
  1869. // $scope.linktypeOptions = optionLinkTypes;
  1870. // if($scope.modelData.name!=""){
  1871. // angular.forEach($scope.linktypeOptions,function(item){
  1872. // if(item.type==$scope.modelData.name){
  1873. // $scope.modelData.linkName=item;
  1874. // }
  1875. // })
  1876. // }
  1877. // $scope.ok = function (e) {
  1878. // $modalInstance.close($scope.modelData);
  1879. // //e.stopPropagation();
  1880. // };
  1881. // $scope.cancel = function (e) {
  1882. // $modalInstance.dismiss();
  1883. // //e.stopPropagation();
  1884. // };
  1885. // },
  1886. // resolve: {
  1887. // ModelData: function(){
  1888. // return model;
  1889. // },
  1890. // optionLinkTypes: function(){
  1891. // return linkTypes;
  1892. // }
  1893. // }
  1894. // });
  1895. // modalInstance.result.then(function (selectedItem) {
  1896. // //TODO create Edge
  1897. // console.log(selectedItem);
  1898. // if(selectedItem.id==-1){
  1899. // api_cmdb.createRef({'id':selectedItem.id,'name':selectedItem.linkName.type,'source':selectedItem.source.id,'target':selectedItem.target.id,'left':selectedItem.left,'right':selectedItem.right}).then(function(response){
  1900. // if(response&&response.status==200){
  1901. // //model.name=selectedItem.linkName.type;
  1902. // var link = response.data.edge[0];
  1903. // for (var j = 0; j < nodes.length; j++) {
  1904. // if (link.source == nodes[j].id) {
  1905. // link.source = nodes[j];
  1906. // }
  1907. // if (link.target == nodes[j].id) {
  1908. // link.target = nodes[j];
  1909. // }
  1910. // }
  1911. // links.push(link);
  1912. // // selected_link.name=linkName;
  1913. // // selected_link.cost=linkCost;
  1914. // restart();
  1915. // }else{
  1916. // }
  1917. // })
  1918. // }else{
  1919. // api_cmdb.putRef({'id':selectedItem.id,'name':selectedItem.linkName.type,'source':selectedItem.source.id,'target':selectedItem.target.id,'left':selectedItem.left,'right':selectedItem.right}, selectedItem.id).then(function(response){
  1920. // if(response&&response.status==200){
  1921. // //model=selectedItem;
  1922. // angular.forEach(links,function(link,index){
  1923. // if(link.name == model.name){
  1924. // links[index]=response.data.edge[0];
  1925. // for (var j = 0; j < nodes.length; j++) {
  1926. // if (links[index].source == nodes[j].id) {
  1927. // links[index].source = nodes[j];
  1928. // }
  1929. // if (links[index].target == nodes[j].id) {
  1930. // links[index].target = nodes[j];
  1931. // }
  1932. // }
  1933. // }
  1934. // })
  1935. // restart();
  1936. // }else{
  1937. // }
  1938. // })
  1939. // }
  1940. // }, function () {
  1941. // //console.log('Modal dismissed at: ' + new Date());
  1942. // });
  1943. };
  1944. //
  1945. //
  1946. function showLink(){
  1947. var linkeName = $scope.linkName = selected_link.name==undefined?"":selected_link.name;
  1948. $scope.linkCost = selected_link.cost==undefined?"":selected_link.cost;
  1949. // d3.select("#linkName").property('value',selected_link.name==undefined?"":selected_link.name);
  1950. // d3.select("#linkCost").property('value',selected_link.cost==undefined?"":selected_link.cost);
  1951. //var linkeName=d3.select("#linkName").property('value');
  1952. //先移除div中原来的标签
  1953. d3.select('#linkTab').selectAll('tr').remove('tr');
  1954. var linkId;
  1955. //sourceTYpe=2 and sourceId=连线nameId
  1956. //当前选择的连线name Id
  1957. for(var i=0;i<linkType.length;i++){
  1958. if(linkeName==linkType[i].type){
  1959. linkId=linkType[i].id;
  1960. }
  1961. }
  1962. var props=selected_link.props;
  1963. var keys=[];
  1964. for(var key in props){
  1965. keys.push(key);
  1966. }
  1967. // //写入固定属性
  1968. // for(var i=0;i<params.length;i++){
  1969. // var p=params[i];
  1970. // var num=0;
  1971. // for(var j=0;j<keys.length;j++){
  1972. // if(p.sourceType==2 && p.sourceId==linkId && p.key==keys[j]){//连线已有属性
  1973. // num++;
  1974. // break;
  1975. // }
  1976. // }
  1977. // if(p.sourceType==2 && p.sourceId==linkId && p.fix==1 && num==0){//连线 中没有的固定属性
  1978. // selected_link['props'][p.key]='';
  1979. // }
  1980. // }
  1981. keys=[];
  1982. for(var key in selected_link.props){
  1983. keys.push(key);
  1984. }
  1985. if(keys){
  1986. d3.select('#linkTab').selectAll('tr')
  1987. .data(keys).enter()
  1988. .append('tr')//.nextSibling
  1989. .attr('id',function(d){
  1990. return 'trLink'+d;
  1991. }).html(function(d){
  1992. var str="";
  1993. if(d==""){//新增后props 属性
  1994. var strS="";
  1995. strS='<input type="text" id="inputLink'+d+'" value="'+props[d]+'" disabled/>';
  1996. str+='<td style="padding-left: 0px;width:145px;"><span id="spanLink'
  1997. +d+'" style="width:50px;text-align:right;">未定义:</span><input type="hidden" id="selectLink'+
  1998. d+'" style="width: 90px;margin-left: 52px;"/></td>'+
  1999. '<td style="padding-left: 21px;">'+//111111111111111111111 padding-left: 60px;
  2000. strS +'</td><td>'
  2001. +'<input id="edtBtnLink'+d+'" type="button" name="edtBtn" style="background-image:url(css/img/tup/xiug.jpg);width:22px;height:22px;" onclick="edtBtnLinkClk(\'text\',\''
  2002. +d+'\',\'未定义\',\'0\')" />'
  2003. +'&nbsp;<input type="button" value="" style="background-image:url(css/img/tup/del.jpg);width:22px;height:22px;" onclick=\'delBtnLinkClk("'+d+'")\'/></td>';
  2004. return str;
  2005. }
  2006. for(var j=0;j<params.length;j++){
  2007. var p=params[j];
  2008. if((p.sourceType==2 && d==p.key && p.sourceId==linkId)){//新增加行
  2009. var strS="";
  2010. if(p.valueType=="date"){
  2011. strS='<input id="inputLink'+d+'" placeholder="请输入日期" style="width: 151px;" class="laydate-icon" onClick="laydate({istime: true, format: \'YYYY-MM-DD hh:mm:ss\'})" value="'+props[d]+'" disabled>';
  2012. }else{
  2013. strS='<input type="text" id="inputLink'+d+'" value="'+props[d]+'" disabled/>';
  2014. }
  2015. if(p.fix==1){//固定属性 不允许编辑显示属性名 不允许删除
  2016. //类型设置 读取JSON string date int float 22222222222222222padding-left: 21px;
  2017. str+='<td style="width:145px;"><span id="spanLink'+d+'">'+p.descName+':</span></td>'+
  2018. '<td style="padding-left: 21px;">'+strS+'</td><td>'+'<input id="edtBtnLink'+d
  2019. +'" type="button" name="edtBtn" style="background-image:url(css/img/tup/xiug.jpg);width:22px;height:22px;" onclick="edtBtnLinkClk(\''
  2020. +p.valueType+'\',\''+d+'\',\''+p.descName+'\',\''+p.fix+'\')" />'
  2021. +'&nbsp;</td>';
  2022. break;
  2023. }else{
  2024. //类型设置 读取JSON string date int float
  2025. str+='<td style="width:145px;"><span id="spanLink'
  2026. +d+'">'+p.descName+':</span><input type="hidden" id="selectLink'+
  2027. d+'" style="width: 90px;margin-left: 52px;"/></td>'+
  2028. '<td style="padding-left: 21px;">'+//333333333333333 padding-left: 21px;
  2029. strS
  2030. +'</td><td>'
  2031. +'<input id="edtBtnLink'+d+'" type="button" name="edtBtn" style="background-image:url(css/img/tup/xiug.jpg);width:22px;height:22px;" onclick="edtBtnLinkClk(\''
  2032. +p.valueType+'\',\''+d+'\',\''+p.descName+'\',\''+p.fix+'\')" />'
  2033. +'&nbsp;<input type="button" value="" style="background-image:url(css/img/tup/del.jpg);width:22px;height:22px;" onclick=\'delBtnLinkClk("'+d+'")\'/></td>';
  2034. break;
  2035. }
  2036. }
  2037. }
  2038. return str;
  2039. });
  2040. }
  2041. hideLinkForm(false);
  2042. }
  2043. //删除(修改状态为报废)
  2044. function delnode_update(){
  2045. if(selected_node || selected_link){
  2046. jConfirm('确定删除?', '提示', function(r) {
  2047. if(r){
  2048. if(selected_node){//删除配置
  2049. //节点ID(节点删除执行成功,数据库节点未删除 ,删除节点关系时执行失败)
  2050. var id=selected_node.id;
  2051. var name=selected_node.name;
  2052. var type=selected_node.type;//资产类型
  2053. var label=selected_node.label; //资产类型
  2054. var assetNo=selected_node.assetNo;//资产编号
  2055. var props =selected_node.props;
  2056. var status=CMConstants.DISCARDE;
  2057. //删除后,状态变为废弃
  2058. $.ajax({
  2059. type: "PUT",
  2060. contentType:"application/json; charset=UTF-8",
  2061. url: window.basePath+"/api/cmdb/ci/"+id,
  2062. data: JSON.stringify({'id':id,'name':name,'status':status,'type':type,'label':label,'assetNo':assetNo,'props':props}),
  2063. dataType: "json",
  2064. success:function(data){
  2065. if(data.status==200){
  2066. jAlert("删除成功!",'提示');
  2067. selected_node.type=type;//资产类型
  2068. selected_node.status=status;
  2069. selected_node.label=label; //资产类型
  2070. selected_node.assetNo=assetNo; //资产编号
  2071. selected_node.props=props;
  2072. selected_node.name=name;
  2073. restart();
  2074. query(label,"");
  2075. //shownode();
  2076. }
  2077. },
  2078. error: function(data){jAlert("服务器请求异常",'提示');}
  2079. });
  2080. }
  2081. }else{
  2082. jAlert("请求异常",'提示');
  2083. }
  2084. });
  2085. }else{
  2086. jAlert('请先选择删除项!','提示');
  2087. }
  2088. }
  2089. //删除
  2090. function delnode(){
  2091. if(selected_node || selected_link){
  2092. jConfirm('确定删除?', '提示', function(r) {
  2093. if(r){
  2094. if(selected_node){//删除配置
  2095. //节点ID(节点删除执行成功,数据库节点未删除 ,删除节点关系时执行失败)
  2096. var id=selected_node.id;
  2097. //先删除节点关系
  2098. d3.xhr(window.basePath+"/api/cmdb/ci/"+id+"/refs").send("DELETE", function(error, json) {
  2099. if (!error){
  2100. if(json.status==200){
  2101. var edge=JSON.parse(json.responseText).data.edge;
  2102. for(var i=0;i<edge.length;i++){
  2103. for(var j=0;j<links.length;j++){
  2104. if(edge[i].id==links[j].id){
  2105. links.splice(j, 1);
  2106. break;
  2107. }
  2108. }
  2109. }
  2110. //再删除节点
  2111. d3.xhr(window.basePath+"/api/cmdb/ci/"+id).send("DELETE", function(error, json) {
  2112. if (!error){
  2113. if(json.status==200){
  2114. //删除节点
  2115. nodes.splice(nodes.indexOf(selected_node), 1);
  2116. jAlert("删除成功!",'提示');
  2117. hideFeedForm(true);;
  2118. }
  2119. restart();
  2120. }else{
  2121. jAlert("请求异常",'提示');
  2122. }
  2123. });
  2124. }
  2125. }else{
  2126. jAlert("请求异常",'提示');
  2127. }
  2128. });
  2129. }
  2130. //用户删除关系
  2131. if(selected_link){
  2132. //得到关系ID 删除关系
  2133. var id=selected_link.id;
  2134. d3.xhr(window.basePath+"/api/cmdb/edge/"+id).send("DELETE", function(error, json) {
  2135. if (!error){
  2136. links.splice(links.indexOf(selected_link), 1);
  2137. jAlert("删除成功!",'提示');
  2138. hideLinkForm(true);
  2139. restart();
  2140. }else{
  2141. jAlert("请求异常",'提示');
  2142. }
  2143. });
  2144. }
  2145. }
  2146. });
  2147. }else{
  2148. jAlert('请先选择删除项!','提示');
  2149. }
  2150. }
  2151. var CI ={};
  2152. CI.add = addnode;
  2153. window.CI = CI;
  2154. d3.select("#traversal").selectAll('a').data([{name:'遍历',id:'traversalBtn'}]).enter()
  2155. .append('a')
  2156. .html(function (d) { return d.name; })
  2157. .on('click', function (d) {
  2158. if(d.id=="traversalBtn"){
  2159. if(selected_node == null){
  2160. alert("没有选择节点。。。");
  2161. }else{
  2162. $.ajax({
  2163. type: "GET",
  2164. url: window.basePath+"/api/cmdb/traversal/"+selected_node.assetNo,
  2165. dataType: "json",
  2166. success:function(json){
  2167. var d=json.data;
  2168. var node=d.node;
  2169. var link=d.edge;
  2170. var tempNode=[];
  2171. var tempLink=[];
  2172. //nodes 或者links 要去重
  2173. for(var i=0;i<node.length;i++){
  2174. var tmp=0;
  2175. for(var j=0;j<nodes.length;j++){
  2176. if(node[i].id==nodes[j].id){
  2177. tmp++;
  2178. break;
  2179. }
  2180. }
  2181. if(tmp==0){
  2182. tempNode.push(node[i]);
  2183. }
  2184. }
  2185. for(var i=0;i<link.length;i++){
  2186. var tmp=0;
  2187. for(var j=0;j<links.length;j++){
  2188. if(link[i].id==links[j].id){
  2189. tmp++;
  2190. break;
  2191. }
  2192. }
  2193. if(tmp==0){
  2194. tempLink.push(link[i]);
  2195. }
  2196. }
  2197. //数据写入页面
  2198. for(var i=0;i<tempNode.length;i++){//nodes 不清空
  2199. nodes.push(tempNode[i]);
  2200. }
  2201. for(var i=0;i<tempLink.length;i++){//link 不清空
  2202. links.push(tempLink[i]);
  2203. }
  2204. //links转换
  2205. for(var i=0;i<links.length;i++){
  2206. for(var j=0;j<nodes.length;j++){
  2207. if(links[i].source==nodes[j].id){
  2208. links[i].source=nodes[j];
  2209. }
  2210. if(links[i].target==nodes[j].id){
  2211. links[i].target=nodes[j];
  2212. }
  2213. }
  2214. }
  2215. restart();
  2216. },
  2217. error:function(){alert("访问服务器出错!");}
  2218. });
  2219. }
  2220. }
  2221. });
  2222. d3.select("#layout").selectAll('a').data([{name:'布局',id:'layoutBtn'}]).enter()
  2223. .append('a')
  2224. .html(function (d) { return d.name; })
  2225. .on('click', function (d) {
  2226. if(d.id=="layoutBtn"){
  2227. var k = Math.sqrt(nodes.length / (width * height));
  2228. //var len = labels.length;
  2229. // nodes.forEach(function(o, i) {
  2230. // //console.log( "postion:" + postion(o.label) % len);
  2231. // o.x += postion(o.label) & 1 ? 140 : -140;
  2232. // o.y += postion(o.label) & 2 ? 140 : -140;
  2233. // console.log("[" +o.id + "-" + o.name + "]:" + o.label + "(" + o.x + "," + o.y + ");");
  2234. // });
  2235. force.charge((-10/k)*1.5);
  2236. force.gravity(100*k);
  2237. force.resume();
  2238. }
  2239. });
  2240. //添加node 点击事件
  2241. d3.select("#addsss").selectAll('a').data([{name:'添加',id:'addBtn'}]).enter()
  2242. .append('a')
  2243. .html(function (d) { return d.name; })
  2244. .on('click', function (d) {
  2245. if(d.id=="addBtn"){
  2246. selected_node={id:-1};
  2247. //内容置空
  2248. d3.select("#nodeAssetNo").property('value','');//资产编号
  2249. d3.select("#nodeName").property('value','');//资产名称
  2250. d3.select("#nodeType").property('value','');//资产类型
  2251. d3.select("#nodeLabel").property('value','');//label
  2252. d3.select("#nodeStatus").property('value','');//资产状态
  2253. d3.select('#nodeTab').selectAll('tr').remove();
  2254. show("feedbox");return false;
  2255. }
  2256. });
  2257. //删除
  2258. d3.select("#delsss").selectAll('a').data([{name:'删除',id:'delBtn'}]).enter()
  2259. .append('a')
  2260. .html(function (d) { return d.name; })
  2261. .on('click', function (d) {
  2262. if(d.id=="delBtn"){
  2263. //delnode();
  2264. delnode_update();
  2265. }
  2266. });
  2267. //修改
  2268. d3.select("#uppsss").selectAll('a').data([{name:'修改',id:'edtBtn'}]).enter()
  2269. .append('a')
  2270. .html(function (d) { return d.name; })
  2271. .on('click', function (d) {
  2272. if(d.id=="edtBtn"){
  2273. if(selected_node!=null){
  2274. show("feedbox");
  2275. return false;
  2276. }else{
  2277. jAlert("请选择设备",'提示');
  2278. }
  2279. }
  2280. });
  2281. //节点提交
  2282. d3.select("#subBtn").on('click',function(d){
  2283. var assetNo=d3.select("#nodeAssetNo").property('value');//资产编号
  2284. var label=d3.select("#nodeLabel").property('value');//label
  2285. var props =selected_node.props;
  2286. for(var key in props){
  2287. if(key==""){
  2288. jAlert("您有未定义属性,请删除或编辑!",'提示');
  2289. return;
  2290. }
  2291. }
  2292. if(assetNo==""){
  2293. jAlert("请输入资产编号!",'提示');
  2294. return;
  2295. }else if(label==null ||label==""){
  2296. jAlert("请选择资产类型!",'提示');
  2297. return;
  2298. }else{
  2299. //添加或者更新
  2300. if(selected_node.id==-1){//添加
  2301. addnode();
  2302. }else{//更新
  2303. var idVal=selected_node.id;
  2304. var name=d3.select("#nodeName").property('value');//资产名称
  2305. var type=d3.select("#nodeType").property('value');//资产类型
  2306. var status=d3.select("#nodeStatus").property('value');//资产状态
  2307. //节点提交
  2308. $.ajax({
  2309. type: "PUT",
  2310. contentType:"application/json; charset=UTF-8",
  2311. url: window.basePath+"/api/cmdb/ci/"+idVal,
  2312. data: JSON.stringify({'id':idVal,'name':name,'status':status,'type':type,'label':label,'assetNo':assetNo,'props':selected_node.props }),
  2313. dataType: "json",
  2314. success:function(data){
  2315. if(data.status==200){
  2316. jAlert("更新成功!",'提示');
  2317. selected_node.assetNo=assetNo;
  2318. selected_node.name=name;
  2319. selected_node.type=type;
  2320. selected_node.label=label;
  2321. selected_node.status=status;
  2322. restart();
  2323. //shownode();
  2324. }
  2325. },
  2326. error: function(data){jAlert("服务器请求异常",'提示');}
  2327. });
  2328. }
  2329. // restart();
  2330. }
  2331. });
  2332. //连线提交
  2333. d3.select("#subBtn1").on('click',function(d){
  2334. var linkName=d3.select("#linkName").property('value');
  2335. var linkCost=d3.select("#linkCost").property('value');
  2336. var idVal=selected_link.id;
  2337. var props =selected_link.props;
  2338. for(var key in props){
  2339. if(key==""){
  2340. jAlert("您有未定义属性,请删除或编辑!",'提示');
  2341. return;
  2342. }
  2343. }
  2344. if(idVal==-1){//添加
  2345. selected_link.name=linkName;
  2346. //selected_link.status=linkStatus;
  2347. selected_link.cost=linkCost;
  2348. var l=selected_link;
  2349. $.ajax({
  2350. type: "POST",
  2351. contentType:"application/json; charset=UTF-8",
  2352. url: window.basePath+"/api/cmdb/edge",
  2353. data: JSON.stringify({'id':l.id,'name':l.name,'status':l.status,'cost':l.cost,'left':l.left,'right':l.right,'source':l.source.id,'target':l.target.id,'props':l.props}),
  2354. dataType: "json",
  2355. success:function(data){
  2356. if(data.status==200){
  2357. var link=data.data.edge[0];
  2358. jAlert("添加成功!",'提示');
  2359. selected_link.id=link.id;
  2360. restart();
  2361. hideLinkForm(true);
  2362. }
  2363. },
  2364. error: function(data){jAlert("服务器请求异常",'提示');}
  2365. });
  2366. }else{
  2367. // 连线提交
  2368. $.ajax({
  2369. type: "PUT",
  2370. contentType:"application/json; charset=UTF-8",
  2371. url: window.basePath+"/api/cmdb/edge/"+idVal,
  2372. data: JSON.stringify({'id':idVal,'name':linkName,'cost':linkCost,'props':selected_link.props }),
  2373. dataType: "json",
  2374. success:function(data){
  2375. if(data.status==200){
  2376. jAlert("更新成功!",'提示');
  2377. selected_link.name=linkName;
  2378. //selected_link.status=linkStatus;
  2379. selected_link.cost=linkCost;
  2380. restart();
  2381. showLink();
  2382. }
  2383. },
  2384. error: function(data){jAlert("服务器请求异常",'提示');}
  2385. });
  2386. }
  2387. // restart();
  2388. });
  2389. //全局变量 正在编辑的属性ID
  2390. var etdBtnId="";
  2391. //编辑按钮点击事件
  2392. function edtBtnClk(type,etdId,value,fix){
  2393. var v=d3.select('#edtBtn'+etdId).property('name');
  2394. if(v=='edtBtn'){
  2395. d3.select('#input'+etdId).property('disabled','');//可编辑
  2396. if(type=="date"){//加载日期
  2397. //$("#input"+etdId).datepicker({dateFormat: 'yy-mm-dd'});$.datepicker.regional[ "zh-cn" ];
  2398. }else if(type=='int'){//只能为整型
  2399. d3.select('#input'+etdId).on('keyup',function(){
  2400. this.value= this.value.replace(/[^\d]/g, '');
  2401. });
  2402. }else if(type=='float'){
  2403. d3.select('#input'+etdId).on('keyup',function(){
  2404. this.value= this.value.replace(/[^\d.]/g,'');
  2405. });
  2406. }
  2407. //span文字隐藏 select2显示
  2408. // d3.select('.addtd').classed('addtds');
  2409. if(fix==0){//动态属性 显示名称隐藏
  2410. d3.select('#span'+etdId).attr('style','display:none');
  2411. }
  2412. //d3.select('tr#tr'+etdId + 'td + td').attr('style','padding-left:0px;');
  2413. //$('#select'+etdId).select2({ multiple: true, data:selectData});//分号选择
  2414. //根据用户选择的label 和节点类型查询
  2415. var t=d3.select('#nodeLabel').property('value');
  2416. var typeId="";//选中的资源label的ID
  2417. for(var i=0;i<labels.length;i++){
  2418. if(labels[i].sign==t){
  2419. typeId=labels[i].id;
  2420. break;
  2421. }
  2422. }
  2423. var res=[];
  2424. //改变属性
  2425. d3.select('#edtBtn'+etdId).property('name','edt');
  2426. d3.select('#edtBtn'+etdId).attr('style','background-image:url(css/img/tup/queding.jpg);width:22px;height:22px;');
  2427. $('#select'+etdId).select2({
  2428. ajax: {
  2429. url: window.basePath+'/api/cm/findByPro',//sourceType=1 节点
  2430. type:'GET',
  2431. dataType: 'json',
  2432. data: function(){
  2433. return {
  2434. sourceType : 1,
  2435. sourceId: typeId
  2436. };
  2437. },
  2438. results: function (data) {
  2439. res=data;
  2440. var bindData = [];
  2441. for(var i = 0;i < data.length;i++){
  2442. bindData.push({'id':data[i].key,'text':data[i].descName});
  2443. }
  2444. return {results: bindData};
  2445. }
  2446. },
  2447. createSearchChoice:function(term, data) { if ($(data).filter(function() { return this.text.localeCompare(term)===0; }).length===0) {return {id:term, text:term};} },
  2448. //multiple: true,//单选 or 多选
  2449. }).on("select2-selecting", function(e) {
  2450. etdBtnId=this.id.substr('select'.length);
  2451. var result = [];
  2452. for(var i = 0;i < res.length;i++){
  2453. result.push({'id':res[i].key,'text':res[i].descName});
  2454. }
  2455. if(result.length==0){
  2456. //置空
  2457. d3.select("#proType").property('value','');
  2458. d3.select("#proNo").property('value','');
  2459. d3.select('#overlay').style('display','block');
  2460. d3.select('#win').style('display','block');
  2461. return;
  2462. }
  2463. for(var i=0;i<result.length;i++){
  2464. if(e.choice.id==result[i].id && e.choice.text==result[i].text){//用户选择的是已有的属性
  2465. //写入nodes
  2466. var props=selected_node.props;
  2467. // 用户选择不能重复
  2468. for(var key in props){
  2469. if(e.val==key && e.val!=etdId){
  2470. jAlert("此配置已有此属性,请另外选择!",'提示',function(){
  2471. $('#select'+etdId).select2('data', {id:etdId,text:value});
  2472. });
  2473. return;
  2474. }
  2475. }
  2476. //用户选择验证通通过 写入到nodes中
  2477. for(var p in props){
  2478. if(p==etdId){
  2479. var text=props[p];
  2480. delete props[p];
  2481. selected_node.props[e.choice.id]=text;
  2482. shownode();//此处不重新加载(shownode) 会有问题
  2483. return;
  2484. }
  2485. }
  2486. }else if((i==result.length-1) && (e.choice!=result[i])){//用户新输入的
  2487. //置空
  2488. d3.select("#proType").property('value','');
  2489. d3.select("#proNo").property('value','');
  2490. d3.select('#overlay').style('display','block');
  2491. d3.select('#win').style('display','block');
  2492. return;
  2493. }
  2494. }
  2495. });
  2496. //绑定默认值
  2497. $('#select'+etdId).select2('data', {id:etdId,text:value});
  2498. }else{//确定
  2499. d3.select('#edtBtn'+etdId).property('name','edtBtn');
  2500. d3.select('#edtBtn'+etdId).attr('style','background-image:url(css/img/tup/xiug.jpg);width:22px;height:22px;');
  2501. //数据写入nodes
  2502. var props=selected_node.props;
  2503. for(var key in props){
  2504. if(key==etdId){
  2505. var text=d3.select('#input'+etdId).property('value');
  2506. var k=null;
  2507. if(fix==0){
  2508. k=d3.select('#select'+etdId).property('value');
  2509. }else{
  2510. k=etdId;
  2511. }
  2512. delete props[etdId];
  2513. props[k]=text;
  2514. shownode();
  2515. return;
  2516. }
  2517. }
  2518. }
  2519. }
  2520. //编辑按钮点击事件
  2521. function edtBtnLinkClk(type,etdId,value,fix){
  2522. var linkeName=d3.select('#linkName').property('value');
  2523. if(linkeName==""){
  2524. jAlert("请先选取连线名称!",'提示');
  2525. return;
  2526. }
  2527. var v=d3.select('#edtBtnLink'+etdId).property('name');
  2528. if(type=="date"){//加载日期
  2529. // $("#inputLink"+etdId).datepicker({dateFormat: 'yy-mm-dd'});$.datepicker.regional[ "zh-cn" ];
  2530. }else if(type=='int'){//只能为整型
  2531. d3.select('#inputLink'+etdId).on('keyup',function(){
  2532. this.value= this.value.replace(/[^\d]/g, '');
  2533. });
  2534. }else if(type=='float'){
  2535. d3.select('#inputLink'+etdId).on('keyup',function(){
  2536. this.value= this.value.replace(/[^\d.]/g,'');
  2537. });
  2538. }
  2539. if(v=='edtBtn'){
  2540. d3.select('#inputLink'+etdId).property('disabled','');//可编辑
  2541. //改变属性
  2542. d3.select('#edtBtnLink'+etdId).attr('style','background-image:url(css/img/tup/queding.jpg);width:22px;height:22px;');
  2543. d3.select('#edtBtnLink'+etdId).property('name','edt');
  2544. if(fix==0){//动态属性隐藏
  2545. //span文字隐藏 select2显示
  2546. d3.select('#spanLink'+etdId).attr('style','display:none');
  2547. }
  2548. //根据用户选择的name(连线名称) 查询
  2549. var linkId;//选中的name的ID 即属性表里的sourceId
  2550. for(var i=0;i<linkType.length;i++){
  2551. if(linkeName==linkType[i].type){
  2552. linkId=linkType[i].id;
  2553. }
  2554. }
  2555. var res=[];
  2556. $('#selectLink'+etdId).select2({
  2557. ajax: {
  2558. url: window.basePath+'/api/cm/findByPro',//sourceType=2 连线
  2559. type:'GET',
  2560. dataType: 'json',
  2561. data: function(){
  2562. return {
  2563. sourceType : 2,
  2564. sourceId: linkId
  2565. };
  2566. },
  2567. results: function (data) {
  2568. res=data;
  2569. var bindData = [];
  2570. for(var i = 0;i < data.length;i++){
  2571. bindData.push({'id':data[i].key,'text':data[i].descName});
  2572. }
  2573. return {results: bindData};
  2574. }
  2575. },
  2576. createSearchChoice:function(term, data) { if ($(data).filter(function() { return this.text.localeCompare(term)===0; }).length===0) {return {id:term, text:term};} },
  2577. }).on("select2-selecting", function(e) {
  2578. etdBtnId=this.id.substr('selectLink'.length);
  2579. var result = [];
  2580. for(var i = 0;i < res.length;i++){
  2581. result.push({'id':res[i].key,'text':res[i].descName});
  2582. }
  2583. if(result.length==0){//如果没有属性 弹出添加属性框
  2584. //置空
  2585. d3.select("#proType").property('value','');
  2586. d3.select("#proNo").property('value','');
  2587. d3.select('#overlay').style('display','block');
  2588. d3.select('#win').style('display','block');
  2589. return;
  2590. }
  2591. //console.log ("selecting val="+ e.val+" choice="+ JSON.stringify(e.choice));
  2592. for(var i=0;i<result.length;i++){
  2593. if(e.choice.id==result[i].id && e.choice.text==result[i].text){//用户选择的是已有的属性
  2594. //nodes props
  2595. var props=selected_link.props;
  2596. // 用户选择不能重复
  2597. for(var key in props){
  2598. if(e.val==key && e.val!=etdId){
  2599. jAlert("此配置已有此属性,请另外选择!",'提示',function(){
  2600. //绑定默认值
  2601. $('#selectLink'+etdId).select2('data', {id:etdId,text:value});
  2602. });
  2603. return;
  2604. }
  2605. }
  2606. //用户选择验证通过 写入到nodes中
  2607. for(var p in props){
  2608. if(p==etdId){
  2609. delete props[etdId];
  2610. selected_link.props[e.choice.id]=e.choice.text;
  2611. showLink();//此处不重新加载(shownode) 会有问题
  2612. return;
  2613. }
  2614. }
  2615. }else if((i==result.length-1) && (e.choice!=result[i])){//用户新输入的
  2616. //置空
  2617. d3.select("#proType").property('value','');
  2618. d3.select("#proNo").property('value','');
  2619. d3.select('#overlay').style('display','block');
  2620. d3.select('#win').style('display','block');
  2621. return;
  2622. }
  2623. }
  2624. });;
  2625. //绑定默认值
  2626. $('#selectLink'+etdId).select2('data', {id:etdId,text:value});
  2627. }else{//确定
  2628. d3.select('#edtBtnLink'+etdId).property('name','edtBtn');
  2629. d3.select('#edtBtnLink'+etdId).attr('style','background-image:url(css/img/tup/xiug.jpg);width:22px;height:22px;');
  2630. //数据写入links
  2631. var props=selected_link.props;
  2632. for(var key in props){
  2633. if(key==etdId){
  2634. var k=null;
  2635. var text=d3.select('#inputLink'+etdId).property('value');
  2636. if(k==0){
  2637. k=d3.select('#selectLink'+etdId).property('value');
  2638. }else{
  2639. k=etdId;
  2640. }
  2641. delete props[etdId];
  2642. props[k]=text;
  2643. showLink();
  2644. return;
  2645. }
  2646. }
  2647. showLink();
  2648. }
  2649. }
  2650. //节点属性删除按钮点击事件
  2651. function delBtnClk(delId){
  2652. jConfirm('确定删除?', '提示', function(r) {
  2653. if(r){
  2654. //提交的时候只删除数据,不删除属性表数据
  2655. //删除表格
  2656. d3.select('#tr'+delId).selectAll('td').remove('td');
  2657. //删除node属性
  2658. var props=selected_node.props;
  2659. for(var key in props){
  2660. if(delId==key){
  2661. delete props[key];//删除node中元素
  2662. return;
  2663. }
  2664. }
  2665. }
  2666. });
  2667. }
  2668. //连线属性删除按钮点击事件
  2669. function delBtnLinkClk(delId){
  2670. jConfirm('确定删除?', '提示', function(r) {
  2671. //提交的时候只删除数据,不删除属性表数据
  2672. if(r){
  2673. //删除表格
  2674. d3.select('#trLink'+delId).selectAll('td').remove('td');
  2675. //删除node属性
  2676. var props=selected_link.props;
  2677. for(var key in props){
  2678. if(delId==key){
  2679. delete props[delId];//删除link中元素
  2680. return;
  2681. }
  2682. }
  2683. }
  2684. });
  2685. }
  2686. //连线名 的选择事件 选择后将 值写入到 selected_node
  2687. d3.select('#linkName').on('change',function(){
  2688. var num=0;
  2689. for(var key in selected_link.props){
  2690. num++;
  2691. break;
  2692. }
  2693. var tType=this;
  2694. if(num>0){
  2695. jConfirm('更换名称选项,动态属性将会被删除,是否继续?', '提示', function(r) {
  2696. if(r){
  2697. selected_link.name=tType.value;
  2698. selected_link.props={};
  2699. showLink();
  2700. selected_link['props']={};
  2701. fixPro(tType.value);
  2702. }else{
  2703. tType.value=selected_link.name;
  2704. return;
  2705. }
  2706. });
  2707. }else{
  2708. selected_link.name=tType.value;
  2709. selected_link['props']={};
  2710. fixPro(tType.value);
  2711. }
  2712. });
  2713. //加载固定属性(节点/连线)
  2714. function fixPro(label){
  2715. if(selected_node){//操作节点
  2716. var labelId=null;
  2717. //根据选择‘节点’的label 查询label的ID
  2718. d3.xhr(window.basePath+"/api/cm/findLabel?sign="+label).send("GET",
  2719. function(error, json) {
  2720. if (!error){
  2721. labelId =JSON.parse(json.responseText).id;
  2722. $.ajax({
  2723. type: "GET",
  2724. url: window.basePath+"/api/cm/findByPro",
  2725. data: {sourceType : 1,sourceId: labelId},
  2726. dataType: "json",
  2727. success:function(data){
  2728. var keys=[];
  2729. for(var i = 0;i < data.length;i++){
  2730. var entity=data[i];
  2731. if(entity.fix==1){
  2732. var key=entity.key;
  2733. keys.push(key);
  2734. selected_node['props'][key]='';
  2735. }
  2736. }
  2737. //先移除div中原来的标签
  2738. d3.select('#nodeTab').selectAll('tr').remove('tr');
  2739. d3.select('#nodeTab').selectAll('tr')
  2740. .data(keys).enter()
  2741. .append('tr')
  2742. .attr('id',function(d){
  2743. return 'tr'+d;
  2744. })
  2745. .html(function(d){ //undefined
  2746. var str="";
  2747. //新增加行
  2748. var strS="";
  2749. for(var i = 0;i < data.length;i++){
  2750. var entity=data[i];
  2751. if(entity.fix==1 && entity.key==d){//固态属性 并且key相等
  2752. if(entity.valueType=="date"){
  2753. strS='<input id="input'+d+'" placeholder="请输入日期" style="width: 151px;" class="laydate-icon" onClick="laydate({istime: true, format: \'YYYY-MM-DD hh:mm:ss\'})" value="'
  2754. +'" disabled>';
  2755. }else{
  2756. strS='<input type="text" id="input'+d+'" value="" disabled/>';
  2757. }
  2758. //类型设置 读取JSON string date int float
  2759. str+='<td style="padding-left: 0px;width:145px;"><span id="span'
  2760. +d+'">'+entity.descName+':</span></td>'+
  2761. '<td style="padding-left: 21px;">'+strS+'</td><td>'+'<input id="edtBtn'+d
  2762. +'" name="edtBtn" type="button" style="background-image:url(css/img/tup/xiug.jpg);width:22px;height:22px;" onclick="edtBtnClk(\''
  2763. +entity.valueType+'\',\''+d+'\',\''+entity.descName+'\',\''+entity.fix+'\')" />'+'&nbsp;</td>';
  2764. break;
  2765. }
  2766. }
  2767. return str;
  2768. });
  2769. },
  2770. error:function(data){jAlert("服务器访问异常!",'提示');}
  2771. });
  2772. }
  2773. });
  2774. }else if(selected_link){//操作连线
  2775. var sourceId=null;
  2776. for(var i=0;i<linkType.length;i++){
  2777. if(label==linkType[i].type){
  2778. sourceId=linkType[i].id;
  2779. }
  2780. }
  2781. if(sourceId!=null){
  2782. $.ajax({
  2783. type: "GET",
  2784. url: window.basePath+"/api/cm/findByPro",
  2785. data: {sourceType : 2,sourceId: sourceId},
  2786. dataType: "json",
  2787. success:function(data){
  2788. var keys=[];
  2789. for(var i = 0;i < data.length;i++){
  2790. var entity=data[i];
  2791. if(entity.fix==1){
  2792. var key=entity.key;
  2793. keys.push(key);
  2794. selected_link['props'][key]='';
  2795. }
  2796. }
  2797. //先移除div中原来的标签
  2798. d3.select('#linkTab').selectAll('tr').remove('tr');
  2799. d3.select('#linkTab').selectAll('tr')
  2800. .data(keys).enter()
  2801. .append('tr')
  2802. .attr('id',function(d){
  2803. return 'tr'+d;
  2804. })
  2805. .html(function(d){ //undefined
  2806. var str="";
  2807. //固态属性
  2808. var strS="";
  2809. for(var i = 0;i < data.length;i++){
  2810. var entity=data[i];
  2811. if(entity.fix==1 && entity.key==d){//固态属性 并且key相等
  2812. if(entity.valueType=="date"){
  2813. strS='<input id="inputLink'+d+'" placeholder="请输入日期" style="width: 151px;" class="laydate-icon" onClick="laydate({istime: true, format: \'YYYY-MM-DD hh:mm:ss\'})" value="" disabled>';
  2814. }else{
  2815. strS='<input type="text" id="inputLink'+d+'" value="" disabled/>';
  2816. }
  2817. //类型设置 读取JSON string date int float
  2818. str+='<td style="padding-left: 0px;width:145px;"><span id="spanLink'+d+'">'+entity.descName+':</span></td>'+
  2819. '<td style="padding-left: 21px;">'+strS+'</td><td>'+'<input id="edtBtnLink'+d
  2820. +'" type="button" name="edtBtn" style="background-image:url(css/img/tup/xiug.jpg);width:22px;height:22px;" onclick="edtBtnLinkClk(\''
  2821. +entity.valueType+'\',\''+d+'\',\''+entity.descName+'\',\''+entity.fix+'\')" />'
  2822. +'&nbsp;</td>';
  2823. break;
  2824. }
  2825. }
  2826. return str;
  2827. });
  2828. },
  2829. error:function(data){jAlert("服务器访问异常!",'提示');}
  2830. });
  2831. }
  2832. }
  2833. }
  2834. //节点'添加属性' 点击事件
  2835. d3.select('#addBtn').on('click',function(){
  2836. var label=d3.select('#nodeLabel').property('value');
  2837. if(""!=label){
  2838. addRow();
  2839. }else{
  2840. jAlert('请先选择资产类型!','提示');
  2841. }
  2842. });
  2843. //添加属性行
  2844. function addRow(){
  2845. if(selected_node.props){
  2846. selected_node.props['']='未定义';
  2847. }else{
  2848. selected_node['props']={'':'未定义'};
  2849. }
  2850. //用户写入的记录下来
  2851. updJson();
  2852. shownode();
  2853. }
  2854. //刷新时记录用户输入
  2855. function updJson(){
  2856. if(selected_node){
  2857. selected_node.assetNo=d3.select("#nodeAssetNo").property('value');
  2858. selected_node.name=d3.select("#nodeName").property('value');
  2859. selected_node.type=d3.select("#nodeType").property('value');
  2860. selected_node.label=d3.select("#nodeLabel").property('value');
  2861. selected_node.status=d3.select("#nodeStatus").property('value');
  2862. }else if(selected_link){
  2863. selected_link.name=d3.select("#linkName").property('value');
  2864. selected_link.cost=d3.select("#linkCost").property('value');
  2865. }
  2866. }
  2867. //=============弹出层添加属性begin=======================================
  2868. //加载属性类型
  2869. d3.select('#proType').selectAll('option')
  2870. .data(proTypes).enter()
  2871. .append('option')
  2872. .attr('value',function(d){return d.key;})
  2873. .html(function(d){ return d.value;});
  2874. //提交
  2875. d3.select('#addSubBtn').on('click',function(){
  2876. if(selected_node){
  2877. var proType=d3.select("#proType").property('value');
  2878. var proNo=d3.select("#proNo").property('value');
  2879. var desName=d3.select("#select"+etdBtnId).property('value');//正在编辑select2的值
  2880. //插入前先查询节点‘英文编号’的此label 此简称是否存在
  2881. var t=d3.select('#nodeLabel').property('value');
  2882. var labelId="";//选中的资源label的ID
  2883. for(var i=0;i<labels.length;i++){
  2884. if(labels[i].sign==t){
  2885. labelId=labels[i].id;
  2886. break;
  2887. }
  2888. }
  2889. $.ajax({
  2890. type: "GET",
  2891. url: window.basePath+"/api/cm/findByPros",
  2892. data: {sourceType : 1,sourceId: labelId,keyname:proNo},
  2893. dataType: "text",
  2894. success:function(data){
  2895. if(data==0){//数据库中没有此属性 允许插入
  2896. //插入操作 返回实体
  2897. $.ajax({
  2898. type: "POST",
  2899. contentType:"application/json; charset=UTF-8",
  2900. url: window.basePath+"/api/cm/dynparam",
  2901. data: JSON.stringify({ descName:desName, key:proNo, sourceId:labelId, sourceType:1, valueType:proType,fix:0}),//JSON.stringify(entity),fix:0动态属性
  2902. dataType: "json",
  2903. success:function(data){
  2904. //插入成功后改变正在编辑的
  2905. var props=selected_node.props;
  2906. for(var key in props){
  2907. if(key==etdBtnId){
  2908. delete props[key];
  2909. props[proNo]=desName;
  2910. //层隐藏
  2911. d3.select('#overlay').style('display','none');
  2912. d3.select('#win').style('display','none');
  2913. //更新属性
  2914. initParams();
  2915. restart();
  2916. return;
  2917. }
  2918. }
  2919. },
  2920. error: function(data){jAlert("服务器请求异常",'提示');}
  2921. });
  2922. }else{
  2923. jAlert("此属性编号已存在,请重新输入编号!",'提示');
  2924. }
  2925. },
  2926. error:function(data){jAlert("服务器访问异常!",'提示');}
  2927. });
  2928. }else if(selected_link){
  2929. var proType=d3.select("#proType").property('value');
  2930. var proNo=d3.select("#proNo").property('value');
  2931. var desName=d3.select("#selectLink"+etdBtnId).property('value');//正在编辑select2的值
  2932. //插入前先查询节点‘英文编号’的此label 此简称是否存在
  2933. var linkeName=d3.select('#linkName').property('value');
  2934. var linkId;//选中的name的ID 即属性表里的sourceId
  2935. for(var i=0;i<linkType.length;i++){
  2936. if(linkeName==linkType[i].type){
  2937. linkId=linkType[i].id;
  2938. }
  2939. }
  2940. $.ajax({
  2941. type: "GET",
  2942. url: window.basePath+"/api/cm/findByPros",
  2943. data: {sourceType : 2,sourceId: linkId,keyname:proNo},
  2944. dataType: "text",
  2945. success:function(data){
  2946. if(data==0){//数据库中没有此属性 允许插入
  2947. //插入操作 返回实体
  2948. $.ajax({
  2949. type: "POST",
  2950. contentType:"application/json; charset=UTF-8",
  2951. url: window.basePath+"/api/cm/dynparam",
  2952. data: JSON.stringify({ descName:desName, key:proNo, sourceId:linkId, sourceType:2, valueType:proType,fix:0}),//JSON.stringify(entity),
  2953. dataType: "json",
  2954. success:function(data){
  2955. //插入成功后改变正在编辑的
  2956. //params=JSON.parse(json.responseText);
  2957. var props=selected_link.props;
  2958. for(var key in props){
  2959. if(key==etdBtnId){
  2960. delete props[key];
  2961. props[proNo]=desName;
  2962. //层隐藏
  2963. d3.select('#overlay').style('display','none');
  2964. d3.select('#win').style('display','none');
  2965. //更新属性
  2966. initParams();
  2967. return;
  2968. }
  2969. }
  2970. },
  2971. error: function(data){jAlert("服务器请求异常",'提示');}
  2972. });
  2973. }else{
  2974. jAlert("此属性编号已存在,请重新输入编号!",'提示');
  2975. }
  2976. },
  2977. error:function(data){jAlert("服务器访问异常!",'提示');}
  2978. });
  2979. }
  2980. });
  2981. //取消
  2982. d3.select('#addResBtn').on('click',function(){
  2983. d3.select('#overlay').style('display','none');
  2984. d3.select('#win').style('display','none');
  2985. });
  2986. //关闭
  2987. d3.select('#close').on('click',function(){
  2988. d3.select('#overlay').style('display','none');
  2989. d3.select('#win').style('display','none');
  2990. });
  2991. //=================添加属性end==============================================
  2992. //连线'添加属性' 点击事件
  2993. d3.select('#addBtn1').on('click',function(){
  2994. addRow1();
  2995. });
  2996. //添加节点
  2997. function addRow1(){
  2998. if(selected_link){
  2999. if(selected_link.props){
  3000. selected_link.props['']='未定义';
  3001. }else{
  3002. selected_link['props']={'':'未定义'};
  3003. }
  3004. updJson();
  3005. showLink();
  3006. }
  3007. }
  3008. function cancel(){
  3009. for(var i=0;i<links.length;i++){//确保用户不提交的时候不出错
  3010. if(links[i].id==-1){
  3011. // delete links[i];
  3012. links.splice(i, 1);
  3013. break;
  3014. }
  3015. }
  3016. };
  3017. //取消1
  3018. d3.select('#addResBtn1').on('click',function(){
  3019. d3.select('#overlay1').style('display','none');
  3020. d3.select('#win1').style('display','none');
  3021. });
  3022. //数据导入
  3023. d3.select("#importData").on("click",function(){
  3024. d3.select('#overlay1').style('display','block');
  3025. d3.select('#win1').style('display','block');
  3026. });
  3027. //上传
  3028. d3.select("#importBtn").on("click",function(){
  3029. var name=d3.select("#importFile").property('value');
  3030. var suffix=name.substring(name.lastIndexOf(".")+1,name.length);
  3031. if(suffix!="xls" && suffix!="xlsx"){
  3032. jAlert("请选择EXCEL文件!",'提示');
  3033. return;
  3034. }else{
  3035. var form=$("#myform")[0];
  3036. form.method="POST";
  3037. form.action=window.basePath +"/api/cm/importFile";
  3038. form.submit();
  3039. jAlert("上传成功!",'提示');
  3040. d3.select('#overlay1').style('display','none');
  3041. d3.select('#win1').style('display','none');
  3042. }
  3043. });
  3044. }]);