'use strict'; var cmdbFormly = angular.module('formlyCMDB', [ 'formly', 'formlyBootstrap', 'ui.bootstrap', 'ngSanitize','ui.select','ui.grid']); app.requires.push('formlyCMDB'); cmdbFormly.controller('meansformCtrl', ['$rootScope', '$scope', '$parse', '$injector', '$http','$q', '$state', '$stateParams', '$modal', '$timeout', '$interval', 'i18nService', 'SweetAlert', 'FileUploader', 'Restangular', 'UserRestangular', 'BpmRestangular', 'api_configure_form', 'api_configure_data', 'api_bpm_domain', 'api_bpm_data', 'api_user_data', 'api_cmdb','api_sysinfo', function ($rootScope, $scope, $parse, $injector, $http, $q, $state, $stateParams, $modal, $timeout, $interval, i18nService, SweetAlert, FileUploader, Restangular, UserRestangular, BpmRestangular, api_configure_form, api_configure_data, api_bpm_domain, api_bpm_data, api_user_data, api_cmdb,api_sysinfo) { $scope.langs=i18nService.getAllLangs(); $scope.lang = 'zh-cn'; i18nService.setCurrentLang($scope.lang); var vm = this; vm.options = {}; vm.exampleTitle = ['expressionProperties','model property']; vm.fields=[]; vm.model={}; vm.model["loginUser"] = $rootScope.user; var that=$injector; var parse=$parse; var formKey = ""; var pdKey = ""; if(angular.isDefined($state.current.pdKey)&&$state.current.pdKey!=""){ pdKey = $state.current.pdKey; //console.log("pdKey::"+$state.current.pdKey); } if(angular.isDefined($stateParams.formKey)&&$stateParams.formKey!=""){ formKey = $stateParams.formKey; //console.log("formKey::"+$stateParams.formKey); } //用户测试数据,后续从header的auth中获取 var userId = 2; userId = $rootScope.user.id; //==============处理表单设计数据 开始==================== //处理组件加载后台数据选项的方法 function refreshSelectOptions(searchVal, field) { if(field.templateOptions.optionsUrl){ var process = BpmRestangular.all(""); if(field.templateOptions.ApiService){ process = UserRestangular.all(""); } process.customPOST({"idx":0,"sum":1000},field.templateOptions.optionsUrl).then(function(result){ if(!field.templateOptions.options){ field.templateOptions.options=[]; } if(field.templateOptions.optionsDataKey){ field.templateOptions.options =result[field.templateOptions.optionsDataKey]; }else{ field.templateOptions.options =result; } }); } } function decodeVMTabForm(model, tabs){ var result = {model:{},tabs:[]}; var mdata = angular.fromJson(model); angular.extend(result.model,mdata); angular.forEach(tabs, function(tab){ tab.form.model = vm.model; angular.forEach(tab.form.fields,function(field){ if(field.key==""){ delete field.key; } if(angular.isDefined(field.extjson)&&field.extjson!=""){ var extObj = angular.fromJson(field.extjson); angular.extend(field.templateOptions, extObj.templateOptions); delete extObj.templateOptions; for(var prop in extObj){ if(new RegExp("Expression").test(prop)){ //var obj = $scope.$eval(extObj[prop]); //extObj[prop] = $scope.$eval(extObj[prop]); if(extObj[prop]!=null){ if(new RegExp("function").test(extObj[prop])){ var propValue = eval(extObj[prop]); extObj[prop] = propValue; }else{ //console.log(extObj[prop]); var obj = $scope.$eval(extObj[prop]); extObj[prop] = obj; //console.log(obj); } } }else if(new RegExp("expressionProperties").test(prop)){ for(var p in extObj[prop]){ if(new RegExp("function").test(extObj[prop][p])){ var propValue = eval(extObj[prop][p]); extObj[prop][p] = propValue; }else{ //if(p.indexOf("'")>=0){ // var obj = $scope.$eval(extObj[prop][p]); // extObj[prop][$scope.$eval(p)]=obj; //} } } }else if("watcher"==prop){ if(angular.isArray(extObj[prop])){ angular.forEach(extObj[prop],function(item,index){ for(var p in item){ if(new RegExp("function").test(item[p])){ var propValue = eval(item[p]); extObj[prop][index][p] = propValue; } } }); }else if(angular.isObject(extObj[prop])){ for(var p in extObj[prop]){ if(new RegExp("function").test(extObj[prop][p])){ var propValue = eval(extObj[prop][p]); extObj[prop][p] = propValue; } } } } } angular.extend(field,extObj); delete field.extjson; } if(field.extjson==""){ delete field.extjson; } if(angular.isDefined(field.templateOptions)){ var templateOs = field.templateOptions; for(var property in templateOs){ //console.log(property); if(angular.isString(templateOs[property])&& !(new RegExp("[\u4e00-\u9fa5]").test(templateOs[property]))){ if(new RegExp("function").test(templateOs[property])){ var propValue = eval(templateOs[property]); field.templateOptions[property] = propValue; }else{ if(that.has(templateOs[property])){ field.templateOptions[property] = that.get(templateOs[property]); }else{ field.templateOptions[property] = templateOs[property]; } } }else if(templateOs[property]==null){ //delete field.templateOptions[property]; }else{ } } } if(angular.isDefined(field.templateOptions) && angular.isDefined(field.templateOptions.extjson)){ var extObj = angular.fromJson(field.templateOptions.extjson);//JSON.parse(field.extjson); angular.extend(field.templateOptions,extObj); delete field.templateOptions.extjson; } //... if(field.templateOptions){ //处理远程获取数据控件方法调用 if(field.templateOptions.optionsUrl){ field.templateOptions.refresh = refreshSelectOptions; } //处理嵌套属性数据绑定/ if(field.templateOptions.pkey){ var pmodel,i= 0; angular.forEach(field.templateOptions.pkey.split("."),function(p){ if(i==0){ if(result.model[p]==null){ result.model[p] = {}; } pmodel = result.model[p]; i++; }else{ if(pmodel[p]==null){ pmodel[p] = {}; } pmodel = pmodel[p]; } }); if(pmodel!=null){ field.model = pmodel; if(pmodel[field.key]==null){ pmodel[field.key] = null; } } }else{ if(result.model[field.key]==null){ result.model[field.key] = null; } } //处理弹出框组件初始化 if(field.type=="ui-input-selectmodal"){ field.templateOptions.modal = $modal; //field.templateOptions.Restangular = Restangular; }else if(field.type=="ui-userselect"){ field.templateOptions.modal = $modal; //field.templateOptions.Restangular = Restangular; }else if(field.type=="ui-multiuserselect"){ field.templateOptions.modal = $modal; }else if(field.type=="ui-modelselect"){ field.templateOptions.modal = $modal; //field.templateOptions.Restangular = Restangular; }else if(field.type=="ui-dropfile"){ field.templateOptions.fileUploader = new FileUploader({ url:'/uploader' }); field.templateOptions.taskId = $stateParams.taskId; field.templateOptions.processInstanceId = $stateParams.processInstanceId; field.templateOptions.userId = $rootScope.user.id; //field.ApiService=api_bpm_domain; }else if(field.type=="ui-dropfiletable"){ if(field.templateOptions.processInstanceId){ }else{ field.templateOptions.processInstanceId = $stateParams.processInstanceId; } }else if(field.type=="ui-repeatSection"){ var repeatForm = { model:{ }, fields:field.templateOptions.fields }; repeatForm.model[field.key]=[]; decodeVMTabForm(repeatForm); } } // console.log(field); //field //result.fields.push(field); }) }); vm.originalTabs = angular.copy(vm.form); } //解析自定义表单设计数据 function decodeVMForm(vmForm){ var result = {model:{},tabs:[]}; //设置模型实体数据 begin // var mdata = vmForm.model; //解析数据实体 var mdata = angular.fromJson(vmForm.model);//JSON.parse(field.extjson); angular.extend(result.model,mdata); //设置模型实体数据 end //解析设计数据生成表单项 begin var fields = []; //处理修改设计数据中展示设置 angular.forEach(vmForm.tabs, function(field){ if(field.key==""){ delete field.key; } if(angular.isDefined(field.extjson)){ var extObj = angular.fromJson(field.extjson);//JSON.parse(field.extjson); angular.extend(field.templateOptions, extObj.templateOptions); delete extObj.templateOptions; for(var prop in extObj){ if(new RegExp("Expression").test(prop)){ //var obj = $scope.$eval(extObj[prop]); //extObj[prop] = $scope.$eval(extObj[prop]); if(extObj[prop]!=null){ if(new RegExp("function").test(extObj[prop])){ var propValue = eval(extObj[prop]); extObj[prop] = propValue; }else{ //console.log(extObj[prop]); var obj = $scope.$eval(extObj[prop]); extObj[prop] = obj; //console.log(obj); } } }else if(new RegExp("expressionProperties").test(prop)){ for(var p in extObj[prop]){ if(new RegExp("function").test(extObj[prop][p])){ var propValue = eval(extObj[prop][p]); extObj[prop][p] = propValue; }else{ //if(p.indexOf("'")>=0){ // var obj = $scope.$eval(extObj[prop][p]); // extObj[prop][$scope.$eval(p)]=obj; //} } } }else if("watcher"==prop){ if(angular.isArray(extObj[prop])){ angular.forEach(extObj[prop],function(item,index){ for(var p in item){ if(new RegExp("function").test(item[p])){ var propValue = eval(item[p]); extObj[prop][index][p] = propValue; } } }); }else if(angular.isObject(extObj[prop])){ for(var p in extObj[prop]){ if(new RegExp("function").test(extObj[prop][p])){ var propValue = eval(extObj[prop][p]); extObj[prop][p] = propValue; } } } } } angular.extend(field,extObj); delete field.extjson; } if(angular.isDefined(field.templateOptions)){ var templateOs = field.templateOptions; for(var property in templateOs){ //console.log(property); if(angular.isString(templateOs[property])&& !(new RegExp("[\u4e00-\u9fa5]").test(templateOs[property]))){ if(new RegExp("function").test(templateOs[property])){ var propValue = eval(templateOs[property]); field.templateOptions[property] = propValue; }else{ if(that.has(templateOs[property])){ field.templateOptions[property] = that.get(templateOs[property]); }else{ field.templateOptions[property] = templateOs[property]; } } }else if(templateOs[property]==null){ //delete field.templateOptions[property]; }else{ } } } console.log(field); if(angular.isDefined(field.templateOptions) && angular.isDefined(field.templateOptions.extjson)){ var extObj = angular.fromJson(field.templateOptions.extjson);//JSON.parse(field.extjson); angular.extend(field.templateOptions,extObj); delete field.templateOptions.extjson; } //... if(field.templateOptions){ //处理远程获取数据控件方法调用 if(field.templateOptions.optionsUrl){ field.templateOptions.refresh = refreshSelectOptions; } //处理嵌套属性数据绑定/ if(field.templateOptions.pkey){ var pmodel,i= 0; angular.forEach(field.templateOptions.pkey.split("."),function(p){ if(i==0){ if(result.model[p]==null){ result.model[p] = {}; } pmodel = result.model[p]; i++; }else{ if(pmodel[p]==null){ pmodel[p] = {}; } pmodel = pmodel[p]; } }); if(pmodel!=null){ field.model = pmodel; if(pmodel[field.key]==null){ pmodel[field.key] = null; } } }else{ if(result.model[field.key]==null){ result.model[field.key] = null; } } //处理弹出框组件初始化 if(field.type=="ui-input-selectmodal"){ field.templateOptions.modal = $modal; //field.templateOptions.Restangular = Restangular; }else if(field.type=="ui-userselect"){ field.templateOptions.modal = $modal; //field.templateOptions.Restangular = Restangular; }else if(field.type=="ui-multiuserselect"){ field.templateOptions.modal = $modal; }else if(field.type=="ui-modelselect"){ field.templateOptions.modal = $modal; //field.templateOptions.Restangular = Restangular; }else if(field.type=="ui-dropfile"){ field.templateOptions.fileUploader = new FileUploader({ url:'/uploader' }); field.templateOptions.taskId = $stateParams.taskId; field.templateOptions.processInstanceId = $stateParams.processInstanceId; field.templateOptions.userId = $rootScope.user.id; //field.ApiService=api_bpm_domain; }else if(field.type=="ui-dropfiletable"){ if(field.templateOptions.processInstanceId){ }else{ field.templateOptions.processInstanceId = $stateParams.processInstanceId; } }else if(field.type=="ui-repeatSection"){ var repeatForm = { model:{ }, fields:field.templateOptions.fields }; repeatForm.model[field.key]=[]; decodeVMForm(repeatForm); } } // console.log(field); result.fields.push(field); }); angular.extend($scope.vm.fields,result.fields); angular.extend($scope.vm.model,result.model); $scope.formData = vmForm; //console.log($scope.vm); //解析设计数据生成表单项 end return result; } //======================处理表单设计数据 结束======================== $scope.ldloading = {}; function filter(obj) { angular.forEach(obj, function(key, value){ if (value === "" || value === null){ delete obj[key]; } else if (Object.prototype.toString.call(value) === '[object Object]') { filter(value); } else if (angular.isArray(value)) { angular.forEach(value,function(item){ filter(item); }); } }); } function invokeOnAllFormOptions(fn) { angular.forEach(vm.tabs, function(tab) { if (tab.form.options && tab.form.options[fn]) { tab.form.options[fn](); } }); } function encodeCIData(data,ciId){ /* create/update state:未审核 create createtime:系统时间 create/update lastupdatetime : 系统时间 label:ci分类 */ if(ciId){ var baseprop = ['uuid','name','type','label','status','createtime','lastupdatetime','props'];//state|audittime//createtime//removeflag|removetime//configperson//lastupdateperson//manager//useradmin var extraprop = 'props'; data[extraprop] = {}; for(var key in data){ console.log(data[key]); if(_.indexOf(baseprop, key)>=0){ continue; }else{ data[extraprop][key] = data[key]; delete data[key]; } } if($rootScope.user){ data[extraprop]['lastupdateperson']=$rootScope.user.name; data[extraprop]['configperson']=$rootScope.user.name; var isCMAdminFlag = false; angular.forEach($rootScope.user.role,function(roleItem){ if(roleItem.rolecode == "cmdb charge"){ isCMAdminFlag = true; } }) if(!isCMAdminFlag){ data[extraprop]['state']='1'; } } if(data.props.id){ }else{ data.label=ciId; } return data; } return undefined; } function decodeCIModel(data){ var extraprop = 'props'; if(data[extraprop]){ for(var key in data[extraprop]){ data[key] = data[extraprop][key]; } delete data[extraprop]; } data['iscmadmin']=false; angular.forEach($rootScope.user.role,function(roleItem){ if(roleItem.rolecode == "cmdb charge"){ data['iscmadmin'] = true; } }) return data; } vm.remove = function(data, style){ $scope.ldloading[style.replace('-', '_')] = true; var cidata = { label:data.label, id:data.id, uuid:data.uuid, name:data.name, props:{} }; if(cidata.id){ cidata.props['removeflag']=true; cidata.props['lastupdateperson']=vm.model.loginUser; //cidata.props['removetime']=new Date(); api_cmdb.put(cidata,data.id).then(function(response){ if(response){ var resData = Restangular.stripRestangular(response); SweetAlert.swal({ title: "删除成功!", confirmButtonColor: "#007AFF" },function(){ $state.go("app.means.list"); // $scope.refreshform(); // reinitTabForm($scope.classify); }); }else{ SweetAlert.swal({ title: "系统错误", text: "系统错误,请稍后重试!", type: "error", confirmButtonColor: "#DD6B55" }); } $scope.ldloading[style.replace('-', '_')] = false; }); }else{ $timeout(function () { $scope.ldloading[style.replace('-', '_')] = false; }, 2000); } } function formValid(){ angular.forEach(vm.tabs,function(item){ //item. }) } $scope.closeModel = function(){ if(angular.isDefined($stateParams.formKey)&&$stateParams.formKey!=""){ if($stateParams.formKey=="means_editor"||$stateParams.formKey=="means_edit") { $state.go('app.means.list',{}); } event.preventDefault(); } } vm.submit = function(data,ciId,templateitem,style){ // $scope.ldloading[style.replace('-', '_')] = true; console.log(vm.form.$$parentForm.$valid); if (vm.form.$$parentForm.$valid) { invokeOnAllFormOptions('updateInitialValue'); //alert(JSON.stringify(vm.model), null, 2); //vm.options.updateInitialValue(); //console.log(vm.model); var cidata = encodeCIData(vm.model,ciId); if(cidata){ //var cidata = ; if(cidata.props.id){ //修改 api_cmdb.put(cidata,ciId).then(function(response){ if(response){ var resData = Restangular.stripRestangular(response); SweetAlert.swal({ title: "保存成功!", confirmButtonColor: "#007AFF" },function(){ $scope.ldloading[style.replace('-', '_')] = false; // $scope.refreshform(); $state.go("app.means.list"); }); }else{ SweetAlert.swal({ title: "系统错误", text: "系统错误,请稍后重试!", type: "error", confirmButtonColor: "#DD6B55" }); } $scope.ldloading[style.replace('-', '_')] = false; }); }else{ //新建 var type=2; api_sysinfo.getSerialnumber(type,templateitem.id).then(function(data){ if(data&&data.status==200){ cidata.uuid=data.uuid; api_cmdb.create(cidata).then(function(response){ if(response){ var resData = Restangular.stripRestangular(response); SweetAlert.swal({ title: "保存成功!", text: "内部编号:"+cidata.uuid, confirmButtonColor: "#007AFF" },function(){ $state.go("app.means.list"); }); // if(resData.status){ // resData // } }else{ SweetAlert.swal({ title: "系统错误", text: "系统错误,请稍后重试!", type: "error", confirmButtonColor: "#DD6B55" }); } $scope.ldloading[style.replace('-', '_')] = false; }); }else{ SweetAlert.swal({ title: "系统错误", text: "内部编号生成出错!", type: "error", confirmButtonColor: "#DD6B55" }); } }) } }else{ SweetAlert.swal({ title: "错误", text: "错误,请选择资产分类!", type: "error", confirmButtonColor: "#DD6B55" }); } //alert(JSON.stringify(cidata), null, 2); $scope.ldloading[style.replace('-', '_')] = true; return; var _ = window._; vm.model = (function filter(obj) { var filtered = _.pick(obj, function (v) { return angular.isDefined(v) && v !== null && (angular.isArray(v)?v.length>0:true) && (_.isPlainObject(v)?(!_.isEmpty(v)):true); }); return _.cloneDeep(filtered, function (v) { return v !== filtered && _.isPlainObject(v) ? filter(v) : undefined; }); })(vm.model); }else{ if(vm.form.$$parentForm.$error){ SweetAlert.swal({ title: "校验错误", text: "请填写必填项!", type: "error", confirmButtonColor: "#DD6B55" }); angular.forEach(vm.form.$$parentForm.$error.required, function(item){ angular.forEach(vm.tabs,function(tab){ angular.forEach(tab.form.fields,function(f){ if(f.name == item.$name){ f.validation.show = true; tab.active=true; } }) }) }); $scope.ldloading[style.replace('-', '_')] = false; } } }; $scope.vm = vm; //树形图 var apple_selected, tree, treedata_avm, treedata_geography; $scope.my_tree_handler = function (branch) { //var _ref; // var classify=$scope.classify=branch.prefix.toLowerCase()+branch.sign; // api_cmdb.query({'sign':classify}).then(function(data){ // var myData = Restangular.stripRestangular(data); // // console.log(myData.data.node); // if(myData.data&&myData.status==200){ // var ret = myData.data; // redrawSvg(myData); // } // }); // $scope.ciId = undefined; // var classify=$scope.classify=branch.prefix.toLowerCase()+branch.sign; // api_configure_form.renderTabForm(classify).then(function(data){ // var myData = Restangular.stripRestangular(data); // //angular.extend($scope.vm.fields,result.fields); // //angular.extend($scope.vm.model,result.model); // $scope.templateProps = myData; // $scope.vm.tabs = myData; // vm.model = {}; // decodeVMTabForm(vm.model, vm.tabs); // //$scope.vm.originalTabs = angular.copy($scope.vm.form); // //console.log(myData); // }); }; $scope.my_data = []; function convertListToTree(data, treeMap){ var idToNodeMap = {}; //Keeps track of nodes using id as key, for fast lookup var root = null; //Initially set our loop to null var parentNode = null; //loop over data for(var i = 0; i < data.length; i++) { var datum = data[i]; //each node will have children, so let's give it a "children" poperty datum.children = []; //add an entry for this node to the map so that any future children can //lookup the parent idToNodeMap[datum.id] = datum; //Does this node have a parent? if(typeof datum.parent === "undefined" || datum.parent == null) { //Doesn't look like it, so this node is the root of the tree root = datum; treeMap[datum.id] = root; } else { //This node has a parent, so let's look it up using the id parentNode = idToNodeMap[datum.parent.id]; //We don't need this property, so let's delete it. delete datum.parent; //Let's add the current node as a child of the parent node. parentNode.children.push(datum); } } return root; } function convertParentToChildList(data){ var treeMap = {}; var list=[]; convertListToTree(data, treeMap); angular.forEach(treeMap,function(item){ list.push(item); }); return list; } $scope.my_tree = tree = {}; $scope.try_async_load = function () { $scope.my_data = []; $scope.select_treedata = []; $scope.doing_async = true; api_configure_data.fetchDataList('ciclassify',{'idx':0,'sum':100}).then(function(result){ //console.log(result['list']); $scope.select_treedata = $scope.my_data = convertParentToChildList(result['list']); $scope.doing_async = false; // tree.expand_all(); //console.log(treelist); }); }; $scope.select_treedata = []; $scope.propTypeOptions = []; $scope.try_async_load(); $scope.onFilterCallback = function(item){ //console.log(item); if(angular.isDefined(item.children)&&item.children.length>=1){ //not valid }else{ var tempclassify=item.prefix.toLowerCase()+item.sign; $scope.cifilter_classic=tempclassify; $scope.templateitem=item; api_configure_form.renderTabForm(tempclassify).then(function(data){ var myData = Restangular.stripRestangular(data); $scope.propTypeOptions = myData; $scope.templateProps = myData; $scope.vm.tabs = myData; vm.model = {}; decodeVMTabForm(vm.model, vm.tabs); }); } } $scope.refreshform = function(){ if($stateParams.model){ var modeldata=JSON.parse($stateParams.model) api_configure_form.renderTabForm(modeldata.model.label).then(function(data){ var myData = Restangular.stripRestangular(data); $scope.templateProps = myData; $scope.vm.tabs = myData; vm.model = {}; vm.model=$scope.vm.model=decodeCIModel(modeldata.model); vm.model["loginUser"]= $rootScope.user.name; console.log(vm.model); decodeVMTabForm(vm.model, vm.tabs); console.log(myData); }); } } $scope.refreshform(); }]);