Bläddra i källkod

添加附件功能

hy 6 år sedan
förälder
incheckning
eeca4d1453

+ 27 - 0
frontend/saas-web/app/Application.scss

@@ -657,3 +657,30 @@ input::-webkit-input-placeholder {
     }
   }
 }
+
+.x-form-filefield{
+  .x-form-item-body{
+    .x-form-trigger-wrap{
+      .x-form-trigger{
+        background: #f7f7f7 !important;
+      }
+    } 
+  }
+}
+
+.x-filefield-button{
+  margin-top: 8px !important
+}
+.x-form-download-trigger {
+	background: #fff url(../resources/images/default/download.png) no-repeat center
+    center !important;
+}
+.x-form-trash-trigger {
+	background: #fff url(../resources/images/default/delete.png) no-repeat center
+    center !important;
+}
+.x-fieldset{
+  .x-form-trigger-default:before{
+    content:""
+  }
+}

+ 14 - 2
frontend/saas-web/app/util/FormUtil.js

@@ -20,7 +20,7 @@ Ext.define('saas.util.FormUtil', {
 
                     items = me.applyItemsGroup(defaultItems || []);
                     items = me.initItems(items);
-                    items = me.applyCusMainItemConfig(items, cfg);
+                    items = me.applyCusMainItemConfig(items, cfg, form);
                     items = me.applyCusDetailItemConfig(items, cfg);
 
                     form.configItems = items;
@@ -198,7 +198,7 @@ Ext.define('saas.util.FormUtil', {
         },
 
         // 将自定义配置应用到默认items
-        applyCusMainItemConfig: function(items, cfg) {
+        applyCusMainItemConfig: function(items, cfg, form) {
             let me = this,
             cusMainItems = cfg.main || [];
 
@@ -218,6 +218,11 @@ Ext.define('saas.util.FormUtil', {
                     });
                     
                 }
+                //附件名称的自定义字段 使用附件类型
+                if(item.fieldLabel == '附件' && item.name.indexOf('_text')>-1){
+                    item.xtype = 'mfilefield'
+                    form.renderMF = item.name
+                }
             });
 
             Ext.Array.sort(items, function(a, b) {
@@ -421,6 +426,13 @@ Ext.define('saas.util.FormUtil', {
                         }
                         form.initFormData(o);
                         form.fireEvent('load', form, o);
+
+                        //渲染附件
+                        if(form.renderMF&&form.down('[name='+form.renderMF+']')){
+                            let MF = form.down('[name='+form.renderMF+']')
+                            MF.value = o.main[form.renderMF]
+                            MF.renderMF(MF)
+                        }
                     }
                 })
                 .catch(function(e) {

+ 228 - 0
frontend/saas-web/app/view/core/form/field/FileField.js

@@ -0,0 +1,228 @@
+/**
+ * 多文件上传下载
+ */
+Ext.define('saas.view.core.form.field.FileField', {
+	extend: 'Ext.form.FieldSet',
+	alias: 'widget.mfilefield',
+	minHeight: 22,
+	collapsible: true,
+	multi: true,
+	allowBlank:true,
+	initComponent: function() {
+		this.columnWidth = 1;//强制占一行
+		this.cls = '';
+		this.title = this.title || '附件';
+		this._title = this.title;
+		this.callParent(arguments);
+	},
+	layout:'column',
+	items: [{
+		xtype: 'form',
+		columnWidth: 1,
+		frame: false,
+		border: false,
+		minHeight: 22,
+		bodyStyle: 'padding:2px;background:#f7f7f7',
+		layout: 'hbox',
+		items: [{
+			xtype: 'filefield',
+			name: 'file',
+			cls:'x-form-filefield',
+			buttonText: '浏览文件(≤20MB)',
+			buttonOnly: true,
+			hideLabel: true,
+			buttonConfig:{
+				cls:'x-filefield-button'
+			},
+			createFileInput : function() {
+	            var me = this;
+	            me.fileInputEl = me.button.el.createChild({
+	            name: me.getName(),
+	            cls: Ext.baseCSSPrefix + 'form-file-input',
+	            tag: 'input',
+	            type: 'file',
+	            multiple:'multiple',
+	            size: 1
+	           }).on('change', me.onFileChange, me);
+	        },
+			listeners: {
+				change: function(field){
+					if(field.value != null){
+						field.ownerCt.ownerCt.upload(field.ownerCt, field);
+					}
+				}
+			}
+		}]
+	}],
+	setValue: function(value){
+		this.value = value;
+		this.dirty = true;
+		this.ownerCt.viewModel.data[this.name] = this.value
+	},
+	getValue: function (){
+		return this.down('hidden').value;
+	},
+	renderMF: function(f){
+		f.setHtml(null);
+		var form = f.ownerCt;			
+		if(f.value != null && f.value.toString().trim() != ''){
+			f.download(f.value,f.name);
+		}
+		if(typeof(form.readOnly)!="undefined"){
+			f.setReadOnly(form.readOnly);
+		}
+	},
+	/**
+	 * 上传附件
+	 */
+	upload: function(form, field){
+		var me = this;
+		var myForm = field.ownerCt;
+		var fileEl = field.fileInputEl.dom;
+		var fd = new FormData();
+		fd.append('file', fileEl.files[0]);
+		fd.append('folderId', 0);
+		form.setLoading(true);
+		Ext.Ajax.request({
+			url: '/api/file/upload',//这里是填写需要跨域访问的URL
+			cors: true,
+			useDefaultXhrHeader: false,
+			method: 'post',
+			rawData: fd,
+			headers: {
+				'Access-Control-Allow-Origin': '*',
+				'Authorization':  saas.util.State.get('session').token,
+				//"Content-Type": 'multipart/form-data'  //文件上传的格式, 
+				"Content-Type":null
+			},
+			success: function (response, opts) {
+				form.setLoading(false);
+				var res = Ext.decode(response.responseText);
+				if(res.success){
+					saas.util.BaseUtil.showSuccessToast('上传成功');
+					var data = res.data;
+					var name = data.name + "  (" + Ext.util.Format.fileSize(data.size) + ")";
+					var w = Math.min((me.getStrLength(name) + 25) / 200, .8);
+					if(data.id){
+						field = Ext.create('saas.view.core.form.field.TrashField', {
+							fileName: data.name,
+							value: name,
+							columnWidth: w,
+							readOnly: false,
+							editable: false,
+							filepath: data.fullPath,
+							filesize: data.size,
+							_id:data.id,
+							fieldStyle: 'background:#E0EEEE;'
+						});
+						me.add(field);
+						val = (me.value || '') + data.id + ';';
+						// //添加FilePath表的ID
+						me.setValue(val);
+					}
+				}else{
+					saas.util.BaseUtil.showErrorToast('上传失败: ' + res.message);
+				}
+			},
+			failure: function (response, opts) {
+				form.setLoading(false);
+				var res = Ext.decode(response.responseText);
+				saas.util.BaseUtil.showErrorToast('上传失败: ' + res.message);
+			}
+		});
+	},
+	/**
+	 * 根据id读取对应PATH
+	 * @param id{String} fp_id
+	 */
+	download: function(id,name){
+		var me = this;
+		me.clearAll();
+		var files = new Array();	
+		Ext.Ajax.request({
+			url : '/api/file/info',
+			async: false,
+			params: {
+				ids:  id
+			},
+			method : 'GET',
+			callback : function(options,success,response){
+				var res = new Ext.decode(response.responseText);
+				if(res.exception || res.exceptionInfo){
+					showError(res.exceptionInfo);
+					return;
+				}
+				files = res.data != null ? res.data : [];
+			}
+		});		
+		Ext.each(files, function(f){
+			var name = f.name + "  (" + Ext.util.Format.fileSize(f.size) + ")";
+			var w = Math.min((me.getStrLength(name) + 25) / 200, .8);
+			me.addItem(Ext.create('saas.view.core.form.field.TrashField', {
+				fileName: f.name,
+				value: name,
+				columnWidth: w,
+				readOnly: false,
+				editable: false,
+				filepath: f.fullPath,
+				filesize: f.size,
+				_id:f.id,
+				fieldStyle: 'background:#E0EEEE;'
+			}));
+		});
+	},
+	
+	checkUploadAmount:function(form){
+		var files = form.getEl().down('input[type=file]').dom.files;
+		var amounts = 0;
+		for (var i = 0; i < files.length; i++) {
+			amounts = amounts + files[i].size
+		}
+		if (amounts>104857600) {
+			Ext.MessageBox.alert("警告","对不起,上传文件总大小超过100m");
+			return false
+		}
+		return true;
+	},
+	addItem: function(item){
+		this.add(item);
+	},
+	setReadOnly: function(bool){
+		//只读情况下限制不允许上传
+		var f=this.down('filefield');
+		if(f.button&&f.fileInputEl){
+			//若界面配置字段可修改则允许传附件 
+			if(this.modify) bool=false;
+			f.button.setDisabled(bool);
+			if(bool) {
+				f.fileInputEl.dom.setAttribute('disabled',bool);	
+			}else f.fileInputEl.dom.removeAttribute('disabled');			
+		}
+	},
+	setFieldStyle: function(str) {
+
+	},
+	getStrLength: function(str) {
+		for (var len = str.length, c = 0, i = 0; i < len; i++) 
+        	str.charCodeAt(i) < 27 || str.charCodeAt(i) > 126 ? c += 2 : c++;
+        return c;
+	},
+	clearAll: function() {
+		var me = this, items = me.query('trashfield');
+		Ext.Array.each(items, function(item){
+			me.remove(item);
+		});
+		me.filesize = 0;
+	},
+	checkFile:function(fileName){
+		var arr=['php','php2','php3', 'php5', 'phtml', 'asp', 'aspx', 'ascx', 'jsp', 'cfm', 'cfc', 'pl','pl','bat',  'dll', 'reg', 'cgi','war'];
+	    var suffix=fileName.substring(fileName.lastIndexOf(".")+1);
+	    return Ext.Array.contains(arr,suffix);
+	},
+	isValid:function(){
+		return true;
+	},
+	isDirty:function(){
+		return this.dirty;
+	}
+});

+ 120 - 0
frontend/saas-web/app/view/core/form/field/TrashField.js

@@ -0,0 +1,120 @@
+/**
+ * 显示附件名称、大小;
+ * 附件删除、下载、显示
+ */
+Ext.define('saas.view.core.form.field.TrashField', {
+	extend : 'Ext.form.field.Trigger',
+	alias : 'widget.trashfield',
+	trigger1Cls: 'x-form-download-trigger',
+    trigger2Cls: 'x-form-trash-trigger',
+    style:'margin:5px 0 0 0',
+	fieldStyle: 'background:#C6E2FF;color:#D9D9D9;',
+    autoShow: true,
+	initComponent : function() {
+		this.callParent(arguments);
+	},
+	listeners : {
+		afterrender : function() {
+			var me = this, c = Ext.Function.bind(me.onTrigger1Click, me);
+			Ext.EventManager.on(me.inputEl, {
+				click : c,
+				scope : me,
+				buffer : 100
+			});
+			Ext.DomHelper.applyStyles(me.inputEl.dom, 'border:none;');
+			//取消延时影藏trigger的写法 
+		/*	// 只读时,隐藏删除trigger
+			Ext.defer(function(){
+				var form = me.up('form');
+				if(me.ownerCt.readOnly) {
+					me.getEl().down("." + me.trigger2Cls).applyStyles({visibility: 'hidden'});
+				}
+			}, 200);*/
+		}
+	},
+	onTrigger1Click: function(e){
+        this.download();
+	},
+	onTrigger2Click: function(){
+		var me = this;
+		saas.util.BaseUtil.warnMsg('确定删除' + me.value, function(btn){
+			if(btn == 'yes'){
+                var v = me.ownerCt.value.replace(me._id+';','')
+                me.ownerCt.setValue(v);
+                me.ownerCt.remove(me)
+				// var v = me.ownerCt.down('hidden').value.replace(me.filepath + ';', '');
+				// me.updateAttachField(v, '删除附件', function(){
+				// 	me.ownerCt.down('hidden').setValue(v);
+				// 	me.ownerCt.filesize -= me.filesize;
+				// 	me.ownerCt.setTitle('<img src="' + basePath + 'resource/images/icon/clip.png" width=20 height=20/>附件' + 
+				// 			'(总大小:' + Ext.util.Format.fileSize(me.ownerCt.filesize) + ")");
+				// });
+			}
+		});
+	},
+	download : function() {
+        var me = this;
+        var serverOptions = Ext.manifest.server;
+		window.location.href = (serverOptions.basePath.https?serverOptions.basePath.https:serverOptions.basePath) + '/api/file/download?path='+me.filepath;
+	},
+	showAttach : function() {
+		var me = this,src = basePath + 'common/download.action?path=' + me.realpath.replace(/\+/g, '%2B')+"&size="+me.filesize+"&fileName="+me.fileName;
+		var img = document.createElement("img");
+		img.src = src;		 		
+		myWindow=window.open(); 
+		myWindow.document.body.appendChild(img);
+		myWindow.focus();
+	},
+	isImage : function(path) {
+		if (Ext.isEmpty(path)) {
+			return false;
+		}
+		if (!/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(path)) {
+			return false;
+		}
+		return true;
+	},
+	resetField:function(bool){		
+	    var me=this;
+		if(bool)
+		me.getEl().down("." + me.trigger2Cls).applyStyles({visibility: 'hidden'});
+		else{
+			 me.getEl().down("." + me.trigger2Cls).applyStyles({visibility: 'visible'});
+		}
+	},
+	updateAttachField: function(value, type, fn) {
+		var form = this.ownerCt.ownerCt;
+		if(form.keyField){
+			var field = this.ownerCt.name,me = this, val = Ext.getCmp(form.keyField).value;
+			if(!Ext.isEmpty(val)&&!(caller.indexOf("$")!=-1 && form.keyField=="cl_id")) {//通用变更单上的附件字段,删除附件时后台不删除
+				Ext.Ajax.request({
+					url: basePath + 'common/attach/update.action',
+					params: {
+						caller: caller,
+						table: form.tablename.toUpperCase().split("LEFT")[0],
+						update: field + '=\'' + value + '\'',
+						condition: form.keyField + "='" + val+"'",
+						type: type
+					},
+					callback: function(opt, s, r) {
+						var res = Ext.decode(r.responseText);
+						if(res.success) {
+							if(fn) {
+								fn.call();
+								me.destroy();
+							}
+						} else {
+							showError(res.exceptionInfo);
+						}
+					}
+				});
+			} else {
+				fn && fn.call();
+				this.destroy();
+			}
+		} else{
+				fn && fn.call();
+				this.destroy();
+		}
+	}
+});

+ 1 - 1
frontend/saas-web/app/view/purchase/b2b/quotationList/DataList.js

@@ -534,7 +534,7 @@ Ext.define('saas.view.purchase.b2b.quotationList.DataList', {
                     }
                     b.ownerCt.setLoading(true)
                     Ext.Ajax.request({  
-                        url : 'http://10.1.80.36:8560/api/purchase/purchase/inquiry/turnPurchase',
+                        url : '/api/purchase/purchase/inquiry/turnPurchase',
                         timeout: 8000,  
                         headers:{
                             'Access-Control-Allow-Origin': '*',

+ 2 - 2
frontend/saas-web/app/view/sys/config/FormPanel.js

@@ -223,7 +223,7 @@ Ext.define('saas.view.sys.config.FormPanel', {
         },{
             xtype:'displayfield',
             margin:'0 0 0 150',
-            value:'支持 JPG、JPEG、PNG、BMP 格式 , 图片小于10M ',  
+            value:'支持 JPG、JPEG、PNG、BMP 格式 , 图片小于20M ',  
         },{
             xtype: 'image',
             width: 100,
@@ -352,7 +352,7 @@ Ext.define('saas.view.sys.config.FormPanel', {
         },{
             xtype:'displayfield',
             margin:'0 0 0 150',
-            value:'支持 JPG、JPEG、PNG、BMP 格式 , 图片小于10M ',  
+            value:'支持 JPG、JPEG、PNG、BMP 格式 , 图片小于20M ',  
         },{
             xtype: 'image',
             style:'border:1px solid #f7f7f7;',

BIN
frontend/saas-web/resources/images/default/delete.png


BIN
frontend/saas-web/resources/images/default/download.png