Browse Source

Merge remote-tracking branch 'origin/dev' into dev

zhoudw 7 years ago
parent
commit
d530919476
35 changed files with 2882 additions and 1328 deletions
  1. 0 1
      base-servers/gateway-server/src/main/resources/application.yml
  2. 4 0
      frontend/saas-web/app/Application.scss
  3. 1 1
      frontend/saas-web/app/util/BaseUtil.js
  4. 15 11
      frontend/saas-web/app/view/core/dbfind/types/ProductDbfindTrigger.js
  5. 15 11
      frontend/saas-web/app/view/core/dbfind/types/ProductMultiDbfindTrigger.js
  6. 4 0
      frontend/saas-web/app/view/core/report/ReportPanel.js
  7. 0 356
      frontend/saas-web/app/view/document/kind/ChildForm.js
  8. 0 71
      frontend/saas-web/app/view/document/kind/Kind.js
  9. 0 39
      frontend/saas-web/app/view/document/kind/KindModel.js
  10. 68 0
      frontend/saas-web/app/view/money/report/TotalPayDetail.js
  11. 4 0
      frontend/saas-web/app/view/money/report/TotalPayDetailController.js
  12. 5 0
      frontend/saas-web/app/view/money/report/TotalPayDetailModel.js
  13. 67 0
      frontend/saas-web/app/view/money/report/TotalRecDetail.js
  14. 19 0
      frontend/saas-web/app/view/money/report/TotalRecDetailController.js
  15. 6 0
      frontend/saas-web/app/view/money/report/TotalRecDetailModel.js
  16. 352 348
      frontend/saas-web/app/view/purchase/purchase/FormPanel.js
  17. 2 0
      frontend/saas-web/app/view/purchase/purchaseOut/FormPanelController.js
  18. 318 316
      frontend/saas-web/app/view/sale/sale/FormPanel.js
  19. 88 108
      frontend/saas-web/app/view/stock/report/DataList.js
  20. 5 0
      frontend/saas-web/app/view/stock/report/DataListController.js
  21. 191 0
      frontend/saas-web/app/view/sys/account/AddWindow.js
  22. 1 6
      frontend/saas-web/app/view/sys/account/DataList.js
  23. 1 4
      frontend/saas-web/app/view/sys/account/DataListController.js
  24. 125 0
      frontend/saas-web/app/view/sys/account/EditWindow.js
  25. 2 2
      frontend/saas-web/app/view/sys/config/FormPanel.js
  26. 2 8
      frontend/saas-web/app/view/sys/maxnumbers/DataList.js
  27. 82 0
      frontend/saas-web/app/view/sys/maxnumbers/Window.js
  28. 1 42
      frontend/saas-web/app/view/sys/power/TreePanel.js
  29. 94 0
      frontend/saas-web/app/view/sys/power/Window.js
  30. 14 0
      frontend/saas-web/electron/.gitignore
  31. 32 0
      frontend/saas-web/electron/main.dev.js
  32. 42 0
      frontend/saas-web/electron/main.js
  33. 21 0
      frontend/saas-web/electron/package.json
  34. 1289 0
      frontend/saas-web/electron/yarn.lock
  35. 12 4
      frontend/saas-web/resources/json/navigation.json

+ 0 - 1
base-servers/gateway-server/src/main/resources/application.yml

