Explorar o código

核销单设计

zhuth %!s(int64=7) %!d(string=hai) anos
pai
achega
53d2274ea9

+ 28 - 0
frontend/saas-web/app/model/money/Verification1.js

@@ -0,0 +1,28 @@
+Ext.define('saas.model.money.Verification1', {
+    extend: 'saas.model.Base',
+    fields: [
+        { name: 'id', type: 'int' },
+        { name: 'vd_id', type: 'int' },
+        { name: 'vd_vcid', type: 'int' },
+        { name: 'vd_detno', type: 'int' },
+        { name: 'vd_ym', type: 'int' },
+        { name: 'vd_slid', type: 'int' },
+        { name: 'vd_slcode', type: 'string' },
+        { name: 'vd_slkind', type: 'string' },
+        { name: 'vd_sldate', type: 'date' },
+        { name: 'vd_amount', type: 'float' },
+        { name: 'vd_nowbalance', type: 'float' },
+        { name: 'vd_remark', type: 'string' },
+        { name: 'companyId', type: 'int' },
+        { name: 'updaterId', type: 'int' },
+        { name: 'vd_text1', type: 'string' },
+        { name: 'vd_text2', type: 'string' },
+        { name: 'vd_text3', type: 'string' },
+        { name: 'vd_text4', type: 'string' },
+        { name: 'vd_text5', type: 'string' },
+        { name: 'creator', type: 'string' },
+        { name: 'creatorId', type: 'int' },
+        { name: 'createTime', type: 'date' },
+        { name: 'updater', type: 'string' },
+    ]
+});

+ 155 - 138
frontend/saas-web/app/util/FormUtil.js

