'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(); var modalInstance = $modal.open({ templateUrl: 'assets/views/delete.html', controller: function($scope, scope, $modalInstance, api_bpm_data) { 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; $scope.ok = function() { $modalInstance.close(cidata); }; $scope.cancel = function() { $modalInstance.dismiss('cancel'); }; } }, size: 'sm', resolve: { scope: function() { return $scope; } } }); modalInstance.result.then(function(selectedItem) { if (selectedItem) { // if (selectedItem.length > 0) { api_cmdb.put(selectedItem, selectedItem.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 { // SweetAlert.swal({ // title: "操作异常!", // text: "系统异常,请稍后重试,或者联系管理员!", // type: "error" // }); // } } }) } // }) // 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(); } ]);