@@ -186,7 +186,6 @@ auth:
     - /ws/**
     - /api/file/download
     - /api/commons/excel/import/templet
-    - /api/account/resource/url/list
   cookie:
     name: uid
     secret-key: 0taQcW073Z7G628g5H

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

@@ -297,6 +297,10 @@ body.launching {
   border-color: #ABDAFF;
 }
 
+.x-keyboard-mode  .x-grid-item-focused .x-grid-cell-inner:before {
+  border: none;
+}
+
 .x-grid-item-over {
   background-color: #bde5f7;
 }

+ 1 - 1
frontend/saas-web/app/util/BaseUtil.js

@@ -127,7 +127,7 @@ Ext.define('saas.util.BaseUtil', {
         },
 
         getCurrentUser: function () {
-            return saas.util.State.get('session') ? saas.util.State.get('session').account : null;
+            return saas.util.State.get('session') ? saas.util.State.get('session').account : {};
         },
 
         /**

+ 15 - 11
frontend/saas-web/app/view/core/dbfind/types/ProductDbfindTrigger.js

@@ -33,22 +33,22 @@ Ext.define('saas.view.core.dbfind.types.ProductDbfindTrigger', {
         text: "物料编号",       
         dataIndex: "pr_code",
         width: 150
-    }, {
+    },{
+        text: "类型",
+        dataIndex: "pr_kind",
+        width: 110
+    },{
         text: "物料名称",
         width: 200,
         dataIndex: "pr_detail"
     }, {
-        text: "型号规格",
-        dataIndex: "pr_spec",
-        width: 150
-    }, {
-        text: "类型",
-        dataIndex: "pr_kind",
-        width: 110
+        text : "型号", 
+        dataIndex : "pr_orispeccode", 
+        width : 150.0
     }, {
-        text: "单位",
-        dataIndex: "pr_unit",
-        width: 80
+        text : "规格", 
+        dataIndex : "pr_spec", 
+        width : 150.0
     },{
         text: "品牌",
         dataIndex: "pr_brand",
@@ -64,6 +64,10 @@ Ext.define('saas.view.core.dbfind.types.ProductDbfindTrigger', {
             var format = '0,000.' + xr.join();
             return Ext.util.Format.number(v, format);
         }
+    },{
+        text: "单位",
+        dataIndex: "pr_unit",
+        width: 80
     }, {
         text: "采购提前期",
         dataIndex: "pr_leadtime",

+ 15 - 11
frontend/saas-web/app/view/core/dbfind/types/ProductMultiDbfindTrigger.js

@@ -40,22 +40,22 @@ Ext.define('saas.view.core.dbfind.types.ProductMultiDbfindTrigger', {
         text: "物料编号",       
         dataIndex: "pr_code",
         width: 150
-    }, {
+    },{
+        text: "类型",
+        dataIndex: "pr_kind",
+        width: 110
+    },{
         text: "物料名称",
         width: 200,
         dataIndex: "pr_detail"
     }, {
-        text: "型号规格",
-        dataIndex: "pr_spec",
-        width: 150
-    }, {
-        text: "类型",
-        dataIndex: "pr_kind",
-        width: 110
+        text : "型号", 
+        dataIndex : "pr_orispeccode", 
+        width : 150.0
     }, {
-        text: "单位",
-        dataIndex: "pr_unit",
-        width: 80
+        text : "规格", 
+        dataIndex : "pr_spec", 
+        width : 150.0
     },{
         text: "品牌",
         dataIndex: "pr_brand",
@@ -71,6 +71,10 @@ Ext.define('saas.view.core.dbfind.types.ProductMultiDbfindTrigger', {
             var format = '0,000.' + xr.join();
             return Ext.util.Format.number(v, format);
         },
+    },{
+        text: "单位",
+        dataIndex: "pr_unit",
+        width: 80
     }, {
         text: "采购提前期",
         dataIndex: "pr_leadtime",

+ 4 - 0
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -473,6 +473,10 @@ Ext.define('saas.view.core.report.ReportPanel', {
             value = formData[n],
             condition;
 
+            if(!value) {
+                continue;
+            }
+
             if(typeof func == 'function') {
                 condition = {
                     type: 'condition',

+ 0 - 356
frontend/saas-web/app/view/document/kind/ChildForm.js

@@ -104,31 +104,6 @@ Ext.define('saas.view.document.kind.ChildForm', {
                 maxLength: 20
             }]
         },
-        personpower:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                name:'name',
-                allowBlank:false,
-                fieldLabel:'角色名称',
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                name:'description',
-                allowBlank:false,
-                fieldLabel:'角色描述',
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                hidden:true,
-                name:'code',
-                allowBlank:true,
-                fieldLabel:'角色编号',
-                maxLength: 20
-            }]
-        },
         inoutkind:{
             items:[{
                 xtype:'hidden',
@@ -162,219 +137,6 @@ Ext.define('saas.view.document.kind.ChildForm', {
                     ]
                 }
             }]
-        },
-        accountinformation:{
-            items:[{
-                xtype:'hidden',
-                name:'accountId',
-                hidden:true,
-            },{
-                xtype:'textfield',
-                fieldLabel: '真实姓名',
-                name: 'realname',
-                readOnly:true,
-                editable:false,
-                allowBlank:true,
-                maxLength: 30,
-                beforeLabelTextTpl: "",
-            },{
-                xtype:'datamulticombo',
-                dataUrl:'/api/account/role/list',
-                fieldLabel: '岗位角色',
-                name: 'roleNames',
-                allowBlank:true,
-                maxLength: 20,
-                beforeLabelTextTpl: "",
-            },{
-                xtype:'textfield',
-                fieldLabel: '联系电话',
-                name: 'mobile',
-                readOnly:true,
-                editable:false,
-                allowBlank:true,
-                maxLength: 30,
-                beforeLabelTextTpl: "",
-            },{
-                xtype:'textfield',
-                fieldLabel: '邮箱',
-                name: 'email',
-                readOnly:true,
-                editable:false,
-                allowBlank:true,
-                maxLength: 30,
-                beforeLabelTextTpl: "",
-            }]
-        },
-        accountadd:{
-            items:[{
-                xtype:'textfield',
-                fieldLabel: '联系号码',
-                name: 'mobile',
-                hideTrigger:true,
-                allowBlank:false,
-                maxLength: 30,
-                regex:/^1(3|4|5|7|8)\d{9}$/,
-                regexText:'请输入正确的手机号码',
-                listeners:{
-                    change:function(f,a,b){
-                        if(a==''){
-                            f._lastCheckValue = ''
-                        }
-                    },
-                    blur:function(f,a,b,c){
-                        var form = f.ownerCt;
-                        if(f.value&&f.value!=''&&f.isValid()&&f._lastCheckValue!=f.value){
-                            f._lastCheckValue = f.value;
-                            form.setLoading(true);
-                            Ext.Ajax.request({
-                                url: '/api/account/account/checkMobile?mobile='+f.value,
-                                method: 'GET',
-                                headers:{
-                                    'Access-Control-Allow-Origin': '*',
-                                    "Content-Type": 'application/json;charset=UTF-8',
-                                },
-                                success: function (response) {
-                                    form.setLoading(false);
-                                    var localJson = Ext.decode(response.responseText);
-                                    if(localJson.success){
-                                        if(localJson.data.hasRegister){
-                                            saas.util.BaseUtil.showSuccessToast('校验成功:手机号已在优软云注册');
-                                        }else{
-                                            saas.util.BaseUtil.showErrorToast('校验失败:手机号未在优软云注册');
-                                            f.setValue('');
-                                        }
-                                    }else{
-                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
-                                        f.setValue('');
-                                    }
-                                },
-                                failure: function (response) {
-                                    if(response.responseText){
-                                        var localJson = Ext.decode(response.responseText);
-                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
-                                        f.setValue('');
-                                    }else{
-                                        saas.util.BaseUtil.showErrorToast('手机号校验接口连接超时');
-                                        f.setValue('');
-                                    }
-                                }
-                            });
-                        }
-                    }
-                }
-            },{
-                xtype:'textfield',
-                fieldLabel: '真实姓名',
-                name: 'realname',
-                regex:/^[\u4e00-\u9fa5]+$/,
-                regexText:'请输入汉字',
-                allowBlank:false,
-                maxLength: 30,
-            },{
-                xtype:'textfield',
-                fieldLabel: '邮箱',
-                name: 'email',
-                allowBlank:true,
-                beforeLabelTextTpl: "",
-                regex:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
-                regexText:'请输入正确的邮箱',
-                maxLength: 30,
-                listeners:{
-                    blur:function(f,a,b,c){
-                        var form = f.ownerCt;
-                        if(f.value&&f.value!=''&&f.isValid()&&f._lastCheckValue!=f.value){
-                            form.setLoading(true);
-                            f._lastCheckValue = f.value
-                            Ext.Ajax.request({
-                                url: '/api/account/account/checkEmail?email='+f.value,
-                                method: 'GET',
-                                headers:{
-                                    'Access-Control-Allow-Origin': '*',
-                                    "Content-Type": 'application/json;charset=UTF-8'
-                                },
-                                success: function (response) {
-                                    form.setLoading(false);
-                                    var localJson = Ext.decode(response.responseText);
-                                    if(localJson.success){
-                                        if(!localJson.data){
-                                            saas.util.BaseUtil.showSuccessToast('校验成功:邮箱未注册');
-                                        }else{
-                                            saas.util.BaseUtil.showErrorToast('校验失败:该邮箱已被注册');
-                                            f.setValue('');
-                                        }
-                                    }else{
-                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
-                                    }
-                                },
-                                failure: function (response) {
-                                    if(response.responseText){
-                                        var localJson = Ext.decode(response.responseText);
-                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
-                                    }else{
-                                        saas.util.BaseUtil.showErrorToast('邮箱校验接口连接超时');
-                                    }
-                                }
-                            });
-                        }
-                    }
-                }
-            },{
-                xtype:'datamulticombo',
-                dataUrl:'/api/account/role/list',
-                fieldLabel: '岗位角色',
-                name: 'roleIds',
-                allowBlank:false,
-                maxLength: 30,
-            }]
-        },
-        maxnumbers:{
-            items:[{
-                xtype:'hidden',
-                name:'id'
-            },{
-                xtype:'textfield',
-                fieldLabel: '单据名称',
-                name: 'mn_name',
-                allowBlank:false,
-                editable:false,
-                readOnly:true,
-                maxLength: 20
-            },{
-                xtype:'textfield',
-                fieldLabel: '单据前缀',
-                name: 'mn_leadcode',
-                beforeLabelTextTpl: '',
-                allowBlank:true,
-                maxLength: 20
-            },{
-                xtype:'combo',
-                fieldLabel: '单据规则',
-                name: 'mn_rule',
-                displayField : "display", 
-                editable:false,
-                hideTrigger : false, 
-                maxLength : 100.0, 
-                minValue : null, 
-                positiveNum : false, 
-                queryMode : "local", 
-                valueField : "value", 
-                store:{
-                    fields: ['display', 'value'],
-                    data : [
-                        {"display":"年月日", "value":'yyyymmdd'},
-                        {"display":"年月", "value":'yyyymm'},
-                        {"display":"无", "value":'无'}
-                    ]
-                }
-            },{
-                xtype:'numberfield',
-                hideTrigger : true, 
-                fieldLabel: '流水长度',
-                name: 'mn_number',
-                minValue : 0, 
-                allowBlank:false,
-                mouseWheelEnabled: false
-            }]
         }
     },
     setFormItems:function() {
@@ -417,17 +179,6 @@ Ext.define('saas.view.document.kind.ChildForm', {
         var relativeField,relativeValue;//要赋值的字段和值
         var names = belong.columns.map(column => column.dataIndex);
 
-        //账户资料特殊保存逻辑
-        if(me.dataKind=='accountinformation'){
-            me.accountinformation();
-            return;
-        }
-        //账户资料新增特殊保存逻辑
-        if(me.dataKind=='accountadd'){
-            me.accountadd();
-            return;
-        }
-
         Ext.Array.each(names,function(name) {
             if(name){
                 var dataField = form.down('[name='+name+']');
@@ -484,112 +235,5 @@ Ext.define('saas.view.document.kind.ChildForm', {
     },
     onCancel:function(){
         this.hide();
-    },
-    accountinformation:function(){
-        var me = this;
-        var belong = this.belong;
-        me.setLoading(true);
-        var form=this.down('form');
-        var combo = this._combo;
-        var params = {};
-        var names = belong.columns.map(column => column.dataIndex);
-
-        Ext.Array.each(names,function(name) {
-            if(name){
-                var dataField = form.down('[name='+name+']');
-                if(dataField&&dataField.value){
-                    params[name] = dataField.value;
-                }
-            }
-        });
-
-        //更改参数
-        var o = '';
-        Ext.Array.each(params.roleNames,function(item) {
-            o+=item.value+','
-        });
-        o = o.substring(0,o.length-1);
-
-        if(o==""){
-            saas.util.BaseUtil.showErrorToast('岗位角色未选择,无法保存!')
-        }
-
-        var _params = {
-            accountId:Number(params['accountId']),
-            roleIds:o,
-        };
-
-        //保存接口
-        saas.util.BaseUtil.request({
-            url: belong.reqUrl,
-            params: _params,
-            method: 'POST',
-            headers:{
-                'Access-Control-Allow-Origin': '*',
-                "Content-Type":'application/x-www-form-urlencoded'
-            }
-        })
-        .then(function(localJson) {
-            me.setLoading(false);
-            if(localJson.success){
-                saas.util.BaseUtil.showSuccessToast('保存成功');
-                form.ownerCt._parent.store.load()
-                form.ownerCt.close();
-            }
-        })
-        .catch(function(res) {
-            me.setLoading(false);
-            console.error(res);
-            saas.util.BaseUtil.showErrorToast('保存失败: ' + res.message);
-        });
-    },
-    accountadd:function(){
-        var me = this;
-        var belong = this.belong;
-        me.setLoading(true);
-        var form=this.down('form');
-        var combo = this._combo;
-        var params = {};
-        var names = belong.columns.map(column => column.dataIndex);
-
-        Ext.Array.each(names,function(name) {
-            if(name){
-                var dataField = form.down('[name='+name+']');
-                if(dataField&&dataField.value){
-                    params[name] = dataField.value;
-                    params._value = dataField.value;
-                }
-            }
-        });
-
-        //更改参数
-        var o = '';
-        var dataField = form.down('[name=roleIds]');
-        Ext.Array.each(dataField.value,function(item) {
-            o+=item.value+','
-        });
-        o = o.substring(0,o.length-1);
-        params['username'] = params['mobile'];
-        params['type'] = 1;
-        params['roleIds'] = o;
-        //保存接口
-        saas.util.BaseUtil.request({
-            url: belong.reqUrl,
-            params: JSON.stringify(params),
-            method: 'POST'
-        })
-        .then(function(localJson) {
-            me.setLoading(false);
-            if(localJson.success){
-                form.ownerCt._parent.store.load();
-                saas.util.BaseUtil.showSuccessToast('保存成功');
-                form.ownerCt.close();
-            }
-        })
-        .catch(function(res) {
-            me.setLoading(false);
-            console.error(res);
-            saas.util.BaseUtil.showErrorToast('保存失败: ' + res.message);
-        });
     }
 });

+ 0 - 71
frontend/saas-web/app/view/document/kind/Kind.js

@@ -119,77 +119,6 @@ Ext.define('saas.view.document.kind.Kind', {
             keyField:'id',
             reqUrl: '/api/document/fundinouttype/save',
             delUrl: '/api/document/fundinouttype/delete'
-        },
-        maxnumbers:{
-            columns: [{
-                text : "单据名称", 
-                width : 200.0, 
-                dataIndex : "mn_caller" 
-            }, 
-            {
-                text : "单据前缀", 
-                dataIndex : "mn_leadcode", 
-                width : 150.0
-            }, 
-            {
-                text : "单据规则", 
-                dataIndex : "mn_rule", 
-                width : 250.0
-            },{
-                text : "流水长度", 
-                dataIndex : "mn_number", 
-                width : 90.0,
-                xtype: 'numbercolumn',
-            }],
-            keyField:'id',
-            reqUrl:'/api/commons/number/save'
-        },
-        personpower:{
-            columns: [ {
-                text : "编号", 
-                dataIndex : "code", 
-                width : 150.0, 
-                xtype : "", 
-            },{
-                text : "角色名称", 
-                width : 200.0, 
-                dataIndex : "name", 
-                xtype : "", 
-            }, 
-            {
-                text : "角色描述", 
-                dataIndex : "description", 
-                width : 250.0
-            }
-           ],
-            keyField:'id',
-            reqUrl:'/api/account/role/save',
-            updateUrl:'/api/account/role/update',
-        },
-        accountinformation:{
-            columns:[{
-                dataIndex:'accountId',
-            },{
-                dataIndex: 'roleNames',
-                width: 150
-            },{
-                dataIndex: 'mobile',
-                width: 110
-            },{
-                dataIndex: 'email',
-                width: 110
-            }],
-            reqUrl:'/api/account/account/bind/roles',
-        },
-        accountadd:{
-            columns:[{
-                dataIndex:'realname',
-            },{
-                dataIndex: 'mobile',
-            },{
-                dataIndex: 'email',
-            }],
-            reqUrl: '/api/account/account/register/add',
         }
     },
     refresh:function(){

+ 0 - 39
frontend/saas-web/app/view/document/kind/KindModel.js

@@ -164,45 +164,6 @@ Ext.define('saas.view.document.kind.KindModel', {
                     });
                 }
             }
-        },
-        accountinformation: {    
-            fields:[
-                {name: 'id', type: 'int'},
-                {name: 'rl_name',  type: 'string'}
-            ],
-            proxy: {
-                type: 'ajax',
-                url: '/api/account/account/accountRole/list',
-                actionMethods: {
-                    read: 'GET'
-                },
-                reader: {
-                    type: 'json',
-                    rootProperty: 'data'
-                },
-                listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
-                                saas.util.BaseUtil.showErrorToast('请求超时');
-                            }
-                        }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
-                        }
-                    }
-                }
-            },
-            pageSize: null,
-            autoLoad: false,
-            listeners: {
-                beforeload: function (store, op) {
-                    Ext.apply(store.proxy.extraParams, {
-                        number: 1,
-                        size: 1000
-                    });
-                }
-            }
         }
     }
 });

+ 68 - 0
frontend/saas-web/app/view/money/report/TotalPayDetail.js

@@ -0,0 +1,68 @@
+/**
+ * 应付总账
+ */
+Ext.define('saas.view.money.report.TotalPayDetail', {
+    extend: 'saas.view.core.report.ReportPanel',
+    xtype: 'monry-report-totalpaydetail',
+
+    controller: 'money-report-totalpaydetail',
+    viewModel: 'money-report-totalpaydetail',
+
+    viewName: 'money-report-totalpaydetail',
+
+    groupField: null,
+    listUrl: '/api/money/report/vendormonthdetails',
+    // listUrl: 'http://192.168.253.139:8560/api/money/report/vendormonthdetails',
+    defaultCondition: null,
+    reportTitle: '应收总账明细表',
+    QueryWidth: 0.35,
+    searchItems: [{
+        xtype: 'textfield',
+        name: 'vm_vendcode',
+        emptyText: '供应商编号/名称',
+        columnWidth: 0.25,
+        getCondition: function(v) {
+            return "(upper(vm_vendcode) like '%"+v.toUpperCase()+"%' or upper(vm_vendname) like '%"+v.toUpperCase()+"%')";
+        },
+    }, {
+        xtype: 'monthdatefield',
+        name: 'vm_yearmonth',
+        fieldLabel: '起始期间',
+        columnWidth: 0.2
+    }, {
+        xtype: 'monthdatefield',
+        name: 'vm_yearmonthTo',
+        fieldLabel: '结束期间',
+        columnWidth: 0.2
+    }],
+
+    reportColumns: [{
+        text: '供应商编号',
+        dataIndex: 'vm_vendcode',
+        width: 200
+    }, {
+        text: '供应商名称',
+        dataIndex: 'vm_vendname',
+        width: 200,
+    }, {
+        text: '期初应付',
+        xtype: 'numbercolumn',
+        dataIndex: 'vm_beginamount',
+        width: 150
+    }, {
+        text: '增加应付',
+        xtype: 'numbercolumn',
+        dataIndex: 'vm_nowamount',
+        width: 150
+    }, {
+        text: '增加预付',
+        xtype: 'numbercolumn',
+        dataIndex: 'vm_nowpreamount',
+        width: 150
+    }, {
+        text: '应付余额',
+        dataIndex: 'vm_endamount',
+        xtype: 'numbercolumn',
+        width: 150,
+    }]
+});

+ 4 - 0
frontend/saas-web/app/view/money/report/TotalPayDetailController.js

@@ -0,0 +1,4 @@
+Ext.define('saas.view.money.report.TotalPayDetailController', {
+    extend: 'saas.view.core.report.ReportPanelController',
+    alias: 'controller.money-report-totalpaydetail',
+});

+ 5 - 0
frontend/saas-web/app/view/money/report/TotalPayDetailModel.js

@@ -0,0 +1,5 @@
+Ext.define('saas.view.money.report.TotalPayDetailModel', {
+    extend: 'saas.view.core.report.ReportPanelModel',
+    alias: 'viewmodel.money-report-totalpaydetail',
+
+});

+ 67 - 0
frontend/saas-web/app/view/money/report/TotalRecDetail.js

@@ -0,0 +1,67 @@
+/**
+ * 应收总账
+ */
+Ext.define('saas.view.money.report.TotalRecDetail', {
+    extend: 'saas.view.core.report.ReportPanel',
+    xtype: 'monry-report-totalrecdetail',
+
+    controller: 'money-report-totalrecdetail',
+    viewModel: 'money-report-totalrecdetail',
+
+    viewName: 'money-report-totalrecdetail',
+
+    groupField: null,
+    listUrl: '/api/money/report/custormonthdetails',
+    // listUrl: 'http://192.168.253.139:8560/api/money/report/custormonthdetails',
+    defaultCondition: null,
+    reportTitle: '应收总账明细表',
+    QueryWidth: 0.35,
+    searchItems: [{
+        xtype: 'textfield',
+        name: 'cm_custcode',
+        emptyText: '客户编号/名称',
+        columnWidth: 0.25,
+        getCondition: function (v) {
+            return "(upper(cm_custcode) like '%" + v.toUpperCase() + "%' or upper(cm_custname) like '%" + v.toUpperCase() + "%')";
+        },
+    }, {
+        xtype: 'monthdatefield',
+        name: 'vm_yearmonth',
+        fieldLabel: '起始期间',
+        columnWidth: 0.2
+    }, {
+        xtype: 'monthdatefield',
+        name: 'vm_yearmonthTo',
+        fieldLabel: '结束期间',
+        columnWidth: 0.2
+    }],
+
+    reportColumns: [{
+        text: '客户编号',
+        dataIndex: 'cm_custcode',
+        width: 200
+    }, {
+        text: '客户名称',
+        dataIndex: 'cm_custname',
+        width: 200,
+    }, {
+        text: '期初应收',
+        dataIndex: 'cm_beginamount',
+        width: 150
+    }, {
+        text: '增加应收',
+        xtype: 'numbercolumn',
+        dataIndex: 'cm_nowamount',
+        width: 150
+    }, {
+        text: '增加预收',
+        xtype: 'numbercolumn',
+        dataIndex: 'cm_nowpreamount',
+        width: 150
+    }, {
+        text: '应收余额',
+        dataIndex: 'cm_endamount',
+        xtype: 'numbercolumn',
+        width: 150,
+    }]
+});