@@ -7,22 +7,11 @@ Ext.define('saas.util.FormUtil', {
         // 模板替换正则
         urlRe: /(.*){viewName}(.*)/g,
 
-        /**
-         * 获得form的字段配置
-         * @param form: form组件
-         * @param url: url
-         */
         setItems: function(form) {
             var me = this,
-            viewName = form.viewName,
-            defaultItems = form.defaultItems,
-            brr = [],
-            formModel = form.getViewModel(),
-            url = me.baseUrl.replace(me.urlRe, '$1' + viewName);
-            
-            brr = brr.concat(form.defaultItems);
+            defaultItems = form.defaultItems;
 
-            saas.util.BaseUtil.request({url, async: false})
+            me.applyCusItemConfig(form)
             .then(function(res) {
                 if(res.success) {
                     var config = res.data || true, items = defaultItems || [];
@@ -34,155 +23,183 @@ Ext.define('saas.util.FormUtil', {
                             });
                             Ext.apply(item, cusItem);
                         });
-                        Ext.Array.each(items, function(item) {
+                        items = me.applyDefaultItems(form, items);
+                    }
+                    form.removeAll();
+                    return form.addItems(items);
+                }else {
+                    return []
+                }
+            })
+            .then(function(items) {
+                form.fireEvent('afterSetItems', form, items);
+            })
+            .then(function() {
+                form.inited || me.loadData(form);
+            })
+            .catch(function(response) {
+                saas.util.BaseUtil.showToast('错误:' + response.message);
+                console.error(response);
+            });
 
-                            // 设置必填
-                            if(item.allowBlank==false){
-                                // TODO 需要判断类型
-                                item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
-                            }
+        },
 
-                            if(item.xtype == 'textfield') {
-                                Ext.applyIf(item, {
-                                    maxLength: 50
-                                });
-                            }
-                            
-                            if(item.xtype == 'datefield') {
-                                Ext.applyIf(item, {
-                                    editable: false,
-                                    format: 'Y-m-d'
-                                });
-                            }
+        /**
+         * 获得form的客户自定义字段配置
+         * @param form: form组件
+         * @param url: url
+         */
 
-                            if(item.xtype == 'numberfield') {
-                                Ext.applyIf(item, {
-                                    hideTrigger: true, // 隐藏trigger
-                                    mouseWheelEnabled: false // 取消滚轮事件
-                                });
-                                // 设置默认值为0
-                                formModel.set(item.name, 0);
-                            }
+        applyCusItemConfig: function(form) {
+            var me = this,
+            viewName = form.viewName,
+            defaultItems = form.defaultItems,
+            url = me.baseUrl.replace(me.urlRe, '$1' + viewName);
+            return saas.util.BaseUtil.request({url, async: false});
+        },
 
-                            // 如果是从表为其绑定store
-                            if(item.xtype == 'detailGridField') {
-                                var index = form.detailCount;
-                                var columns = item.columns,
-                                cnames = columns.filter(function(c) {
-                                    return c.dataIndex && !c.ignore;
-                                }).map(function(c) {
-                                    return c.dataIndex
-                                }),
-                                defaultValueColumns = {};
+        /**
+         * 处理formitems的一些默认配置
+         */
+        applyDefaultItems: function(form, items) {
+            var me = this,
+            formModel = form.getViewModel();
 
-                                Ext.Array.each(columns, function(c) {
+            Ext.Array.each(items, function(item) {
 
-                                    if(c.dataIndex && c.defaultValue) {
-                                        defaultValueColumns[c.dataIndex] = c.defaultValue;
-                                    }
+                // 设置必填
+                if(item.allowBlank==false){
+                    // TODO 需要判断类型
+                    item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
+                }
 
-                                    // 不可锁定
-                                    Ext.applyIf(c, {
-                                        lockable: false,
-                                        width: 120
-                                    });
+                if(item.xtype == 'textfield') {
+                    Ext.applyIf(item, {
+                        maxLength: 50
+                    });
+                }
+                
+                if(item.xtype == 'datefield') {
+                    Ext.applyIf(item, {
+                        editable: false,
+                        format: 'Y-m-d'
+                    });
+                }
 
-                                    //必填
-                                    Ext.applyIf(c, {
-                                        allowBlank: true
-                                    });
-                                    if(!c.allowBlank){
-                                        c.cls = 'x-grid-necessary';
-                                    }
+                if(item.xtype == 'numberfield') {
+                    Ext.applyIf(item, {
+                        hideTrigger: true, // 隐藏trigger
+                        mouseWheelEnabled: false // 取消滚轮事件
+                    });
+                    // 设置默认值为0
+                    formModel.set(item.name, 0);
+                }
 
-                                    if(c.xtype == 'textfield') {
-                                        Ext.applyIf(c, {
-                                            maxLength: 50
-                                        });
-                                    }else if(c.xtype == 'datecolumn') {
-                                        Ext.applyIf(c, {
-                                            format: 'Y-m-d'
-                                        });
-                                    }else if(c.xtype == 'numbercolumn') {
-                                        Ext.applyIf(c, {
-                                            align: 'end'
-                                        });
-                                    }
-                                    
-                                    var editor = c.editor;
-                                    if(editor) {
-                                        Ext.applyIf(editor, {
-                                            selectOnFocus: true
-                                        });
-                                        if(editor.xtype == 'numberfield') {
-                                            Ext.applyIf(editor, {
-                                                hideTrigger: true, // 隐藏trigger
-                                                mouseWheelEnabled: false // 取消滚轮事件
-                                            });
-                                        }else if(editor.xtype == 'datefield') {
-                                            Ext.apply(editor, {
-                                                format: 'Y-m-d'
-                                            });
-                                            Ext.applyIf(editor, {
-                                                editable: false
-                                            });
-                                        }
-                                    }
-                                });
+                // 如果是从表为其绑定store
+                if(item.xtype == 'detailGridField') {
+                    var index = form.detailCount;
+                    var columns = item.columns,
+                    cnames = columns.filter(function(c) {
+                        return c.dataIndex && !c.ignore;
+                    }).map(function(c) {
+                        return c.dataIndex
+                    }),
+                    defaultValueColumns = {};
 
-                                if(columns[columns.length - 1].flex != 1) {
-                                    columns.push({
-                                        flex: 1,
-                                        allowBlank: true
-                                    });
-                                }
+                    Ext.Array.each(columns, function(c) {
 
-                                cnames.push(item.detnoColumn);
+                        if(c.dataIndex && c.defaultValue) {
+                            defaultValueColumns[c.dataIndex] = c.defaultValue;
+                        }
 
-                                formModel.set('detail' + index + '.detailBindFields', cnames);
-                                item.bind = {
-                                    store: '{detail' + index + '.detailStore}'
-                                };     
-                                formModel.set('detail' + index + '.detailStore', Ext.create('Ext.data.Store', {
-                                    model:item.storeModel,
-                                    data: [],
-                                    listeners: {
-                                        add: function(store, records, index, eOpts) {
-                                            Ext.Array.each(records, function(r) {
-                                                for(k in defaultValueColumns) {
-                                                    r.set(k, defaultValueColumns[k]);
-                                                }
-                                                r.commit();
-                                            });
-                                        }
-                                    }
-                                }));
+                        // 不可锁定
+                        Ext.applyIf(c, {
+                            lockable: false,
+                            width: 120
+                        });
 
-                                form.detailCount++;
+                        //必填
+                        Ext.applyIf(c, {
+                            allowBlank: true
+                        });
+                        if(!c.allowBlank){
+                            c.cls = 'x-grid-necessary';
+                        }
+
+                        if(c.xtype == 'textfield') {
+                            Ext.applyIf(c, {
+                                maxLength: 50
+                            });
+                        }else if(c.xtype == 'datecolumn') {
+                            Ext.applyIf(c, {
+                                format: 'Y-m-d'
+                            });
+                        }else if(c.xtype == 'numbercolumn') {
+                            Ext.applyIf(c, {
+                                align: 'end'
+                            });
+                        }
+                        
+                        var editor = c.editor;
+                        if(editor) {
+                            Ext.applyIf(editor, {
+                                selectOnFocus: true
+                            });
+                            if(editor.xtype == 'numberfield') {
+                                Ext.applyIf(editor, {
+                                    hideTrigger: true, // 隐藏trigger
+                                    mouseWheelEnabled: false // 取消滚轮事件
+                                });
+                            }else if(editor.xtype == 'datefield') {
+                                Ext.apply(editor, {
+                                    format: 'Y-m-d'
+                                });
+                                Ext.applyIf(editor, {
+                                    editable: false
+                                });
                             }
+                        }
+                    });
+
+                    if(columns[columns.length - 1].flex != 1) {
+                        columns.push({
+                            flex: 1,
+                            allowBlank: true
                         });
                     }
-                    return form.addItems(items);
-                }else {
-                    return []
+
+                    cnames.push(item.detnoColumn);
+
+                    formModel.set('detail' + index + '.detailBindFields', cnames);
+                    item.bind = {
+                        store: '{detail' + index + '.detailStore}'
+                    };     
+                    formModel.set('detail' + index + '.detailStore', Ext.create('Ext.data.Store', {
+                        model:item.storeModel,
+                        data: [],
+                        listeners: {
+                            add: function(store, records, index, eOpts) {
+                                Ext.Array.each(records, function(r) {
+                                    for(k in defaultValueColumns) {
+                                        r.set(k, defaultValueColumns[k]);
+                                    }
+                                    r.commit();
+                                });
+                            }
+                        }
+                    }));
+
+                    form.detailCount++;
                 }
-            })
-            .then(function(items) {
-                form.fireEvent('afterSetItems', form, items);
-            })
-            .then(function() {
-                me.loadData(form);
-            })
-            .catch(function(response) {
-                saas.util.BaseUtil.showToast('错误:' + response.message);
-                console.error(response);
             });
 
+            return items;
         },
 
         loadData: function(form) {
             var me = this;
             form.setLoading(true);
+            form.inited = true;
             if(form.initId && form.initId!=0) {
                 var url = form._readUrl + form.initId;
                 saas.util.BaseUtil.request({url })

+ 6 - 1
frontend/saas-web/app/view/core/form/FormPanel.js

@@ -49,7 +49,7 @@ Ext.define('saas.view.core.form.FormPanel', {
         auditTexts = me.auditTexts;
         me._deleteMsg = '删除的'+me._title+'将不能恢复,请确认是否删除?';
         me.initViewModel();
-        saas.util.FormUtil.setItems(me);
+        me.initFormItems();
 
         me.defaultBtns = me.defaultBtns || [{
             cls: 'x-formpanel-btn-orange',
@@ -128,6 +128,11 @@ Ext.define('saas.view.core.form.FormPanel', {
         me.callParent(arguments);
     },
 
+    initFormItems: function() {
+        var me = this;
+        saas.util.FormUtil.setItems(me);
+    },
+
     getToolBarItems: function() {
         var me = this, items = [];
         var codeHeaderItems = [{

+ 1 - 1
frontend/saas-web/app/view/core/form/field/DetailGridField.js

@@ -201,7 +201,7 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
         selectedRecord = me.selModel.lastSelected,
         datas = [];
 
-        num = num || 3
+        num = num || 3;
 
         //当前行后序号全部加1
         var detno = selectedRecord ? selectedRecord.data[detnoColumn] : 0;

+ 528 - 0
frontend/saas-web/app/view/money/verification/FormPanel.js

@@ -0,0 +1,528 @@
+Ext.define('saas.view.money.verification.FormPanel', {
+    extend: 'saas.view.core.form.FormPanel',
+    // extend: 'Ext.panel.Panel',
+    xtype: 'money-verification-formpanel',
+
+    controller: 'money-verification-formpanel',
+    viewModel: 'money-verification-formpanel',
+
+    viewName: 'money-verification-formpanel',
+
+    caller: 'Verification',
+
+    //字段属性
+    _title: '核销单',
+    _idField: 'vc_id',
+    _codeField: 'vc_code',
+    _statusField: 'vc_status',
+    _statusCodeField: 'vc_statuscode',
+
+    _readUrl: '/api/money/verification/read/',
+    _saveUrl: '/api/money/verification/save/',
+    _auditUrl: '/api/money/verification/audit/',
+    _unAuditUrl: '/api/money/verification/unAudit/',
+    _deleteUrl: '/api/money/verification/delete/',
+
+    defatulType: 'receipts_offset_receivable',
+
+    etc: {
+
+        /**
+         * 预收:receipts
+         * 预付:prepaid
+         * 应收:receivable
+         * 应付:payable
+         */
+
+        // base
+        base: [{
+            xtype: 'combo',
+            name: 'vc_kind',
+            fieldLabel: '业务类型',
+            editable: false,
+            store: [
+                ['receipts_offset_receivable', '预收冲应收'],
+                ['prepaid_offset_payable', '预付冲应付'],
+                ['receivable_offset_payable', '应收冲应付'],
+                ['receivable_to_receivable', '应收转应收'],
+                ['payable_to_payable', '应付转应付']
+            ]
+        }],
+
+        detail1: {
+            xtype: "detailGridField",
+            storeModel: 'saas.model.money.Verification1',
+            detnoColumn: 'vd_detno',
+            deleteDetailUrl: '/api/money/verification/deleteDetail1/',
+            columnWidth: 1,
+            columns: [{
+                text: 'ID',
+                dataIndex: 'id',
+                hidden: true
+            }, {
+                text: '来源ID',
+                dataIndex: 'vd_slid',
+                hidden: true
+            }, {
+                text: '来源单号',
+                dataIndex: 'vd_slcode',
+                editor:{
+                    displayField : "display",
+                    editable : true,
+                    format : "",
+                    hideTrigger : false,
+                    maxLength : 100.0,
+                    minValue : null,
+                    positiveNum : false,
+                    queryMode : "local",
+                    store : null,
+                    valueField : "value",
+                    xtype : "multidbfindtrigger"
+                }
+            }, {
+                text: '业务类型',
+                dataIndex: "vd_slkind"
+            }, {
+                text: "单据日期",
+                dataIndex: "vd_sldate",
+                xtype: 'datecolumn'
+            }, {
+                text: "单据金额",
+                xtype: 'numbercolumn',
+                dataIndex: "vd_amount",
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }, {
+                text: "已核销金额",
+                xtype: 'numbercolumn',
+                dataIndex: "sl_yamount",
+                ignore:true,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }, {
+                text: "未核销金额",
+                xtype: 'numbercolumn',
+                dataIndex: "sl_namount",
+                ignore:true,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }, {
+                text: "本次核销金额",
+                xtype: 'numbercolumn',
+                dataIndex: "vd_nowbalance",
+                width:200,
+                editor : {
+                    xtype : "numberfield",
+                    decimalPrecision: 2
+                },
+                allowBlank : false,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }]
+        },
+        detail2: {
+            xtype: "detailGridField",
+            storeModel: 'saas.model.money.Verification1',
+            detnoColumn: 'vd_detno',
+            deleteDetailUrl: '/api/money/verification/deleteDetail2/',
+            columnWidth: 1,
+            columns: [{
+                text: 'ID',
+                dataIndex: 'id',
+                hidden: true
+            }, {
+                text: '来源ID',
+                dataIndex: 'vd_slid',
+                hidden: true
+            }, {
+                text: '来源单号',
+                dataIndex: 'vd_slcode',
+                editor:{
+                    displayField : "display",
+                    editable : true,
+                    format : "",
+                    hideTrigger : false,
+                    maxLength : 100.0,
+                    minValue : null,
+                    positiveNum : false,
+                    queryMode : "local",
+                    store : null,
+                    valueField : "value",
+                    xtype : "multidbfindtrigger"
+                }
+            }, {
+                text: '业务类型',
+                dataIndex: "vd_slkind"
+            }, {
+                text: "单据日期",
+                dataIndex: "vd_sldate",
+                xtype: 'datecolumn'
+            }, {
+                text: "单据金额",
+                xtype: 'numbercolumn',
+                dataIndex: "vd_amount",
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }, {
+                text: "已核销金额",
+                xtype: 'numbercolumn',
+                dataIndex: "sl_yamount",
+                ignore:true,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }, {
+                text: "未核销金额",
+                xtype: 'numbercolumn',
+                dataIndex: "sl_namount",
+                ignore:true,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }, {
+                text: "本次核销金额",
+                xtype: 'numbercolumn',
+                dataIndex: "vd_nowbalance",
+                width:200,
+                editor : {
+                    xtype : "numberfield",
+                    decimalPrecision: 2
+                },
+                allowBlank : false,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                },
+                summaryType: 'sum',
+                summaryRenderer: function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
+            }]
+        },
+        other: {
+            fieldLabel: '备注',
+            xtype: 'textfield',
+            columnWidth: 1,
+            name: 'vc_remark'
+        },
+
+        // 预收冲应收
+        receipts_offset_receivable : {
+            main: [{
+                xtype: 'hidden',
+                fieldLabel: '客户id',
+                name: 'vc_custid',
+            }, {
+                fieldLabel: '客户编号',
+                xtype: 'hidden',
+                name: 'vc_custcode',
+            }, {
+                fieldLabel: '客户名称',
+                xtype: 'customerDbfindTrigger',
+                name: 'vc_custname',
+            }, {
+                fieldLabel: '日期',
+                xtype: 'datefield',
+                name: 'vc_date'
+            }],
+            details: ['detail1', 'detail2']
+        },
+
+        // 预付冲应付
+        prepaid_offset_payable: {
+            main: [{
+                xtype: 'hidden',
+                name: 'vc_vendid',
+                fieldLabel: '供应商ID'
+            }, {
+                xtype: "hidden",
+                name: "vc_vendcode",
+                fieldLabel: "供应商编号"
+            }, {
+                xtype: "vendorDbfindTrigger",
+                name: "vc_vendname",
+                fieldLabel: "供应商名称",
+                allowBlank : false
+            }, {
+                fieldLabel: '日期',
+                xtype: 'datefield',
+                name: 'vc_date'
+            }],
+            details: ['detail1', 'detail2']
+        },
+
+        // 应收冲应付
+        receivable_offset_payable: {
+            main: [{
+                fieldLabel: '客户id',
+                xtype: 'textfield',
+                name: 'vc_custid',
+                hidden: true
+            }, {
+                fieldLabel: '客户编号',
+                xtype: 'textfield',
+                name: 'vc_custcode',
+                hidden: true
+            }, {
+                fieldLabel: '客户名称',
+                xtype: 'customerDbfindTrigger',
+                name: 'vc_custname',
+            }, {
+                xtype: 'hidden',
+                name: 'vc_vendid',
+                fieldLabel: '供应商ID'
+            }, {
+                xtype: "hidden",
+                name: "vc_vendcode",
+                fieldLabel: "供应商编号"
+            }, {
+                xtype: "vendorDbfindTrigger",
+                name: "vc_vendname",
+                fieldLabel: "供应商名称",
+                allowBlank : false
+            }, {
+                fieldLabel: '日期',
+                xtype: 'datefield',
+                name: 'vc_date'
+            }],
+            details: ['detail1', 'detail2']
+        },
+
+        // 应收转应收
+        receivable_to_receivable: {
+            main: [{
+                fieldLabel: '转出客户id',
+                xtype: 'textfield',
+                name: 'vc_outcustid',
+                hidden: true
+            }, {
+                fieldLabel: '转出客户编号',
+                xtype: 'textfield',
+                name: 'vc_outcustcode',
+                hidden: true
+            }, {
+                fieldLabel: '转出客户',
+                xtype: 'customerDbfindTrigger',
+                name: 'vc_outcustname',
+            }, {
+                fieldLabel: '转入客户id',
+                xtype: 'textfield',
+                name: 'vc_turncustid',
+                hidden: true
+            }, {
+                fieldLabel: '转入客户编号',
+                xtype: 'textfield',
+                name: 'vc_turncustcode',
+                hidden: true
+            }, {
+                fieldLabel: '转入客户',
+                xtype: 'customerDbfindTrigger',
+                name: 'vc_turncustname',
+            }, {
+                fieldLabel: '日期',
+                xtype: 'datefield',
+                name: 'vc_date'
+            }],
+            details: ['detail1']
+        },
+
+        // 应付转应付
+        payable_to_payable: {
+            main: [{
+                fieldLabel: '转出供应商id',
+                xtype: 'textfield',
+                name: 'vc_outvendid',
+                hidden: true
+            }, {
+                fieldLabel: '转出供应商编号',
+                xtype: 'textfield',
+                name: 'vc_outvendcode',
+                hidden: true
+            }, {
+                fieldLabel: '转出供应商',
+                xtype: 'vendorDbfindTrigger',
+                name: 'vc_outvendname',
+            }, {
+                fieldLabel: '转入供应商id',
+                xtype: 'textfield',
+                name: 'vc_turnvendid',
+                hidden: true
+            }, {
+                fieldLabel: '转入供应商编号',
+                xtype: 'textfield',
+                name: 'vc_turnvendcode',
+                hidden: true
+            }, {
+                fieldLabel: '转入供应商',
+                xtype: 'vendorDbfindTrigger',
+                name: 'vc_turnvendname',
+            }, {
+                fieldLabel: '日期',
+                xtype: 'datefield',
+                name: 'vc_date'
+            }],
+            details: ['detail1']
+        }
+    },
+
+    // initComponent: function() {
+    //     this.callParent(arguments);
+    // },
+
+    initFormItems: function() {
+        var me = this,
+        cusItems = me.cusItems,
+        defaultItems = me.getAcitveItems(),
+        FormUtil = saas.util.FormUtil;
+        
+        me.detailCount = 0;
+        if(cusItems) {
+            var items = defaultItems || [];
+            Ext.Array.each(cusItems, function(cusItem) {
+                var item = items.find(function(item) {
+                    return item.name == cusItem.name;
+                });
+                Ext.apply(item, cusItem);
+            });
+            items = FormUtil.applyDefaultItems(me, items);
+            me.removeAll();
+            me.addItems(items);
+
+            var grids = me.query('detailGridField');
+            for(var i = 0; i < grids.length; i++) {
+                var grid = grids[i];
+                grid.add10EmptyRow(5);
+            }
+        }else {
+            FormUtil.applyCusItemConfig(me)
+            .then(function(res) {
+                if(res.success) {
+                    var config = res.data || true, items = defaultItems || [];
+                    if(config) {
+                        cusItems = config.items || [];
+                        me.cusItems = cusItems;
+                        Ext.Array.each(cusItems, function(cusItem) {
+                            var item = items.find(function(item) {
+                                return item.name == cusItem.name;
+                            });
+                            Ext.apply(item, cusItem);
+                        });
+                        items = FormUtil.applyDefaultItems(me, items);
+                    }
+                    me.removeAll();
+                    return me.addItems(items);
+                }
+            })
+            .then(function(items) {
+                me.fireEvent('afterSetItems', me, items);
+            })
+            .then(function() {
+                FormUtil.loadData(me);
+            })
+            .catch(function(response) {
+                saas.util.BaseUtil.showToast('错误:' + response.message);
+                console.error(response);
+            });
+        }
+    },
+
+    getAcitveItems: function() {
+        var me = this,
+        acitveType = me.acitveType || me.defatulType,
+        etc = me.etc,
+        acitveEtc = etc[acitveType],
+        mainItems =  acitveEtc.main,
+        details = acitveEtc.details,
+        base = etc.base,
+        detail1 = etc.detail1,
+        detail2 = etc.detail2,
+        other = etc.other,
+        items = [];
+
+        base.defaultValue = acitveType;
+
+        items = Ext.Array.merge(base, mainItems, (details[0] ? [detail1] : []), (details[1] ? [detail2] : []), [other] );
+
+        return items;
+    },
+});

+ 115 - 0
frontend/saas-web/app/view/money/verification/FormPanelController.js

@@ -0,0 +1,115 @@
+Ext.define('saas.view.money.verification.FormPanelController', {
+    extend: 'saas.view.core.form.FormPanelController',
+    alias: 'controller.money-verification-formpanel',
+
+    init: function (form) {
+        var me = this;
+        this.control({
+            // 客户
+            'dbfindtrigger[name=vc_custname]':{
+                beforerender:function(f){
+                    Ext.apply(f,{
+                        //赋值 
+                        dbfinds:[{
+                            from: 'id', to: 'vc_custid',ignore:true
+                        }, {
+                            from:'cu_code', to:'vc_custcode'
+                        },{
+                            from:'cu_name', to:'vc_custname'
+                        }],
+                    }) ;   
+
+                }
+            },
+            // 转出客户
+            'dbfindtrigger[name=vc_outcustname]':{
+                beforerender:function(f){
+                    Ext.apply(f,{
+                        //赋值 
+                        dbfinds:[{
+                            from: 'id', to: 'vc_outcustid',ignore:true
+                        }, {
+                            from:'cu_code', to:'vc_outcustcode'
+                        },{
+                            from:'cu_name', to:'vc_outcustname'
+                        }],
+                    }) ;   
+
+                }
+            },
+            // 转入客户
+            'dbfindtrigger[name=vc_turncustname]':{
+                beforerender:function(f){
+                    Ext.apply(f,{
+                        //赋值 
+                        dbfinds:[{
+                            from: 'id', to: 'vc_turncustid',ignore:true
+                        }, {
+                            from:'cu_code', to:'vc_turncustcode'
+                        },{
+                            from:'cu_name', to:'vc_turncustname'
+                        }],
+                    }) ;   
+
+                }
+            },
+            // 供应商
+            'dbfindtrigger[name=vc_vendname]':{
+                beforerender: function (f) {
+                    Ext.apply(f, {
+                        dbfinds: [{
+                            from: 'id',
+                            to: 'vc_vendid',
+                            ignore: true
+                        }, {
+                            from: 've_code',
+                            to: 'vc_vendcode'
+                        }, {
+                            from: 've_name',
+                            to: 'vc_vendname'
+                        }],
+                    });
+
+                }
+            },
+            // 转出供应商
+            'dbfindtrigger[name=vc_outvendname]':{
+                beforerender: function (f) {
+                    Ext.apply(f, {
+                        dbfinds: [{
+                            from: 'id',
+                            to: 'vc_outvendid',
+                            ignore: true
+                        }, {
+                            from: 've_code',
+                            to: 'vc_outvendcode'
+                        }, {
+                            from: 've_name',
+                            to: 'vc_outvendname'
+                        }],
+                    });
+
+                }
+            },
+            // 转入供应商
+            'dbfindtrigger[name=vc_turnvendname]':{
+                beforerender: function (f) {
+                    Ext.apply(f, {
+                        dbfinds: [{
+                            from: 'id',
+                            to: 'vc_turncustid',
+                            ignore: true
+                        }, {
+                            from: 've_code',
+                            to: 'vc_turnvendcode'
+                        }, {
+                            from: 've_name',
+                            to: 'vc_turnvendname'
+                        }],
+                    });
+
+                }
+            },
+        });
+    },
+});

+ 18 - 0
frontend/saas-web/app/view/money/verification/FormPanelModel.js

@@ -0,0 +1,18 @@
+Ext.define('saas.view.money.verification.FormPanelModel', {
+    extend: 'saas.view.core.form.FormPanelModel',
+    alias: 'viewmodel.money-verification-formpanel',
+
+    formulas: {
+        vc_kind_change: {
+            bind: '{vc_kind}',
+            get: function(v) {
+                var form = this.getView();
+                form.acitveType = v;
+                form.initFormItems();
+
+                return v;
+            }
+        }
+    }
+
+});

+ 77 - 0
frontend/saas-web/app/view/money/verification/QueryPanel.js

@@ -0,0 +1,77 @@
+Ext.define('saas.view.money.verification.QueryPanel', {
+    extend: 'saas.view.core.query.QueryPanel',
+    xtype: 'money-verification-querypanel',
+
+    controller: 'money-verification-querypanel',
+    viewModel: 'money-verification-querypanel',
+
+    viewName: 'money-verification-querypanel',
+    
+    queryFormItems: [{
+        xtype: 'hidden',
+        name: 'rb_id',
+        fieldLabel: 'ID',
+        allowBlank: true,
+        getCondition: function(value) {
+            return 'rb_id=' + value;
+        }
+    }, {
+        xtype: 'textfield',
+        name: 'rb_code',
+        fieldLabel: '单据编号'
+    }, {
+        xtype: 'condatefield',
+        name: 'rb_date',
+        fieldLabel: '日期',
+        columnWidth: 0.5,
+        operation: 'between'
+    }],
+    moreQueryFormItems: [],
+    queryGridConfig: {
+        idField: 'id',
+        codeField: 'rb_code',
+        addTitle: '收款单',
+        addXtype: 'money-recbalance-formpanel',
+        defaultCondition:'',
+        baseVastUrl: '/api/money/recbalance/',
+        baseColumn: [{
+            text: 'id',
+            dataIndex: 'id',
+            width: 100,
+            xtype: 'numbercolumn',
+            hidden: true
+        }, {
+            text: '单据编号',
+            dataIndex: 'rb_code',
+            width: 200
+        }, {
+            text: '单据状态',
+            dataIndex: 'rb_status',
+            width: 120
+        }, {
+            text: '日期',
+            dataIndex: 'rb_date',
+            xtype: 'datecolumn',
+            width: 200
+        }, {
+            text: '客户编号',
+            dataIndex: 'rb_custcode',
+            hidden: true
+        }, {
+            text: '客户名称',
+            dataIndex: 'rb_custname',
+        }, {
+            text: '收款人',
+            dataIndex: 'rb_manname',
+            xtype: 'numbercolumn',
+            width: 120,
+        }, {
+            text: '收款金额',
+            dataIndex: 'rb_rdamount',
+            xtype: 'numbercolumn',
+            width: 120,
+            flex: 1,
+            hidden: true
+        }]
+    }
+});

+ 186 - 0
frontend/saas-web/app/view/money/verification/QueryPanelController.js

@@ -0,0 +1,186 @@
+Ext.define('saas.view.money.verification.QueryPanelController', {
+    extend: 'saas.view.core.query.QueryPanelController',
+    alias: 'controller.money-verification-querypanel',
+    
+    init: function (form) {
+        var me = this;
+        this.control({
+            //放大镜赋值关系 以及 tpl模板
+            'dbfindtrigger[name=pu_vendname]':{
+                beforerender:function(f){
+                    Ext.apply(f,{
+                        dataUrl: '/api/document/vendor/list',
+                        addXtype: 'document-vendor-formpanel',
+                        addTitle: '供应商资料',
+                        dbfinds:[{
+                            from:'ve_code',to:'pu_vendcode'
+                        },{
+                            from:'ve_name',to:'pu_vendname'
+                        }],
+                        dbtpls:[{
+                            field:'ve_code',width:100
+                        },{
+                            field:'ve_name',width:100
+                        }],
+                        defaultCondition: "ve_statuscode='OPEN'",
+                        dbSearchFields:[{
+                            emptyText:'输入供应商编号或名称',
+                            xtype : "textfield", 
+                            name : "search", 
+                            getCondition: function(v) {
+                                return "(upper(ve_code) like '%"+v.toUpperCase()+"%' or upper(ve_name) like '%"+v.toUpperCase()+"%')";
+                            },
+                            allowBlank : true, 
+                            columnWidth : 0.25
+                        }],
+                        dbColumns:[{
+                            "text": "供应商ID",
+                            "hidden": true,
+                            "dataIndex": "id",
+                            "width": 100,
+                            "xtype": "numbercolumn"
+                        },{
+                            "text": "供应商编号",
+                            "flex": 1,
+                            "dataIndex": "ve_code",
+                            "width": 100
+                        }, {
+                            "text": "供应商名称",
+                            "flex": 1,
+                            "dataIndex": "ve_name",
+                            "width": 100
+                        }, {
+                            "text": "供应商类型",
+                            "flex": 0,
+                            "dataIndex": "ve_type",
+                            "width": 200,
+                            "items": null
+                        }, {
+                            "text": "税率",
+                            "flex": 1,
+                            "dataIndex": "ve_taxrate",
+                            "width": 100
+                        }, {
+                            "text": "承付天数",
+                            "flex": 1,
+                            "dataIndex": "ve_promisedays",
+                            "width": 100
+                        }, {
+                            "text": "纳税人识别号",
+                            "flex": 1,
+                            "dataIndex": "ve_bankaccount",
+                            "width": 100
+                        }, {
+                            "text": "开户银行",
+                            "flex": 1,
+                            "dataIndex": "ve_bankaccount",
+                            "width": 100
+                        }, {
+                            "text": "银行账户",
+                            "flex": 1,
+                            "dataIndex": "ve_bankcode",
+                            "width": 100
+                        }]
+                    }) ;   
+
+                }
+            },
+            //放大镜赋值关系 以及 tpl模板
+            'dbfindtrigger[name=pd_prodcode]':{
+                beforerender:function(f){
+                    Ext.apply(f,{
+                        conditionCode:'pr_code',
+                        dataUrl: '/api/document/product/list',
+                        addXtype: 'document-product-formpanel',
+                        addTitle: '物料资料',
+                        dbfinds:[{
+                            from:'pr_code',to:'pd_prodcode',
+                        }, {
+                            from:'pr_detail',to:'pr_detail'
+                        }],
+                        dbtpls:[{
+                            field:'pr_code',width:100
+                        },{
+                            field:'pr_detail',width:100
+                        }],
+                        defaultCondition: "pr_statuscode='OPEN'",
+                        dbSearchFields:[{
+                            emptyText:'输入物料编号、名称或规格',
+                            xtype : "textfield", 
+                            name : "search", 
+                            width: 200,
+                            getCondition: function(v) {
+                                return "(upper(pr_spec) like '%" + v.toUpperCase()+"%' or upper(pr_code) like '%"+v.toUpperCase()+"%' or upper(pr_detail) like '%"+v.toUpperCase()+"%')";
+                            },
+                            allowBlank : true, 
+                            columnWidth : 0.25
+                        }],
+                        dbColumns:[{
+                            "text": "物料ID",
+                            "hidden": true,
+                            "dataIndex": "id",
+                        }, {
+                            "text": "物料编号",       
+                            "dataIndex": "pr_code",
+                            "width": 200,
+                        }, {
+                            "text": "物料名称",
+                            "width": 200,
+                            "dataIndex": "pr_detail",
+                        }, {
+                            "text": "规格",
+                            "dataIndex": "pr_spec",
+                            "width": 100,
+                        }, {
+                            "text": "单位",
+                            "dataIndex": "pr_spec",
+                            "width": 100,
+                        },{
+                            "text": "仓库id",
+                            "dataIndex": "pr_whid",
+                            "hidden": true,
+                        },{
+                            "text": "仓库编号",
+                            "dataIndex": "pr_whcode",
+                            "hidden": true,
+                        },{
+                            "text": "仓库",
+                            "dataIndex": "pr_whname",
+                            "width": 200,
+                        },{
+                            "text": "总库存数",
+                            "dataIndex": "po_onhand",
+                            "width": 100,
+                        },{
+                            "text": "类型",
+                            "dataIndex": "pr_kind",
+                            "width": 100,
+                        },{
+                            "text": "型号",
+                            "dataIndex": "pr_orispeccode",
+                            "width": 100,
+                        },{
+                            "text": "品牌",
+                            "dataIndex": "pr_brand",
+                            "width": 100,
+                        },{
+                            "text": "供应商",
+                            "dataIndex": "pr_vendname",
+                            "width": 100,
+                        },{
+                            "text": "最小包装",
+                            "dataIndex": "pr_zxbzs",
+                            "width": 100,
+                        },{
+                            "text": "L/T",
+                            "dataIndex": "pr_leadtime",
+                            "width": 100,
+                        }]   
+                    }) ;   
+
+                }
+            }
+        });
+
+    }
+});

+ 5 - 0
frontend/saas-web/app/view/money/verification/QueryPanelModel.js

@@ -0,0 +1,5 @@
+Ext.define('saas.view.money.verification.QueryPanelModel', {
+    extend: 'saas.view.core.query.QueryPanelModel',
+    alias: 'viewmodel.money-verification-querypanel'
+
+});