+ 19 - 0
frontend/saas-web/app/view/money/report/TotalRecDetailController.js

@@ -0,0 +1,19 @@
+Ext.define('saas.view.money.report.TotalRecDetailController', {
+    extend: 'saas.view.core.report.ReportPanelController',
+    alias: 'controller.money-report-totalrecdetail',
+    init: function (form) {
+        this.control({
+            // 供应商编号
+            'dbfindtrigger[name=pi_vendname]':{
+                beforerender:function(f){
+                    Ext.apply(f,{
+                        dbfinds:[{
+                            from:'ve_name',to:'pi_vendname'
+                        }],
+                    }) ;
+
+                }
+            }
+        });
+    }
+});

+ 6 - 0
frontend/saas-web/app/view/money/report/TotalRecDetailModel.js

@@ -0,0 +1,6 @@
+Ext.define('saas.view.money.report.TotalRecDetailModel', {
+    extend: 'saas.view.core.report.ReportPanelModel',
+    alias: 'viewmodel.money-report-totalrecdetail',
+
+
+});

+ 352 - 348
frontend/saas-web/app/view/purchase/purchase/FormPanel.js

@@ -24,364 +24,368 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
      _deleteUrl:'/api/purchase/purchase/delete',
      _turnInUrl:'/api/purchase/purchase/turnProdin',
      initId:0,
- 
-     toolBtns: [{
-         xtype: 'button',
-         text: '转采购验收单',
-         hidden: true,
-         bind: {
-            hidden: '{turnHidden}'
-        },
-         handler: 'turnIn'
-     }],
-
-    defaultItems: [{
-        xtype: 'hidden',
-        name: 'id',
-        fieldLabel: 'id'
-    },{
-        xtype : "hidden", 
-        name : "pu_vendid", 
-        fieldLabel : "供应商ID"
-    }, {
-        xtype : "hidden", 
-        name : "pu_vendcode", 
-        fieldLabel : "供应商编号"
-    }, {
-        xtype : "vendorDbfindTrigger", 
-        name : "pu_vendname", 
-        fieldLabel : "供应商名称",
-        allowBlank : false,
-    },{
-        xtype : "datefield", 
-        name : "pu_delivery", 
-        fieldLabel : "交货日期",
-        allowBlank:false,
-        defaultValue: new Date(),
-        columnWidth : 0.25,
-    },{
-        name : "pu_shipaddresscode", 
-        editable:false,
-        xtype : "remotecombo", 
-        storeUrl:'/api/document/address/getCombo',
-        fieldLabel : "交货地址", 
-        allowBlank : false, 
-        columnWidth : 0.5,
-        hiddenBtn:false,//true 则会关闭新增按钮功能
-        addHandler:function(b){
-            var form = this.ownerCmp.ownerCt;
-            this.dialog = form.add({
-                xtype: 'document-address-window',
-                bind: {
-                    title: '新增交货地址'
-                },
-                _parent:form,
-                _combo:this.ownerCmp,
-                record:null,
-                session: true
-            });
-            this.dialog.show();
-        }
-    },{
-        name : "detailGridField", 
-        xtype : "detailGridField", 
-        storeModel:'saas.model.purchase.Purchasedetail',
-        detnoColumn:  'pd_detno',
-        deleteDetailUrl:'/api/purchase/purchase/deleteDetail',
-        allowEmpty: false,
-        columns : [
-            {
-                text : "id", 
-                dataIndex : "id", 
-                xtype : "numbercolumn",
-                hidden:true
+     initComponent:function() {
+        Ext.applyIf(this,{
+            defaultItems: [{
+                xtype: 'hidden',
+                name: 'id',
+                fieldLabel: 'id'
             },{
-                text : "物料id", 
-                dataIndex : "pd_prodid", 
-                xtype : "numbercolumn",
-                hidden:true
-            },
-            {
-                text : "物料编号", 
-                width : 150.0, 
-                dataIndex : "pd_prodcode", 
-                xtype : "", 
-                items : null,
+                xtype : "hidden", 
+                name : "pu_vendid", 
+                fieldLabel : "供应商ID"
+            }, {
+                xtype : "hidden", 
+                name : "pu_vendcode", 
+                fieldLabel : "供应商编号"
+            }, {
+                xtype : "vendorDbfindTrigger", 
+                name : "pu_vendname", 
+                fieldLabel : "供应商名称",
                 allowBlank : false,
-                editor : {
-                    xtype : "productMultiDbfindTrigger"
-                }
-            },
-            {
-                text : "名称", 
-                width : 200.0, 
-                dataIndex : "pr_detail",
-                ignore:true,
-                renderer: function (v, m, r) {
-                    if(!v){
-                        return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null; 
-                    }                     
-                    return v;
-                }
             },{
-                text: 'model映射需要',
-                dataIndex: 'productDTO',
-                hidden: true,
-            },
-            {
-                text : "规格", 
-                dataIndex : "pr_spec", 
-                width : 150.0,
-                ignore:true,
-                renderer: function (v, m, r) {
-                    if(!v){
-                        return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null; 
-                    }                     
-                    return v;    
-                }
-            },            
-            {
-                text : "数量", 
-                dataIndex : "pd_qty", 
-                xtype: 'numbercolumn',
-                width : 110.0,
-                allowBlank : false,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 3,
-                    minValue:0
-                },
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                }
-            },
-            {
-                text : "单价", 
-                xtype: 'numbercolumn',
-                dataIndex : "pd_price", 
-                width : 110.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 8,
-                    minValue:0
-                },
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 8 ? 8 :(arr[1].length < 2? 2 : arr[1].length))).fill('0');
-                    var format = '0,000.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                },
-            },
-            {
-                text : "已转数", 
-                dataIndex : "pd_yqty", 
-                xtype: 'numbercolumn',
-                width : 0,
-                hidden:true,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 3,
-                    editable : false
-                },
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                }
-            }, 
-            {
-                text : "税率", 
-                xtype: 'numbercolumn',
-                dataIndex : "pd_taxrate", 
-                width : 80.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 0,
-                    minValue: 0,
-                    maxValue: 100
-                },
-                renderer : function(v) {
-                    return Ext.util.Format.number(v, '0');
-                }
+                xtype : "datefield", 
+                name : "pu_delivery", 
+                fieldLabel : "交货日期",
+                allowBlank:false,
+                defaultValue: new Date(),
+                columnWidth : 0.25,
             },{
-                text : "需求日期", 
-                dataIndex : "pd_delivery", 
-                xtype:'datecolumn',
-                width : 110.0, 
-                editor : {
-                    xtype : "datefield",
-                    editable : false, 
-                    hideTrigger : false
+                name : "pu_shipaddresscode", 
+                editable:false,
+                xtype : "remotecombo", 
+                storeUrl:'/api/document/address/getCombo',
+                fieldLabel : "交货地址", 
+                allowBlank : false, 
+                columnWidth : 0.5,
+                hiddenBtn:false,//true 则会关闭新增按钮功能
+                addHandler:function(b){
+                    var form = this.ownerCmp.ownerCt;
+                    this.dialog = form.add({
+                        xtype: 'document-address-window',
+                        bind: {
+                            title: '新增交货地址'
+                        },
+                        _parent:form,
+                        _combo:this.ownerCmp,
+                        record:null,
+                        session: true
+                    });
+                    this.dialog.show();
                 }
+            },{
+                name : "detailGridField", 
+                xtype : "detailGridField", 
+                storeModel:'saas.model.purchase.Purchasedetail',
+                detnoColumn:  'pd_detno',
+                deleteDetailUrl:'/api/purchase/purchase/deleteDetail',
+                allowEmpty: false,
+                columns : [
+                    {
+                        text : "id", 
+                        dataIndex : "id", 
+                        xtype : "numbercolumn",
+                        hidden:true
+                    },{
+                        text : "物料id", 
+                        dataIndex : "pd_prodid", 
+                        xtype : "numbercolumn",
+                        hidden:true
+                    },
+                    {
+                        text : "物料编号", 
+                        width : 150.0, 
+                        dataIndex : "pd_prodcode", 
+                        xtype : "", 
+                        items : null,
+                        allowBlank : false,
+                        editor : {
+                            xtype : "productMultiDbfindTrigger"
+                        }
+                    },
+                    {
+                        text : "名称", 
+                        width : 200.0, 
+                        dataIndex : "pr_detail",
+                        ignore:true,
+                        renderer: function (v, m, r) {
+                            if(!v){
+                                return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null; 
+                            }                     
+                            return v;
+                        }
+                    },{
+                        text: 'model映射需要',
+                        dataIndex: 'productDTO',
+                        hidden: true,
+                    },
+                    {
+                        text : "规格", 
+                        dataIndex : "pr_spec", 
+                        width : 150.0,
+                        ignore:true,
+                        renderer: function (v, m, r) {
+                            if(!v){
+                                return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null; 
+                            }                     
+                            return v;    
+                        }
+                    },            
+                    {
+                        text : "数量", 
+                        dataIndex : "pd_qty", 
+                        xtype: 'numbercolumn',
+                        width : 110.0,
+                        allowBlank : false,
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 3,
+                            minValue:0
+                        },
+                        renderer : function(v) {
+                            var arr = (v + '.').split('.');
+                            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + xr.join();
+                            return Ext.util.Format.number(v, format);
+                        }
+                    },
+                    {
+                        text : "单价", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "pd_price", 
+                        width : 110.0,
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 8,
+                            minValue:0
+                        },
+                        renderer : function(v) {
+                            var arr = (v + '.').split('.');
+                            var xr = (new Array(arr[1].length > 8 ? 8 :(arr[1].length < 2? 2 : arr[1].length))).fill('0');
+                            var format = '0,000.' + xr.join();
+                            return Ext.util.Format.number(v, format);
+                        },
+                    },
+                    {
+                        text : "已转数", 
+                        dataIndex : "pd_yqty", 
+                        xtype: 'numbercolumn',
+                        width : 0,
+                        hidden:true,
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 3,
+                            editable : false
+                        },
+                        renderer : function(v) {
+                            var arr = (v + '.').split('.');
+                            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + xr.join();
+                            return Ext.util.Format.number(v, format);
+                        }
+                    }, 
+                    {
+                        text : "税率", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "pd_taxrate", 
+                        width : 80.0,
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 0,
+                            minValue: 0,
+                            maxValue: 100
+                        },
+                        renderer : function(v) {
+                            return Ext.util.Format.number(v, '0');
+                        }
+                    },{
+                        text : "需求日期", 
+                        dataIndex : "pd_delivery", 
+                        xtype:'datecolumn',
+                        width : 110.0, 
+                        editor : {
+                            xtype : "datefield",
+                            editable : false, 
+                            hideTrigger : false
+                        }
+                    },
+                    {
+                        text : "含税金额", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "pd_total", 
+                        width : 110.0, 
+                        // editor : {
+                        //     xtype : "numberfield",
+                        //     decimalPrecision: 2,
+                        //     editable : 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);
+                        }
+                    }, 
+                    {
+                        text : "未税金额", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "pd_taxtotal", 
+                        width : 110.0,
+                        // editor : {
+                        //     xtype : "numberfield",
+                        //     decimalPrecision: 2,
+                        //     editable : 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);
+                        }
+                    },
+                    {
+                        text : "最小包装数", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "pr_zxbzs",
+                        width : 110.0,
+                        ignore:true,
+                        renderer: function (v, m, r) {
+                            if(!v){
+                                return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null; 
+                            }                     
+                            return v; 
+                        }
+                    },
+                    {
+                        text : "关联销售单号", 
+                        dataIndex : "pd_salecode", 
+                        width : 150.0
+                    },{
+                        text : "备注", 
+                        dataIndex : "pd_remark",
+                        width : 250, 
+                        items : null,
+                        editor : {
+                            xtype : "textfield"
+                        },
+                    }
+                ]
+            }, {
+                xtype : "textfield", 
+                name : "pu_remark", 
+                fieldLabel : "备注", 
+                columnWidth : 1
+            }, {
+                xtype : "datefield", 
+                name : "pu_date", 
+                fieldLabel : "单据日期", 
+                defaultValue: new Date()
+            }, {
+                xtype : "textfield", 
+                name : "pu_total", 
+                fieldLabel : "采购金额",
+                readOnly:true,
+                columnWidth : 0.25,
+            },{
+                xtype : "hidden", 
+                name : "pu_buyercode", 
+                fieldLabel : "采购员编号"
+            },{
+                xtype : "employeeDbfindTrigger", 
+                name : "pu_buyername", 
+                fieldLabel : "采购员",
+                columnWidth : 0.25,
+                defaultValue:saas.util.BaseUtil.getCurrentUser().realname
+            },{
+                xtype : "hidden", 
+                name : "pu_buyerid", 
+                fieldLabel : "采购员ID",
+                defaultValue:saas.util.BaseUtil.getCurrentUser().id
             },
             {
-                text : "含税金额", 
-                xtype: 'numbercolumn',
-                dataIndex : "pd_total", 
-                width : 110.0, 
-                // editor : {
-                //     xtype : "numberfield",
-                //     decimalPrecision: 2,
-                //     editable : 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);
-                }
-            }, 
-            {
-                text : "未税金额", 
-                xtype: 'numbercolumn',
-                dataIndex : "pd_taxtotal", 
-                width : 110.0,
-                // editor : {
-                //     xtype : "numberfield",
-                //     decimalPrecision: 2,
-                //     editable : 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);
-                }
+                xtype : "hidden", 
+                name : "creatorId", 
+                fieldLabel : "录入人ID", 
+                readOnly:true
             },
             {
-                text : "最小包装数", 
-                xtype: 'numbercolumn',
-                dataIndex : "pr_zxbzs",
-                width : 110.0,
-                ignore:true,
-                renderer: function (v, m, r) {
-                    if(!v){
-                        return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null; 
-                    }                     
-                    return v; 
-                }
-            },
-            {
-                text : "关联销售单号", 
-                dataIndex : "pd_salecode", 
-                width : 150.0
+                xtype : "textfield", 
+                name : "creatorName", 
+                fieldLabel : "录入人", 
+                readOnly:true
+            }, {
+                xtype : "datefield", 
+                name : "createTime", 
+                fieldLabel : "录入日期",
+                readOnly:true, 
+                defaultValue: new Date()
             },{
-                text : "备注", 
-                dataIndex : "pd_remark",
-                width : 250, 
-                items : null,
-                editor : {
-                    xtype : "textfield"
-                },
-            }
-        ]
-    }, {
-        xtype : "textfield", 
-        name : "pu_remark", 
-        fieldLabel : "备注", 
-        columnWidth : 1
-    }, {
-        xtype : "datefield", 
-        name : "pu_date", 
-        fieldLabel : "单据日期", 
-        defaultValue: new Date()
-    }, {
-        xtype : "textfield", 
-        name : "pu_total", 
-        fieldLabel : "采购金额",
-        readOnly:true,
-        columnWidth : 0.25,
-    },{
-        xtype : "hidden", 
-        name : "pu_buyercode", 
-        fieldLabel : "采购员编号"
-    },{
-        xtype : "employeeDbfindTrigger", 
-        name : "pu_buyername", 
-        fieldLabel : "采购员",
-        columnWidth : 0.25,
-        defaultValue:saas.util.BaseUtil.getCurrentUser().realname
-    },{
-        xtype : "hidden", 
-        name : "pu_buyerid", 
-        fieldLabel : "采购员ID",
-        defaultValue:saas.util.BaseUtil.getCurrentUser().id
-    },
-    {
-        xtype : "hidden", 
-        name : "creatorId", 
-        fieldLabel : "录入人ID", 
-        readOnly:true
+                xtype : "hidden", 
+                name : "updaterId", 
+                fieldLabel : "更新人ID", 
+                readOnly:true
+            },{
+                xtype : "hidden", 
+                name : "updaterName", 
+                fieldLabel : "更新人", 
+                readOnly:true
+            }, {
+                xtype : "hidden", 
+                name : "updateTime", 
+                fieldLabel : "更新日期",
+                readOnly:true, 
+                defaultValue: new Date()
+            }, {
+                xtype : "textfield", 
+                name : "pu_auditman", 
+                fieldLabel : "审核人", 
+                readOnly:true
+            }, {
+                xtype : "datefield", 
+                name : "pu_auditdate", 
+                fieldLabel : "审核日期",
+                readOnly:true
+            }]
+        });
+        this.callParent();
     },
-    {
-        xtype : "textfield", 
-        name : "creatorName", 
-        fieldLabel : "录入人", 
-        readOnly:true
-    }, {
-        xtype : "datefield", 
-        name : "createTime", 
-        fieldLabel : "录入日期",
-        readOnly:true, 
-        defaultValue: new Date()
-    },{
-        xtype : "hidden", 
-        name : "updaterId", 
-        fieldLabel : "更新人ID", 
-        readOnly:true
-    },{
-        xtype : "hidden", 
-        name : "updaterName", 
-        fieldLabel : "更新人", 
-        readOnly:true
-    }, {
-        xtype : "hidden", 
-        name : "updateTime", 
-        fieldLabel : "更新日期",
-        readOnly:true, 
-        defaultValue: new Date()
-    }, {
-        xtype : "textfield", 
-        name : "pu_auditman", 
-        fieldLabel : "审核人", 
-        readOnly:true
-    }, {
-        xtype : "datefield", 
-        name : "pu_auditdate", 
-        fieldLabel : "审核日期",
-        readOnly:true
-    }]
+     toolBtns: [{
+         xtype: 'button',
+         text: '转采购验收单',
+         hidden: true,
+         bind: {
+            hidden: '{turnHidden}'
+        },
+         handler: 'turnIn'
+     }]
+
 
 });

+ 2 - 0
frontend/saas-web/app/view/purchase/purchaseOut/FormPanelController.js

@@ -38,6 +38,8 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanelController', {
                             from:'pr_detail',to:'pr_detail'
                         },{
                             from:'pr_unit',to:'pd_unit'
+                        },{
+                            from:'pr_spec',to:'pr_spec'
                         },{
                             from:'pr_whid',to:'pd_whid'
                         },{

+ 318 - 316
frontend/saas-web/app/view/sale/sale/FormPanel.js

@@ -25,7 +25,323 @@ Ext.define('saas.view.sale.sale.FormPanel', {
      _turnOutUrl:'/api/sale/sale/turnProdOut',
      _turnPurchase:'/api/sale/sale/saleTurnPurchase',
      initId:0,
- 
+     initComponent:function() {
+        Ext.applyIf(this,{
+            defaultItems: [{
+                xtype: 'hidden',
+                name: 'id',
+                fieldLabel: 'id'
+            }, {
+                xtype : 'hidden',
+                name : 'sa_custid', 
+                fieldLabel : '客户ID'
+            }
+            , {
+                xtype : 'hidden', 
+                name : 'sa_custcode', 
+                fieldLabel : '客户编号'
+            }, {
+                xtype : "customerDbfindTrigger", 
+                name : "sa_custname", 
+                fieldLabel : "客户名称",
+                allowBlank : false
+            }, {
+                name : "sa_toplace", 
+                xtype : "textfield", 
+                fieldLabel : "交货地址", 
+                allowBlank : false, 
+                columnWidth : 0.5,
+                hiddenBtn:false,//true 则会关闭新增按钮功能
+                addHandler:function(b){
+                    var form = this.ownerCmp.ownerCt;
+                    this.dialog = form.add({
+                        xtype: 'document-address-window',
+                        bind: {
+                            title: '新增交货地址'
+                        },
+                        _parent:form,
+                        _combo:this.ownerCmp,
+                        record:null,
+                        session: true
+                    });
+                    this.dialog.show();
+                }
+            }, {
+                name : "detailGridField", 
+                xtype : "detailGridField", 
+                detnoColumn: 'sd_detno',
+                storeModel:'saas.model.sale.Saledetail',
+                deleteDetailUrl:'/api/sale/sale/deleteDetail',
+                columns : [
+                   {
+                        text : "id", 
+                        dataIndex : "id", 
+                        xtype : "numbercolumn",
+                        hidden:true
+                    }, {
+                        text : "物料id", 
+                        dataIndex : "sd_prodid", 
+                        width : 0
+                    }, {
+                        text : "物料编号", 
+                        width : 150.0, 
+                        dataIndex : "sd_prodcode", 
+                        xtype : "", 
+                        items : null,
+                        allowBlank:false,
+                        editor : {
+                            displayField : "display", 
+                            editable : true, 
+                            format : "", 
+                            hideTrigger : false, 
+                            maxLength : 100.0, 
+                            minValue : null, 
+                            positiveNum : false, 
+                            queryMode : "local", 
+                            store : null, 
+                            valueField : "value", 
+                            xtype : "productMultiDbfindTrigger"
+                        }
+                    },{
+                        text: 'model映射需要',
+                        dataIndex: 'productDTO',
+                        hidden: true,
+                    }, {
+                        text : "名称", 
+                        dataIndex : "pr_detail", 
+                        width : 200.0,
+                        ignore:true,
+                        renderer: function (v, m, r) {
+                            if(!v){
+                                return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null;
+                            }
+                            return v;
+                        }
+                    }, {
+                        text : "规格", 
+                        dataIndex : "pr_spec",
+                        ignore:true,
+                        width : 150.0, 
+                        renderer: function (v, m, r) {
+                            if(!v){
+                                return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null;
+                            }
+                            return v;
+                        }
+                    }, {
+                        text : "数量", 
+                        dataIndex : "sd_qty", 
+                        width : 110.0,
+                        xtype: 'numbercolumn',
+                        allowBlank:false, 
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 3,
+                            minValue:0
+                        },
+                        renderer : function(v) {
+                            var arr = (v + '.').split('.');
+                            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + xr.join();
+                            return Ext.util.Format.number(v, format);
+                        }
+                    },  {
+                        text : "已转数", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "sd_yqty", 
+                        width : 0, 
+                        hidden : true,
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 3
+                        },
+                        renderer : function(v) {
+                            var arr = (v + '.').split('.');
+                            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
+                            var format = '0.' + xr.join();
+                            return Ext.util.Format.number(v, format);
+                        }
+                    },
+                    {
+                        text : "单价", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "sd_price", 
+                        width : 110.0,
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 8,
+                            minValue:0
+                        },
+                        renderer : function(v) {
+                            var arr = (v + '.').split('.');
+                            var xr = (new Array(arr[1].length > 8 ? 8 :(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 : "sd_taxrate", 
+                        width : 80.0, 
+                        editor : {
+                            xtype : "numberfield",
+                            decimalPrecision: 0,
+                            minValue: 0,
+                            maxValue: 100
+                        },
+                        renderer : function(v) {
+                            return Ext.util.Format.number(v, '0');
+                        }
+                    },{
+                        text : "交货日期", 
+                        dataIndex : "sd_delivery", 
+                        width : 110.0, 
+                        xtype:'datecolumn',
+                        editor : {
+                            xtype : "datefield",
+                            editable : true, 
+                            hideTrigger : false
+                        }
+                    },
+                    {
+                        text : "含税金额", 
+                        xtype: 'numbercolumn',
+                        dataIndex : "sd_total", 
+                        width : 110.0,
+                        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 : "sd_nettotal", 
+                        width : 110.0,
+                        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 : "备注", 
+                        dataIndex : "sd_remark",
+                        width : 250, 
+                        items : null,
+                        editor : {
+                            xtype : "textfield"
+                        },
+                    }
+                ]
+            }, {
+                xtype : "textfield", 
+                name : "sa_remark", 
+                fieldLabel : "备注", 
+                columnWidth : 1
+            }, {
+                xtype : "datefield", 
+                name : "sa_date", 
+                fieldLabel : "单据日期", 
+                defaultValue: new Date()
+            }, {
+                xtype : "textfield", 
+                name : "sa_total", 
+                fieldLabel : "销售金额",
+                readOnly:true
+            },{
+                xtype : "hidden", 
+                name : "sa_sellercode", 
+                fieldLabel : "业务员编号",
+            },{
+                xtype : "employeeDbfindTrigger", 
+                name : "sa_seller", 
+                fieldLabel : "业务员",
+                defaultValue:saas.util.BaseUtil.getCurrentUser().realname
+            }, {
+                xtype : 'textfield', 
+                name : 'sa_sendstatus', 
+                fieldLabel : '出货状态', 
+                hidden : true,
+                defaultValue:saas.util.BaseUtil.getCurrentUser().id
+             },{
+                xtype : "hidden", 
+                name : "creatorId", 
+                fieldLabel : "录入人ID", 
+                readOnly:true
+            },
+            {
+                xtype : "textfield", 
+                name : "creatorName", 
+                fieldLabel : "录入人", 
+                readOnly:true
+            }, {
+                xtype : "datefield", 
+                name : "createTime", 
+                fieldLabel : "录入日期",
+                readOnly:true, 
+                defaultValue: new Date()
+            },{
+                xtype : "hidden", 
+                name : "updaterId", 
+                fieldLabel : "更新人ID", 
+                readOnly:true
+            },{
+                xtype : "hidden", 
+                name : "updaterName", 
+                fieldLabel : "更新人", 
+                readOnly:true
+            }, {
+                xtype : "hidden", 
+                name : "updateTime", 
+                fieldLabel : "更新日期",
+                readOnly:true, 
+                defaultValue: new Date()
+            }, {
+                xtype : "textfield", 
+                name : "sa_auditman", 
+                fieldLabel : "审核人", 
+                readOnly:true
+            }, {
+                xtype : "datefield", 
+                name : "sa_auditdate", 
+                fieldLabel : "审核日期",
+                readOnly:true
+            }]
+        });
+       this.callParent();
+     },   
      toolBtns: [{
          xtype: 'button',
          text: '转出货单',
@@ -42,319 +358,5 @@ Ext.define('saas.view.sale.sale.FormPanel', {
          bind: {
              hidden: '{sa_statuscode!="AUDITED"}'
          }
-     }],
-
-    defaultItems: [{
-        xtype: 'hidden',
-        name: 'id',
-        fieldLabel: 'id'
-    }, {
-        xtype : 'hidden',
-        name : 'sa_custid', 
-        fieldLabel : '客户ID'
-    }
-    , {
-        xtype : 'hidden', 
-        name : 'sa_custcode', 
-        fieldLabel : '客户编号'
-    }, {
-        xtype : "customerDbfindTrigger", 
-        name : "sa_custname", 
-        fieldLabel : "客户名称",
-        allowBlank : false
-    }, {
-        name : "sa_toplace", 
-        xtype : "textfield", 
-        fieldLabel : "交货地址", 
-        allowBlank : false, 
-        columnWidth : 0.5,
-        hiddenBtn:false,//true 则会关闭新增按钮功能
-        addHandler:function(b){
-            var form = this.ownerCmp.ownerCt;
-            this.dialog = form.add({
-                xtype: 'document-address-window',
-                bind: {
-                    title: '新增交货地址'
-                },
-                _parent:form,
-                _combo:this.ownerCmp,
-                record:null,
-                session: true
-            });
-            this.dialog.show();
-        }
-    }, {
-        name : "detailGridField", 
-        xtype : "detailGridField", 
-        detnoColumn: 'sd_detno',
-        storeModel:'saas.model.sale.Saledetail',
-        deleteDetailUrl:'/api/sale/sale/deleteDetail',
-        columns : [
-           {
-                text : "id", 
-                dataIndex : "id", 
-                xtype : "numbercolumn",
-                hidden:true
-            }, {
-                text : "物料id", 
-                dataIndex : "sd_prodid", 
-                width : 0
-            }, {
-                text : "物料编号", 
-                width : 150.0, 
-                dataIndex : "sd_prodcode", 
-                xtype : "", 
-                items : null,
-                allowBlank:false,
-                editor : {
-                    displayField : "display", 
-                    editable : true, 
-                    format : "", 
-                    hideTrigger : false, 
-                    maxLength : 100.0, 
-                    minValue : null, 
-                    positiveNum : false, 
-                    queryMode : "local", 
-                    store : null, 
-                    valueField : "value", 
-                    xtype : "productMultiDbfindTrigger"
-                }
-            },{
-                text: 'model映射需要',
-                dataIndex: 'productDTO',
-                hidden: true,
-            }, {
-                text : "名称", 
-                dataIndex : "pr_detail", 
-                width : 200.0,
-                ignore:true,
-                renderer: function (v, m, r) {
-                    if(!v){
-                        return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null;
-                    }
-                    return v;
-                }
-            }, {
-                text : "规格", 
-                dataIndex : "pr_spec",
-                ignore:true,
-                width : 150.0, 
-                renderer: function (v, m, r) {
-                    if(!v){
-                        return r.data["productDTO"]?r.data["productDTO"][m.column.dataIndex]:null;
-                    }
-                    return v;
-                }
-            }, {
-                text : "数量", 
-                dataIndex : "sd_qty", 
-                width : 110.0,
-                xtype: 'numbercolumn',
-                allowBlank:false, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 3,
-                    minValue:0
-                },
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                }
-            },  {
-                text : "已转数", 
-                xtype: 'numbercolumn',
-                dataIndex : "sd_yqty", 
-                width : 0, 
-                hidden : true,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 3
-                },
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + 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 > 3 ? 3 : arr[1].length)).fill('0');
-                    var format = '0.' + xr.join();
-                    return Ext.util.Format.number(v, format);
-                }
-            },
-            {
-                text : "单价", 
-                xtype: 'numbercolumn',
-                dataIndex : "sd_price", 
-                width : 110.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 8,
-                    minValue:0
-                },
-                renderer : function(v) {
-                    var arr = (v + '.').split('.');
-                    var xr = (new Array(arr[1].length > 8 ? 8 :(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 : "sd_taxrate", 
-                width : 80.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 0,
-                    minValue: 0,
-                    maxValue: 100
-                },
-                renderer : function(v) {
-                    return Ext.util.Format.number(v, '0');
-                }
-            },{
-                text : "交货日期", 
-                dataIndex : "sd_delivery", 
-                width : 110.0, 
-                xtype:'datecolumn',
-                editor : {
-                    xtype : "datefield",
-                    editable : true, 
-                    hideTrigger : false
-                }
-            },
-            {
-                text : "含税金额", 
-                xtype: 'numbercolumn',
-                dataIndex : "sd_total", 
-                width : 110.0,
-                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 : "sd_nettotal", 
-                width : 110.0,
-                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 : "备注", 
-                dataIndex : "sd_remark",
-                width : 250, 
-                items : null,
-                editor : {
-                    xtype : "textfield"
-                },
-            }
-        ]
-    }, {
-        xtype : "textfield", 
-        name : "sa_remark", 
-        fieldLabel : "备注", 
-        columnWidth : 1
-    }, {
-        xtype : "datefield", 
-        name : "sa_date", 
-        fieldLabel : "单据日期", 
-        defaultValue: new Date()
-    }, {
-        xtype : "textfield", 
-        name : "sa_total", 
-        fieldLabel : "销售金额",
-        readOnly:true
-    },{
-        xtype : "hidden", 
-        name : "sa_sellercode", 
-        fieldLabel : "业务员编号",
-    },{
-        xtype : "employeeDbfindTrigger", 
-        name : "sa_seller", 
-        fieldLabel : "业务员",
-        defaultValue:saas.util.BaseUtil.getCurrentUser().realname
-    }, {
-        xtype : 'textfield', 
-        name : 'sa_sendstatus', 
-        fieldLabel : '出货状态', 
-        hidden : true,
-        defaultValue:saas.util.BaseUtil.getCurrentUser().id
-     },{
-        xtype : "hidden", 
-        name : "creatorId", 
-        fieldLabel : "录入人ID", 
-        readOnly:true
-    },
-    {
-        xtype : "textfield", 
-        name : "creatorName", 
-        fieldLabel : "录入人", 
-        readOnly:true
-    }, {
-        xtype : "datefield", 
-        name : "createTime", 
-        fieldLabel : "录入日期",
-        readOnly:true, 
-        defaultValue: new Date()
-    },{
-        xtype : "hidden", 
-        name : "updaterId", 
-        fieldLabel : "更新人ID", 
-        readOnly:true
-    },{
-        xtype : "hidden", 
-        name : "updaterName", 
-        fieldLabel : "更新人", 
-        readOnly:true
-    }, {
-        xtype : "hidden", 
-        name : "updateTime", 
-        fieldLabel : "更新日期",
-        readOnly:true, 
-        defaultValue: new Date()
-    }, {
-        xtype : "textfield", 
-        name : "sa_auditman", 
-        fieldLabel : "审核人", 
-        readOnly:true
-    }, {
-        xtype : "datefield", 
-        name : "sa_auditdate", 
-        fieldLabel : "审核日期",
-        readOnly:true
-    }
-    ]
+     }]
 });

+ 88 - 108
frontend/saas-web/app/view/stock/report/DataList.js

@@ -12,160 +12,140 @@ Ext.define('saas.view.stock.report.DataList', {
     // listUrl: 'http://192.168.253.41:8560/api/document/product/ReserveCost',
     defaultCondition: null,
     reportTitle: '物料库存数量金额表',
-    QueryWidth:0.15,
+    QueryWidth: 0.4,
     printAble: false,
     exportAble: true,
 
     searchItems: [{
         name: 'pr_code',
         xtype: 'textfield',
-        emptyText : '物料编号',
-        columnWidth: 0.15
-    },{
-        name: 'pr_detail',
-        xtype: 'textfield',
-        emptyText : '物料名称',
-        columnWidth: 0.15
-    },{
-        name: 'wh_code',
-        xtype: 'textfield',
-        emptyText : '仓库编号',
-        columnWidth: 0.15
-    },{
-        name: 'wh_description',
-        xtype: 'textfield',
-        emptyText : '仓库名称',
-        columnWidth: 0.15
+        emptyText: '物料编号/名称/规格',
+        columnWidth: 0.25,
+        getCondition: function (v) {
+            return "(upper(pr_spec) like '%" + v.toUpperCase() + "%' or upper(pr_code) like '%" + v.toUpperCase() + "%' or upper(pr_detail) like '%" + v.toUpperCase() + "%')";
+        },
     }, {
-        name: 'wh_description',
+        name: 'wh_code',
         xtype: 'textfield',
-        emptyText : '仓库名称',
-        columnWidth: 0.15
+        emptyText: '仓库编号/名称',
+        columnWidth: 0.25,
+        getCondition: function (v) {
+            return "(upper(wh_code) like '%" + v.toUpperCase() + "%' or upper(wh_description) like '%" + v.toUpperCase() + "%')";
+        }
     }, {
         name: 'toggle',
         xtype: 'checkbox',
-        fieldLabel : '分仓库存',
+        fieldLabel: '分仓库存',
         columnWidth: 0.1,
+        labelAlign: 'left',
+        labelWidth: 70,
         ignore: true,
         listeners: {
             change: 'toggle_change'
         }
     }],
 
-    reportColumns2 : [{
-        text : "物料编号", 
-        width : 150, 
-        dataIndex : "rc_prodCode", 
-        xtype : "", 
-    },{
-        text : "物料名称", 
-        width : 200.0, 
-        dataIndex : "rc_prodDetail", 
-    }, 
-    {
-        text : "物料规格", 
-        dataIndex : "rc_prodSpec", 
-        width : 150.0, 
-    }, 
-    {
-        text : "单位", 
-        dataIndex : "rc_prodUnit", 
-        width : 80.0, 
-    }, 
-    {
-        text : "仓库编号", 
-        dataIndex : "rc_whCode", 
-        width : 150, 
-    }, 
-    {
-        text : "仓库名称", 
-        dataIndex : "rc_whName", 
-        width : 200.0, 
-    }, 
-    {
-        text : "数量",
+    reportColumns2: [{
+        text: "物料编号",
+        width: 200,
+        dataIndex: "rc_prodCode",
+        xtype: "",
+    }, {
+        text: "物料名称",
+        width: 200,
+        dataIndex: "rc_prodDetail",
+    }, {
+        text: "物料规格",
+        dataIndex: "rc_prodSpec",
+        width: 200,
+    }, {
+        text: "单位",
+        dataIndex: "rc_prodUnit",
+        width: 150,
+    }, {
+        text: "仓库编号",
+        dataIndex: "rc_whCode",
+        width: 200,
+    }, {
+        text: "仓库名称",
+        dataIndex: "rc_whName",
+        width: 200,
+    }, {
+        text: "数量",
         xtype: 'numbercolumn',
-        dataIndex : "rc_number", 
-        width : 110.0, 
-        renderer : function(v) {
+        dataIndex: "rc_number",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>3?3:arr[1].length)).fill('0');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         }
-    }, 
-    {
-        text : "单价",
+    }, {
+        text: "单价",
         xtype: 'numbercolumn',
         align: 'end',
-        dataIndex : "rc_price", 
-        width : 110.0, 
-        renderer : function(v) {
+        dataIndex: "rc_price",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>8?8:arr[1].length)).fill('0');
+            var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         }
-    }, 
-    {
-        text : "金额", 
+    }, {
+        text: "金额",
         xtype: 'numbercolumn',
-        dataIndex : "rc_amount", 
-        width : 110.0,
-        renderer : function(v) {
+        dataIndex: "rc_amount",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>2?2:arr[1].length)).fill('0');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         },
     }],
 
-    reportColumns : [{
-        text : "物料编号", 
-        width : 150, 
-        dataIndex : "rc_prodCode", 
-        xtype : "", 
-    },{
-        text : "物料名称", 
-        width : 200.0, 
-        dataIndex : "rc_prodDetail", 
-    }, 
-    {
-        text : "物料规格", 
-        dataIndex : "rc_prodSpec", 
-        width : 150.0, 
-    }, 
-    {
-        text : "单位", 
-        dataIndex : "rc_prodUnit", 
-        width : 80.0, 
-    }, 
-    {
-        text : "数量",
+    reportColumns: [{
+        text: "物料编号",
+        width: 200,
+        dataIndex: "rc_prodCode",
+        xtype: "",
+    }, {
+        text: "物料名称",
+        width: 200,
+        dataIndex: "rc_prodDetail",
+    }, {
+        text: "物料规格",
+        dataIndex: "rc_prodSpec",
+        width: 200,
+    }, {
+        text: "单位",
+        dataIndex: "rc_prodUnit",
+        width: 150,
+    }, {
+        text: "数量",
         xtype: 'numbercolumn',
-        dataIndex : "rc_number", 
-        width : 110.0, 
-        renderer : function(v) {
+        dataIndex: "rc_number",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>3?3:arr[1].length)).fill('0');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         }
-    }, 
-    {
-        text : "金额", 
+    }, {
+        text: "金额",
         xtype: 'numbercolumn',
-        dataIndex : "rc_amount", 
-        width : 110.0,
-        renderer : function(v) {
+        dataIndex: "rc_amount",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>2?2:arr[1].length)).fill('0');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         },
     }, {
         flex: 1
     }],
-})
-
-
+})

+ 5 - 0
frontend/saas-web/app/view/stock/report/DataListController.js

@@ -5,9 +5,14 @@ Ext.define('saas.view.stock.report.DataListController', {
     toggle_change: function(field, newValue, oldValue, eOpts) {
         var me = this,
         reportPanel = me.getView(),
+        form = reportPanel.down('form'),
         grid = reportPanel.down('grid'),
         store = grid.store;
         
+        // var whCodeField = form.getForm().findField('wh_code');
+        // whCodeField.setValue('');
+        // whCodeField.setHidden(!newValue);
+
         if(newValue) {
             reportPanel.queryMode = 'DETAIL';
             store.load(function() {

+ 191 - 0
frontend/saas-web/app/view/sys/account/AddWindow.js

@@ -0,0 +1,191 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.sys.account.AddWindow', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'sys-account-addwindow',
+    dataKind:'accountadd',//类型标识
+    belong:{
+        columns:[{
+            dataIndex:'realname',
+        },{
+            dataIndex: 'mobile',
+        },{
+            dataIndex: 'email',
+        }],
+        reqUrl: '/api/account/account/register/add',
+    },
+    etc:{
+        accountadd:{
+            items:[{
+                xtype:'textfield',
+                fieldLabel: '联系号码',
+                name: 'mobile',
+                hideTrigger:true,
+                allowBlank:false,
+                maxLength: 30,
+                regex:/^1(3|4|5|7|8)\d{9}$/,
+                regexText:'请输入正确的手机号码',
+                listeners:{
+                    change:function(f,a,b){
+                        if(a==''){
+                            f._lastCheckValue = ''
+                        }
+                    },
+                    blur:function(f,a,b,c){
+                        var form = f.ownerCt;
+                        if(f.value&&f.value!=''&&f.isValid()&&f._lastCheckValue!=f.value){
+                            f._lastCheckValue = f.value;
+                            form.setLoading(true);
+                            Ext.Ajax.request({
+                                url: '/api/account/account/checkMobile?mobile='+f.value,
+                                method: 'GET',
+                                headers:{
+                                    'Access-Control-Allow-Origin': '*',
+                                    "Content-Type": 'application/json;charset=UTF-8',
+                                },
+                                success: function (response) {
+                                    form.setLoading(false);
+                                    var localJson = Ext.decode(response.responseText);
+                                    if(localJson.success){
+                                        if(localJson.data.hasRegister){
+                                            saas.util.BaseUtil.showSuccessToast('校验成功:手机号已在优软云注册');
+                                        }else{
+                                            saas.util.BaseUtil.showErrorToast('校验失败:手机号未在优软云注册');
+                                            f.setValue('');
+                                        }
+                                    }else{
+                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
+                                        f.setValue('');
+                                    }
+                                },
+                                failure: function (response) {
+                                    if(response.responseText){
+                                        var localJson = Ext.decode(response.responseText);
+                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
+                                        f.setValue('');
+                                    }else{
+                                        saas.util.BaseUtil.showErrorToast('手机号校验接口连接超时');
+                                        f.setValue('');
+                                    }
+                                }
+                            });
+                        }
+                    }
+                }
+            },{
+                xtype:'textfield',
+                fieldLabel: '真实姓名',
+                name: 'realname',
+                regex:/^[\u4e00-\u9fa5]+$/,
+                regexText:'请输入汉字',
+                allowBlank:false,
+                maxLength: 30,
+            },{
+                xtype:'textfield',
+                fieldLabel: '邮箱',
+                name: 'email',
+                allowBlank:true,
+                beforeLabelTextTpl: "",
+                regex:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
+                regexText:'请输入正确的邮箱',
+                maxLength: 30,
+                listeners:{
+                    blur:function(f,a,b,c){
+                        var form = f.ownerCt;
+                        if(f.value&&f.value!=''&&f.isValid()&&f._lastCheckValue!=f.value){
+                            form.setLoading(true);
+                            f._lastCheckValue = f.value
+                            Ext.Ajax.request({
+                                url: '/api/account/account/checkEmail?email='+f.value,
+                                method: 'GET',
+                                headers:{
+                                    'Access-Control-Allow-Origin': '*',
+                                    "Content-Type": 'application/json;charset=UTF-8'
+                                },
+                                success: function (response) {
+                                    form.setLoading(false);
+                                    var localJson = Ext.decode(response.responseText);
+                                    if(localJson.success){
+                                        if(!localJson.data){
+                                            saas.util.BaseUtil.showSuccessToast('校验成功:邮箱未注册');
+                                        }else{
+                                            saas.util.BaseUtil.showErrorToast('校验失败:该邮箱已被注册');
+                                            f.setValue('');
+                                        }
+                                    }else{
+                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
+                                    }
+                                },
+                                failure: function (response) {
+                                    if(response.responseText){
+                                        var localJson = Ext.decode(response.responseText);
+                                        saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
+                                    }else{
+                                        saas.util.BaseUtil.showErrorToast('邮箱校验接口连接超时');
+                                    }
+                                }
+                            });
+                        }
+                    }
+                }
+            },{
+                xtype:'datamulticombo',
+                dataUrl:'/api/account/role/list',
+                fieldLabel: '关联角色',
+                name: 'roleIds',
+                allowBlank:false,
+                maxLength: 30,
+            }]
+        }
+    },
+    onSave:function(){
+        var me = this;
+        var belong = this.belong;
+        me.setLoading(true);
+        var form=this.down('form');
+        var combo = this._combo;
+        var params = {};
+        var names = belong.columns.map(column => column.dataIndex);
+
+        Ext.Array.each(names,function(name) {
+            if(name){
+                var dataField = form.down('[name='+name+']');
+                if(dataField&&dataField.value){
+                    params[name] = dataField.value;
+                    params._value = dataField.value;
+                }
+            }
+        });
+
+        //更改参数
+        var o = '';
+        var dataField = form.down('[name=roleIds]');
+        Ext.Array.each(dataField.value,function(item) {
+            o+=item.value+','
+        });
+        o = o.substring(0,o.length-1);
+        params['username'] = params['mobile'];
+        params['type'] = 1;
+        params['roleIds'] = o;
+        //保存接口
+        saas.util.BaseUtil.request({
+            url: belong.reqUrl,
+            params: JSON.stringify(params),
+            method: 'POST'
+        })
+        .then(function(localJson) {
+            me.setLoading(false);
+            if(localJson.success){
+                form.ownerCt._parent.store.load();
+                saas.util.BaseUtil.showSuccessToast('保存成功');
+                form.ownerCt.close();
+            }
+        })
+        .catch(function(res) {
+            me.setLoading(false);
+            console.error(res);
+            saas.util.BaseUtil.showErrorToast('保存失败: ' + res.message);
+        });
+    }
+});

+ 1 - 6
frontend/saas-web/app/view/sys/account/DataList.js

@@ -237,17 +237,12 @@ Ext.define('saas.view.sys.account.DataList', {
         },
         itemClick: function(view,record,a,index,c) {
             var classList = c.target.classList.value;
-            var grid = this;
             if(classList.indexOf('fa-pencil')>-1){
-                var document = Ext.create('saas.view.document.kind.Kind',{});
-                var form = this.ownerCt;
                 this.dialog = this.getController().getView().add({
-                    xtype: 'document-kind-childwin',
+                    xtype: 'sys-account-editwindow',
                     bind: {
                         title: '修改账户信息'
                     },
-                    dataKind:'accountinformation',
-                    belong:document.etc['accountinformation'],
                     _parent:this,
                     record:record,
                     session: true

+ 1 - 4
frontend/saas-web/app/view/sys/account/DataListController.js

@@ -9,15 +9,12 @@ Ext.define('saas.view.sys.account.DataListController', {
     },
 
     onAdd:function(b){
-        var document = Ext.create('saas.view.document.kind.Kind',{});
         var form = this.view;
         this.dialog = form.add({
-            xtype: 'document-kind-childwin',
+            xtype: 'sys-account-addwindow',
             bind: {
                 title: '新增账户资料'
             },
-            dataKind:'accountadd',
-            belong:document.etc['accountadd'],
             _parent:form,
             record:null,
             session: true

+ 125 - 0
frontend/saas-web/app/view/sys/account/EditWindow.js

@@ -0,0 +1,125 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.sys.account.EditWindow', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'sys-account-editwindow',
+    dataKind:'accountinformation',//类型标识
+    belong:{
+        columns:[{
+            dataIndex:'accountId',
+        },{
+            dataIndex: 'roleNames',
+            width: 150
+        },{
+            dataIndex: 'mobile',
+            width: 110
+        },{
+            dataIndex: 'email',
+            width: 110
+        }],
+        reqUrl:'/api/account/account/bind/roles',
+    },
+    etc:{
+        accountinformation:{
+            items:[{
+                xtype:'hidden',
+                name:'accountId',
+                hidden:true,
+            },{
+                xtype:'textfield',
+                fieldLabel: '真实姓名',
+                name: 'realname',
+                readOnly:true,
+                editable:false,
+                allowBlank:true,
+                maxLength: 30,
+                beforeLabelTextTpl: "",
+            },{
+                xtype:'datamulticombo',
+                dataUrl:'/api/account/role/list',
+                fieldLabel: '关联角色',
+                name: 'roleNames',
+                allowBlank:true,
+                maxLength: 20,
+                beforeLabelTextTpl: "",
+            },{
+                xtype:'textfield',
+                fieldLabel: '联系电话',
+                name: 'mobile',
+                readOnly:true,
+                editable:false,
+                allowBlank:true,
+                maxLength: 30,
+                beforeLabelTextTpl: "",
+            },{
+                xtype:'textfield',
+                fieldLabel: '邮箱',
+                name: 'email',
+                readOnly:true,
+                editable:false,
+                allowBlank:true,
+                maxLength: 30,
+                beforeLabelTextTpl: "",
+            }]
+        }
+    },
+    onSave:function(){
+        var me = this;
+        var belong = this.belong;
+        me.setLoading(true);
+        var form=this.down('form');
+        var combo = this._combo;
+        var params = {};
+        var names = belong.columns.map(column => column.dataIndex);
+
+        Ext.Array.each(names,function(name) {
+            if(name){
+                var dataField = form.down('[name='+name+']');
+                if(dataField&&dataField.value){
+                    params[name] = dataField.value;
+                }
+            }
+        });
+
+        //更改参数
+        var o = '';
+        Ext.Array.each(params.roleNames,function(item) {
+            o+=item.value+','
+        });
+        o = o.substring(0,o.length-1);
+
+        if(o==""){
+            saas.util.BaseUtil.showErrorToast('关联角色未选择,无法保存!')
+        }
+
+        var _params = {
+            accountId:Number(params['accountId']),
+            roleIds:o,
+        };
+
+        //保存接口
+        saas.util.BaseUtil.request({
+            url: belong.reqUrl,
+            params: _params,
+            method: 'POST',
+            headers:{
+                'Access-Control-Allow-Origin': '*',
+                "Content-Type":'application/x-www-form-urlencoded'
+            }
+        })
+        .then(function(localJson) {
+            me.setLoading(false);
+            if(localJson.success){
+                saas.util.BaseUtil.showSuccessToast('保存成功');
+                form.ownerCt._parent.store.load()
+                form.ownerCt.close();
+            }
+        })
+        .catch(function(res) {
+            me.setLoading(false);
+            console.error(res);
+            saas.util.BaseUtil.showErrorToast('保存失败: ' + res.message);
+        });
+    }
+});

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

@@ -436,9 +436,9 @@ Ext.define('saas.view.sys.config.FormPanel', {
         var viewModel = form.getViewModel();
         if(viewModel.data.fileInfoList&&viewModel.data.fileInfoList.length!=0){
             var logo = viewModel.data.fileInfoList[0].logo;
-            var logoName = logo.name + "  (" + Ext.util.Format.fileSize(logo.size) + ")";
+            //var logoName = logo.name + "  (" + Ext.util.Format.fileSize(logo.size) + ")";
             var signet = viewModel.data.fileInfoList[0].signet;
-            var signetName = signet.name + "  (" + Ext.util.Format.fileSize(signet.size) + ")";
+            //var signetName = signet.name + "  (" + Ext.util.Format.fileSize(signet.size) + ")";
         }
     },
 

+ 2 - 8
frontend/saas-web/app/view/sys/maxnumbers/DataList.js

@@ -51,16 +51,13 @@ Ext.define('saas.view.sys.maxnumbers.DataList', {
         hidden:true,
         listeners: {
             click: function(){
-                var document = Ext.create('saas.view.document.kind.Kind',{});
                 var form = this.ownerCt.ownerCt;
                 var grid = this.ownerCt.ownerCt.items.items[0].grid;
                 this.dialog = form.getController().getView().add({
-                    xtype: 'document-kind-childwin',
+                    xtype: 'sys-maxnumbers-window',
                     bind: {
                         title: '新增单据编码规则'
                     },
-                    dataKind:'maxnumbers',
-                    belong:document.etc['maxnumbers'],
                     _parent:form,
                     _combo:grid,
                     record:null,
@@ -201,15 +198,12 @@ Ext.define('saas.view.sys.maxnumbers.DataList', {
             var classList = c.target.classList.value;
             var grid = this;
             if(classList.indexOf('fa-pencil')>-1){
-                var document = Ext.create('saas.view.document.kind.Kind',{});
                 var form = this.ownerCt;
                 this.dialog = form.getController().getView().add({
-                    xtype: 'document-kind-childwin',
+                    xtype: 'sys-maxnumbers-window',
                     bind: {
                         title: '修改单据编码规则'
                     },
-                    dataKind:'maxnumbers',
-                    belong:document.etc['maxnumbers'],
                     _parent:form,
                     _combo:this,
                     record:record,

+ 82 - 0
frontend/saas-web/app/view/sys/maxnumbers/Window.js

@@ -0,0 +1,82 @@
+Ext.define('saas.view.sys.maxnumbers.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'sys-maxnumbers-window',
+    dataKind:'maxnumbers',//类型标识
+    belong:{
+        columns: [{
+            text : "单据名称", 
+            width : 200.0, 
+            dataIndex : "mn_caller" 
+        }, 
+        {
+            text : "单据前缀", 
+            dataIndex : "mn_leadcode", 
+            width : 150.0
+        }, 
+        {
+            text : "单据规则", 
+            dataIndex : "mn_rule", 
+            width : 250.0
+        },{
+            text : "流水长度", 
+            dataIndex : "mn_number", 
+            width : 90.0,
+            xtype: 'numbercolumn',
+        }],
+        keyField:'id',
+        reqUrl:'/api/commons/number/save'
+    },
+    etc:{
+        maxnumbers:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                fieldLabel: '单据名称',
+                name: 'mn_name',
+                allowBlank:false,
+                editable:false,
+                readOnly:true,
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                fieldLabel: '单据前缀',
+                name: 'mn_leadcode',
+                beforeLabelTextTpl: '',
+                allowBlank:true,
+                maxLength: 20
+            },{
+                xtype:'combo',
+                fieldLabel: '单据规则',
+                name: 'mn_rule',
+                displayField : "display", 
+                editable:false,
+                hideTrigger : false, 
+                maxLength : 100.0, 
+                minValue : null, 
+                positiveNum : false, 
+                queryMode : "local", 
+                valueField : "value", 
+                store:{
+                    fields: ['display', 'value'],
+                    data : [
+                        {"display":"年月日", "value":'yyyymmdd'},
+                        {"display":"年月", "value":'yyyymm'},
+                        {"display":"无", "value":'无'}
+                    ]
+                }
+            },{
+                xtype:'numberfield',
+                hideTrigger : true, 
+                fieldLabel: '流水长度',
+                name: 'mn_number',
+                minValue : 0, 
+                allowBlank:false,
+                mouseWheelEnabled: false
+            }]
+        }
+    }
+});
+
+

+ 1 - 42
frontend/saas-web/app/view/sys/power/TreePanel.js

@@ -139,55 +139,14 @@ Ext.define('saas.view.sys.power.TreePanel', {
         var isleaf = rec.get('leaf');
         var record = isleaf?rec:null;
         var view = this.ownerCt.getController().getView();
-        var document = Ext.create('saas.view.document.kind.Kind',{});
         this.dialog = view.add({
-            xtype: 'document-kind-childwin',
+            xtype: 'sys-power-window',
             bind: {
                 title: (record?'修改':'新增')+'角色'
             },
-            dataKind:'personpower',
-            belong:document.etc['personpower'],
             _parent:this,
             record:record,
             session: true,
-            onSave:function(){
-                var me = this;
-                var belong = this.belong;
-                me.setLoading(true);
-                var form=this.down('form');
-                var params = {};
-                var names = belong.columns.map(column => column.dataIndex);
-                Ext.Array.each(names,function(name) {
-                    if(name){
-                        var dataField = form.down('[name='+name+']');
-                        if(dataField&&dataField.value){
-                            params[name] = dataField.value;
-                            params._value = dataField.value;
-                        }
-                    }
-                });
-                var idField = form.down('[name='+belong.keyField+']');
-                params[belong.keyField] = idField.value || 0;
-                //保存接口
-                saas.util.BaseUtil.request({
-                    url: idField.value?belong.updateUrl:belong.reqUrl,
-                    params: JSON.stringify(params),
-                    method: 'POST'
-                })
-                .then(function(localJson) {
-                    me.setLoading(false);
-                    if(localJson.success){
-                        saas.util.BaseUtil.showSuccessToast('保存成功');
-                        me._parent.setTree();
-                        form.ownerCt.close();
-                    }
-                })
-                .catch(function(res) {
-                    me.setLoading(false);
-                    console.error(res);
-                    saas.util.BaseUtil.showErrorToast('保存失败: ' + res.message);
-                });
-            }
         });
         this.dialog.show();
     },

+ 94 - 0
frontend/saas-web/app/view/sys/power/Window.js

@@ -0,0 +1,94 @@
+Ext.define('saas.view.sys.power.Window', {
+    extend: 'saas.view.document.kind.ChildForm',
+    xtype: 'sys-power-window',
+    dataKind:'personpower',//类型标识
+    belong:{
+        columns: [ {
+            text : "编号", 
+            dataIndex : "code", 
+            width : 150.0, 
+            xtype : "", 
+        },{
+            text : "角色名称", 
+            width : 200.0, 
+            dataIndex : "name", 
+            xtype : "", 
+        }, 
+        {
+            text : "角色描述", 
+            dataIndex : "description", 
+            width : 250.0
+        }
+        ],
+        keyField:'id',
+        reqUrl:'/api/account/role/save',
+        updateUrl:'/api/account/role/update',
+    },
+    etc:{
+        personpower:{
+            items:[{
+                xtype:'hidden',
+                name:'id'
+            },{
+                xtype:'textfield',
+                name:'name',
+                allowBlank:false,
+                fieldLabel:'角色名称',
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                name:'description',
+                allowBlank:false,
+                fieldLabel:'角色描述',
+                maxLength: 20
+            },{
+                xtype:'textfield',
+                hidden:true,
+                name:'code',
+                allowBlank:true,
+                fieldLabel:'角色编号',
+                maxLength: 20
+            }]
+        }
+    },
+    onSave:function(){
+        var me = this;
+        var belong = this.belong;
+        me.setLoading(true);
+        var form=this.down('form');
+        var params = {};
+        var names = belong.columns.map(column => column.dataIndex);
+        Ext.Array.each(names,function(name) {
+            if(name){
+                var dataField = form.down('[name='+name+']');
+                if(dataField&&dataField.value){
+                    params[name] = dataField.value;
+                    params._value = dataField.value;
+                }
+            }
+        });
+        var idField = form.down('[name='+belong.keyField+']');
+        params[belong.keyField] = idField.value || 0;
+        //保存接口
+        saas.util.BaseUtil.request({
+            url: idField.value?belong.updateUrl:belong.reqUrl,
+            params: JSON.stringify(params),
+            method: 'POST'
+        })
+        .then(function(localJson) {
+            me.setLoading(false);
+            if(localJson.success){
+                saas.util.BaseUtil.showSuccessToast('保存成功');
+                me._parent.setTree();
+                form.ownerCt.close();
+            }
+        })
+        .catch(function(res) {
+            me.setLoading(false);
+            console.error(res);
+            saas.util.BaseUtil.showErrorToast('保存失败: ' + res.message);
+        });
+    }
+});
+
+

+ 14 - 0
frontend/saas-web/electron/.gitignore

@@ -0,0 +1,14 @@
+dist/
+out/
+.idea
+node_modules/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+package-lock.json
+
+### VSCODE ###
+.vscode
+
+### sencha log ###
+*.log

+ 32 - 0
frontend/saas-web/electron/main.dev.js

@@ -0,0 +1,32 @@
+const { app, BrowserWindow } = require('electron');
+let mainWindow;
+
+function createWindow () {
+    mainWindow = new BrowserWindow({ width: 1280, height: 720, show: false });
+    mainWindow.once('ready-to-show', function(){
+        mainWindow.maximize();
+        mainWindow.show();
+    });
+    mainWindow.loadURL('http://127.0.0.1:1841/');
+
+    mainWindow.webContents.openDevTools();
+
+    mainWindow.on('closed', function () {
+        mainWindow = null;
+    });
+}
+
+app.on('ready', createWindow);
+
+// Quit when all windows are closed, except for Mac users
+app.on('window-all-closed', function () {
+    if (process.platform !== 'darwin') {
+        app.quit()
+    }
+});
+
+app.on('activate', function () {
+    if (mainWindow === null) {
+        createWindow();
+    }
+});

+ 42 - 0
frontend/saas-web/electron/main.js

@@ -0,0 +1,42 @@
+const { app, BrowserWindow } = require('electron');
+const path = require('path');
+const url = require('url');
+const isLocal = process.argv[process.argv.length - 1] === 'local';
+const extDir = isLocal ? '../build/production/saas' : 'dist';
+let mainWindow;
+
+function createWindow () {
+    mainWindow = new BrowserWindow({ width: 1280, height: 720, show: false });
+    mainWindow.once('ready-to-show', function(){
+        mainWindow.maximize();
+        mainWindow.show();
+    });
+    mainWindow.loadURL(url.format({
+        pathname: path.join(__dirname, extDir + '/index.html'),
+        protocol: 'file:',
+        slashes: true
+    }));
+
+    if (isLocal) {
+        mainWindow.webContents.openDevTools();
+    }
+
+    mainWindow.on('closed', function () {
+        mainWindow = null;
+    });
+}
+
+app.on('ready', createWindow);
+
+// Quit when all windows are closed, except for Mac users
+app.on('window-all-closed', function () {
+    if (process.platform !== 'darwin') {
+        app.quit()
+    }
+});
+
+app.on('activate', function () {
+    if (mainWindow === null) {
+        createWindow();
+    }
+});

+ 21 - 0
frontend/saas-web/electron/package.json

@@ -0,0 +1,21 @@
+{
+  "name": "saas-client",
+  "version": "1.0.0",
+  "description": "saas在线进销存系统",
+  "main": "./main.js",
+  "scripts": {
+    "dev-start": "electron ./main.dev.js",
+    "prod-start": "electron . local",
+    "build": "cd ../ && sencha app build --build prod --destination electron/dist/ --production",
+    "pack-win": "electron-packager . saas --overwrite --asar --platform=win32 --arch=x64 --out=out --ignore=\"(src|docs|out|.gitignore|LICENSE.md|README.md|npm-debug.log|node_modules|.idea|main.dev.js|package-lock.json|yarn.lock)\"",
+    "pack": "npm run build && npm run pack-win"
+  },
+  "author": "yingp@usoftchina.com",
+  "license": "ISC",
+  "dependencies": {
+    "electron": "^1.8.1"
+  },
+  "devDependencies": {
+    "electron-packager": "^9.0.1"
+  }
+}

+ 1289 - 0
frontend/saas-web/electron/yarn.lock

@@ -0,0 +1,1289 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/node@^8.0.24":
+  version "8.10.38"
+  resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-8.10.38.tgz#e05c201a668492e534b48102aca0294898f449f6"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+ajv@^6.5.5:
+  version "6.6.1"
+  resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61"
+  dependencies:
+    fast-deep-equal "^2.0.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+asar@^0.13.0:
+  version "0.13.1"
+  resolved "http://registry.npm.taobao.org/asar/download/asar-0.13.1.tgz#dfc73f574a7db256b09ba62d1f0e95cd4a6cb8d3"
+  dependencies:
+    chromium-pickle-js "^0.2.0"
+    commander "^2.9.0"
+    cuint "^0.2.1"
+    glob "^6.0.4"
+    minimatch "^3.0.3"
+    mkdirp "^0.5.0"
+    mksnapshot "^0.3.0"
+    tmp "0.0.28"
+
+asn1@~0.2.3:
+  version "0.2.4"
+  resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+  dependencies:
+    safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+author-regex@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/author-regex/download/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.8.0:
+  version "1.8.0"
+  resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64-js@^1.2.3:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+binary@^0.3.0:
+  version "0.3.0"
+  resolved "http://registry.npm.taobao.org/binary/download/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79"
+  dependencies:
+    buffers "~0.1.1"
+    chainsaw "~0.1.0"
+
+bluebird@^3.1.1, bluebird@^3.5.0:
+  version "3.5.3"
+  resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+buffer-alloc-unsafe@^1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/buffer-alloc-unsafe/download/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+
+buffer-alloc@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+
+buffer-from@^1.0.0:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
+buffers@~0.1.1:
+  version "0.1.1"
+  resolved "http://registry.npm.taobao.org/buffers/download/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelize@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/camelize/download/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+chainsaw@~0.1.0:
+  version "0.1.0"
+  resolved "http://registry.npm.taobao.org/chainsaw/download/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
+  dependencies:
+    traverse ">=0.3.0 <0.4"
+
+chromium-pickle-js@^0.2.0:
+  version "0.2.0"
+  resolved "http://registry.npm.taobao.org/chromium-pickle-js/download/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+  version "1.0.7"
+  resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.9.0:
+  version "2.19.0"
+  resolved "http://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+
+compare-version@^0.1.2:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/compare-version/download/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@1.6.2:
+  version "1.6.2"
+  resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+cuint@^0.2.1:
+  version "0.2.2"
+  resolved "http://registry.npm.taobao.org/cuint/download/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8:
+  version "2.6.9"
+  resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.0.0:
+  version "3.2.6"
+  resolved "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+  dependencies:
+    ms "^2.1.1"
+
+decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decompress-zip@0.3.0:
+  version "0.3.0"
+  resolved "http://registry.npm.taobao.org/decompress-zip/download/decompress-zip-0.3.0.tgz#ae3bcb7e34c65879adfe77e19c30f86602b4bdb0"
+  dependencies:
+    binary "^0.3.0"
+    graceful-fs "^4.1.3"
+    mkpath "^0.1.0"
+    nopt "^3.0.1"
+    q "^1.1.2"
+    readable-stream "^1.1.8"
+    touch "0.0.3"
+
+deep-extend@^0.6.0:
+  version "0.6.0"
+  resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+  dependencies:
+    jsbn "~0.1.0"
+    safer-buffer "^2.1.0"
+
+electron-download@^3.0.1:
+  version "3.3.0"
+  resolved "http://registry.npm.taobao.org/electron-download/download/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8"
+  dependencies:
+    debug "^2.2.0"
+    fs-extra "^0.30.0"
+    home-path "^1.0.1"
+    minimist "^1.2.0"
+    nugget "^2.0.0"
+    path-exists "^2.1.0"
+    rc "^1.1.2"
+    semver "^5.3.0"
+    sumchecker "^1.2.0"
+
+electron-download@^4.0.0:
+  version "4.1.1"
+  resolved "http://registry.npm.taobao.org/electron-download/download/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8"
+  dependencies:
+    debug "^3.0.0"
+    env-paths "^1.0.0"
+    fs-extra "^4.0.1"
+    minimist "^1.2.0"
+    nugget "^2.0.1"
+    path-exists "^3.0.0"
+    rc "^1.2.1"
+    semver "^5.4.1"
+    sumchecker "^2.0.2"
+
+electron-osx-sign@^0.4.1:
+  version "0.4.11"
+  resolved "http://registry.npm.taobao.org/electron-osx-sign/download/electron-osx-sign-0.4.11.tgz#8377732fe7b207969f264b67582ee47029ce092f"
+  dependencies:
+    bluebird "^3.5.0"
+    compare-version "^0.1.2"
+    debug "^2.6.8"
+    isbinaryfile "^3.0.2"
+    minimist "^1.2.0"
+    plist "^3.0.1"
+
+electron-packager@^9.0.1:
+  version "9.1.0"
+  resolved "http://registry.npm.taobao.org/electron-packager/download/electron-packager-9.1.0.tgz#4b2ef9f8343f5de431182d82929d9c06c0d51a1d"
+  dependencies:
+    asar "^0.13.0"
+    camelize "^1.0.0"
+    debug "^3.0.0"
+    electron-download "^4.0.0"
+    electron-osx-sign "^0.4.1"
+    extract-zip "^1.0.3"
+    fs-extra "^4.0.0"
+    get-package-info "^1.0.0"
+    minimist "^1.1.1"
+    parse-author "^2.0.0"
+    pify "^3.0.0"
+    plist "^2.0.0"
+    pruner "^0.0.7"
+    rcedit "^0.9.0"
+    resolve "^1.1.6"
+    run-series "^1.1.1"
+    sanitize-filename "^1.6.0"
+    semver "^5.3.0"
+
+electron@^1.8.1:
+  version "1.8.8"
+  resolved "http://registry.npm.taobao.org/electron/download/electron-1.8.8.tgz#a90cddb075291f49576993e6f5c8bb4439301cae"
+  dependencies:
+    "@types/node" "^8.0.24"
+    electron-download "^3.0.1"
+    extract-zip "^1.0.3"
+
+env-paths@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/env-paths/download/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
+
+error-ex@^1.2.0:
+  version "1.3.2"
+  resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es6-promise@^4.0.5:
+  version "4.2.5"
+  resolved "http://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
+
+extend@~3.0.2:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+
+extract-zip@^1.0.3:
+  version "1.6.7"
+  resolved "http://registry.npm.taobao.org/extract-zip/download/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
+  dependencies:
+    concat-stream "1.6.2"
+    debug "2.6.9"
+    mkdirp "0.5.1"
+    yauzl "2.4.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fd-slicer@~1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
+  dependencies:
+    pend "~1.2.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.3.2:
+  version "2.3.3"
+  resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.6"
+    mime-types "^2.1.12"
+
+fs-extra@0.26.7:
+  version "0.26.7"
+  resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    klaw "^1.0.0"
+    path-is-absolute "^1.0.0"
+    rimraf "^2.2.8"
+
+fs-extra@^0.30.0:
+  version "0.30.0"
+  resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    klaw "^1.0.0"
+    path-is-absolute "^1.0.0"
+    rimraf "^2.2.8"
+
+fs-extra@^4.0.0, fs-extra@^4.0.1:
+  version "4.0.3"
+  resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+get-package-info@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/get-package-info/download/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c"
+  dependencies:
+    bluebird "^3.1.1"
+    debug "^2.2.0"
+    lodash.get "^4.0.0"
+    read-pkg-up "^2.0.0"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob@^6.0.4:
+  version "6.0.4"
+  resolved "http://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.0.5:
+  version "7.1.3"
+  resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+  version "4.1.15"
+  resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~5.1.0:
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
+  dependencies:
+    ajv "^6.5.5"
+    har-schema "^2.0.0"
+
+home-path@^1.0.1:
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/home-path/download/home-path-1.0.6.tgz#d549dc2465388a7f8667242c5b31588d29af29fc"
+
+hosted-git-info@^2.1.4:
+  version "2.7.1"
+  resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+ini@~1.3.0:
+  version "1.3.5"
+  resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isbinaryfile@^3.0.2:
+  version "3.0.3"
+  resolved "http://registry.npm.taobao.org/isbinaryfile/download/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
+  dependencies:
+    buffer-alloc "^1.2.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+jsonfile@^2.1.0:
+  version "2.4.0"
+  resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+klaw@^1.0.0:
+  version "1.3.1"
+  resolved "http://registry.npm.taobao.org/klaw/download/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+  optionalDependencies:
+    graceful-fs "^4.1.9"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash.get@^4.0.0:
+  version "4.4.2"
+  resolved "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+meow@^3.1.0:
+  version "3.7.0"
+  resolved "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+mime-db@~1.37.0:
+  version "1.37.0"
+  resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+  version "2.1.21"
+  resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
+  dependencies:
+    mime-db "~1.37.0"
+
+"minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mkdirp@0.5.1, mkdirp@^0.5.0:
+  version "0.5.1"
+  resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+mkpath@^0.1.0:
+  version "0.1.0"
+  resolved "http://registry.npm.taobao.org/mkpath/download/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91"
+
+mksnapshot@^0.3.0:
+  version "0.3.1"
+  resolved "http://registry.npm.taobao.org/mksnapshot/download/mksnapshot-0.3.1.tgz#2501c05657436d742ce958a4ff92c77e40dd37e6"
+  dependencies:
+    decompress-zip "0.3.0"
+    fs-extra "0.26.7"
+    request "^2.79.0"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+ms@^2.1.1:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+
+nopt@^3.0.1:
+  version "3.0.6"
+  resolved "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+nopt@~1.0.10:
+  version "1.0.10"
+  resolved "http://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+  dependencies:
+    abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+  version "2.4.0"
+  resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+nugget@^2.0.0, nugget@^2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/nugget/download/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0"
+  dependencies:
+    debug "^2.1.3"
+    minimist "^1.1.0"
+    pretty-bytes "^1.0.2"
+    progress-stream "^1.1.0"
+    request "^2.45.0"
+    single-line-log "^1.1.2"
+    throttleit "0.0.2"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.9.0:
+  version "0.9.0"
+  resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+
+object-assign@^4.0.1:
+  version "4.1.1"
+  resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-keys@~0.4.0:
+  version "0.4.0"
+  resolved "http://registry.npm.taobao.org/object-keys/download/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
+once@^1.3.0:
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+os-tmpdir@~1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+parse-author@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/parse-author/download/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f"
+  dependencies:
+    author-regex "^1.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+path-exists@^2.0.0, path-exists@^2.1.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-parse@^1.0.5:
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+plist@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/plist/download/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025"
+  dependencies:
+    base64-js "1.2.0"
+    xmlbuilder "8.2.2"
+    xmldom "0.1.x"
+
+plist@^3.0.1:
+  version "3.0.1"
+  resolved "http://registry.npm.taobao.org/plist/download/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c"
+  dependencies:
+    base64-js "^1.2.3"
+    xmlbuilder "^9.0.7"
+    xmldom "0.1.x"
+
+pretty-bytes@^1.0.2:
+  version "1.0.4"
+  resolved "http://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84"
+  dependencies:
+    get-stdin "^4.0.1"
+    meow "^3.1.0"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+progress-stream@^1.1.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/progress-stream/download/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77"
+  dependencies:
+    speedometer "~0.1.2"
+    through2 "~0.2.3"
+
+pruner@^0.0.7:
+  version "0.0.7"
+  resolved "http://registry.npm.taobao.org/pruner/download/pruner-0.0.7.tgz#345fbcb3e80701163a1d7adf56bac229a5a1e4c1"
+  dependencies:
+    fs-extra "^4.0.0"
+
+psl@^1.1.24:
+  version "1.1.29"
+  resolved "http://registry.npm.taobao.org/psl/download/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
+
+punycode@^1.4.1:
+  version "1.4.1"
+  resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+q@^1.1.2:
+  version "1.5.1"
+  resolved "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qs@~6.5.2:
+  version "6.5.2"
+  resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+
+rc@^1.1.2, rc@^1.2.1:
+  version "1.2.8"
+  resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+  dependencies:
+    deep-extend "^0.6.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+rcedit@^0.9.0:
+  version "0.9.0"
+  resolved "http://registry.npm.taobao.org/rcedit/download/rcedit-0.9.0.tgz#3910df57345399e2b0325f4a519007f89e55ef1c"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+readable-stream@^1.1.8, readable-stream@~1.1.9:
+  version "1.1.14"
+  resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^2.2.2:
+  version "2.3.6"
+  resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request@^2.45.0, request@^2.79.0:
+  version "2.88.0"
+  resolved "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.8.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.6"
+    extend "~3.0.2"
+    forever-agent "~0.6.1"
+    form-data "~2.3.2"
+    har-validator "~5.1.0"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.19"
+    oauth-sign "~0.9.0"
+    performance-now "^2.1.0"
+    qs "~6.5.2"
+    safe-buffer "^5.1.2"
+    tough-cookie "~2.4.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.3.2"
+
+resolve@^1.1.6:
+  version "1.8.1"
+  resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+  dependencies:
+    path-parse "^1.0.5"
+
+rimraf@^2.2.8:
+  version "2.6.2"
+  resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+run-series@^1.1.1:
+  version "1.1.8"
+  resolved "http://registry.npm.taobao.org/run-series/download/run-series-1.1.8.tgz#2c4558f49221e01cd6371ff4e0a1e203e460fc36"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+  version "2.1.2"
+  resolved "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sanitize-filename@^1.6.0:
+  version "1.6.1"
+  resolved "http://registry.npm.taobao.org/sanitize-filename/download/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a"
+  dependencies:
+    truncate-utf8-bytes "^1.0.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
+  version "5.6.0"
+  resolved "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+single-line-log@^1.1.2:
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/single-line-log/download/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364"
+  dependencies:
+    string-width "^1.0.1"
+
+spdx-correct@^3.0.0:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.2.0"
+  resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
+
+speedometer@~0.1.2:
+  version "0.1.4"
+  resolved "http://registry.npm.taobao.org/speedometer/download/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d"
+
+sshpk@^1.7.0:
+  version "1.15.2"
+  resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    bcrypt-pbkdf "^1.0.0"
+    dashdash "^1.12.0"
+    ecc-jsbn "~0.1.1"
+    getpass "^0.1.1"
+    jsbn "~0.1.0"
+    safer-buffer "^2.0.2"
+    tweetnacl "~0.14.0"
+
+string-width@^1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0:
+  version "3.0.1"
+  resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+sumchecker@^1.2.0:
+  version "1.3.1"
+  resolved "http://registry.npm.taobao.org/sumchecker/download/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d"
+  dependencies:
+    debug "^2.2.0"
+    es6-promise "^4.0.5"
+
+sumchecker@^2.0.2:
+  version "2.0.2"
+  resolved "http://registry.npm.taobao.org/sumchecker/download/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e"
+  dependencies:
+    debug "^2.2.0"
+
+throttleit@0.0.2:
+  version "0.0.2"
+  resolved "http://registry.npm.taobao.org/throttleit/download/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf"
+
+through2@~0.2.3:
+  version "0.2.3"
+  resolved "http://registry.npm.taobao.org/through2/download/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f"
+  dependencies:
+    readable-stream "~1.1.9"
+    xtend "~2.1.1"
+
+tmp@0.0.28:
+  version "0.0.28"
+  resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120"
+  dependencies:
+    os-tmpdir "~1.0.1"
+
+touch@0.0.3:
+  version "0.0.3"
+  resolved "http://registry.npm.taobao.org/touch/download/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d"
+  dependencies:
+    nopt "~1.0.10"
+
+tough-cookie@~2.4.3:
+  version "2.4.3"
+  resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
+  dependencies:
+    psl "^1.1.24"
+    punycode "^1.4.1"
+
+"traverse@>=0.3.0 <0.4":
+  version "0.3.9"
+  resolved "http://registry.npm.taobao.org/traverse/download/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+truncate-utf8-bytes@^1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/truncate-utf8-bytes/download/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+  dependencies:
+    utf8-byte-length "^1.0.1"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+universalify@^0.1.0:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+
+uri-js@^4.2.2:
+  version "4.2.2"
+  resolved "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+  dependencies:
+    punycode "^2.1.0"
+
+utf8-byte-length@^1.0.1:
+  version "1.0.4"
+  resolved "http://registry.npm.taobao.org/utf8-byte-length/download/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+uuid@^3.3.2:
+  version "3.3.2"
+  resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.4"
+  resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xmlbuilder@8.2.2:
+  version "8.2.2"
+  resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
+
+xmlbuilder@^9.0.7:
+  version "9.0.7"
+  resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
+
+xmldom@0.1.x:
+  version "0.1.27"
+  resolved "http://registry.npm.taobao.org/xmldom/download/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+
+xtend@~2.1.1:
+  version "2.1.2"
+  resolved "http://registry.npm.taobao.org/xtend/download/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+  dependencies:
+    object-keys "~0.4.0"
+
+yauzl@2.4.1:
+  version "2.4.1"
+  resolved "http://registry.npm.taobao.org/yauzl/download/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
+  dependencies:
+    fd-slicer "~1.0.1"

+ 12 - 4
frontend/saas-web/resources/json/navigation.json

@@ -173,10 +173,18 @@
             "id": "monry-report-accountbalance",
             "viewType":"monry-report-accountbalance"
         }, {
-                "text": "核销明细表",
-                "id": "monry-report-accountdetails",
-                "viewType":"monry-report-accountdetails"
-            }]
+            "text": "核销明细表",
+            "id": "monry-report-accountdetails",
+            "viewType":"monry-report-accountdetails"
+        }, {
+            "text": "应收总账明细表",
+            "id": "monry-report-totalrecdetail",
+            "viewType":"monry-report-totalrecdetail"
+        }, {
+            "text": "应付总账明细表",
+            "id": "monry-report-totalpaydetail",
+            "viewType":"monry-report-totalpaydetail"
+        }]
     }]
 }, {
     "text": "资料",