yingp 6 лет назад
Родитель
Сommit
0c3711469e
100 измененных файлов с 12373 добавлено и 1152 удалено
  1. 22 1
      applications/README.md
  2. 3 0
      applications/assert/assert-base/build.gradle
  3. 7 1
      applications/assert/assert-base/src/main/resources/metadata/Assert.domain.json
  4. 167 0
      applications/assert/assert-base/src/main/resources/metadata/Assert.fn.json
  5. 68 0
      applications/base/src/main/resources/metadata/Base.enum.json
  6. 10 3
      applications/base/src/main/resources/metadata/Base.fn.json
  7. 8 19
      applications/base/src/main/resources/metadata/Base.module.json
  8. 25 0
      applications/base/src/main/resources/metadata/Base.support.json
  9. 832 0
      applications/base/src/main/resources/metadata/product/Currency.form.json
  10. 1090 292
      applications/base/src/main/resources/metadata/product/Product.form.json
  11. 763 0
      applications/base/src/main/resources/metadata/product/ProductCategory.form.json
  12. 119 56
      applications/base/src/main/resources/metadata/product/Unit.form.json
  13. 26 35
      applications/base/src/main/resources/metadata/product/UnitGroup.form.json
  14. 26 35
      applications/base/src/main/resources/metadata/supplier/Supplier.form.json
  15. 3 0
      applications/cost/cost-base/build.gradle
  16. 15 1
      applications/cost/cost-base/src/main/resources/metadata/Cost.domain.json
  17. 79 0
      applications/cost/cost-base/src/main/resources/metadata/Cost.fn.json
  18. 3 0
      applications/crm/crm-base/build.gradle
  19. 6 6
      applications/crm/crm-base/src/main/resources/metadata/Crm.domain.json
  20. 32 3
      applications/crm/crm-base/src/main/resources/metadata/Crm.fn.json
  21. 3 0
      applications/ec/ec-base/build.gradle
  22. 11 1
      applications/ec/ec-base/src/main/resources/metadata/Ec.domain.json
  23. 36 0
      applications/ec/ec-base/src/main/resources/metadata/Ec.fn.json
  24. 3 0
      applications/fa/fa-base/build.gradle
  25. 43 1
      applications/fa/fa-base/src/main/resources/metadata/Fa.domain.json
  26. 66 0
      applications/fa/fa-base/src/main/resources/metadata/Fa.fn.json
  27. 3 0
      applications/plm/plm-base/build.gradle
  28. 31 1
      applications/plm/plm-base/src/main/resources/metadata/Plm.domain.json
  29. 23 0
      applications/plm/plm-base/src/main/resources/metadata/Plm.fn.json
  30. 3 0
      applications/pm/pm-base/build.gradle
  31. 27 1
      applications/pm/pm-base/src/main/resources/metadata/Pm.domain.json
  32. 81 0
      applications/pm/pm-base/src/main/resources/metadata/Pm.fn.json
  33. 3 0
      applications/scm/scm-barcode/build.gradle
  34. 240 0
      applications/scm/scm-barcode/src/main/resources/metadata/Barcode.fn.json
  35. 0 25
      applications/scm/scm-barcode/src/main/resources/metadata/Barcode.module.json
  36. 1 1
      applications/scm/scm-base/build.gradle
  37. 3 0
      applications/scm/scm-credit/build.gradle
  38. 170 0
      applications/scm/scm-credit/src/main/resources/metadata/Credit.fn.json
  39. 7 0
      applications/scm/scm-credit/src/main/resources/metadata/Credit.module.json
  40. 3 0
      applications/scm/scm-org/build.gradle
  41. 128 0
      applications/scm/scm-org/src/main/resources/metadata/Org.fn.json
  42. 7 0
      applications/scm/scm-org/src/main/resources/metadata/Org.module.json
  43. 1813 0
      applications/scm/scm-purchase/src/main/resources/metadata/InStock.form.json
  44. 593 459
      applications/scm/scm-purchase/src/main/resources/metadata/Order.form.json
  45. 20 20
      applications/scm/scm-purchase/src/main/resources/metadata/Purchase.fn.json
  46. 0 25
      applications/scm/scm-purchase/src/main/resources/metadata/Purchase.module.json
  47. 1447 0
      applications/scm/scm-purchase/src/main/resources/metadata/Receive.form.json
  48. 8 0
      applications/scm/scm-purchase/src/main/resources/metadata/ReqToOrder.convert.json
  49. 1491 10
      applications/scm/scm-purchase/src/main/resources/metadata/Requisition.form.json
  50. 3 0
      applications/scm/scm-sale/build.gradle
  51. 359 0
      applications/scm/scm-sale/src/main/resources/metadata/Sale.fn.json
  52. 7 0
      applications/scm/scm-sale/src/main/resources/metadata/Sale.module.json
  53. 3 0
      applications/scm/scm-stock/build.gradle
  54. 443 0
      applications/scm/scm-stock/src/main/resources/metadata/Stock.fn.json
  55. 7 0
      applications/scm/scm-stock/src/main/resources/metadata/Stock.module.json
  56. 3 0
      applications/sys/sys-base/build.gradle
  57. 15 1
      applications/sys/sys-base/src/main/resources/metadata/Sys.domain.json
  58. 1 1
      build.gradle
  59. 2 1
      framework/README.md
  60. 39 1
      framework/framework-core/src/main/java/com/usoftchina/uas/util/CollectionUtils.java
  61. 115 7
      framework/framework-core/src/main/java/com/usoftchina/uas/util/DateUtils.java
  62. 10 0
      framework/framework-core/src/main/java/com/usoftchina/uas/util/HashTable.java
  63. 1 1
      framework/framework-core/src/main/java/com/usoftchina/uas/util/Iterators.java
  64. 28 0
      framework/framework-core/src/main/java/com/usoftchina/uas/util/JsonUtils.java
  65. 10 0
      framework/framework-core/src/main/java/com/usoftchina/uas/util/MapUtils.java
  66. 21 1
      framework/framework-core/src/main/java/com/usoftchina/uas/util/NumberUtils.java
  67. 138 4
      framework/framework-core/src/main/java/com/usoftchina/uas/util/Record.java
  68. 34 6
      framework/framework-core/src/main/java/com/usoftchina/uas/util/Safety.java
  69. 107 1
      framework/framework-core/src/main/java/com/usoftchina/uas/util/StatefulRecord.java
  70. 8 0
      framework/framework-core/src/main/java/com/usoftchina/uas/util/Table.java
  71. 12 0
      framework/framework-core/src/main/java/com/usoftchina/uas/util/TypeUtils.java
  72. 114 1
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/EntityFieldMetadata.java
  73. 45 1
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/EntityMetadata.java
  74. 38 0
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/Status.java
  75. 29 1
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/StatusControl.java
  76. 23 21
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/dialect/MsSqlFieldTypeResolver.java
  77. 23 21
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/dialect/MySqlFieldTypeResolver.java
  78. 26 24
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/dialect/OracleFieldResolver.java
  79. 439 1
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/filter/FilterMetadata.java
  80. 1 1
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/filter/SorterMetadata.java
  81. 25 1
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/model/EntityModel.java
  82. 3 2
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/util/EntityInsert.java
  83. 61 6
      framework/framework-entity/src/main/java/com/usoftchina/uas/entity/util/EntityQuery.java
  84. 34 27
      framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainInitialize.java
  85. 8 1
      framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainInitializedEvent.java
  86. 18 2
      framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainMetadata.java
  87. 10 0
      framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainMetadataService.java
  88. 12 1
      framework/framework-form/src/main/java/com/usoftchina/uas/domain/module/ModuleMetadata.java
  89. 39 1
      framework/framework-form/src/main/java/com/usoftchina/uas/form/FormMetadata.java
  90. 3 2
      framework/framework-form/src/main/java/com/usoftchina/uas/form/FormMetadataResolver.java
  91. 17 0
      framework/framework-form/src/main/java/com/usoftchina/uas/form/base/EnumData.java
  92. 2 2
      framework/framework-form/src/main/java/com/usoftchina/uas/form/base/SupportData.java
  93. 10 10
      framework/framework-form/src/main/java/com/usoftchina/uas/form/base/SupportDataEntry.java
  94. 4 3
      framework/framework-form/src/main/java/com/usoftchina/uas/form/base/SupportDataInitialize.java
  95. 1 1
      framework/framework-form/src/main/java/com/usoftchina/uas/form/base/view/SupportDataController.java
  96. 75 0
      framework/framework-form/src/main/java/com/usoftchina/uas/form/bill/BillInitialize.java
  97. 37 0
      framework/framework-form/src/main/java/com/usoftchina/uas/form/bill/BillTypeService.java
  98. 296 0
      framework/framework-form/src/main/java/com/usoftchina/uas/form/bill/ConvertMetadata.java
  99. 19 1
      framework/framework-form/src/main/java/com/usoftchina/uas/form/dynamic/TipController.java
  100. 27 1
      framework/framework-form/src/main/java/com/usoftchina/uas/form/operation/AddViewHandler.java

+ 22 - 1
applications/README.md

@@ -5,10 +5,31 @@
 ```
 ├─applications
 │  │  
-│  ├─base-------------------------------------基础
+│  ├─assert-----------------------------------资产管理
+│  ├───assert-base----------------------------资产管理基础
+│  ├─base-------------------------------------基础应用
+│  ├─cloud------------------------------------云应用
+│  ├─cost-------------------------------------成本管理
+│  ├───cost-base------------------------------成本管理基础
+│  ├─crm--------------------------------------客户关系管理
+│  ├───crm-base-------------------------------客户关系管理基础
+│  ├─ec---------------------------------------电商与分销
+│  ├───ec-base--------------------------------电商基础
+│  ├─fa---------------------------------------财务会计
+│  ├───fa-base--------------------------------财务会计基础
+│  ├─plm--------------------------------------PLM
+│  ├───plm-base-------------------------------PLM基础
+│  ├─pm---------------------------------------生产制造
+│  ├───pm-base--------------------------------生产制造基础
 │  ├─scm--------------------------------------供应链
+│  ├───scm-barcode----------------------------条码管理
 │  ├───scm-base-------------------------------供应链基础
+│  ├───scm-credit-----------------------------信用管理
+│  ├───scm-org--------------------------------组织间结算
 │  ├───scm-purchase---------------------------采购管理
 │  ├───scm-sale-------------------------------销售管理
+│  ├───scm-stock------------------------------库存管理
+│  ├─sys--------------------------------------系统管理
+│  ├───sys-base-------------------------------系统管理基础
 │  │
 ```

+ 3 - 0
applications/assert/assert-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 7 - 1
applications/assert/assert-base/src/main/resources/metadata/Assert.domain.json

@@ -1,6 +1,12 @@
 [
   {
     "name": "资产管理",
-    "id": "assert"
+    "id": "assert",
+    "modules": [
+      {
+        "id": "assert_fixed",
+        "name": "固定资产"
+      }
+    ]
   }
 ]

+ 167 - 0
applications/assert/assert-base/src/main/resources/metadata/Assert.fn.json

@@ -0,0 +1,167 @@
+[
+  {
+    "groupId": "assert_fixed_req",
+    "groupName": "资产请购",
+    "module": "assert_fixed",
+    "entries": [
+      {
+        "text": "资产申请单",
+        "formId": "assert_fixed_req",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "采购申请单",
+        "formId": "pur_req",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "assert_fixed_mgm",
+    "groupName": "日常管理",
+    "module": "assert_fixed",
+    "entries": [
+      {
+        "text": "资产卡片",
+        "formId": "assert_fixed_card",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "资产处置",
+        "formId": "assert_fixed_disp",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "资产变更",
+        "formId": "assert_fixed_change",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "资产借用",
+        "formId": "assert_fixed_borrow",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "资产领用",
+        "formId": "assert_fixed_take",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "资产调出",
+        "formId": "assert_fixed_out",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "资产调入",
+        "formId": "assert_fixed_in",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "初始化卡片",
+        "formId": "assert_fixed_card_init",
+        "viewType": "list",
+        "openType": "card"
+      }
+    ]
+  },
+  {
+    "groupId": "assert_fixed_dep",
+    "groupName": "折旧管理",
+    "module": "assert_fixed",
+    "entries": [
+      {
+        "text": "计提折旧",
+        "formId": "assert_fixed_dep",
+        "viewType": "form",
+        "openType": "card"
+      },
+      {
+        "text": "折旧调整单",
+        "formId": "assert_fixed_dep_adjust",
+        "viewType": "list",
+        "openType": "card"
+      }
+    ]
+  },
+  {
+    "groupId": "assert_fixed_fa",
+    "groupName": "账务处理",
+    "module": "assert_fixed",
+    "entries": [
+      {
+        "text": "凭证生成",
+        "formId": "assert_fixed_voucher",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "业务凭证查询",
+        "formId": "assert_fixed_voucher_biz",
+        "viewType": "list",
+        "openType": "card"
+      },
+      {
+        "text": "总账凭证查询",
+        "formId": "assert_fixed_voucher_gl",
+        "viewType": "list",
+        "openType": "card"
+      }
+    ]
+  },
+  {
+    "groupId": "assert_fixed_report",
+    "groupName": "管理报表",
+    "module": "assert_fixed",
+    "entries": [
+      {
+        "text": "资产实物清单",
+        "formId": "assert_fixed_material",
+        "viewType": "report",
+        "openType": "card"
+      },
+      {
+        "text": "资产价值清单",
+        "formId": "assert_fixed_value",
+        "viewType": "report",
+        "openType": "card"
+      },
+      {
+        "text": "折扣明细表",
+        "formId": "assert_fixed_dep_detail",
+        "viewType": "report",
+        "openType": "card"
+      },
+      {
+        "text": "折扣汇总表",
+        "formId": "assert_fixed_dep_sum",
+        "viewType": "report",
+        "openType": "card"
+      }
+    ]
+  },
+  {
+    "groupId": "assert_fixed_em",
+    "groupName": "期末处理",
+    "module": "assert_fixed"
+  },
+  {
+    "groupId": "assert_fixed_check",
+    "groupName": "资产盘点",
+    "module": "assert_fixed"
+  },
+  {
+    "groupId": "assert_fixed_config",
+    "groupName": "参数设置",
+    "module": "assert_fixed"
+  }
+]

+ 68 - 0
applications/base/src/main/resources/metadata/Base.enum.json

@@ -30,5 +30,73 @@
         "entryName": "浮动"
       }
     ]
+  },
+  {
+    "enumCode": "base_curr_order",
+    "enumName": "币别显示顺序",
+    "entries": [
+      {
+        "entryCode": "prefix",
+        "entryName": "前缀式"
+      },
+      {
+        "entryCode": "suffix",
+        "entryName": "后缀式"
+      }
+    ]
+  },
+  {
+    "enumCode": "base_product_cls",
+    "enumName": "物料属性",
+    "entries": [
+      {
+        "entryCode": "1",
+        "entryName": "外购"
+      },
+      {
+        "entryCode": "2",
+        "entryName": "自制"
+      },
+      {
+        "entryCode": "3",
+        "entryName": "委外"
+      },
+      {
+        "entryCode": "4",
+        "entryName": "配置"
+      },
+      {
+        "entryCode": "5",
+        "entryName": "资产"
+      },
+      {
+        "entryCode": "6",
+        "entryName": "特征"
+      },
+      {
+        "entryCode": "7",
+        "entryName": "费用"
+      },
+      {
+        "entryCode": "8",
+        "entryName": "虚拟"
+      },
+      {
+        "entryCode": "9",
+        "entryName": "服务"
+      },
+      {
+        "entryCode": "10",
+        "entryName": "一次性"
+      },
+      {
+        "entryCode": "11",
+        "entryName": "模型"
+      },
+      {
+        "entryCode": "12",
+        "entryName": "产品系列"
+      }
+    ]
   }
 ]

+ 10 - 3
applications/base/src/main/resources/metadata/Base.fn.json

@@ -82,7 +82,7 @@
     "module": "base_data",
     "entries": [
       {
-        "text": "币别",
+        "text": "币别列表",
         "formId": "base_currency",
         "viewType": "list",
         "openType": "card",
@@ -94,6 +94,13 @@
         "viewType": "list",
         "openType": "card",
         "permission": "view"
+      },
+      {
+        "text": "存货类别列表",
+        "formId": "base_product_cate",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "view"
       }
     ]
   },
@@ -104,7 +111,7 @@
     "entries": [
       {
         "text": "辅助资料列表",
-        "formId": "base_supportdata",
+        "formId": "frame_supportdata",
         "viewType": "list",
         "openType": "card",
         "permission": "new"
@@ -118,7 +125,7 @@
     "entries": [
       {
         "text": "单据类型列表",
-        "formId": "base_billtype",
+        "formId": "frame_billtype",
         "viewType": "list",
         "openType": "card"
       }

+ 8 - 19
applications/base/src/main/resources/metadata/Base.module.json

@@ -1,23 +1,12 @@
 [
   {
-    "name": "基础管理",
-    "id": "base",
-    "modules": [
-      {
-        "id": "base_data",
-        "name": "基础资料",
-        "domain": "base"
-      },
-      {
-        "id": "base_setting",
-        "name": "公共设置",
-        "domain": "base"
-      },
-      {
-        "id": "base_init",
-        "name": "初始化管理",
-        "domain": "base"
-      }
-    ]
+    "id": "base_setting",
+    "name": "公共设置",
+    "domain": "base"
+  },
+  {
+    "id": "base_init",
+    "name": "初始化管理",
+    "domain": "base"
   }
 ]

+ 25 - 0
applications/base/src/main/resources/metadata/Base.support.json

@@ -0,0 +1,25 @@
+[
+  {
+    "domain": "base",
+    "supportCode": "base_taxtype",
+    "supportName": "税分类",
+    "entries": [
+      {
+        "entryCode": "normal",
+        "entryName": "标准税率"
+      },
+      {
+        "entryCode": "relief",
+        "entryName": "减免税率"
+      },
+      {
+        "entryCode": "zero",
+        "entryName": "零税率"
+      },
+      {
+        "entryCode": "free",
+        "entryName": "免税"
+      }
+    ]
+  }
+]

+ 832 - 0
applications/base/src/main/resources/metadata/product/Currency.form.json

@@ -0,0 +1,832 @@
+[
+  {
+    "id": "base_currency",
+    "name": "币别",
+    "type": "baseData",
+    "idColumnName": "CR_ID",
+    "codeColumnName": "CR_CODE",
+    "nameColumnName": "CR_NAME",
+    "subSys": "base_data",
+    "entities": [
+      {
+        "name": "单据头",
+        "tableName": "BASE_CURRENCY",
+        "type": "head",
+        "fields": [
+          {
+            "name": "货币代码",
+            "columnName": "CR_CODE",
+            "type": "text",
+            "length": 50,
+            "required": true
+          },
+          {
+            "name": "名称",
+            "columnName": "CR_NAME",
+            "type": "text",
+            "length": 50,
+            "required": true
+          },
+          {
+            "name": "货币符号",
+            "columnName": "CR_SYMBOL",
+            "type": "text",
+            "length": 30,
+            "copiable": true
+          },
+          {
+            "name": "显示货币符号",
+            "columnName": "CR_SHOWSYMBOL",
+            "type": "checkbox",
+            "copiable": true
+          },
+          {
+            "name": "显示格式",
+            "columnName": "CR_FORMAT",
+            "type": "enumData",
+            "ref": "base_curr_order",
+            "copiable": true
+          },
+          {
+            "name": "单价精度",
+            "columnName": "CR_PRICE_DIGIT",
+            "type": "int",
+            "defaultValue": 4,
+            "copiable": true
+          },
+          {
+            "name": "金额精度",
+            "columnName": "CR_AMOUNT_DIGIT",
+            "type": "int",
+            "defaultValue": 2,
+            "copiable": true
+          },
+          {
+            "name": "舍入类型",
+            "columnName": "CR_ROUNDTYPE",
+            "type": "enumData",
+            "ref": "base_roundtype",
+            "required": true,
+            "copiable": true
+          },
+          {
+            "name": "优先级",
+            "columnName": "CR_PRIORITY",
+            "type": "int",
+            "copiable": true
+          },
+          {
+            "name": "中间币",
+            "columnName": "CR_MIDDLE",
+            "type": "checkbox",
+            "copiable": true
+          },
+          {
+            "name": "系统预设",
+            "columnName": "CR_SYS",
+            "type": "checkbox"
+          },
+          {
+            "name": "创建人",
+            "columnName": "CR_CREATOR",
+            "type": "creator"
+          },
+          {
+            "name": "创建日期",
+            "columnName": "CR_CREATEDATE",
+            "type": "createDate"
+          },
+          {
+            "name": "修改人",
+            "columnName": "CR_MODIFIER",
+            "type": "modifier"
+          },
+          {
+            "name": "修改日期",
+            "columnName": "CR_MODIFYDATE",
+            "type": "modifyDate"
+          },
+          {
+            "name": "审核人",
+            "columnName": "CR_AUDITOR",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "审核日期",
+            "columnName": "CR_AUDITDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "单据状态",
+            "columnName": "CR_STATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "E",
+                "name": "在录入",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "copyBtn",
+                      "unSubmitBtn",
+                      "auditMenu"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "S",
+                "name": "已提交",
+                "controls": [
+                  {
+                    "type": "field",
+                    "scope": [
+                      "BASE_CURRENCY.CR_CODE",
+                      "BASE_CURRENCY.CR_NAME",
+                      "BASE_CURRENCY.CR_PRICE_DIGIT",
+                      "BASE_CURRENCY.CR_AMOUNT_DIGIT",
+                      "BASE_CURRENCY.CR_ROUNDTYPE"
+                    ]
+                  },
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitBtn",
+                      "unAuditBtn"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "A",
+                "name": "已审核",
+                "controls": [
+                  {
+                    "type": "field",
+                    "scope": [
+                      "BASE_CURRENCY.CR_CODE",
+                      "BASE_CURRENCY.CR_NAME",
+                      "BASE_CURRENCY.CR_PRICE_DIGIT",
+                      "BASE_CURRENCY.CR_AMOUNT_DIGIT",
+                      "BASE_CURRENCY.CR_ROUNDTYPE"
+                    ]
+                  },
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitMenu",
+                      "auditBtn"
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "name": "禁用人",
+            "columnName": "CR_FORBIDDER",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "禁用日期",
+            "columnName": "CR_FORBIDDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "禁用状态",
+            "columnName": "CR_FORBIDSTATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "N",
+                "name": "未禁用",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "unForbidBtn"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "Y",
+                "name": "已禁用",
+                "controls": [
+                  {
+                    "type": "field",
+                    "scope": [
+                      "BASE_CURRENCY.CR_CODE",
+                      "BASE_CURRENCY.CR_NAME",
+                      "BASE_CURRENCY.CR_SYMBOL",
+                      "BASE_CURRENCY.CR_SHOWSYMBOL",
+                      "BASE_CURRENCY.CR_FORMAT",
+                      "BASE_CURRENCY.CR_PRICE_DIGIT",
+                      "BASE_CURRENCY.CR_AMOUNT_DIGIT",
+                      "BASE_CURRENCY.CR_ROUNDTYPE",
+                      "BASE_CURRENCY.CR_PRIORITY",
+                      "BASE_CURRENCY.CR_MIDDLE"
+                    ]
+                  },
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitMenu",
+                      "submitBtn",
+                      "unSubmitBtn",
+                      "auditMenu",
+                      "auditBtn",
+                      "unAuditBtn",
+                      "forbidBtn"
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ]
+      }
+    ],
+    "operations": [
+      {
+        "id": "save",
+        "name": "保存",
+        "type": "save"
+      },
+      {
+        "id": "copy",
+        "name": "复制",
+        "type": "copy"
+      },
+      {
+        "id": "submit",
+        "name": "提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "CR_STATUS",
+          "statusValue": "S"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_CURRENCY.CR_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "只能提交在录入的单据"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unSubmit",
+        "name": "反提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "CR_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已提交,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_CURRENCY.CR_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未提交"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "audit",
+        "name": "审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "CR_STATUS",
+          "statusValue": "A"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,不允许",
+            "params": {
+              "filter": {
+                "field": "BASE_CURRENCY.CR_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": true,
+              "message": "请先提交单据"
+            },
+            "level": "error"
+          },
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,不允许",
+            "params": {
+              "filter": {
+                "field": "BASE_CURRENCY.CR_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": true,
+              "message": "单据已经审核,无需再审"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unAudit",
+        "name": "反审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "CR_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_CURRENCY.CR_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未审核"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "new",
+        "name": "新增",
+        "type": "addView",
+        "params": {
+          "viewName": "base_currency",
+          "viewType": "form",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "forbid",
+        "name": "禁用",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "CR_FORBIDSTATUS",
+          "statusValue": "Y"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已禁用,不允许",
+            "params": {
+              "filter": {
+                "field": "BASE_CURRENCY.CR_FORBIDSTATUS",
+                "compare": "=",
+                "value": "Y"
+              },
+              "triggerOnTrue": true,
+              "message": "单据已禁用"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unForbid",
+        "name": "反禁用",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "CR_FORBIDSTATUS",
+          "statusValue": "N"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 禁用,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_CURRENCY.CR_FORBIDSTATUS",
+                "compare": "=",
+                "value": "Y"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未禁用"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "close",
+        "name": "退出",
+        "type": "closeView"
+      },
+      {
+        "id": "showList",
+        "name": "列表",
+        "type": "addView",
+        "params": {
+          "viewName": "base_currency",
+          "viewType": "list",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "returnData",
+        "name": "返回数据",
+        "type": "returnData"
+      },
+      {
+        "id": "refresh",
+        "name": "刷新",
+        "type": "refresh"
+      }
+    ],
+    "views": [
+      {
+        "viewType": "form",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "form",
+              "menubar": [
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn",
+                      "operation": "copy",
+                      "disableOnAdd": true
+                    }
+                  ]
+                },
+                {
+                  "text": "保存",
+                  "itemId": "saveBtn",
+                  "operation": "save",
+                  "valid": true
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit",
+                      "valid": true
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "menu": [
+                    {
+                      "text": "禁用",
+                      "itemId": "forbidBtn",
+                      "operation": "forbid",
+                      "disableOnAdd": true
+                    },
+                    {
+                      "text": "反禁用",
+                      "itemId": "unForbidBtn",
+                      "operation": "unForbid"
+                    }
+                  ]
+                },
+                {
+                  "text": "列表",
+                  "itemId": "showListBtn",
+                  "operation": "showList"
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "layout": "absolute",
+              "items": [
+                {
+                  "xtype": "textfield",
+                  "fieldLabel": "货币代码",
+                  "itemId": "BASE_CURRENCY_CR_CODE",
+                  "bind": "{BASE_CURRENCY.CR_CODE}",
+                  "x": 10,
+                  "y": 10,
+                  "width": 300
+                },
+                {
+                  "xtype": "textfield",
+                  "fieldLabel": "名称",
+                  "itemId": "BASE_CURRENCY_CR_NAME",
+                  "bind": "{BASE_CURRENCY.CR_NAME}",
+                  "x": 10,
+                  "y": 50,
+                  "width": 300
+                },
+                {
+                  "xtype": "textfield",
+                  "fieldLabel": "货币符号",
+                  "itemId": "BASE_CURRENCY_CR_SYMBOL",
+                  "bind": "{BASE_CURRENCY.CR_SYMBOL}",
+                  "x": 10,
+                  "y": 90,
+                  "width": 300
+                },
+                {
+                  "xtype": "checkbox",
+                  "fieldLabel": "显示货币符号",
+                  "itemId": "BASE_CURRENCY_CR_SHOWSYMBOL",
+                  "bind": "{BASE_CURRENCY.CR_SHOWSYMBOL}",
+                  "x": 10,
+                  "y": 130,
+                  "width": 300
+                },
+                {
+                  "xtype": "combobox",
+                  "fieldLabel": "显示格式",
+                  "itemId": "BASE_CURRENCY_CR_FORMAT",
+                  "bind": "{BASE_CURRENCY.CR_FORMAT}",
+                  "x": 10,
+                  "y": 170,
+                  "width": 300
+                },
+                {
+                  "xtype": "numberfield",
+                  "fieldLabel": "单价精度",
+                  "itemId": "BASE_CURRENCY_CR_PRICE_DIGIT",
+                  "bind": "{BASE_CURRENCY.CR_PRICE_DIGIT}",
+                  "x": 310,
+                  "y": 10,
+                  "width": 300
+                },
+                {
+                  "xtype": "numberfield",
+                  "fieldLabel": "金额精度",
+                  "itemId": "BASE_CURRENCY_CR_AMOUNT_DIGIT",
+                  "bind": "{BASE_CURRENCY.CR_AMOUNT_DIGIT}",
+                  "x": 310,
+                  "y": 50,
+                  "width": 300
+                },
+                {
+                  "xtype": "combobox",
+                  "fieldLabel": "舍入类型",
+                  "itemId": "BASE_CURRENCY_CR_ROUNDTYPE",
+                  "bind": "{BASE_CURRENCY.CR_ROUNDTYPE}",
+                  "x": 310,
+                  "y": 90,
+                  "width": 300
+                },
+                {
+                  "xtype": "checkbox",
+                  "fieldLabel": "中间币",
+                  "itemId": "BASE_CURRENCY_CR_MIDDLE",
+                  "bind": "{BASE_CURRENCY.CR_MIDDLE}",
+                  "x": 310,
+                  "y": 130,
+                  "width": 300
+                },
+                {
+                  "xtype": "numberfield",
+                  "fieldLabel": "优先级",
+                  "itemId": "BASE_CURRENCY_CR_PRIORITY",
+                  "bind": "{BASE_CURRENCY.CR_PRIORITY}",
+                  "x": 310,
+                  "y": 170,
+                  "width": 300
+                }
+              ]
+            }
+          ]
+        }
+      },
+      {
+        "viewType": "list",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "gridpanel",
+              "ui": "form",
+              "menubar": [
+                {
+                  "text": "返回数据",
+                  "itemId": "returnDataBtn",
+                  "operation": "returnData",
+                  "showOnOrdinary": false
+                },
+                {
+                  "text": "过滤"
+                },
+                {
+                  "text": "刷新",
+                  "itemId": "refreshBtn",
+                  "operation": "refresh"
+                },
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn",
+                      "operation": "copy"
+                    }
+                  ]
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "itemId": "bizMenu",
+                  "menu": [
+                    {
+                      "text": "禁用",
+                      "itemId": "forbidBtn",
+                      "operation": "borbid"
+                    },
+                    {
+                      "text": "反禁用",
+                      "itemId": "unForbidBtn",
+                      "operation": "unForbid"
+                    }
+                  ]
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "showScheme": true,
+              "showHeaderFilter": true,
+              "showPagingBar": true,
+              "selType": "checkboxmodel"
+            }
+          ]
+        },
+        "schemes": [
+          {
+            "id": "default",
+            "default": true,
+            "name": "缺省方案",
+            "columns": [
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_CODE",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_NAME",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_SYMBOL",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_SHOWSYMBOL",
+                "width": 120
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_PRICE_DIGIT",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_AMOUNT_DIGIT",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_ROUNDTYPE",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_FORBIDSTATUS",
+                "width": 100
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_PRIORITY",
+                "width": 80
+              },
+              {
+                "entity": "BASE_CURRENCY",
+                "field": "CR_MIDDLE",
+                "width": 80
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+]

Разница между файлами не показана из-за своего большого размера
+ 1090 - 292
applications/base/src/main/resources/metadata/product/Product.form.json


+ 763 - 0
applications/base/src/main/resources/metadata/product/ProductCategory.form.json

@@ -0,0 +1,763 @@
+[
+  {
+    "id": "base_product_cate",
+    "name": "存货类别",
+    "type": "baseData",
+    "nameColumnName": "PC_NAME",
+    "idColumnName": "PC_ID",
+    "codeColumnName": "PC_CODE",
+    "subSys": "base_data",
+    "entities": [
+      {
+        "name": "单据头",
+        "tableName": "BASE_PRODUCT_CATE",
+        "type": "head",
+        "fields": [
+          {
+            "name": "编码",
+            "columnName": "PC_CODE",
+            "type": "text",
+            "length": 50,
+            "required": true
+          },
+          {
+            "name": "名称",
+            "columnName": "PC_NAME",
+            "type": "text",
+            "length": 100,
+            "required": true
+          },
+          {
+            "name": "创建人",
+            "columnName": "PC_CREATOR",
+            "type": "creator"
+          },
+          {
+            "name": "创建日期",
+            "columnName": "PC_CREATEDATE",
+            "type": "createDate"
+          },
+          {
+            "name": "修改人",
+            "columnName": "PC_MODIFIER",
+            "type": "modifier"
+          },
+          {
+            "name": "修改日期",
+            "columnName": "PC_MODIFYDATE",
+            "type": "modifyDate"
+          },
+          {
+            "name": "审核人",
+            "columnName": "PC_AUDITOR",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "审核日期",
+            "columnName": "PC_AUDITDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "单据状态",
+            "columnName": "PC_STATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "E",
+                "name": "在录入",
+                "userField": "PC_AUDITOR",
+                "dateField": "PC_AUDITDATE",
+                "clearData": true,
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "auditMenu",
+                      "auditBtn",
+                      "unAuditBtn",
+                      "unSubmitBtn"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "S",
+                "name": "已提交",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitBtn",
+                      "unAuditBtn"
+                    ]
+                  },
+                  {
+                    "type": "field",
+                    "scope": [
+                      "BASE_PRODUCT_CATE_PC_CODE",
+                      "BASE_PRODUCT_CATE_PC_NAME"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "A",
+                "name": "已审核",
+                "userField": "PC_AUDITOR",
+                "dateField": "PC_AUDITDATE",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitMenu",
+                      "submitBtn",
+                      "unSubmitBtn",
+                      "auditBtn"
+                    ]
+                  },
+                  {
+                    "type": "field",
+                    "scope": [
+                      "BASE_PRODUCT_CATE_PC_CODE",
+                      "BASE_PRODUCT_CATE_PC_NAME"
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "name": "禁用人",
+            "columnName": "PC_FORBIDDER",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "禁用日期",
+            "columnName": "PC_FORBIDDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "禁用状态",
+            "columnName": "PC_FORBIDSTATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "N",
+                "name": "否",
+                "userField": "PC_FORBIDDER",
+                "dateField": "PC_FORBIDDATE",
+                "clearData": true,
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "unForbidBtn"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "Y",
+                "name": "是",
+                "userField": "PC_FORBIDDER",
+                "dateField": "PC_FORBIDDATE",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "forbidBtn"
+                    ]
+                  },
+                  {
+                    "type": "field",
+                    "scope": [
+                      "BASE_PRODUCT_CATE_PC_CODE",
+                      "BASE_PRODUCT_CATE_PC_NAME"
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ]
+      }
+    ],
+    "operations": [
+      {
+        "id": "save",
+        "name": "保存",
+        "type": "save"
+      },
+      {
+        "id": "submit",
+        "name": "提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "PC_STATUS",
+          "statusValue": "S"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_PRODUCT_CATE.PC_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "只能提交在录入的单据"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unSubmit",
+        "name": "反提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "PC_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已提交,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_PRODUCT_CATE.PC_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未提交"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "audit",
+        "name": "审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "PC_STATUS",
+          "statusValue": "A"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,不允许",
+            "params": {
+              "filter": {
+                "field": "BASE_PRODUCT_CATE.PC_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": true,
+              "message": "请先提交单据"
+            },
+            "level": "error"
+          },
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,不允许",
+            "params": {
+              "filter": {
+                "field": "BASE_PRODUCT_CATE.PC_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": true,
+              "message": "单据已经审核,无需再审"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unAudit",
+        "name": "反审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "PC_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_PRODUCT_CATE.PC_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未审核"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "forbid",
+        "name": "禁用",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "PC_FORBIDSTATUS",
+          "statusValue": "Y"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已禁用,不允许",
+            "params": {
+              "filter": {
+                "field": "BASE_PRODUCT_CATE.PC_FORBIDSTATUS",
+                "compare": "=",
+                "value": "Y"
+              },
+              "triggerOnTrue": true,
+              "message": "单据已禁用"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unForbid",
+        "name": "反禁用",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "PC_FORBIDSTATUS",
+          "statusValue": "N"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已禁用,允许",
+            "params": {
+              "filter": {
+                "field": "BASE_PRODUCT_CATE.PC_FORBIDSTATUS",
+                "compare": "=",
+                "value": "Y"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未禁用"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "new",
+        "name": "新增",
+        "type": "addView",
+        "params": {
+          "viewName": "base_product_cate",
+          "viewType": "form",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "showList",
+        "name": "列表",
+        "type": "addView",
+        "params": {
+          "viewName": "base_product_cate",
+          "viewType": "list",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "close",
+        "name": "退出",
+        "type": "closeView"
+      },
+      {
+        "id": "returnData",
+        "name": "返回数据",
+        "type": "returnData"
+      },
+      {
+        "id": "copy",
+        "name": "复制",
+        "type": "copy"
+      },
+      {
+        "id": "refresh",
+        "name": "刷新",
+        "type": "refresh"
+      }
+    ],
+    "views": [
+      {
+        "viewType": "form",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "form",
+              "layout": {
+                "type": "vbox",
+                "pack": "start",
+                "align": "stretch"
+              },
+              "menubar": [
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn",
+                      "operation": "copy",
+                      "disableOnAdd": true
+                    }
+                  ]
+                },
+                {
+                  "text": "保存",
+                  "itemId": "saveBtn",
+                  "operation": "save"
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "itemId": "bizMenu",
+                  "menu": [
+                    {
+                      "text": "禁用",
+                      "itemId": "forbidBtn",
+                      "operation": "forbid",
+                      "disableOnAdd": true
+                    },
+                    {
+                      "text": "反禁用",
+                      "itemId": "unForbidBtn",
+                      "operation": "unForbid"
+                    }
+                  ]
+                },
+                {
+                  "text": "列表",
+                  "itemId": "listBtn",
+                  "operation": "showList"
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "items": [
+                {
+                  "xtype": "container",
+                  "height": 50,
+                  "layout": "absolute",
+                  "items": [
+                    {
+                      "xtype": "textfield",
+                      "fieldLabel": "编码",
+                      "itemId": "BASE_PRODUCT_CATE_PC_CODE",
+                      "bind": "{BASE_PRODUCT_CATE.PC_CODE}",
+                      "emptyText": "保存时自动生成",
+                      "x": 10,
+                      "y": 10,
+                      "width": 300
+                    },
+                    {
+                      "xtype": "textfield",
+                      "fieldLabel": "名称",
+                      "itemId": "BASE_PRODUCT_CATE_PC_NAME",
+                      "bind": "{BASE_PRODUCT_CATE.PC_NAME}",
+                      "x": 310,
+                      "y": 10,
+                      "width": 300
+                    }
+                  ]
+                },
+                {
+                  "xtype": "tabpanel",
+                  "ui": "form",
+                  "flex": 1,
+                  "items": [
+                    {
+                      "title": "基本",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "x": 10,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "创建人",
+                          "xtype": "textfield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_CREATOR}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_CREATOR"
+                        },
+                        {
+                          "x": 10,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "创建日期",
+                          "xtype": "datefield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_CREATEDATE}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_CREATEDATE"
+                        },
+                        {
+                          "x": 10,
+                          "y": 90,
+                          "width": 300,
+                          "fieldLabel": "修改人",
+                          "xtype": "textfield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_MODIFIER}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_MODIFIER"
+                        },
+                        {
+                          "x": 10,
+                          "y": 130,
+                          "width": 300,
+                          "fieldLabel": "修改日期",
+                          "xtype": "datefield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_MODIFYDATE}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_MODIFYDATE"
+                        },
+                        {
+                          "x": 310,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "审核人",
+                          "xtype": "textfield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_AUDITOR}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_AUDITOR"
+                        },
+                        {
+                          "x": 310,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "审核日期",
+                          "xtype": "datefield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_AUDITDATE}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_AUDITDATE"
+                        },
+                        {
+                          "x": 610,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "禁用状态",
+                          "xtype": "textfield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_FORBIDSTATUS}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_FORBIDSTATUS"
+                        },
+                        {
+                          "x": 610,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "禁用人",
+                          "xtype": "textfield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_FORBIDDER}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_FORBIDDER"
+                        },
+                        {
+                          "x": 610,
+                          "y": 90,
+                          "width": 300,
+                          "fieldLabel": "禁用时间",
+                          "xtype": "datefield",
+                          "bind": "{BASE_PRODUCT_CATE.PC_FORBIDDATE}",
+                          "itemId": "BASE_PRODUCT_CATE_PC_FORBIDDATE"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      },
+      {
+        "viewType": "list",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "grid",
+              "ui": "form",
+              "menubar": [
+                {
+                  "text": "过滤"
+                },
+                {
+                  "text": "返回数据",
+                  "itemId": "returnDataBtn",
+                  "operation": "returnData"
+                },
+                {
+                  "text": "刷新",
+                  "itemId": "refreshBtn",
+                  "operation": "refresh"
+                },
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn",
+                      "operation": "copy"
+                    }
+                  ]
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "itemId": "bizMenu",
+                  "menu": [
+                    {
+                      "text": "禁用",
+                      "itemId": "forbidBtn",
+                      "operation": "forbid",
+                      "disableOnAdd": true
+                    },
+                    {
+                      "text": "反禁用",
+                      "itemId": "unForbidBtn",
+                      "operation": "unForbid"
+                    }
+                  ]
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "showScheme": true,
+              "showHeaderFilter": true,
+              "showPagingBar": true,
+              "selType": "checkboxmodel"
+            }
+          ]
+        },
+        "schemes": [
+          {
+            "name": "缺省方案",
+            "default": true,
+            "columns": [
+              {
+                "field": "PC_CODE",
+                "entity": "BASE_PRODUCT_CATE",
+                "width": 100
+              },
+              {
+                "field": "PC_NAME",
+                "entity": "BASE_PRODUCT_CATE",
+                "width": 200
+              },
+              {
+                "field": "PC_STATUS",
+                "entity": "BASE_PRODUCT_CATE",
+                "width": 100
+              },
+              {
+                "field": "PC_FORBIDSTATUS",
+                "entity": "BASE_PRODUCT_CATE",
+                "width": 100
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+]

+ 119 - 56
applications/base/src/main/resources/metadata/product/Unit.form.json

@@ -6,6 +6,7 @@
     "nameColumnName": "UN_NAME",
     "idColumnName": "UN_ID",
     "codeColumnName": "UN_CODE",
+    "subSys": "base_data",
     "entities": [
       {
         "name": "单据头",
@@ -103,6 +104,9 @@
               {
                 "code": "E",
                 "name": "在录入",
+                "userField": "UN_AUDITOR",
+                "dateField": "UN_AUDITDATE",
+                "clearData": true,
                 "controls": [
                   {
                     "type": "menubar",
@@ -143,6 +147,8 @@
               {
                 "code": "A",
                 "name": "已审核",
+                "userField": "UN_AUDITOR",
+                "dateField": "UN_AUDITDATE",
                 "controls": [
                   {
                     "type": "menubar",
@@ -191,6 +197,9 @@
               {
                 "code": "N",
                 "name": "否",
+                "userField": "UN_FORBIDDER",
+                "dateField": "UN_FORBIDDATE",
+                "clearData": true,
                 "controls": [
                   {
                     "type": "menubar",
@@ -203,6 +212,8 @@
               {
                 "code": "Y",
                 "name": "是",
+                "userField": "UN_FORBIDDER",
+                "dateField": "UN_FORBIDDATE",
                 "controls": [
                   {
                     "type": "menubar",
@@ -277,13 +288,11 @@
             "type": "legal",
             "description": "状态 = 在录入,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UN_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNIT.UN_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": false,
               "message": "只能提交在录入的单据"
             },
@@ -305,13 +314,11 @@
             "type": "legal",
             "description": "状态 = 已提交,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UN_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNIT.UN_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": false,
               "message": "单据未提交"
             },
@@ -333,13 +340,11 @@
             "type": "legal",
             "description": "状态 = 在录入,不允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UN_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNIT.UN_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": true,
               "message": "请先提交单据"
             },
@@ -349,13 +354,11 @@
             "type": "legal",
             "description": "状态 = 已审核,不允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UN_STATUS",
-                  "compare": "=",
-                  "value": "A"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNIT.UN_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
               "triggerOnTrue": true,
               "message": "单据已经审核,无需再审"
             },
@@ -377,13 +380,11 @@
             "type": "legal",
             "description": "状态 = 已审核,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UN_STATUS",
-                  "compare": "=",
-                  "value": "A"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNIT.UN_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
               "triggerOnTrue": false,
               "message": "单据未审核"
             },
@@ -405,13 +406,11 @@
             "type": "legal",
             "description": "状态 = 已禁用,不允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UN_FORBIDSTATUS",
-                  "compare": "=",
-                  "value": "Y"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNIT.UN_FORBIDSTATUS",
+                "compare": "=",
+                "value": "Y"
+              },
               "triggerOnTrue": true,
               "message": "单据已禁用"
             },
@@ -433,13 +432,11 @@
             "type": "legal",
             "description": "状态 = 已禁用,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UN_FORBIDSTATUS",
-                  "compare": "=",
-                  "value": "Y"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNIT.UN_FORBIDSTATUS",
+                "compare": "=",
+                "value": "Y"
+              },
               "triggerOnTrue": false,
               "message": "单据未禁用"
             },
@@ -477,6 +474,16 @@
         "id": "returnData",
         "name": "返回数据",
         "type": "returnData"
+      },
+      {
+        "id": "copy",
+        "name": "复制",
+        "type": "copy"
+      },
+      {
+        "id": "refresh",
+        "name": "刷新",
+        "type": "refresh"
       }
     ],
     "codeRules": [
@@ -509,6 +516,11 @@
           "items": [
             {
               "xtype": "form",
+              "layout": {
+                "type": "vbox",
+                "pack": "start",
+                "align": "stretch"
+              },
               "menubar": [
                 {
                   "text": "新增",
@@ -622,7 +634,7 @@
                 {
                   "xtype": "tabpanel",
                   "ui": "form",
-                  "height": 500,
+                  "flex": 1,
                   "items": [
                     {
                       "title": "基本信息",
@@ -658,7 +670,7 @@
                         },
                         {
                           "xtype": "checkbox",
-                          "fieldLabel": "基准计量单位",
+                          "boxLabel": "基准计量单位",
                           "itemId": "BASE_UNIT_UN_ISBASE",
                           "bind": "{BASE_UNIT.UN_ISBASE}",
                           "x": 310,
@@ -875,8 +887,8 @@
                           "width": 300,
                           "fieldLabel": "禁用人",
                           "xtype": "textfield",
-                          "bind": "{BASE_UNIT.UN_FORBIDER}",
-                          "itemId": "BASE_UNIT_UN_FORBIDER"
+                          "bind": "{BASE_UNIT.UN_FORBIDDER}",
+                          "itemId": "BASE_UNIT_UN_FORBIDDER"
                         },
                         {
                           "x": 610,
@@ -914,10 +926,13 @@
                   "operation": "returnData"
                 },
                 {
-                  "text": "刷新"
+                  "text": "刷新",
+                  "itemId": "refreshBtn",
+                  "operation": "refresh"
                 },
                 {
                   "text": "新增",
+                  "itemId": "newMenu",
                   "menu": [
                     {
                       "text": "新增",
@@ -925,12 +940,60 @@
                       "operation": "new"
                     },
                     {
-                      "text": "复制"
+                      "text": "复制",
+                      "itemId": "copyBtn",
+                      "operation": "copy"
                     }
                   ]
                 },
                 {
-                  "text": "打开"
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "itemId": "bizMenu",
+                  "menu": [
+                    {
+                      "text": "禁用",
+                      "itemId": "forbidBtn",
+                      "operation": "forbid",
+                      "disableOnAdd": true
+                    },
+                    {
+                      "text": "反禁用",
+                      "itemId": "unForbidBtn",
+                      "operation": "unForbid"
+                    }
+                  ]
                 },
                 {
                   "text": "退出",

+ 26 - 35
applications/base/src/main/resources/metadata/product/UnitGroup.form.json

@@ -6,6 +6,7 @@
     "nameColumnName": "UG_NAME",
     "idColumnName": "UG_ID",
     "codeColumnName": "UG_CODE",
+    "subSys": "base_data",
     "entities": [
       {
         "name": "单据头",
@@ -138,13 +139,11 @@
             "type": "legal",
             "description": "状态 = 在录入,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UG_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNITGROUP.UG_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": false,
               "message": "只能提交在录入的单据"
             },
@@ -166,13 +165,11 @@
             "type": "legal",
             "description": "状态 = 已提交,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UG_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNITGROUP.UG_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": false,
               "message": "单据未提交"
             },
@@ -194,13 +191,11 @@
             "type": "legal",
             "description": "状态 = 在录入,不允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UG_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNITGROUP.UG_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": true,
               "message": "请先提交单据"
             },
@@ -210,13 +205,11 @@
             "type": "legal",
             "description": "状态 = 已审核,不允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UG_STATUS",
-                  "compare": "=",
-                  "value": "A"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNITGROUP.UG_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
               "triggerOnTrue": true,
               "message": "单据已经审核,无需再审"
             },
@@ -238,13 +231,11 @@
             "type": "legal",
             "description": "状态 = 已审核,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "UG_STATUS",
-                  "compare": "=",
-                  "value": "A"
-                }
-              ],
+              "filter": {
+                "field": "BASE_UNITGROUP.UG_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
               "triggerOnTrue": false,
               "message": "单据未审核"
             },

+ 26 - 35
applications/base/src/main/resources/metadata/supplier/Supplier.form.json

@@ -6,6 +6,7 @@
     "nameColumnName": "SU_NAME",
     "idColumnName": "SU_ID",
     "codeColumnName": "SU_CODE",
+    "subSys": "base_data",
     "entities": [
       {
         "name": "单据头",
@@ -317,13 +318,11 @@
             "type": "legal",
             "description": "状态 = 在录入,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "SU_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_SUPPLIER.SU_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": false,
               "message": "只能提交在录入的单据"
             },
@@ -345,13 +344,11 @@
             "type": "legal",
             "description": "状态 = 已提交,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "SU_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_SUPPLIER.SU_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": false,
               "message": "单据未提交"
             },
@@ -373,13 +370,11 @@
             "type": "legal",
             "description": "状态 = 在录入,不允许",
             "params": {
-              "expression": [
-                {
-                  "field": "SU_STATUS",
-                  "compare": "=",
-                  "value": "E"
-                }
-              ],
+              "filter": {
+                "field": "BASE_SUPPLIER.SU_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
               "triggerOnTrue": true,
               "message": "请先提交单据"
             },
@@ -389,13 +384,11 @@
             "type": "legal",
             "description": "状态 = 已审核,不允许",
             "params": {
-              "expression": [
-                {
-                  "field": "SU_STATUS",
-                  "compare": "=",
-                  "value": "A"
-                }
-              ],
+              "filter": {
+                "field": "BASE_SUPPLIER.SU_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
               "triggerOnTrue": true,
               "message": "单据已经审核,无需再审"
             },
@@ -417,13 +410,11 @@
             "type": "legal",
             "description": "状态 = 已审核,允许",
             "params": {
-              "expression": [
-                {
-                  "field": "SU_STATUS",
-                  "compare": "=",
-                  "value": "A"
-                }
-              ],
+              "filter": {
+                "field": "BASE_SUPPLIER.SU_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
               "triggerOnTrue": false,
               "message": "单据未审核"
             },

+ 3 - 0
applications/cost/cost-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 15 - 1
applications/cost/cost-base/src/main/resources/metadata/Cost.domain.json

@@ -1,6 +1,20 @@
 [
   {
     "name": "成本管理",
-    "id": "cost"
+    "id": "cost",
+    "modules": [
+      {
+        "id": "cost_inventory",
+        "name": "存货核算"
+      },
+      {
+        "id": "cost_analysis",
+        "name": "标准成本分析"
+      },
+      {
+        "id": "cost_product",
+        "name": "产品成本核算"
+      }
+    ]
   }
 ]

+ 79 - 0
applications/cost/cost-base/src/main/resources/metadata/Cost.fn.json

@@ -0,0 +1,79 @@
+[
+  {
+    "groupId": "cost_inventory",
+    "groupName": "存货核算",
+    "module": "cost_inventory",
+    "entries": [
+      {
+        "text": "采购费用分配",
+        "formId": "cost_pur_exp",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "采购入库核算",
+        "formId": "cost_pur_instock",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "委外入库核算",
+        "formId": "cost_outsourcestock",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "出库成本核算",
+        "formId": "cost_outstock",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "其他存货核算",
+        "formId": "cost_oth",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "cost_adjust",
+    "groupName": "成本调整",
+    "module": "cost_inventory"
+  },
+  {
+    "groupId": "cost_inventory_report",
+    "groupName": "报表分析",
+    "module": "cost_inventory"
+  },
+  {
+    "groupId": "cost_inventory_immediate",
+    "groupName": "即时成本",
+    "module": "cost_inventory"
+  },
+  {
+    "groupId": "cost_inventory_em",
+    "groupName": "期末处理",
+    "module": "cost_inventory"
+  },
+  {
+    "groupId": "cost_inventory_fa",
+    "groupName": "账务处理",
+    "module": "cost_inventory"
+  },
+  {
+    "groupId": "cost_inventory_config",
+    "groupName": "参数设置",
+    "module": "cost_inventory"
+  },
+  {
+    "groupId": "cost_inventory_init",
+    "groupName": "初始化",
+    "module": "cost_inventory"
+  }
+]

+ 3 - 0
applications/crm/crm-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 6 - 6
applications/crm/crm-base/src/main/resources/metadata/Crm.domain.json

@@ -1,26 +1,26 @@
 [
   {
     "name": "客户关系管理",
-    "id": "cust",
+    "id": "crm",
     "modules": [
       {
-        "id": "cust_customer",
+        "id": "crm_customer",
         "name": "客户管理"
       },
       {
-        "id": "cust_market",
+        "id": "crm_market",
         "name": "市场营销"
       },
       {
-        "id": "cust_sale",
+        "id": "crm_sale",
         "name": "销售过程管理"
       },
       {
-        "id": "cust_mgm",
+        "id": "crm_mgm",
         "name": "日常管理"
       },
       {
-        "id": "cust_serve",
+        "id": "crm_serve",
         "name": "服务管理"
       }
     ]

+ 32 - 3
applications/crm/crm-base/src/main/resources/metadata/Crm.fn.json

@@ -1,12 +1,41 @@
 [
   {
-    "groupId": "cust_customer",
+    "groupId": "crm_customer",
     "groupName": "客户管理",
-    "module": "cust_customer",
+    "module": "crm_customer",
     "entries": [
       {
-
+        "text": "客户",
+        "formId": "base_customer",
+        "viewType": "form",
+        "openType": "card"
+      },
+      {
+        "text": "客户列表",
+        "formId": "base_customer",
+        "viewType": "list",
+        "openType": "card"
       }
     ]
+  },
+  {
+    "groupId": "crm_customer_contact",
+    "groupName": "联系人管理",
+    "module": "crm_customer"
+  },
+  {
+    "groupId": "crm_customer_clue",
+    "groupName": "线索管理",
+    "module": "crm_customer"
+  },
+  {
+    "groupId": "crm_customer_value",
+    "groupName": "客户价值",
+    "module": "crm_customer"
+  },
+  {
+    "groupId": "crm_customer_report",
+    "groupName": "报表分析",
+    "module": "crm_customer"
   }
 ]

+ 3 - 0
applications/ec/ec-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 11 - 1
applications/ec/ec-base/src/main/resources/metadata/Ec.domain.json

@@ -1,6 +1,16 @@
 [
   {
     "name": "电商与分销",
-    "id": "ec"
+    "id": "ec",
+    "modules": [
+      {
+        "id": "ec_integration",
+        "name": "电商集成"
+      },
+      {
+        "id": "ec_promotion",
+        "name": "促销管理"
+      }
+    ]
   }
 ]

+ 36 - 0
applications/ec/ec-base/src/main/resources/metadata/Ec.fn.json

@@ -0,0 +1,36 @@
+[
+  {
+    "groupId": "ec_integration_config",
+    "groupName": "电商集成参数",
+    "module": "ec_integration",
+    "entries": [
+      {
+        "text": "淘宝集成参数",
+        "formId": "ec_integration_taobao",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "ec_integration_base",
+    "groupName": "基础资料对接",
+    "module": "ec_integration"
+  },
+  {
+    "groupId": "ec_integration_stock",
+    "groupName": "电商库存调拨",
+    "module": "ec_integration"
+  },
+  {
+    "groupId": "ec_integration_pur",
+    "groupName": "电商采购对接",
+    "module": "ec_integration"
+  },
+  {
+    "groupId": "ec_integration_sale",
+    "groupName": "电商销售对接",
+    "module": "ec_integration"
+  }
+]

+ 3 - 0
applications/fa/fa-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 43 - 1
applications/fa/fa-base/src/main/resources/metadata/Fa.domain.json

@@ -1,6 +1,48 @@
 [
   {
     "name": "财务会计",
-    "id": "fa"
+    "id": "fa",
+    "modules": [
+      {
+        "id": "fa_rec",
+        "name": "应收款管理"
+      },
+      {
+        "id": "fa_tax",
+        "name": "税务管理"
+      },
+      {
+        "id": "fa_pay",
+        "name": "应付款管理"
+      },
+      {
+        "id": "fa_report",
+        "name": "报表"
+      },
+      {
+        "id": "fa_combined_report",
+        "name": "合并报表"
+      },
+      {
+        "id": "fa_exp",
+        "name": "费用报销"
+      },
+      {
+        "id": "fa_gl",
+        "name": "总账"
+      },
+      {
+        "id": "fa_invoice",
+        "name": "发票管理"
+      },
+      {
+        "id": "fa_fund",
+        "name": "资金管理"
+      },
+      {
+        "id": "fa_bank",
+        "name": "网上银行"
+      }
+    ]
   }
 ]

+ 66 - 0
applications/fa/fa-base/src/main/resources/metadata/Fa.fn.json

@@ -0,0 +1,66 @@
+[
+  {
+    "groupId": "fa_rec_sale",
+    "groupName": "销售应收",
+    "module": "fa_rec",
+    "entries": [
+      {
+        "text": "应收单",
+        "formId": "fa_rec",
+        "viewType": "form",
+        "openType": "card"
+      },
+      {
+        "text": "应收单列表",
+        "formId": "fa_rec",
+        "viewType": "list",
+        "openType": "card"
+      }
+    ]
+  },
+  {
+    "groupId": "fa_rec_balance",
+    "groupName": "收款",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_oth",
+    "groupName": "其他应收",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_rec",
+    "groupName": "应收收款",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_invoice",
+    "groupName": "应收开票",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_report",
+    "groupName": "报表分析",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_em",
+    "groupName": "期末处理",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_fa",
+    "groupName": "账务处理",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_config",
+    "groupName": "参数设置",
+    "module": "fa_rec"
+  },
+  {
+    "groupId": "fa_rec_init",
+    "groupName": "初始化",
+    "module": "fa_rec"
+  }
+]

+ 3 - 0
applications/plm/plm-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 31 - 1
applications/plm/plm-base/src/main/resources/metadata/Plm.domain.json

@@ -1,6 +1,36 @@
 [
   {
     "name": "PLM",
-    "id": "plm"
+    "id": "plm",
+    "modules": [
+      {
+        "id": "plm_product",
+        "name": "研发物料管理"
+      },
+      {
+        "id": "plm_wc",
+        "name": "工作中心"
+      },
+      {
+        "id": "plm_doc",
+        "name": "文档管理"
+      },
+      {
+        "id": "plm_bom",
+        "name": "设计BOM管理"
+      },
+      {
+        "id": "plm_change",
+        "name": "设计变更管理"
+      },
+      {
+        "id": "plm_cad",
+        "name": "CAD集成"
+      },
+      {
+        "id": "plm_prj",
+        "name": "项目管理"
+      }
+    ]
   }
 ]

+ 23 - 0
applications/plm/plm-base/src/main/resources/metadata/Plm.fn.json

@@ -0,0 +1,23 @@
+[
+  {
+    "groupId": "plm_product",
+    "groupName": "物料管理",
+    "module": "plm_product",
+    "entries": [
+      {
+        "text": "新建物料",
+        "formId": "plm_product",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "物料库",
+        "formId": "plm_product",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  }
+]

+ 3 - 0
applications/pm/pm-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 27 - 1
applications/pm/pm-base/src/main/resources/metadata/Pm.domain.json

@@ -1,6 +1,32 @@
 [
   {
     "name": "生产制造",
-    "id": "pm"
+    "id": "pm",
+    "modules": [
+      {
+        "id": "pm_prod",
+        "name": "生产管理"
+      },
+      {
+        "id": "pm_plan",
+        "name": "计划管理"
+      },
+      {
+        "id": "pm_engineer",
+        "name": "工程数据"
+      },
+      {
+        "id": "pm_prodline",
+        "name": "生产线"
+      },
+      {
+        "id": "pm_workshop",
+        "name": "车间管理"
+      },
+      {
+        "id": "pm_outsource",
+        "name": "委外管理"
+      }
+    ]
   }
 ]

+ 81 - 0
applications/pm/pm-base/src/main/resources/metadata/Pm.fn.json

@@ -0,0 +1,81 @@
+[
+  {
+    "groupId": "pm_prod_order",
+    "groupName": "生产订单",
+    "module": "pm_prod",
+    "entries": [
+      {
+        "text": "生产订单",
+        "formId": "pm_prod_order",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "生产订单列表",
+        "formId": "pm_prod_order",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "生产用料清单",
+        "formId": "pm_prod_material",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "生产变更单",
+        "formId": "pm_prod_change",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "生产变更单列表",
+        "formId": "pm_prod_change",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "生产用料清单变更",
+        "formId": "pm_prod_material_change",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "pm_prod_take",
+    "groupName": "生产领料",
+    "module": "pm_prod"
+  },
+  {
+    "groupId": "pm_prod_platform",
+    "groupName": "生产平台",
+    "module": "pm_prod"
+  },
+  {
+    "groupId": "pm_prod_completion",
+    "groupName": "完工入库",
+    "module": "pm_prod"
+  },
+  {
+    "groupId": "pm_prod_report",
+    "groupName": "报表分析",
+    "module": "pm_prod"
+  },
+  {
+    "groupId": "pm_prod_base",
+    "groupName": "基础资料",
+    "module": "pm_prod"
+  },
+  {
+    "groupId": "pm_prod_config",
+    "groupName": "参数设置",
+    "module": "pm_prod"
+  }
+]

+ 3 - 0
applications/scm/scm-barcode/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:scm:scm-base')
+}

+ 240 - 0
applications/scm/scm-barcode/src/main/resources/metadata/Barcode.fn.json

@@ -0,0 +1,240 @@
+[
+  {
+    "groupId": "scm_barcode_print",
+    "groupName": "条码打印平台",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "条码打印",
+        "formId": "scm_barcode_print",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码打印日志",
+        "formId": "scm_barcode_print_log",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "自定义条码打印",
+        "formId": "scm_barcode_print_cust",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码拆分",
+        "formId": "scm_barcode_split",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_barcode_scan",
+    "groupName": "条码扫描平台",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "条码扫描",
+        "formId": "scm_barcode_scan",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码扫描日志",
+        "formId": "scm_barcode_scan_log",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码扫描记录",
+        "formId": "scm_barcode_scan_list",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_barcode_rule",
+    "groupName": "条码规则",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "条码属性",
+        "formId": "scm_barcode_prop",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码属性列表",
+        "formId": "scm_barcode_prop",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码规则",
+        "formId": "scm_barcode_rule",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码规则列表",
+        "formId": "scm_barcode_rule",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码字段规则",
+        "formId": "scm_barcode_fieldrule",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码字段规则列表",
+        "formId": "scm_barcode_fieldrule",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_barcode_config",
+    "groupName": "参数设置",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "条码管理系统参数",
+        "formId": "scm_barcode_config",
+        "viewType": "config",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "扫描配置",
+        "formId": "scm_barcode_scan_config",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "扫描配置列表",
+        "formId": "scm_barcode_scan_config",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_barcode_task",
+    "groupName": "条码任务",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "扫描任务",
+        "formId": "scm_barcode_scan_task",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "扫描任务列表",
+        "formId": "scm_barcode_scan_task",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "扫描任务方案",
+        "formId": "scm_barcode_scan_scheme",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "扫描任务方案列表",
+        "formId": "scm_barcode_scan_scheme",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_barcode_assert",
+    "groupName": "资产条码",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "资产报备单",
+        "formId": "scm_barcode_assert",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "资产报修单",
+        "formId": "scm_barcode_assert_repair",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "资产报废单",
+        "formId": "scm_barcode_assert_scrap",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_barcode_sec",
+    "groupName": "条码防伪",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "防伪查询记录",
+        "formId": "scm_barcode_sec",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_barcode_arch",
+    "groupName": "归档管理",
+    "module": "scm_barcode",
+    "entries": [
+      {
+        "text": "条码归档",
+        "formId": "scm_barcode_arch",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "条码归档列表",
+        "formId": "scm_barcode_arch",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  }
+]

+ 0 - 25
applications/scm/scm-barcode/src/main/resources/metadata/Barcode.module.json

@@ -1,29 +1,4 @@
 [
-  {
-    "id": "scm_purchase",
-    "name": "采购管理",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_sale",
-    "name": "销售管理",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_credit",
-    "name": "信用管理",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_stock",
-    "name": "库存管理",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_org",
-    "name": "组织间结算",
-    "domain": "scm"
-  },
   {
     "id": "scm_barcode",
     "name": "条码管理",

+ 1 - 1
applications/scm/scm-base/build.gradle

@@ -1,3 +1,3 @@
 dependencies {
-    compile project(':framework:framework-form')
+    compile project(':applications:base')
 }

+ 3 - 0
applications/scm/scm-credit/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:scm:scm-base')
+}

+ 170 - 0
applications/scm/scm-credit/src/main/resources/metadata/Credit.fn.json

@@ -0,0 +1,170 @@
+[
+  {
+    "groupId": "scm_credit_policy",
+    "groupName": "信用政策",
+    "module": "scm_credit",
+    "entries": [
+      {
+        "text": "信用检查规则",
+        "formId": "scm_credit_policy",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用检查规则列表",
+        "formId": "scm_credit_policy",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_credit_grant",
+    "groupName": "信用授予",
+    "module": "scm_credit",
+    "entries": [
+      {
+        "text": "信用档案",
+        "formId": "scm_credit_record",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用档案列表",
+        "formId": "scm_credit_record",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_credit_mgm",
+    "groupName": "信用管理",
+    "module": "scm_credit",
+    "entries": [
+      {
+        "text": "信用初始化",
+        "formId": "scm_credit_init",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用重算",
+        "formId": "scm_credit_calc",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用月结计算",
+        "formId": "scm_credit_monthcalc",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_credit_inquiry",
+    "groupName": "信用查询",
+    "module": "scm_credit",
+    "entries": [
+      {
+        "text": "信用状况查询",
+        "formId": "scm_credit_inquiry",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_credit_eval",
+    "groupName": "信用评估",
+    "module": "scm_credit",
+    "entries": [
+      {
+        "text": "信用评估指标",
+        "formId": "scm_credit_eval_indicator",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用等级方案",
+        "formId": "scm_credit_level",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用评估模型",
+        "formId": "scm_credit_eval",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用评估模型列表",
+        "formId": "scm_credit_eval",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用评分",
+        "formId": "scm_credit_score",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用评分列表",
+        "formId": "scm_credit_score",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_credit_config",
+    "groupName": "参数设置",
+    "module": "scm_credit",
+    "entries": [
+      {
+        "text": "信用管理系统参数设置",
+        "formId": "scm_credit_config",
+        "viewType": "config",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_credit_change",
+    "groupName": "信用变更",
+    "module": "scm_credit",
+    "entries": [
+      {
+        "text": "信用变更",
+        "formId": "scm_credit_change",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "信用变更列表",
+        "formId": "scm_credit_change",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  }
+]

+ 7 - 0
applications/scm/scm-credit/src/main/resources/metadata/Credit.module.json

@@ -0,0 +1,7 @@
+[
+  {
+    "id": "scm_credit",
+    "name": "信用管理",
+    "domain": "scm"
+  }
+]

+ 3 - 0
applications/scm/scm-org/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:scm:scm-base')
+}

+ 128 - 0
applications/scm/scm-org/src/main/resources/metadata/Org.fn.json

@@ -0,0 +1,128 @@
+[
+  {
+    "groupId": "scm_org_price",
+    "groupName": "价格资料",
+    "module": "scm_org",
+    "entries": [
+      {
+        "text": "组织间结算价目表",
+        "formId": "scm_org_price",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "组织间结算价目表列表",
+        "formId": "scm_org_price",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "结算调价表",
+        "formId": "scm_org_price_adjust",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "结算调价表列表",
+        "formId": "scm_org_price_adjust",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_org_rel",
+    "groupName": "组织间结算关系",
+    "module": "scm_org",
+    "entries": [
+      {
+        "text": "组织间结算关系",
+        "formId": "scm_org_rel",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "组织间结算关系列表",
+        "formId": "scm_org_rel",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_org_settle",
+    "groupName": "结算清单",
+    "module": "scm_org",
+    "entries": [
+      {
+        "text": "结算清单",
+        "formId": "scm_org_settle",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "结算清单列表",
+        "formId": "scm_org_settle",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_org_report",
+    "groupName": "报表分析",
+    "module": "scm_org",
+    "entries": [
+      {
+        "text": "组织间结算分析报告",
+        "formId": "scm_org_report",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "组织间交易利润分析表",
+        "formId": "scm_org_profit_report",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_org_base",
+    "groupName": "基础资料",
+    "module": "scm_org",
+    "entries": [
+      {
+        "text": "跨组织业务类型",
+        "formId": "scm_org_biztype",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_org_config",
+    "groupName": "参数设置",
+    "module": "scm_org",
+    "entries": [
+      {
+        "text": "组织间结算系统参数",
+        "formId": "scm_org_config",
+        "viewType": "config",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  }
+]

+ 7 - 0
applications/scm/scm-org/src/main/resources/metadata/Org.module.json

@@ -0,0 +1,7 @@
+[
+  {
+    "id": "scm_org",
+    "name": "组织间结算",
+    "domain": "scm"
+  }
+]

+ 1813 - 0
applications/scm/scm-purchase/src/main/resources/metadata/InStock.form.json

@@ -0,0 +1,1813 @@
+[
+  {
+    "id": "stk_pur_in",
+    "name": "采购入库单",
+    "type": "bill",
+    "idColumnName": "I_ID",
+    "codeColumnName": "I_CODE",
+    "billTypeColumnName": "I_BILLTYPE",
+    "subSys": "scm_purchase",
+    "entities": [
+      {
+        "name": "基本信息",
+        "tableName": "STK_PURIN",
+        "type": "head",
+        "fields": [
+          {
+            "name": "单据类型",
+            "columnName": "I_BILLTYPE",
+            "type": "billType",
+            "length": 50
+          },
+          {
+            "name": "业务类型",
+            "columnName": "I_BIZTYPE",
+            "type": "enumData",
+            "ref": "stk_purintype"
+          },
+          {
+            "name": "收料部门",
+            "columnName": "I_RECDEPT",
+            "type": "baseData",
+            "ref": "base_deptartment",
+            "refField": "DP_NAME"
+          },
+          {
+            "name": "采购部门",
+            "columnName": "I_PURDEPT",
+            "type": "baseData",
+            "ref": "base_deptartment",
+            "refField": "DP_NAME"
+          },
+          {
+            "name": "单据编号",
+            "columnName": "I_CODE",
+            "type": "code",
+            "length": 50
+          },
+          {
+            "name": "入库日期",
+            "columnName": "I_DATE",
+            "type": "date"
+          },
+          {
+            "name": "仓管员",
+            "columnName": "I_STOREKEEPER",
+            "type": "baseData",
+            "ref": "base_employee",
+            "refField": "EM_NAME",
+            "parentRefField": "I_RECDEPT"
+          },
+          {
+            "name": "采购员",
+            "columnName": "I_PURCHASER",
+            "type": "baseData",
+            "ref": "base_employee",
+            "refField": "EM_NAME",
+            "parentRefField": "I_PURDEPT"
+          },
+          {
+            "name": "供应商",
+            "columnName": "I_SUPPLIER",
+            "type": "baseData",
+            "ref": "base_supplier",
+            "refField": "SU_NAME"
+          },
+          {
+            "name": "供货方",
+            "columnName": "I_PROVIDER",
+            "type": "baseData",
+            "ref": "base_supplier",
+            "refField": "SU_NAME"
+          },
+          {
+            "name": "供货方联系人",
+            "columnName": "I_PROVIDER_CT",
+            "type": "baseData",
+            "ref": "base_supplieI_ct",
+            "refField": "SC_NAME"
+          },
+          {
+            "name": "供货方地址",
+            "columnName": "I_PROVIDER_ADDR",
+            "type": "textarea",
+            "length": 255
+          },
+          {
+            "name": "结算方",
+            "columnName": "I_SETTLE",
+            "type": "baseData",
+            "ref": "base_supplier",
+            "refField": "SU_NAME"
+          },
+          {
+            "name": "收款方",
+            "columnName": "I_CHARGE",
+            "type": "baseData",
+            "ref": "base_supplier",
+            "refField": "SU_NAME"
+          },
+          {
+            "name": "创建人",
+            "columnName": "I_CREATOR",
+            "type": "creator"
+          },
+          {
+            "name": "创建日期",
+            "columnName": "I_CREATEDATE",
+            "type": "createDate"
+          },
+          {
+            "name": "修改人",
+            "columnName": "I_MODIFIER",
+            "type": "modifier"
+          },
+          {
+            "name": "修改日期",
+            "columnName": "I_MODIFYDATE",
+            "type": "modifyDate"
+          },
+          {
+            "name": "审核人",
+            "columnName": "I_AUDITOR",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "审核日期",
+            "columnName": "I_AUDITDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "单据状态",
+            "columnName": "I_STATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "E",
+                "name": "在录入",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "copyBtn",
+                      "unSubmitBtn",
+                      "auditMenu"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "S",
+                "name": "已提交",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitBtn",
+                      "unAuditBtn"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "A",
+                "name": "已审核",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitMenu",
+                      "auditBtn"
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "name": "作废人",
+            "columnName": "I_CANCELLER",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "作废日期",
+            "columnName": "I_CANCELDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "作废状态",
+            "columnName": "I_CANCELSTATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "N",
+                "name": "未作废"
+              },
+              {
+                "code": "Y",
+                "name": "已作废"
+              }
+            ]
+          }
+        ]
+      },
+      {
+        "name": "明细信息",
+        "tableName": "STK_PURIN_ENTRY",
+        "type": "entry",
+        "idColumnName": "IE_ID",
+        "seqColumnName": "IE_NO",
+        "defaultRowSize": 1,
+        "fields": [
+          {
+            "name": "入库类型",
+            "columnName": "IE_INTYPE",
+            "type": "baseData"
+          },
+          {
+            "name": "物料编码",
+            "columnName": "IE_PROD",
+            "type": "baseData",
+            "ref": "base_product",
+            "refField": "PI_CODE"
+          },
+          {
+            "name": "物料名称",
+            "columnName": "IE_PRODNAME",
+            "type": "baseDataProp",
+            "baseDataField": "IE_PROD",
+            "refField": "PI_NAME"
+          },
+          {
+            "name": "规格型号",
+            "columnName": "IE_PRODSPEC",
+            "type": "baseDataProp",
+            "baseDataField": "IE_PROD",
+            "refField": "PI_SPEC"
+          },
+          {
+            "name": "库存单位",
+            "columnName": "IE_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "应收数量",
+            "columnName": "IE_EXPECTED_QTY",
+            "type": "qty"
+          },
+          {
+            "name": "实收数量",
+            "columnName": "IE_ACTUAL_QTY",
+            "type": "qty",
+            "defaultValue": 0
+          },
+          {
+            "name": "计价单位",
+            "columnName": "IE_PRICE_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "计价数量",
+            "columnName": "IE_PRICE_QTY",
+            "type": "qty"
+          },
+          {
+            "name": "批号",
+            "columnName": "IE_BATCH",
+            "type": "batch",
+            "ref": "stk_batch",
+            "refField": "BA_CODE"
+          },
+          {
+            "name": "仓库",
+            "columnName": "IE_WAREHOUSE",
+            "type": "baseData",
+            "ref": "base_warehouse",
+            "refField": "WH_NAME"
+          },
+          {
+            "name": "库存状态",
+            "columnName": "IE_STOCK_STATUS",
+            "type": "baseData",
+            "ref": "base_stockstatus",
+            "refField": "SS_NAME"
+          },
+          {
+            "name": "是否赠品",
+            "columnName": "IE_GIVEAWAY",
+            "type": "checkbox"
+          },
+          {
+            "name": "备注",
+            "columnName": "IE_REMARK",
+            "type": "textarea",
+            "length": 255
+          },
+          {
+            "name": "采购单位",
+            "columnName": "IE_PUI_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "采购数量",
+            "columnName": "IE_PUI_QTY",
+            "type": "qty"
+          }
+        ]
+      },
+      {
+        "name": "财务信息",
+        "tableName": "STK_PURIN_FIN",
+        "type": "subHead",
+        "idColumnName": "IF_ID",
+        "fields": [
+          {
+            "name": "定价时点",
+            "columnName": "IF_PRICE_DATE",
+            "type": "enumData",
+            "ref": "base_price_date"
+          },
+          {
+            "name": "本位币",
+            "columnName": "IF_LOCAL_CURR",
+            "type": "baseData",
+            "ref": "base_currency",
+            "refField": "CI_NAME"
+          },
+          {
+            "name": "结算方式",
+            "columnName": "IF_SETTLE",
+            "type": "baseData",
+            "ref": "base_settle",
+            "refField": "SE_NAME"
+          },
+          {
+            "name": "价目表",
+            "columnName": "IF_PRICE_LIST",
+            "type": "baseData",
+            "ref": "scm_purchase_price",
+            "refField": "PP_CODE"
+          },
+          {
+            "name": "汇率类型",
+            "columnName": "IF_EXCHANGE_TYPE",
+            "type": "baseData",
+            "ref": "base_exchange_type",
+            "refField": "ET_NAME"
+          },
+          {
+            "name": "结算币别",
+            "columnName": "IF_CURRENCY",
+            "type": "baseData",
+            "ref": "base_currency",
+            "refField": "CI_NAME"
+          },
+          {
+            "name": "折扣表",
+            "columnName": "IF_DISCOUNT_LIST",
+            "type": "baseData",
+            "ref": "scm_purchase_discount",
+            "refField": "PD_CODE"
+          },
+          {
+            "name": "汇率",
+            "columnName": "IF_EXCHANGE_RATE",
+            "type": "float",
+            "length": 23,
+            "decimalDigit": 10
+          },
+          {
+            "name": "付款条件",
+            "columnName": "IF_PAYCOND",
+            "type": "baseData",
+            "ref": "base_paycondition",
+            "refField": "PA_NAME"
+          },
+          {
+            "name": "金额",
+            "columnName": "IF_AMOUNT",
+            "type": "amount",
+            "refField": "IF_CURRENCY"
+          },
+          {
+            "name": "税额",
+            "columnName": "IF_TAX_AMOUNT",
+            "type": "amount",
+            "refField": "IF_CURRENCY"
+          },
+          {
+            "name": "价税合计",
+            "columnName": "IF_ALL_AMOUNT",
+            "type": "amount",
+            "refField": "IF_CURRENCY"
+          },
+          {
+            "name": "含税",
+            "columnName": "IF_INCLUDE_TAX",
+            "type": "checkbox"
+          },
+          {
+            "name": "价外税",
+            "columnName": "IF_PRICEEX_TAX",
+            "type": "checkbox"
+          }
+        ]
+      }
+    ],
+    "operations": [
+      {
+        "id": "save",
+        "name": "保存",
+        "type": "save"
+      },
+      {
+        "id": "submit",
+        "name": "提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "I_STATUS",
+          "statusValue": "S"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,允许",
+            "params": {
+              "filter": {
+                "field": "STK_PURIN.I_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "只能提交在录入的单据"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unSubmit",
+        "name": "反提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "I_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已提交,允许",
+            "params": {
+              "filter": {
+                "field": "STK_PURIN.I_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未提交"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "audit",
+        "name": "审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "I_STATUS",
+          "statusValue": "A"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,不允许",
+            "params": {
+              "filter": {
+                "field": "STK_PURIN.I_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": true,
+              "message": "请先提交单据"
+            },
+            "level": "error"
+          },
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,不允许",
+            "params": {
+              "filter": {
+                "field": "STK_PURIN.I_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": true,
+              "message": "单据已经审核,无需再审"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unAudit",
+        "name": "反审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "I_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,允许",
+            "params": {
+              "filter": {
+                "field": "STK_PURIN.I_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未审核"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "new",
+        "name": "新增",
+        "type": "addView",
+        "params": {
+          "viewName": "stk_pur_in",
+          "viewType": "form",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "close",
+        "name": "关闭",
+        "type": "closeView"
+      },
+      {
+        "id": "showList",
+        "name": "列表",
+        "type": "addView",
+        "params": {
+          "viewName": "stk_pur_in",
+          "viewType": "list",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "newEntry",
+        "name": "新增明细行",
+        "type": "newEntry",
+        "params": {
+          "entity": "STK_PURIN_ENTRY"
+        }
+      }
+    ],
+    "codeRules": [
+      {
+        "default": true,
+        "name": "采购入库编码规则",
+        "description": "采购入库编码规则",
+        "editable": true,
+        "repairable": true,
+        "entries": [
+          {
+            "type": "date",
+            "field": "I_DATE",
+            "format": "yyyyMM"
+          },
+          {
+            "type": "number",
+            "cover": "0",
+            "seed": 1,
+            "increment": 1,
+            "length": 4
+          }
+        ]
+      }
+    ],
+    "views": [
+      {
+        "viewType": "form",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "form",
+              "menubar": [
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn"
+                    }
+                  ]
+                },
+                {
+                  "text": "保存",
+                  "itemId": "saveBtn",
+                  "operation": "save"
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "选单",
+                  "itemId": "pullBtn",
+                  "operation": "showPullView"
+                },
+                {
+                  "text": "下推",
+                  "itemId": "pushBtn",
+                  "operation": "showPushView",
+                  "disableOnAdd": true
+                },
+                {
+                  "text": "业务操作",
+                  "menu": [
+                    {
+                      "text": "作废"
+                    },
+                    {
+                      "text": "反作废"
+                    }
+                  ]
+                },
+                {
+                  "text": "凭证",
+                  "itemId": "voucherMenu",
+                  "menu": [
+                    {
+                      "text": "查看业务凭证",
+                      "itemId": "bizVoucherBtn",
+                      "disableOnAdd": true
+                    },
+                    {
+                      "text": "查看总账凭证",
+                      "itemId": "glVoucherBtn",
+                      "disableOnAdd": true
+                    }
+                  ]
+                },
+                {
+                  "text": "列表",
+                  "itemId": "showListBtn",
+                  "operation": "showList"
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "layout": {
+                "type": "vbox",
+                "pack": "start",
+                "align": "stretch"
+              },
+              "items": [
+                {
+                  "xtype": "tabpanel",
+                  "ui": "form",
+                  "height": 200,
+                  "items": [
+                    {
+                      "title": "基本信息",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "xtype": "combobox",
+                          "fieldLabel": "单据类型",
+                          "itemId": "STK_PURIN_I_BILLTYPE",
+                          "bind": "{STK_PURIN.I_BILLTYPE}",
+                          "x": 10,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "textfield",
+                          "fieldLabel": "单据编号",
+                          "itemId": "STK_PURIN_I_CODE",
+                          "bind": "{STK_PURIN.I_CODE}",
+                          "emptyText": "保存时自动生成",
+                          "x": 10,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "combobox",
+                          "fieldLabel": "业务类型",
+                          "itemId": "STK_PURIN_I_BIZTYPE",
+                          "bind": "{STK_PURIN.I_BIZTYPE}",
+                          "x": 10,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "供应商",
+                          "itemId": "STK_PURIN_I_SUPPLIER",
+                          "bind": "{STK_PURIN.I_SUPPLIER}",
+                          "x": 310,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "采购部门",
+                          "itemId": "STK_PURIN_I_PURDEPT",
+                          "bind": "{STK_PURIN.I_PURDEPT}",
+                          "x": 310,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "采购员",
+                          "itemId": "STK_PURIN_I_PURCHASER",
+                          "bind": "{STK_PURIN.I_PURCHASER}",
+                          "x": 310,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "datefield",
+                          "fieldLabel": "入库日期",
+                          "itemId": "STK_PURIN_I_DATE",
+                          "bind": "{STK_PURIN.I_DATE}",
+                          "x": 610,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "收料部门",
+                          "itemId": "STK_PURIN_I_RECDEPT",
+                          "bind": "{STK_PURIN.I_RECDEPT}",
+                          "x": 610,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "仓管员",
+                          "itemId": "STK_PURIN_I_STOREKEEPER",
+                          "bind": "{STK_PURIN.I_STOREKEEPER}",
+                          "x": 610,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "textfield",
+                          "fieldLabel": "单据状态",
+                          "itemId": "STK_PURIN_I_STATUS",
+                          "bind": "{STK_PURIN.I_STATUS}",
+                          "x": 910,
+                          "y": 10,
+                          "width": 300,
+                          "disabled": true
+                        }
+                      ]
+                    },
+                    {
+                      "title": "供应商信息",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "供货方",
+                          "itemId": "STK_PURIN_I_PROVIDER",
+                          "bind": "{STK_PURIN.I_PROVIDER}",
+                          "x": 10,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "结算方",
+                          "itemId": "STK_PURIN_I_SETTLE",
+                          "bind": "{STK_PURIN.I_SETTLE}",
+                          "x": 10,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "收款方",
+                          "itemId": "STK_PURIN_I_CHARGE",
+                          "bind": "{STK_PURIN.I_CHARGE}",
+                          "x": 10,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "供货方联系人",
+                          "itemId": "STK_PURIN_I_PROVIDER_CT",
+                          "bind": "{STK_PURIN.I_PROVIDER_CT}",
+                          "x": 310,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "textarea",
+                          "fieldLabel": "供货方地址",
+                          "itemId": "STK_PURIN_I_PROVIDER_ADDR",
+                          "bind": "{STK_PURIN.I_PROVIDER_ADDR}",
+                          "x": 610,
+                          "y": 10,
+                          "width": 300
+                        }
+                      ]
+                    },
+                    {
+                      "title": "财务信息",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "本位币",
+                          "itemId": "STK_PURIN_FIN_IF_LOCAL_CURR",
+                          "bind": "{STK_PURIN_FIN.IF_LOCAL_CURR}",
+                          "x": 10,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "结算币别",
+                          "itemId": "STK_PURIN_FIN_IF_CURRENCY",
+                          "bind": "{STK_PURIN_FIN.IF_CURRENCY}",
+                          "x": 10,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "汇率类型",
+                          "itemId": "STK_PURIN_FIN_IF_EXCHANGE_TYPE",
+                          "bind": "{STK_PURIN_FIN.IF_EXCHANGE_TYPE}",
+                          "x": 10,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "numberfield",
+                          "fieldLabel": "汇率",
+                          "itemId": "STK_PURIN_FIN_IF_EXCHANGE_RATE",
+                          "bind": "{STK_PURIN_FIN.IF_EXCHANGE_RATE}",
+                          "x": 10,
+                          "y": 130,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "combobox",
+                          "fieldLabel": "定价时点",
+                          "itemId": "STK_PURIN_FIN_IF_PRICE_DATE",
+                          "bind": "{STK_PURIN_FIN.IF_PRICE_DATE}",
+                          "x": 310,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "结算方式",
+                          "itemId": "STK_PURIN_FIN_IF_SETTLE",
+                          "bind": "{STK_PURIN_FIN.IF_SETTLE}",
+                          "x": 310,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "价目表",
+                          "itemId": "STK_PURIN_FIN_IF_PRICE_LIST",
+                          "bind": "{STK_PURIN_FIN.IF_PRICE_LIST}",
+                          "x": 310,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "折扣表",
+                          "itemId": "STK_PURIN_FIN_IF_DISCOUNT_LIST",
+                          "bind": "{STK_PURIN_FIN.IF_DISCOUNT_LIST}",
+                          "x": 310,
+                          "y": 130,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "付款条件",
+                          "itemId": "STK_PURIN_FIN_IF_PAYCOND",
+                          "bind": "{STK_PURIN_FIN.IF_PAYCOND}",
+                          "x": 610,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "numberfield",
+                          "fieldLabel": "金额",
+                          "itemId": "STK_PURIN_FIN_IF_AMOUNT",
+                          "bind": "{STK_PURIN_FIN.IF_AMOUNT}",
+                          "x": 610,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "numberfield",
+                          "fieldLabel": "税额",
+                          "itemId": "STK_PURIN_FIN_IF_TAX_AMOUNT",
+                          "bind": "{STK_PURIN_FIN.IF_TAX_AMOUNT}",
+                          "x": 610,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "numberfield",
+                          "fieldLabel": "价税合计",
+                          "itemId": "STK_PURIN_FIN_IF_ALL_AMOUNT",
+                          "bind": "{STK_PURIN_FIN.IF_ALL_AMOUNT}",
+                          "x": 610,
+                          "y": 130,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "checkbox",
+                          "fieldLabel": "含税",
+                          "itemId": "STK_PURIN_FIN_IF_INCLUDE_TAX",
+                          "bind": "{STK_PURIN_FIN.IF_INCLUDE_TAX}",
+                          "x": 910,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "checkbox",
+                          "fieldLabel": "价外税",
+                          "itemId": "STK_PURIN_FIN_IF_PRICEEX_TAX",
+                          "bind": "{STK_PURIN_FIN.IF_PRICEEX_TAX}",
+                          "x": 910,
+                          "y": 50,
+                          "width": 300
+                        }
+                      ]
+                    },
+                    {
+                      "title": "其他",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "x": 10,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "创建人",
+                          "xtype": "textfield",
+                          "itemId": "STK_PURIN_I_CREATOR",
+                          "bind": "{STK_PURIN.I_CREATOR}"
+                        },
+                        {
+                          "x": 10,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "创建日期",
+                          "xtype": "datefield",
+                          "itemId": "STK_PURIN_I_CREATEDATE",
+                          "bind": "{STK_PURIN.I_CREATEDATE}"
+                        },
+                        {
+                          "x": 310,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "修改人",
+                          "xtype": "textfield",
+                          "itemId": "STK_PURIN_I_MODIFIER",
+                          "bind": "{STK_PURIN.I_MODIFIER}"
+                        },
+                        {
+                          "x": 310,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "修改日期",
+                          "xtype": "datefield",
+                          "itemId": "STK_PURIN_I_MODIFYDATE",
+                          "bind": "{STK_PURIN.I_MODIFYDATE}"
+                        },
+                        {
+                          "x": 610,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "审核人",
+                          "xtype": "textfield",
+                          "itemId": "STK_PURIN_I_AUDITOR",
+                          "bind": "{STK_PURIN.I_AUDITOR}"
+                        },
+                        {
+                          "x": 610,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "审核日期",
+                          "xtype": "datefield",
+                          "itemId": "STK_PURIN_I_AUDITDATE",
+                          "bind": "{STK_PURIN.I_AUDITDATE}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "作废人",
+                          "xtype": "textfield",
+                          "itemId": "STK_PURIN_I_CANCELLER",
+                          "bind": "{STK_PURIN.I_CANCELLER}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "作废日期",
+                          "xtype": "datefield",
+                          "itemId": "STK_PURIN_I_CANCELDATE",
+                          "bind": "{STK_PURIN.I_CANCELDATE}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 90,
+                          "width": 300,
+                          "fieldLabel": "作废状态",
+                          "xtype": "textfield",
+                          "itemId": "STK_PURIN_I_CANCELSTATUS",
+                          "bind": "{STK_PURIN.I_CANCELSTATUS}"
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "xtype": "tabpanel",
+                  "ui": "form",
+                  "flex": 1,
+                  "items": [
+                    {
+                      "title": "明细信息",
+                      "layout": "fit",
+                      "items": [
+                        {
+                          "xtype": "gridpanel",
+                          "menubar": [
+                            {
+                              "text": "新增行",
+                              "itemId": "newEntryMenu",
+                              "menu": [
+                                {
+                                  "text": "新增行",
+                                  "itemId": "newEntryBtn",
+                                  "operation": "newEntry"
+                                },
+                                {
+                                  "text": "插入行",
+                                  "itemId": "insertEntryBtn"
+                                },
+                                {
+                                  "text": "复制行",
+                                  "itemId": "copyEntryBtn"
+                                }
+                              ]
+                            },
+                            {
+                              "text": "删除行",
+                              "itemId": "delEntryBtn"
+                            },
+                            {
+                              "text": "批量填充"
+                            },
+                            {
+                              "text": "业务操作",
+                              "menu": [
+                                {
+                                  "text": "获取批号"
+                                }
+                              ]
+                            },
+                            {
+                              "text": "业务查询",
+                              "menu": [
+                                {
+                                  "text": "库存查询"
+                                },
+                                {
+                                  "text": "批号主档"
+                                }
+                              ]
+                            }
+                          ],
+                          "entity": "STK_PURIN_ENTRY",
+                          "bind": "{STK_PURIN_ENTRY}",
+                          "editable": true,
+                          "ui": "form",
+                          "columns": [
+                            {
+                              "text": "序号",
+                              "align": "center",
+                              "dataIndex": "IE_NO",
+                              "itemId": "STK_PURIN_ENTRY_IE_NO",
+                              "width": 60
+                            },
+                            {
+                              "text": "入库类型",
+                              "align": "center",
+                              "dataIndex": "IE_INTYPE",
+                              "itemId": "STK_PURIN_ENTRY_IE_INTYPE",
+                              "width": 100
+                            },
+                            {
+                              "text": "物料编码",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "IE_PROD",
+                              "itemId": "STK_PURIN_ENTRY_IE_PROD",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "物料名称",
+                              "dataIndex": "IE_PRODNAME",
+                              "itemId": "STK_PURIN_ENTRY_IE_PRODNAME",
+                              "width": 160
+                            },
+                            {
+                              "text": "规格型号",
+                              "dataIndex": "IE_PRODSPEC",
+                              "itemId": "STK_PURIN_ENTRY_IE_PRODSPEC",
+                              "width": 100
+                            },
+                            {
+                              "text": "库存单位",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "IE_UNIT",
+                              "itemId": "STK_PURIN_ENTRY_IE_UNIT",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "应收数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "IE_EXPECTED_QTY",
+                              "itemId": "STK_PURIN_ENTRY_IE_EXPECTED_QTY"
+                            },
+                            {
+                              "text": "实收数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "IE_ACTUAL_QTY",
+                              "itemId": "STK_PURIN_ENTRY_IE_ACTUAL_QTY",
+                              "editor": {
+                                "xtype": "numberfield"
+                              }
+                            },
+                            {
+                              "text": "计价单位",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "IE_PRICE_UNIT",
+                              "itemId": "STK_PURIN_ENTRY_IE_PRICE_UNIT",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "计价数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "IE_PRICE_QTY",
+                              "itemId": "STK_PURIN_ENTRY_IE_PRICE_QTY",
+                              "editor": {
+                                "xtype": "numberfield"
+                              }
+                            },
+                            {
+                              "text": "批号",
+                              "dataIndex": "IE_BATCH",
+                              "itemId": "STK_PURIN_ENTRY_IE_BATCH"
+                            },
+                            {
+                              "text": "仓库",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "IE_WAREHOUSE",
+                              "itemId": "STK_PURIN_ENTRY_IE_WAREHOUSE",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "库存状态",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "IE_STOCK_STATUS",
+                              "itemId": "STK_PURIN_ENTRY_IE_STOCK_STATUS",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            }
+                          ]
+                        }
+                      ]
+                    },
+                    {
+                      "title": "物料数据"
+                    },
+                    {
+                      "title": "明细财务信息"
+                    },
+                    {
+                      "title": "其他信息"
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      },
+      {
+        "viewType": "list",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "gridpanel",
+              "ui": "form",
+              "menubar": [
+                {
+                  "text": "过滤"
+                },
+                {
+                  "text": "刷新"
+                },
+                {
+                  "text": "新增",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制"
+                    }
+                  ]
+                },
+                {
+                  "text": "删除"
+                },
+                {
+                  "text": "提交",
+                  "menu": [
+                    {
+                      "text": "提交"
+                    },
+                    {
+                      "text": "反提交"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "menu": [
+                    {
+                      "text": "审核"
+                    },
+                    {
+                      "text": "反审核"
+                    }
+                  ]
+                },
+                {
+                  "text": "下推"
+                },
+                {
+                  "text": "关联查询",
+                  "menu": [
+                    {
+                      "text": "上查"
+                    },
+                    {
+                      "text": "下查"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "业务流程图"
+                    },
+                    {
+                      "text": "全流程跟踪"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "menu": [
+                    {
+                      "text": "作废"
+                    },
+                    {
+                      "text": "反作废"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "拆单"
+                    },
+                    {
+                      "text": "合并"
+                    }
+                  ]
+                },
+                {
+                  "text": "选项",
+                  "menu": [
+                    {
+                      "text": "选项"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "打印"
+                    },
+                    {
+                      "text": "预览"
+                    },
+                    {
+                      "text": "套打",
+                      "menu": [
+                        {
+                          "text": "套打设置"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "连续套打全部单据"
+                        },
+                        {
+                          "text": "连续套打所选单据"
+                        },
+                        {
+                          "text": "连续套打预览全部单据"
+                        },
+                        {
+                          "text": "连续套打预览所选单据"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "合并套打全部单据"
+                        },
+                        {
+                          "text": "合并套打所选单据"
+                        },
+                        {
+                          "text": "合并套打预览全部单据"
+                        },
+                        {
+                          "text": "合并套打预览所选单据"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "套打导出"
+                        },
+                        {
+                          "text": "分批打印全部单据"
+                        },
+                        {
+                          "text": "分批打印所选单据"
+                        }
+                      ]
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "导入",
+                      "menu": [
+                        {
+                          "text": "导入"
+                        },
+                        {
+                          "text": "导入模板设置"
+                        }
+                      ]
+                    },
+                    {
+                      "text": "导出",
+                      "menu": [
+                        {
+                          "text": "导出模板设置"
+                        },
+                        {
+                          "text": "按列表导出数据"
+                        },
+                        {
+                          "text": "按导出模板导出数据"
+                        },
+                        {
+                          "text": "按导入模板导出数据"
+                        }
+                      ]
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "附件"
+                    }
+                  ]
+                },
+                {
+                  "text": "凭证",
+                  "menu": [
+                    {
+                      "text": "查看业务凭证"
+                    },
+                    {
+                      "text": "查看总账凭证"
+                    }
+                  ]
+                },
+                {
+                  "text": "退出"
+                }
+              ],
+              "showScheme": true,
+              "showHeaderFilter": true,
+              "showPagingBar": true,
+              "selType": "checkboxmodel"
+            }
+          ]
+        },
+        "schemes": [
+          {
+            "id": "default",
+            "name": "缺省方案",
+            "columns": [
+              {
+                "entity": "STK_PURIN",
+                "field": "I_CODE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_DATE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_UNIT",
+                "width": 80
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_ACTUAL_QTY",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_BATCH",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_WAREHOUSE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "today",
+            "name": "今天",
+            "filter": {
+              "field": "STK_PURIN.I_CREATEDATE",
+              "compare": "=",
+              "value": "today"
+            },
+            "columns": [
+              {
+                "entity": "STK_PURIN",
+                "field": "I_CODE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_DATE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_UNIT",
+                "width": 80
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_ACTUAL_QTY",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_BATCH",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_WAREHOUSE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "thisWeek",
+            "name": "本周",
+            "filter": {
+              "field": "STK_PURIN.I_CREATEDATE",
+              "compare": "=",
+              "value": "thisWeek"
+            },
+            "columns": [
+              {
+                "entity": "STK_PURIN",
+                "field": "I_CODE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_DATE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_UNIT",
+                "width": 80
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_ACTUAL_QTY",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_BATCH",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_WAREHOUSE",
+                "width": 100
+              }
+            ],
+            "default": true
+          },
+          {
+            "id": "thisMonth",
+            "name": "本月",
+            "filter": {
+              "field": "STK_PURIN.I_CREATEDATE",
+              "compare": "=",
+              "value": "thisMonth"
+            },
+            "columns": [
+              {
+                "entity": "STK_PURIN",
+                "field": "I_CODE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_DATE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_UNIT",
+                "width": 80
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_ACTUAL_QTY",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_BATCH",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_WAREHOUSE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "unAudit",
+            "name": "待审核",
+            "filter": {
+              "field": "STK_PURIN.I_STATUS",
+              "compare": "=",
+              "value": "S"
+            },
+            "columns": [
+              {
+                "entity": "STK_PURIN",
+                "field": "I_CODE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_DATE",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN",
+                "field": "I_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_UNIT",
+                "width": 80
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_ACTUAL_QTY",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_BATCH",
+                "width": 100
+              },
+              {
+                "entity": "STK_PURIN_ENTRY",
+                "field": "IE_WAREHOUSE",
+                "width": 100
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+]

Разница между файлами не показана из-за своего большого размера
+ 593 - 459
applications/scm/scm-purchase/src/main/resources/metadata/Order.form.json


+ 20 - 20
applications/scm/scm-purchase/src/main/resources/metadata/Purchase.fn.json

@@ -1,19 +1,19 @@
 [
   {
-    "groupId": "scm_purchase_apply",
+    "groupId": "scm_purchase_req",
     "groupName": "采购申请",
     "module": "scm_purchase",
     "entries": [
       {
         "text": "采购申请单",
-        "formId": "scm_purchase_apply",
+        "formId": "pur_req",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "采购申请单列表",
-        "formId": "scm_purchase_apply",
+        "formId": "pur_req",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
@@ -27,14 +27,14 @@
     "entries": [
       {
         "text": "采购合同",
-        "formId": "scm_purchase_contract",
+        "formId": "pur_contract",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "采购合同列表",
-        "formId": "scm_purchase_contract",
+        "formId": "pur_contract",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
@@ -48,28 +48,28 @@
     "entries": [
       {
         "text": "采购订单",
-        "formId": "scm_purchase_order",
+        "formId": "pur_order",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "采购订单列表",
-        "formId": "scm_purchase_order",
+        "formId": "pur_order",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
       },
       {
         "text": "采购订单变更单",
-        "formId": "scm_purchase_change",
+        "formId": "pur_order_change",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "采购订单变更单列表",
-        "formId": "scm_purchase_change",
+        "formId": "pur_order_change",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
@@ -78,33 +78,33 @@
   },
   {
     "groupId": "scm_purchase_accept",
-    "groupName": "订单处理",
+    "groupName": "收料处理",
     "module": "scm_purchase",
     "entries": [
       {
         "text": "收料通知单",
-        "formId": "scm_purchase_accept",
+        "formId": "pur_rec_notify",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "收料通知单列表",
-        "formId": "scm_purchase_accept",
+        "formId": "pur_rec_notify",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
       },
       {
         "text": "采购入库单",
-        "formId": "scm_purchase_in",
+        "formId": "stk_pur_in",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "采购入库单列表",
-        "formId": "scm_purchase_in",
+        "formId": "stk_pur_in",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
@@ -118,28 +118,28 @@
     "entries": [
       {
         "text": "退料申请单",
-        "formId": "scm_purchase_return",
+        "formId": "pur_return_req",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "退料申请单列表",
-        "formId": "scm_purchase_return",
+        "formId": "pur_return_req",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
       },
       {
         "text": "采购退料单",
-        "formId": "scm_purchase_out",
+        "formId": "stk_pur_return",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "采购退料单列表",
-        "formId": "scm_purchase_out",
+        "formId": "stk_pur_return",
         "viewType": "list",
         "openType": "card",
         "permission": "view"
@@ -167,14 +167,14 @@
       },
       {
         "text": "采购价目表",
-        "formId": "scm_purchase_price",
+        "formId": "pur_price",
         "viewType": "form",
         "openType": "card",
         "permission": "new"
       },
       {
         "text": "采购价目表列表",
-        "formId": "scm_purchase_price",
+        "formId": "pur_price",
         "viewType": "list",
         "openType": "card",
         "permission": "view"

+ 0 - 25
applications/scm/scm-purchase/src/main/resources/metadata/Purchase.module.json

@@ -3,30 +3,5 @@
     "id": "scm_purchase",
     "name": "采购管理",
     "domain": "scm"
-  },
-  {
-    "id": "scm_sale",
-    "name": "销售管理",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_credit",
-    "name": "信用管理",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_stock",
-    "name": "库存管理",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_org",
-    "name": "组织间结算",
-    "domain": "scm"
-  },
-  {
-    "id": "scm_barcode",
-    "name": "条码管理",
-    "domain": "scm"
   }
 ]

+ 1447 - 0
applications/scm/scm-purchase/src/main/resources/metadata/Receive.form.json

@@ -0,0 +1,1447 @@
+[
+  {
+    "id": "pur_rec_notify",
+    "name": "收料通知单",
+    "type": "bill",
+    "idColumnName": "R_ID",
+    "codeColumnName": "R_CODE",
+    "billTypeColumnName": "R_BILLTYPE",
+    "subSys": "scm_purchase",
+    "entities": [
+      {
+        "name": "基本信息",
+        "tableName": "PUR_RECEIVE",
+        "type": "head",
+        "fields": [
+          {
+            "name": "单据类型",
+            "columnName": "R_BILLTYPE",
+            "type": "billType",
+            "length": 50
+          },
+          {
+            "name": "业务类型",
+            "columnName": "R_BIZTYPE",
+            "type": "enumData",
+            "ref": "scm_rectype"
+          },
+          {
+            "name": "收料部门",
+            "columnName": "R_RECDEPT",
+            "type": "baseData",
+            "ref": "base_deptartment",
+            "refField": "DP_NAME"
+          },
+          {
+            "name": "采购部门",
+            "columnName": "R_PURDEPT",
+            "type": "baseData",
+            "ref": "base_deptartment",
+            "refField": "DP_NAME"
+          },
+          {
+            "name": "单据编号",
+            "columnName": "R_CODE",
+            "type": "code",
+            "length": 50
+          },
+          {
+            "name": "收料日期",
+            "columnName": "R_DATE",
+            "type": "date"
+          },
+          {
+            "name": "收料员",
+            "columnName": "R_RECEIVER",
+            "type": "baseData",
+            "ref": "base_employee",
+            "refField": "EM_NAME",
+            "parentRefField": "R_DEPT"
+          },
+          {
+            "name": "采购员",
+            "columnName": "R_PURCHASER",
+            "type": "baseData",
+            "ref": "base_employee",
+            "refField": "EM_NAME",
+            "parentRefField": "R_DEPT"
+          },
+          {
+            "name": "供应商",
+            "columnName": "R_SUPPLIER",
+            "type": "baseData",
+            "ref": "base_supplier",
+            "refField": "SU_NAME"
+          },
+          {
+            "name": "创建人",
+            "columnName": "R_CREATOR",
+            "type": "creator"
+          },
+          {
+            "name": "创建日期",
+            "columnName": "R_CREATEDATE",
+            "type": "createDate"
+          },
+          {
+            "name": "修改人",
+            "columnName": "R_MODIFIER",
+            "type": "modifier"
+          },
+          {
+            "name": "修改日期",
+            "columnName": "R_MODIFYDATE",
+            "type": "modifyDate"
+          },
+          {
+            "name": "审核人",
+            "columnName": "R_AUDITOR",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "审核日期",
+            "columnName": "R_AUDITDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "单据状态",
+            "columnName": "R_STATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "E",
+                "name": "在录入",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "copyBtn",
+                      "unSubmitBtn",
+                      "auditMenu"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "S",
+                "name": "已提交",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitBtn",
+                      "unAuditBtn"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "A",
+                "name": "已审核",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitMenu",
+                      "auditBtn"
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "name": "作废人",
+            "columnName": "R_CANCELLER",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "作废日期",
+            "columnName": "R_CANCELDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "作废状态",
+            "columnName": "R_CANCELSTATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "N",
+                "name": "未作废"
+              },
+              {
+                "code": "Y",
+                "name": "已作废"
+              }
+            ]
+          }
+        ]
+      },
+      {
+        "name": "明细信息",
+        "tableName": "PUR_RECEIVE_ENTRY",
+        "type": "entry",
+        "idColumnName": "RE_ID",
+        "seqColumnName": "RE_NO",
+        "defaultRowSize": 1,
+        "fields": [
+          {
+            "name": "物料编码",
+            "columnName": "RE_PROD",
+            "type": "baseData",
+            "ref": "base_product",
+            "refField": "PR_CODE"
+          },
+          {
+            "name": "物料名称",
+            "columnName": "RE_PRODNAME",
+            "type": "baseDataProp",
+            "baseDataField": "RE_PROD",
+            "refField": "PR_NAME"
+          },
+          {
+            "name": "规格型号",
+            "columnName": "RE_PRODSPEC",
+            "type": "baseDataProp",
+            "baseDataField": "RE_PROD",
+            "refField": "PR_SPEC"
+          },
+          {
+            "name": "收料单位",
+            "columnName": "RE_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "交货数量",
+            "columnName": "RE_QTY",
+            "type": "qty",
+            "defaultValue": 0
+          },
+          {
+            "name": "预计到货日期",
+            "columnName": "RE_ARRIVALDATE",
+            "type": "date"
+          },
+          {
+            "name": "计价单位",
+            "columnName": "RE_PRICE_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "计价数量",
+            "columnName": "RE_PRICE_QTY",
+            "type": "qty"
+          },
+          {
+            "name": "库存单位",
+            "columnName": "RE_STOCK_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "库存数量",
+            "columnName": "RE_STOCK_QTY",
+            "type": "qty"
+          },
+          {
+            "name": "仓库",
+            "columnName": "RE_WAREHOUSE",
+            "type": "baseData",
+            "ref": "base_warehouse",
+            "refField": "WH_NAME"
+          },
+          {
+            "name": "库存状态",
+            "columnName": "RE_STOCK_STATUS",
+            "type": "baseData",
+            "ref": "base_stockstatus",
+            "refField": "SS_NAME"
+          }
+        ]
+      },
+      {
+        "name": "财务信息",
+        "tableName": "PUR_RECEIVE_FIN",
+        "idColumnName": "RF_ID",
+        "type": "subHead",
+        "fields": [
+          {
+            "name": "结算币别",
+            "columnName": "RF_CURRENCY",
+            "type": "baseData",
+            "ref": "base_currency",
+            "refField": "CR_NAME"
+          },
+          {
+            "name": "结算方式",
+            "columnName": "RF_SETTLE",
+            "type": "baseData",
+            "ref": "base_settle",
+            "refField": "SE_NAME"
+          },
+          {
+            "name": "付款条件",
+            "columnName": "RF_PAYCOND",
+            "type": "baseData",
+            "ref": "base_paycondition",
+            "refField": "PA_NAME"
+          }
+        ]
+      }
+    ],
+    "operations": [
+      {
+        "id": "save",
+        "name": "保存",
+        "type": "save"
+      },
+      {
+        "id": "submit",
+        "name": "提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "S"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,允许",
+            "params": {
+              "filter": {
+                "field": "PUR_RECEIVE.R_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "只能提交在录入的单据"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unSubmit",
+        "name": "反提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已提交,允许",
+            "params": {
+              "filter": {
+                "field": "PUR_RECEIVE.R_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未提交"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "audit",
+        "name": "审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "A"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,不允许",
+            "params": {
+              "filter": {
+                "field": "PUR_RECEIVE.R_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": true,
+              "message": "请先提交单据"
+            },
+            "level": "error"
+          },
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,不允许",
+            "params": {
+              "filter": {
+                "field": "PUR_RECEIVE.R_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": true,
+              "message": "单据已经审核,无需再审"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unAudit",
+        "name": "反审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,允许",
+            "params": {
+              "filter": {
+                "field": "PUR_RECEIVE.R_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未审核"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "new",
+        "name": "新增",
+        "type": "addView",
+        "params": {
+          "viewName": "pur_rec_notify",
+          "viewType": "form",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "close",
+        "name": "关闭",
+        "type": "closeView"
+      },
+      {
+        "id": "showList",
+        "name": "列表",
+        "type": "addView",
+        "params": {
+          "viewName": "pur_rec_notify",
+          "viewType": "list",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "newEntry",
+        "name": "新增明细行",
+        "type": "newEntry",
+        "params": {
+          "entity": "PUR_RECEIVE_ENTRY"
+        }
+      }
+    ],
+    "codeRules": [
+      {
+        "default": true,
+        "name": "收料通知单编码规则",
+        "description": "收料通知单编码规则",
+        "editable": true,
+        "repairable": true,
+        "entries": [
+          {
+            "type": "date",
+            "field": "R_DATE",
+            "format": "yyyyMM"
+          },
+          {
+            "type": "number",
+            "cover": "0",
+            "seed": 1,
+            "increment": 1,
+            "length": 4
+          }
+        ]
+      }
+    ],
+    "views": [
+      {
+        "viewType": "form",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "form",
+              "menubar": [
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn"
+                    }
+                  ]
+                },
+                {
+                  "text": "保存",
+                  "itemId": "saveBtn",
+                  "operation": "save"
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "选单",
+                  "itemId": "pullBtn",
+                  "operation": "showPullView"
+                },
+                {
+                  "text": "下推",
+                  "itemId": "pushBtn",
+                  "operation": "showPushView",
+                  "disableOnAdd": true
+                },
+                {
+                  "text": "列表",
+                  "itemId": "showListBtn",
+                  "operation": "showList"
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "layout": {
+                "type": "vbox",
+                "pack": "start",
+                "align": "stretch"
+              },
+              "items": [
+                {
+                  "xtype": "tabpanel",
+                  "ui": "form",
+                  "height": 160,
+                  "items": [
+                    {
+                      "title": "基本信息",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "xtype": "combobox",
+                          "fieldLabel": "单据类型",
+                          "itemId": "PUR_RECEIVE_R_BILLTYPE",
+                          "bind": "{PUR_RECEIVE.R_BILLTYPE}",
+                          "x": 10,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "textfield",
+                          "fieldLabel": "单据编号",
+                          "itemId": "PUR_RECEIVE_R_CODE",
+                          "bind": "{PUR_RECEIVE.R_CODE}",
+                          "emptyText": "保存时自动生成",
+                          "x": 10,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "combobox",
+                          "fieldLabel": "业务类型",
+                          "itemId": "PUR_RECEIVE_R_BIZTYPE",
+                          "bind": "{PUR_RECEIVE.R_BIZTYPE}",
+                          "x": 10,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "供应商",
+                          "itemId": "PUR_RECEIVE_R_SUPPLIER",
+                          "bind": "{PUR_RECEIVE.R_SUPPLIER}",
+                          "x": 310,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "采购部门",
+                          "itemId": "PUR_RECEIVE_R_PURDEPT",
+                          "bind": "{PUR_RECEIVE.R_PURDEPT}",
+                          "x": 310,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "采购员",
+                          "itemId": "PUR_RECEIVE_R_PURCHASER",
+                          "bind": "{PUR_RECEIVE.R_PURCHASER}",
+                          "x": 310,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "datefield",
+                          "fieldLabel": "收料日期",
+                          "itemId": "PUR_RECEIVE_R_DATE",
+                          "bind": "{PUR_RECEIVE.R_DATE}",
+                          "x": 610,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "收料部门",
+                          "itemId": "PUR_RECEIVE_R_RECDEPT",
+                          "bind": "{PUR_RECEIVE.R_RECDEPT}",
+                          "x": 610,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "收料员",
+                          "itemId": "PUR_RECEIVE_R_RECEIVER",
+                          "bind": "{PUR_RECEIVE.R_RECEIVER}",
+                          "x": 610,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "textfield",
+                          "fieldLabel": "单据状态",
+                          "itemId": "PUR_RECEIVE_R_STATUS",
+                          "bind": "{PUR_RECEIVE.R_STATUS}",
+                          "x": 910,
+                          "y": 10,
+                          "width": 300,
+                          "disabled": true
+                        }
+                      ]
+                    },
+                    {
+                      "title": "财务信息",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "结算币别",
+                          "itemId": "PUR_RECEIVE_FIN_RF_CURRENCY",
+                          "bind": "{PUR_RECEIVE_FIN.RF_CURRENCY}",
+                          "x": 10,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "结算方式",
+                          "itemId": "PUR_RECEIVE_FIN_RF_SETTLE",
+                          "bind": "{PUR_RECEIVE_FIN.RF_SETTLE}",
+                          "x": 310,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "付款条件",
+                          "itemId": "PUR_RECEIVE_FIN_RF_PAYCOND",
+                          "bind": "{PUR_RECEIVE_FIN.RF_PAYCOND}",
+                          "x": 610,
+                          "y": 10,
+                          "width": 300
+                        }
+                      ]
+                    },
+                    {
+                      "title": "其他",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "x": 10,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "创建人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_RECEIVE_R_CREATOR",
+                          "bind": "{PUR_RECEIVE.R_CREATOR}"
+                        },
+                        {
+                          "x": 10,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "创建日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_RECEIVE_R_CREATEDATE",
+                          "bind": "{PUR_RECEIVE.R_CREATEDATE}"
+                        },
+                        {
+                          "x": 310,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "修改人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_RECEIVE_R_MODIFIER",
+                          "bind": "{PUR_RECEIVE.R_MODIFIER}"
+                        },
+                        {
+                          "x": 310,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "修改日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_RECEIVE_R_MODIFYDATE",
+                          "bind": "{PUR_RECEIVE.R_MODIFYDATE}"
+                        },
+                        {
+                          "x": 610,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "审核人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_RECEIVE_R_AUDITOR",
+                          "bind": "{PUR_RECEIVE.R_AUDITOR}"
+                        },
+                        {
+                          "x": 610,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "审核日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_RECEIVE_R_AUDITDATE",
+                          "bind": "{PUR_RECEIVE.R_AUDITDATE}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "作废人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_RECEIVE_R_CANCELLER",
+                          "bind": "{PUR_RECEIVE.R_CANCELLER}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "作废日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_RECEIVE_R_CANCELDATE",
+                          "bind": "{PUR_RECEIVE.O_CANCELDATE}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 90,
+                          "width": 300,
+                          "fieldLabel": "作废状态",
+                          "xtype": "textfield",
+                          "itemId": "PUR_RECEIVE_R_CANCELSTATUS",
+                          "bind": "{PUR_RECEIVE.O_CANCELSTATUS}"
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "xtype": "tabpanel",
+                  "ui": "form",
+                  "flex": 1,
+                  "items": [
+                    {
+                      "title": "明细信息",
+                      "layout": "fit",
+                      "items": [
+                        {
+                          "xtype": "gridpanel",
+                          "menubar": [
+                            {
+                              "text": "新增行",
+                              "itemId": "newEntryMenu",
+                              "menu": [
+                                {
+                                  "text": "新增行",
+                                  "itemId": "newEntryBtn",
+                                  "operation": "newEntry"
+                                },
+                                {
+                                  "text": "插入行",
+                                  "itemId": "insertEntryBtn"
+                                },
+                                {
+                                  "text": "复制行",
+                                  "itemId": "copyEntryBtn"
+                                }
+                              ]
+                            },
+                            {
+                              "text": "删除行",
+                              "itemId": "delEntryBtn"
+                            },
+                            {
+                              "text": "批量填充"
+                            },
+                            {
+                              "text": "业务操作",
+                              "menu": [
+                                {
+                                  "text": "获取批号"
+                                },
+                                {
+                                  "text": "获取库存"
+                                },
+                                {
+                                  "text": "累计数量取价"
+                                }
+                              ]
+                            },
+                            {
+                              "text": "业务查询",
+                              "menu": [
+                                {
+                                  "text": "价格查询"
+                                },
+                                {
+                                  "text": "历史价格"
+                                },
+                                {
+                                  "text": "库存查询"
+                                },
+                                {
+                                  "text": "预留综合查询"
+                                },
+                                {
+                                  "text": "研发资料"
+                                }
+                              ]
+                            }
+                          ],
+                          "entity": "PUR_RECEIVE_ENTRY",
+                          "bind": "{PUR_RECEIVE_ENTRY}",
+                          "editable": true,
+                          "ui": "form",
+                          "columns": [
+                            {
+                              "text": "序号",
+                              "align": "center",
+                              "dataIndex": "RE_NO",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_NO",
+                              "width": 60
+                            },
+                            {
+                              "text": "物料编码",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_PROD",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_PROD",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "物料名称",
+                              "dataIndex": "RE_PRODNAME",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_PRODNAME",
+                              "width": 160
+                            },
+                            {
+                              "text": "收料单位",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_UNIT",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_UNIT",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "交货数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "RE_QTY",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_QTY",
+                              "editor": {
+                                "xtype": "numberfield"
+                              }
+                            },
+                            {
+                              "text": "预计到货日期",
+                              "xtype": "datecolumn",
+                              "dataIndex": "RE_ARRIVALDATE",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_ARRIVALDATE",
+                              "editor": {
+                                "xtype": "datefield"
+                              }
+                            },
+                            {
+                              "text": "计价单位",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_PRICE_UNIT",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_PRICE_UNIT",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "计价数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "RE_PRICE_QTY",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_PRICE_QTY",
+                              "editor": {
+                                "xtype": "numberfield"
+                              }
+                            },
+                            {
+                              "text": "仓库",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_WAREHOUSE",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_WAREHOUSE",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "库存状态",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_STOCK_STATUS",
+                              "itemId": "PUR_RECEIVE_ENTRY_RE_STOCK_STATUS",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            }
+                          ]
+                        }
+                      ]
+                    },
+                    {
+                      "title": "交货安排"
+                    },
+                    {
+                      "title": "明细财务信息"
+                    },
+                    {
+                      "title": "其他信息"
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      },
+      {
+        "viewType": "list",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "gridpanel",
+              "ui": "form",
+              "menubar": [
+                {
+                  "text": "过滤"
+                },
+                {
+                  "text": "刷新"
+                },
+                {
+                  "text": "新增",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制"
+                    }
+                  ]
+                },
+                {
+                  "text": "删除"
+                },
+                {
+                  "text": "提交",
+                  "menu": [
+                    {
+                      "text": "提交"
+                    },
+                    {
+                      "text": "反提交"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "menu": [
+                    {
+                      "text": "审核"
+                    },
+                    {
+                      "text": "反审核"
+                    }
+                  ]
+                },
+                {
+                  "text": "下推"
+                },
+                {
+                  "text": "关联查询",
+                  "menu": [
+                    {
+                      "text": "上查"
+                    },
+                    {
+                      "text": "下查"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "业务流程图"
+                    },
+                    {
+                      "text": "全流程跟踪"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "menu": [
+                    {
+                      "text": "作废"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "整单关闭"
+                    },
+                    {
+                      "text": "反关闭"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "计划确认"
+                    },
+                    {
+                      "text": "反计划确认"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "条码打印"
+                    },
+                    {
+                      "text": "修改变更"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务查询",
+                  "menu": [
+                    {
+                      "text": "预付查询"
+                    },
+                    {
+                      "text": "预留综合查询"
+                    },
+                    {
+                      "text": "研发资料"
+                    }
+                  ]
+                },
+                {
+                  "text": "选项",
+                  "menu": [
+                    {
+                      "text": "选项"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "打印"
+                    },
+                    {
+                      "text": "预览"
+                    },
+                    {
+                      "text": "套打",
+                      "menu": [
+                        {
+                          "text": "套打设置"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "连续套打全部单据"
+                        },
+                        {
+                          "text": "连续套打所选单据"
+                        },
+                        {
+                          "text": "连续套打预览全部单据"
+                        },
+                        {
+                          "text": "连续套打预览所选单据"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "合并套打全部单据"
+                        },
+                        {
+                          "text": "合并套打所选单据"
+                        },
+                        {
+                          "text": "合并套打预览全部单据"
+                        },
+                        {
+                          "text": "合并套打预览所选单据"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "套打导出"
+                        },
+                        {
+                          "text": "分批打印全部单据"
+                        },
+                        {
+                          "text": "分批打印所选单据"
+                        }
+                      ]
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "导入",
+                      "menu": [
+                        {
+                          "text": "导入"
+                        },
+                        {
+                          "text": "导入模板设置"
+                        }
+                      ]
+                    },
+                    {
+                      "text": "导出",
+                      "menu": [
+                        {
+                          "text": "导出模板设置"
+                        },
+                        {
+                          "text": "按列表导出数据"
+                        },
+                        {
+                          "text": "按导出模板导出数据"
+                        },
+                        {
+                          "text": "按导入模板导出数据"
+                        }
+                      ]
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "附件"
+                    }
+                  ]
+                },
+                {
+                  "text": "退出"
+                }
+              ],
+              "showScheme": true,
+              "showHeaderFilter": true,
+              "showPagingBar": true,
+              "selType": "checkboxmodel"
+            }
+          ]
+        },
+        "schemes": [
+          {
+            "id": "default",
+            "name": "缺省方案",
+            "columns": [
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_UNIT",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_WAREHOUSE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "today",
+            "name": "今天",
+            "filter": {
+              "field": "PUR_RECEIVE.R_CREATEDATE",
+              "compare": "=",
+              "value": "today"
+            },
+            "columns": [
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_UNIT",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_WAREHOUSE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "thisWeek",
+            "name": "本周",
+            "filter": {
+              "field": "PUR_RECEIVE.R_CREATEDATE",
+              "compare": "=",
+              "value": "thisWeek"
+            },
+            "columns": [
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_UNIT",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_WAREHOUSE",
+                "width": 100
+              }
+            ],
+            "default": true
+          },
+          {
+            "id": "thisMonth",
+            "name": "本月",
+            "filter": {
+              "field": "PUR_RECEIVE.R_CREATEDATE",
+              "compare": "=",
+              "value": "thisMonth"
+            },
+            "columns": [
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_SUPPLIER",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_UNIT",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_RECEIVE_ENTRY",
+                "field": "RE_WAREHOUSE",
+                "width": 100
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+]

+ 8 - 0
applications/scm/scm-purchase/src/main/resources/metadata/ReqToOrder.convert.json

@@ -0,0 +1,8 @@
+[
+  {
+    "id": "pur_req_pur_order",
+    "name": "采购申请单至采购订单",
+    "source": "pur_req",
+    "target": "pur_order"
+  }
+]

+ 1491 - 10
applications/scm/scm-purchase/src/main/resources/metadata/Requisition.form.json

@@ -1,10 +1,1491 @@
-[{
-  "id": "scm_purchase_apply",
-  "name": "采购申请",
-  "type": "bill",
-  "idColumnName": "PA_ID",
-  "codeColumnName": "PA_CODE",
-  "entities": [{
-    
-  }]
-}]
+[
+  {
+    "id": "pur_req",
+    "name": "采购申请单",
+    "type": "bill",
+    "idColumnName": "R_ID",
+    "codeColumnName": "R_CODE",
+    "billTypeColumnName": "R_BILLTYPE",
+    "subSys": "scm_purchase",
+    "entities": [
+      {
+        "name": "基本信息",
+        "tableName": "PUR_REQ",
+        "type": "head",
+        "fields": [
+          {
+            "name": "单据类型",
+            "columnName": "R_BILLTYPE",
+            "type": "billType",
+            "length": 50
+          },
+          {
+            "name": "单据编号",
+            "columnName": "R_CODE",
+            "type": "code",
+            "length": 50
+          },
+          {
+            "name": "申请日期",
+            "columnName": "R_DATE",
+            "type": "date",
+            "required": true
+          },
+          {
+            "name": "申请类型",
+            "columnName": "R_REQTYPE",
+            "type": "enumData",
+            "ref": "base_reqtype"
+          },
+          {
+            "name": "申请部门",
+            "columnName": "R_DEPT",
+            "type": "baseData",
+            "ref": "base_deptartment",
+            "refField": "DP_NAME"
+          },
+          {
+            "name": "申请人",
+            "columnName": "R_APPLICANT",
+            "type": "baseData",
+            "ref": "base_employee",
+            "refField": "EM_NAME",
+            "parentRefField": "R_DEPT"
+          },
+          {
+            "name": "币别",
+            "columnName": "R_CURRENCY",
+            "type": "baseData",
+            "ref": "base_currency",
+            "refField": "CR_NAME"
+          },
+          {
+            "name": "含税金额合计",
+            "columnName": "R_AMOUNT",
+            "type": "amount",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "备注",
+            "columnName": "R_REMARK",
+            "type": "textarea",
+            "length": 255
+          },
+          {
+            "name": "价外税",
+            "columnName": "R_PRICEEXTAX",
+            "type": "checkbox"
+          },
+          {
+            "name": "创建人",
+            "columnName": "R_CREATOR",
+            "type": "creator"
+          },
+          {
+            "name": "创建日期",
+            "columnName": "R_CREATEDATE",
+            "type": "createDate"
+          },
+          {
+            "name": "修改人",
+            "columnName": "R_MODIFIER",
+            "type": "modifier"
+          },
+          {
+            "name": "修改日期",
+            "columnName": "R_MODIFYDATE",
+            "type": "modifyDate"
+          },
+          {
+            "name": "审核人",
+            "columnName": "R_AUDITOR",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "审核日期",
+            "columnName": "R_AUDITDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "单据状态",
+            "columnName": "R_STATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "E",
+                "name": "在录入",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "copyBtn",
+                      "unSubmitBtn",
+                      "auditMenu"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "S",
+                "name": "已提交",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitBtn",
+                      "unAuditBtn"
+                    ]
+                  }
+                ]
+              },
+              {
+                "code": "A",
+                "name": "已审核",
+                "controls": [
+                  {
+                    "type": "menubar",
+                    "scope": [
+                      "submitMenu",
+                      "auditBtn"
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "name": "关闭人",
+            "columnName": "R_CLOSER",
+            "type": "user",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "关闭日期",
+            "columnName": "R_CLOSEDATE",
+            "type": "date",
+            "disableOnAdd": true,
+            "disableOnEdit": true
+          },
+          {
+            "name": "关闭状态",
+            "columnName": "R_CLOSESTATUS",
+            "type": "status",
+            "statusList": [
+              {
+                "code": "N",
+                "name": "未关闭"
+              },
+              {
+                "code": "Y",
+                "name": "已关闭"
+              }
+            ]
+          }
+        ]
+      },
+      {
+        "name": "明细信息",
+        "tableName": "PUR_REQ_ENTRY",
+        "type": "entry",
+        "idColumnName": "RE_ID",
+        "seqColumnName": "RE_NO",
+        "defaultRowSize": 1,
+        "fields": [
+          {
+            "name": "物料编码",
+            "columnName": "RE_PROD",
+            "type": "baseData",
+            "ref": "base_product",
+            "refField": "PR_CODE"
+          },
+          {
+            "name": "物料名称",
+            "columnName": "RE_PRODNAME",
+            "type": "baseDataProp",
+            "baseDataField": "RE_PROD",
+            "refField": "PR_NAME"
+          },
+          {
+            "name": "规格型号",
+            "columnName": "RE_PRODSPEC",
+            "type": "baseDataProp",
+            "baseDataField": "RE_PROD",
+            "refField": "PR_SPEC"
+          },
+          {
+            "name": "申请单位",
+            "columnName": "RE_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "申请数量",
+            "columnName": "RE_QTY",
+            "type": "qty",
+            "defaultValue": 0
+          },
+          {
+            "name": "批准数量",
+            "columnName": "RE_APPROVEQTY",
+            "type": "qty",
+            "defaultValue": 0
+          },
+          {
+            "name": "到货日期",
+            "columnName": "RE_ARRIVALDATE",
+            "type": "date"
+          },
+          {
+            "name": "建议供应商",
+            "columnName": "RE_SUGSUPPLIER",
+            "type": "baseData",
+            "ref": "base_supplier",
+            "refField": "SU_NAME"
+          },
+          {
+            "name": "计价单位",
+            "columnName": "RE_PRICE_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "计价数量",
+            "columnName": "RE_PRICE_QTY",
+            "type": "qty"
+          },
+          {
+            "name": "库存单位",
+            "columnName": "RE_STOCK_UNIT",
+            "type": "baseData",
+            "ref": "base_unit",
+            "refField": "UN_NAME"
+          },
+          {
+            "name": "库存数量",
+            "columnName": "RE_STOCK_QTY",
+            "type": "qty"
+          },
+          {
+            "name": "备注",
+            "columnName": "RE_REMARK",
+            "type": "textarea",
+            "length": 255
+          }
+        ]
+      }
+    ],
+    "operations": [
+      {
+        "id": "save",
+        "name": "保存",
+        "type": "save"
+      },
+      {
+        "id": "submit",
+        "name": "提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "S"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,允许",
+            "params": {
+              "filter": {
+                "field": "PUR_REQ.R_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "只能提交在录入的单据"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unSubmit",
+        "name": "反提交",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已提交,允许",
+            "params": {
+              "filter": {
+                "field": "PUR_REQ.R_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未提交"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "audit",
+        "name": "审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "A"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 在录入,不允许",
+            "params": {
+              "filter": {
+                "field": "PUR_REQ.R_STATUS",
+                "compare": "=",
+                "value": "E"
+              },
+              "triggerOnTrue": true,
+              "message": "请先提交单据"
+            },
+            "level": "error"
+          },
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,不允许",
+            "params": {
+              "filter": {
+                "field": "PUR_REQ.R_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": true,
+              "message": "单据已经审核,无需再审"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "unAudit",
+        "name": "反审核",
+        "type": "changeStatus",
+        "params": {
+          "statusField": "R_STATUS",
+          "statusValue": "E"
+        },
+        "validators": [
+          {
+            "type": "legal",
+            "description": "状态 = 已审核,允许",
+            "params": {
+              "filter": {
+                "field": "PUR_REQ.R_STATUS",
+                "compare": "=",
+                "value": "A"
+              },
+              "triggerOnTrue": false,
+              "message": "单据未审核"
+            },
+            "level": "error"
+          }
+        ],
+        "log": true
+      },
+      {
+        "id": "new",
+        "name": "新增",
+        "type": "addView",
+        "params": {
+          "viewName": "pur_req",
+          "viewType": "form",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "close",
+        "name": "关闭",
+        "type": "closeView"
+      },
+      {
+        "id": "showList",
+        "name": "列表",
+        "type": "addView",
+        "params": {
+          "viewName": "pur_req",
+          "viewType": "list",
+          "openType": "card"
+        }
+      },
+      {
+        "id": "newEntry",
+        "name": "新增明细行",
+        "type": "newEntry",
+        "params": {
+          "entity": "PUR_REQ_ENTRY"
+        }
+      }
+    ],
+    "codeRules": [
+      {
+        "default": true,
+        "name": "采购申请编码规则",
+        "description": "采购申请编码规则",
+        "editable": true,
+        "repairable": true,
+        "entries": [
+          {
+            "type": "date",
+            "field": "R_DATE",
+            "format": "yyyyMM"
+          },
+          {
+            "type": "number",
+            "cover": "0",
+            "seed": 1,
+            "increment": 1,
+            "length": 4
+          }
+        ]
+      }
+    ],
+    "views": [
+      {
+        "viewType": "form",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "form",
+              "menubar": [
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn",
+                      "operation": "copy"
+                    }
+                  ]
+                },
+                {
+                  "text": "保存",
+                  "itemId": "saveBtn",
+                  "operation": "save"
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "下推",
+                  "itemId": "pushBtn",
+                  "operation": "showPushView",
+                  "disableOnAdd": true
+                },
+                {
+                  "text": "业务操作",
+                  "itemId": "bizMenu",
+                  "menu": [
+                    {
+                      "text": "整单关闭",
+                      "itemId": "billCloseBtn",
+                      "operation": "closeBill",
+                      "disableOnAdd": true
+                    },
+                    {
+                      "text": "反关闭",
+                      "itemId": "billUnCloseBtn",
+                      "operation": "unCloseBill",
+                      "disableOnAdd": true
+                    }
+                  ]
+                },
+                {
+                  "text": "列表",
+                  "itemId": "showListBtn",
+                  "operation": "showList"
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "layout": {
+                "type": "vbox",
+                "pack": "start",
+                "align": "stretch"
+              },
+              "items": [
+                {
+                  "xtype": "tabpanel",
+                  "ui": "form",
+                  "height": 160,
+                  "items": [
+                    {
+                      "title": "基本信息",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "xtype": "combobox",
+                          "fieldLabel": "单据类型",
+                          "itemId": "PUR_REQ_R_BILLTYPE",
+                          "bind": "{PUR_REQ.R_BILLTYPE}",
+                          "x": 10,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "textfield",
+                          "fieldLabel": "单据编号",
+                          "itemId": "PUR_REQ_R_CODE",
+                          "bind": "{PUR_REQ.R_CODE}",
+                          "emptyText": "保存时自动生成",
+                          "x": 10,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "datefield",
+                          "fieldLabel": "申请日期",
+                          "itemId": "PUR_REQ_R_DATE",
+                          "bind": "{PUR_REQ.R_DATE}",
+                          "x": 10,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "combobox",
+                          "fieldLabel": "申请类型",
+                          "itemId": "PUR_REQ_R_REQTYPE",
+                          "bind": "{PUR_REQ.R_REQTYPE}",
+                          "x": 310,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "申请部门",
+                          "itemId": "PUR_REQ_R_DEPT",
+                          "bind": "{PUR_REQ.R_DEPT}",
+                          "x": 310,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "申请人",
+                          "itemId": "PUR_REQ_R_APPLICANT",
+                          "bind": "{PUR_REQ.R_APPLICANT}",
+                          "x": 310,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "searchfield",
+                          "fieldLabel": "币别",
+                          "itemId": "PUR_REQ_R_CURRENCY",
+                          "bind": "{PUR_REQ.R_CURRENCY}",
+                          "x": 610,
+                          "y": 10,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "numberfield",
+                          "fieldLabel": "含税金额合计",
+                          "itemId": "PUR_REQ_R_AMOUNT",
+                          "bind": "{PUR_REQ.R_AMOUNT}",
+                          "x": 610,
+                          "y": 50,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "checkbox",
+                          "fieldLabel": "价外税",
+                          "itemId": "PUR_REQ_R_PRICEEXTAX",
+                          "bind": "{PUR_REQ.R_PRICEEXTAX}",
+                          "x": 610,
+                          "y": 90,
+                          "width": 300
+                        },
+                        {
+                          "xtype": "textarea",
+                          "fieldLabel": "备注",
+                          "itemId": "PUR_REQ_R_REMARK",
+                          "bind": "{PUR_REQ.R_REMARK}",
+                          "x": 910,
+                          "y": 10,
+                          "width": 300
+                        }
+                      ]
+                    },
+                    {
+                      "title": "其他",
+                      "layout": "absolute",
+                      "items": [
+                        {
+                          "x": 10,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "创建人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_REQ_R_CREATOR",
+                          "bind": "{PUR_REQ.R_CREATOR}"
+                        },
+                        {
+                          "x": 10,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "创建日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_REQ_R_CREATEDATE",
+                          "bind": "{PUR_REQ.R_CREATEDATE}"
+                        },
+                        {
+                          "x": 310,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "修改人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_REQ_R_MODIFIER",
+                          "bind": "{PUR_REQ.R_MODIFIER}"
+                        },
+                        {
+                          "x": 310,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "修改日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_REQ_R_MODIFYDATE",
+                          "bind": "{PUR_REQ.R_MODIFYDATE}"
+                        },
+                        {
+                          "x": 610,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "审核人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_REQ_R_AUDITOR",
+                          "bind": "{PUR_REQ.R_AUDITOR}"
+                        },
+                        {
+                          "x": 610,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "审核日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_REQ_R_AUDITDATE",
+                          "bind": "{PUR_REQ.R_AUDITDATE}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 10,
+                          "width": 300,
+                          "fieldLabel": "关闭人",
+                          "xtype": "textfield",
+                          "itemId": "PUR_REQ_R_CLOSER",
+                          "bind": "{PUR_REQ.R_CLOSER}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 50,
+                          "width": 300,
+                          "fieldLabel": "关闭日期",
+                          "xtype": "datefield",
+                          "itemId": "PUR_REQ_R_CLOSEDATE",
+                          "bind": "{PUR_REQ.R_CLOSEDATE}"
+                        },
+                        {
+                          "x": 910,
+                          "y": 90,
+                          "width": 300,
+                          "fieldLabel": "关闭状态",
+                          "xtype": "textfield",
+                          "itemId": "PUR_REQ_R_CLOSESTATUS",
+                          "bind": "{PUR_REQ.R_CLOSESTATUS}"
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "xtype": "tabpanel",
+                  "ui": "form",
+                  "flex": 1,
+                  "items": [
+                    {
+                      "title": "明细信息",
+                      "layout": "fit",
+                      "items": [
+                        {
+                          "xtype": "gridpanel",
+                          "menubar": [
+                            {
+                              "text": "新增行",
+                              "itemId": "newEntryMenu",
+                              "menu": [
+                                {
+                                  "text": "新增行",
+                                  "itemId": "newEntryBtn",
+                                  "operation": "newEntry"
+                                },
+                                {
+                                  "text": "插入行",
+                                  "itemId": "insertEntryBtn",
+                                  "operation": "insertEntry"
+                                },
+                                {
+                                  "text": "复制行",
+                                  "itemId": "copyEntryBtn",
+                                  "operation": "copyEntry"
+                                }
+                              ]
+                            },
+                            {
+                              "text": "删除行",
+                              "itemId": "delEntryBtn",
+                              "operation": "deleteEntry"
+                            },
+                            {
+                              "text": "业务查询",
+                              "menu": [
+                                {
+                                  "text": "库存查询"
+                                }
+                              ]
+                            }
+                          ],
+                          "entity": "PUR_REQ_ENTRY",
+                          "bind": "{PUR_REQ_ENTRY}",
+                          "editable": true,
+                          "ui": "form",
+                          "columns": [
+                            {
+                              "text": "序号",
+                              "align": "center",
+                              "dataIndex": "RE_NO",
+                              "itemId": "PUR_REQ_ENTRY_RE_NO",
+                              "width": 60
+                            },
+                            {
+                              "text": "物料编码",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_PROD",
+                              "itemId": "PUR_REQ_ENTRY_RE_PROD",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "物料名称",
+                              "dataIndex": "RE_PRODNAME",
+                              "itemId": "PUR_REQ_ENTRY_RE_PRODNAME",
+                              "width": 160
+                            },
+                            {
+                              "text": "规格型号",
+                              "dataIndex": "RE_PRODSPEC",
+                              "itemId": "PUR_REQ_ENTRY_RE_PRODSPEC",
+                              "width": 160
+                            },
+                            {
+                              "text": "申请单位",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_UNIT",
+                              "itemId": "PUR_REQ_ENTRY_RE_UNIT",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "申请数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "RE_QTY",
+                              "itemId": "PUR_REQ_ENTRY_RE_QTY",
+                              "editor": {
+                                "xtype": "numberfield"
+                              }
+                            },
+                            {
+                              "text": "批准数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "RE_APPROVEQTY",
+                              "itemId": "PUR_REQ_ENTRY_RE_APPROVEQTY"
+                            },
+                            {
+                              "text": "到货日期",
+                              "xtype": "datecolumn",
+                              "dataIndex": "RE_ARRIVALDATE",
+                              "itemId": "PUR_REQ_ENTRY_RE_ARRIVALDATE"
+                            },
+                            {
+                              "text": "建议供应商",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_SUGSUPPLIER",
+                              "itemId": "PUR_REQ_ENTRY_RE_SUGSUPPLIER",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "计价单位",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_PRICE_UNIT",
+                              "itemId": "PUR_REQ_ENTRY_RE_PRICE_UNIT",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "计价数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "RE_PRICE_QTY",
+                              "itemId": "PUR_REQ_ENTRY_RE_PRICE_QTY",
+                              "editor": {
+                                "xtype": "numberfield"
+                              }
+                            },
+                            {
+                              "text": "库存单位",
+                              "xtype": "searchcolumn",
+                              "dataIndex": "RE_STOCK_UNIT",
+                              "itemId": "PUR_REQ_ENTRY_RE_STOCK_UNIT",
+                              "editor": {
+                                "xtype": "searchfield"
+                              }
+                            },
+                            {
+                              "text": "库存数量",
+                              "xtype": "numbercolumn",
+                              "dataIndex": "RE_STOCK_QTY",
+                              "itemId": "PUR_REQ_ENTRY_RE_STOCK_QTY",
+                              "editor": {
+                                "xtype": "numberfield"
+                              }
+                            },
+                            {
+                              "text": "备注",
+                              "dataIndex": "RE_REMARK",
+                              "itemId": "PUR_REQ_ENTRY_RE_REMARK",
+                              "editor": {
+                                "xtype": "textfield"
+                              }
+                            }
+                          ]
+                        }
+                      ]
+                    },
+                    {
+                      "title": "货源安排"
+                    },
+                    {
+                      "title": "明细财务信息"
+                    },
+                    {
+                      "title": "其他信息"
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      },
+      {
+        "viewType": "list",
+        "appearance": {
+          "layout": "fit",
+          "items": [
+            {
+              "xtype": "gridpanel",
+              "ui": "form",
+              "menubar": [
+                {
+                  "text": "过滤",
+                  "itemId": "filterBtn",
+                  "operation": "showSchemeView"
+                },
+                {
+                  "text": "刷新",
+                  "itemId": "refreshBtn",
+                  "operation": "refresh"
+                },
+                {
+                  "text": "新增",
+                  "itemId": "newMenu",
+                  "menu": [
+                    {
+                      "text": "新增",
+                      "itemId": "newBtn",
+                      "operation": "new"
+                    },
+                    {
+                      "text": "复制",
+                      "itemId": "copyBtn",
+                      "operation": "copy"
+                    }
+                  ]
+                },
+                {
+                  "text": "删除",
+                  "itemId": "deleteBtn",
+                  "operation": "delete"
+                },
+                {
+                  "text": "提交",
+                  "itemId": "submitMenu",
+                  "menu": [
+                    {
+                      "text": "提交",
+                      "itemId": "submitBtn",
+                      "operation": "submit"
+                    },
+                    {
+                      "text": "反提交",
+                      "itemId": "unSubmitBtn",
+                      "operation": "unSubmit"
+                    }
+                  ]
+                },
+                {
+                  "text": "审核",
+                  "itemId": "auditMenu",
+                  "menu": [
+                    {
+                      "text": "审核",
+                      "itemId": "auditBtn",
+                      "operation": "audit"
+                    },
+                    {
+                      "text": "反审核",
+                      "itemId": "unAuditBtn",
+                      "operation": "unAudit"
+                    }
+                  ]
+                },
+                {
+                  "text": "下推",
+                  "itemId": "pushBtn",
+                  "operation": "push"
+                },
+                {
+                  "text": "关联查询",
+                  "menu": [
+                    {
+                      "text": "上查"
+                    },
+                    {
+                      "text": "下查"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "业务流程图"
+                    },
+                    {
+                      "text": "全流程跟踪"
+                    }
+                  ]
+                },
+                {
+                  "text": "业务操作",
+                  "menu": [
+                    {
+                      "text": "作废"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "整单关闭"
+                    },
+                    {
+                      "text": "反关闭"
+                    }
+                  ]
+                },
+                {
+                  "text": "选项",
+                  "menu": [
+                    {
+                      "text": "选项"
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "打印"
+                    },
+                    {
+                      "text": "预览"
+                    },
+                    {
+                      "text": "套打",
+                      "menu": [
+                        {
+                          "text": "套打设置"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "连续套打全部单据"
+                        },
+                        {
+                          "text": "连续套打所选单据"
+                        },
+                        {
+                          "text": "连续套打预览全部单据"
+                        },
+                        {
+                          "text": "连续套打预览所选单据"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "合并套打全部单据"
+                        },
+                        {
+                          "text": "合并套打所选单据"
+                        },
+                        {
+                          "text": "合并套打预览全部单据"
+                        },
+                        {
+                          "text": "合并套打预览所选单据"
+                        },
+                        {
+                          "xtype": "menuseparator"
+                        },
+                        {
+                          "text": "套打导出"
+                        },
+                        {
+                          "text": "分批打印全部单据"
+                        },
+                        {
+                          "text": "分批打印所选单据"
+                        }
+                      ]
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "导入",
+                      "menu": [
+                        {
+                          "text": "导入"
+                        },
+                        {
+                          "text": "导入模板设置"
+                        }
+                      ]
+                    },
+                    {
+                      "text": "导出",
+                      "menu": [
+                        {
+                          "text": "导出模板设置"
+                        },
+                        {
+                          "text": "按列表导出数据"
+                        },
+                        {
+                          "text": "按导出模板导出数据"
+                        },
+                        {
+                          "text": "按导入模板导出数据"
+                        }
+                      ]
+                    },
+                    {
+                      "xtype": "menuseparator"
+                    },
+                    {
+                      "text": "附件"
+                    }
+                  ]
+                },
+                {
+                  "text": "退出",
+                  "itemId": "closeBtn",
+                  "operation": "close"
+                }
+              ],
+              "showScheme": true,
+              "showHeaderFilter": true,
+              "showPagingBar": true,
+              "selType": "checkboxmodel"
+            }
+          ]
+        },
+        "schemes": [
+          {
+            "id": "default",
+            "name": "缺省方案",
+            "columns": [
+              {
+                "entity": "PUR_REQ",
+                "field": "R_BILLTYPE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CLOSESTATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_APPROVEQTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_ARRIVALDATE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "today",
+            "name": "今天",
+            "filter": {
+              "entity": "PUR_REQ",
+              "field": "R_CREATEDATE",
+              "compare": "=",
+              "value": "today"
+            },
+            "columns": [
+              {
+                "entity": "PUR_REQ",
+                "field": "R_BILLTYPE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CLOSESTATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_APPROVEQTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_ARRIVALDATE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "thisWeek",
+            "name": "本周",
+            "filter": {
+              "field": "PUR_REQ.R_CREATEDATE",
+              "compare": "=",
+              "value": "thisWeek"
+            },
+            "columns": [
+              {
+                "entity": "PUR_REQ",
+                "field": "R_BILLTYPE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CLOSESTATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_APPROVEQTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_ARRIVALDATE",
+                "width": 100
+              }
+            ]
+          },
+          {
+            "id": "thisMonth",
+            "name": "本月",
+            "filter": {
+              "field": "PUR_REQ.R_CREATEDATE",
+              "compare": "=",
+              "value": "thisMonth"
+            },
+            "columns": [
+              {
+                "entity": "PUR_REQ",
+                "field": "R_BILLTYPE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CLOSESTATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_APPROVEQTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_ARRIVALDATE",
+                "width": 100
+              }
+            ],
+            "default": true
+          },
+          {
+            "id": "unAudit",
+            "name": "未完成采购申请",
+            "filter": {
+              "logic": "AND",
+              "items": [
+                {
+                  "field": "PUR_REQ.R_STATUS",
+                  "compare": "=",
+                  "value": "A"
+                },
+                {
+                  "field": "PUR_REQ.R_CLOSESTATUS",
+                  "compare": "=",
+                  "value": "N"
+                }
+              ]
+            },
+            "columns": [
+              {
+                "entity": "PUR_REQ",
+                "field": "R_BILLTYPE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CODE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_STATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_CLOSESTATUS",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ",
+                "field": "R_DATE",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PROD",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_PRODNAME",
+                "width": 200
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_QTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_APPROVEQTY",
+                "width": 100
+              },
+              {
+                "entity": "PUR_REQ_ENTRY",
+                "field": "RE_ARRIVALDATE",
+                "width": 100
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+]

+ 3 - 0
applications/scm/scm-sale/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:scm:scm-base')
+}

+ 359 - 0
applications/scm/scm-sale/src/main/resources/metadata/Sale.fn.json

@@ -0,0 +1,359 @@
+[
+  {
+    "groupId": "scm_sale_quote",
+    "groupName": "报价",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "销售报价单",
+        "formId": "scm_sale_quote",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售报价单列表",
+        "formId": "scm_sale_quote",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_contract",
+    "groupName": "合同管理",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "销售合同",
+        "formId": "scm_sale_contract",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售合同列表",
+        "formId": "scm_sale_contract",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_order",
+    "groupName": "订单处理",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "销售订单",
+        "formId": "scm_sale_order",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售订单列表",
+        "formId": "scm_sale_order",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售订单变更单",
+        "formId": "scm_sale_order_change",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售订单变更单列表",
+        "formId": "scm_sale_order_change",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_send",
+    "groupName": "出货处理",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "可发量查询",
+        "formId": "scm_sale_send_avail",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "发货通知单",
+        "formId": "scm_sale_send_notify",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "发货通知单列表",
+        "formId": "scm_sale_send_notify",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售出库单",
+        "formId": "scm_sale_out",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售出库单列表",
+        "formId": "scm_sale_out",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_return",
+    "groupName": "退货处理",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "退货通知单",
+        "formId": "scm_sale_return_notify",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "退货通知单列表",
+        "formId": "scm_sale_return_notify",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售退货单",
+        "formId": "stk_sale_return",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售退货单列表",
+        "formId": "stk_sale_return",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_consign",
+    "groupName": "寄售",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "寄售结算单",
+        "formId": "scm_sale_consign",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "寄售结算单列表",
+        "formId": "scm_sale_consign",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_price",
+    "groupName": "价格管理",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "销售价目表",
+        "formId": "scm_sale_price",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售价目表列表",
+        "formId": "scm_sale_price",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售折扣表",
+        "formId": "scm_sale_discount",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售折扣表列表",
+        "formId": "scm_sale_discount",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售调价方案",
+        "formId": "scm_sale_price_adjust",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售调价方案列表",
+        "formId": "scm_sale_price_adjust",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "价格综合查询",
+        "formId": "scm_sale_price_query",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "历史价格查询",
+        "formId": "scm_sale_price_his",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_report",
+    "groupName": "报表分析",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "销售订单执行明细表",
+        "formId": "scm_sale_order_detail",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售订单执行汇总表",
+        "formId": "scm_sale_order_sum",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售利润估算分析表",
+        "formId": "scm_sale_profit_est",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售出库明细表",
+        "formId": "scm_sale_out_detail",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售出库汇总表",
+        "formId": "scm_sale_out_sum",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_base",
+    "groupName": "基础资料",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "客户列表",
+        "formId": "base_customer",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "客户物料对照表",
+        "formId": "base_customer_prod",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售条款列表",
+        "formId": "scm_sale_clause",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_config",
+    "groupName": "参数设置",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "销售管理系统参数",
+        "formId": "scm_sale_config",
+        "viewType": "config",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "预计可发量参数",
+        "formId": "scm_sale_send_avail_config",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_sale_init",
+    "groupName": "初始化",
+    "module": "scm_sale",
+    "entries": [
+      {
+        "text": "期初订单",
+        "formId": "scm_sale_init",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "期初销售出库单",
+        "formId": "scm_sale_send_init",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "期初销售退货单",
+        "formId": "scm_sale_return_init",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  }
+]

+ 7 - 0
applications/scm/scm-sale/src/main/resources/metadata/Sale.module.json

@@ -0,0 +1,7 @@
+[
+  {
+    "id": "scm_sale",
+    "name": "销售管理",
+    "domain": "scm"
+  }
+]

+ 3 - 0
applications/scm/scm-stock/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:scm:scm-base')
+}

+ 443 - 0
applications/scm/scm-stock/src/main/resources/metadata/Stock.fn.json

@@ -0,0 +1,443 @@
+[
+  {
+    "groupId": "scm_stock_io",
+    "groupName": "出入库管理",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "出入库列表",
+        "formId": "scm_stock_io",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_saleio",
+    "groupName": "销售出入库",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "销售出库单",
+        "formId": "scm_sale_out",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售出库单列表",
+        "formId": "scm_sale_out",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售退货单",
+        "formId": "scm_sale_return",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "销售退货单列表",
+        "formId": "scm_sale_return",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_purio",
+    "groupName": "采购出入库",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "采购入库单",
+        "formId": "stk_pur_in",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "采购入库单列表",
+        "formId": "stk_pur_in",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "view"
+      },
+      {
+        "text": "采购退料单",
+        "formId": "stk_pur_return",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "采购退料单列表",
+        "formId": "stk_pur_return",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "view"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_oth",
+    "groupName": "杂收杂发",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "其他入库单",
+        "formId": "stk_oth_in",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "其他入库单列表",
+        "formId": "stk_oth_in",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "其他出库单",
+        "formId": "stk_oth_out",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "其他出库单列表",
+        "formId": "stk_oth_out",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_move",
+    "groupName": "库存调拨",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "调拨申请单",
+        "formId": "stk_move_req",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "调拨申请单列表",
+        "formId": "stk_move_req",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "直接调拨单",
+        "formId": "stk_move",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "直接调拨单列表",
+        "formId": "stk_move",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "分步式调出单",
+        "formId": "stk_moveout_step",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "分步式调出单列表",
+        "formId": "stk_moveout_step",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "分步式调入单",
+        "formId": "stk_movein_step",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "分步式调入单列表",
+        "formId": "stk_movein_step",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_em",
+    "groupName": "期末处理",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "关账",
+        "formId": "stk_em_close",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "反关账",
+        "formId": "stk_em_unclose",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_query",
+    "groupName": "库存查询",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "即时库存查询",
+        "formId": "stk_query",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_adjust",
+    "groupName": "库存调整",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "库存状态转换单",
+        "formId": "stk_status_change",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库存状态转换单列表",
+        "formId": "stk_status_change",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "批号调整单",
+        "formId": "stk_batch_adjust",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "批号调整单列表",
+        "formId": "stk_batch_adjust",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_report",
+    "groupName": "报表分析",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "物料收发明细表",
+        "formId": "stk_prodio_detail",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "物料收发汇总表",
+        "formId": "stk_prodio_sum",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库存台账",
+        "formId": "stk_ledger",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库存账龄分析表",
+        "formId": "stk_age_analysis",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "呆滞料分析",
+        "formId": "stk_dull_analysis",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "安全库存预警",
+        "formId": "stk_safe_warn",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "保质期预警",
+        "formId": "stk_quality_warn",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库存负结余预警",
+        "formId": "stk_minus_warn",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_age",
+    "groupName": "库龄计算",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "库龄计算方案",
+        "formId": "stk_age_calc",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库龄计算方案列表",
+        "formId": "stk_age_calc",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库龄分析汇总",
+        "formId": "stk_age_sum",
+        "viewType": "report",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库龄分析明细",
+        "formId": "stk_age_detail",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_batch",
+    "groupName": "批号管理",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "批号主档列表",
+        "formId": "stk_batch",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "物料批号规则设置",
+        "formId": "stk_batch_rule",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_base",
+    "groupName": "基础资料",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "仓库列表",
+        "formId": "stk_warehouse",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "库存状态列表",
+        "formId": "stk_status",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_config",
+    "groupName": "参数设置",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "库存管理系统参数",
+        "formId": "stk_config",
+        "viewType": "config",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  },
+  {
+    "groupId": "scm_stock_init",
+    "groupName": "初始化",
+    "module": "scm_stock",
+    "entries": [
+      {
+        "text": "初始库存",
+        "formId": "stk_init",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "初始库存列表",
+        "formId": "stk_init",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "结束初始化",
+        "formId": "stk_init_finish",
+        "viewType": "form",
+        "openType": "card",
+        "permission": "new"
+      },
+      {
+        "text": "反初始化",
+        "formId": "stk_init_unfinish",
+        "viewType": "list",
+        "openType": "card",
+        "permission": "new"
+      }
+    ]
+  }
+]

+ 7 - 0
applications/scm/scm-stock/src/main/resources/metadata/Stock.module.json

@@ -0,0 +1,7 @@
+[
+  {
+    "id": "scm_stock",
+    "name": "库存管理",
+    "domain": "scm"
+  }
+]

+ 3 - 0
applications/sys/sys-base/build.gradle

@@ -0,0 +1,3 @@
+dependencies {
+    compile project(':applications:base')
+}

+ 15 - 1
applications/sys/sys-base/src/main/resources/metadata/Sys.domain.json

@@ -1,6 +1,20 @@
 [
   {
     "name": "系统管理",
-    "id": "sys"
+    "id": "sys",
+    "modules": [
+      {
+        "id": "sys",
+        "name": "系统管理"
+      },
+      {
+        "id": "sys_org",
+        "name": "组织机构"
+      },
+      {
+        "id": "sys_portal",
+        "name": "门户管理"
+      }
+    ]
   }
 ]

+ 1 - 1
build.gradle

@@ -9,7 +9,7 @@ allprojects {
 }
 
 subprojects { Project subproject ->
-    if (subproject.name in ["framework", "applications", "runtime", "scm", "cloud"]) {
+    if (subproject.name in ["framework", "applications", "runtime", "scm", "cloud", "plm", "cost", "assert", "fa", "sys", "cust", "pm", "ec"]) {
         return
     }
     apply plugin: 'java'

+ 2 - 1
framework/README.md

@@ -6,11 +6,12 @@
 ├─framework
 │  │  
 │  ├─framework-core---------------------------基础
-│  ├─framework-domain-------------------------领域
 │  ├─framework-entity-------------------------实体
 │  ├─framework-form---------------------------表单
 │  ├─framework-jdbc---------------------------数据库操作
 │  ├─framework-plugin-------------------------插件
+│  ├─framework-print--------------------------打印
+│  ├─framework-report-------------------------报表
 │  ├─framework-security-----------------------安全
 │  ├─framework-view---------------------------视图
 │  ├─framework-web----------------------------web服务

+ 39 - 1
framework/framework-core/src/main/java/com/usoftchina/uas/util/CollectionUtils.java

@@ -1,8 +1,46 @@
 package com.usoftchina.uas.util;
 
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.Function;
+
 /**
  * @author yingp
  * @date 2019/11/4
  */
-public class CollectionUtils {
+public class CollectionUtils extends org.springframework.util.CollectionUtils {
+
+    public static <T, R> Map<R, T> toMap(Collection<T> list, Function<T, R> function) {
+        if (isEmpty(list)) {
+            return Collections.emptyMap();
+        }
+
+        Map<R, T> map = new LinkedHashMap<>(list.size());
+        for (T t : list) {
+            R key = function.apply(t);
+            if (null != key) {
+                map.put(key, t);
+            }
+        }
+        return map;
+    }
+
+    public static <T, R, C> HashTable<R, C, T> toTable(Collection<T> list, Function<T, R> rFunction, Function<T, C> cFunction) {
+        HashTable<R, C, T> table = new HashTable<>();
+        if (!isEmpty(list)) {
+            for (T t : list) {
+                R r = rFunction.apply(t);
+                if (null != r) {
+                    C c = cFunction.apply(t);
+                    if (null != c) {
+                        table.put(r, c, t);
+                    }
+                }
+            }
+        }
+
+        return table;
+    }
 }

+ 115 - 7
framework/framework-core/src/main/java/com/usoftchina/uas/util/DateUtils.java

@@ -3,8 +3,14 @@ package com.usoftchina.uas.util;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.temporal.TemporalAdjusters;
+import java.time.temporal.TemporalField;
+import java.time.temporal.WeekFields;
 import java.util.Date;
+import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
 
@@ -19,31 +25,133 @@ public class DateUtils {
     private final static Pattern P_YMD_HMS = Pattern.compile("\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}");
     private final static Pattern P_YMD_HMS_TZ = Pattern.compile("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z");
 
-    private static DateFormat getFormat(String pattern) {
-        DateFormat format = formats.get(pattern);
+    private static DateFormat getFormat(String pattern, TimeZone timeZone) {
+        DateFormat format = formats.get(pattern + "_" + timeZone.getID());
         if (null == format) {
             format = new SimpleDateFormat(pattern);
-            formats.put(pattern, format);
+            format.setTimeZone(timeZone);
+            formats.put(pattern + "_" + timeZone.getID(), format);
         }
         return format;
     }
 
     public static String format(Date date, String pattern) {
-        return getFormat(pattern).format(date);
+        return getFormat(pattern, TimeZone.getDefault()).format(date);
+    }
+
+    public static String format(Date date) {
+        return format(date, "yyyy-MM-dd");
+    }
+
+    public static String formatDateTime(Date date) {
+        return format(date, "yyyy-MM-dd HH:mm:ss");
     }
 
     public static Date parse(String date) {
         try {
             if (P_YMD.matcher(date).matches()) {
-                return getFormat("yyyy-MM-dd").parse(date);
+                return getFormat("yyyy-MM-dd", TimeZone.getDefault()).parse(date);
             } else if (P_YMD_HMS.matcher(date).matches()) {
-                return getFormat("yyyy-MM-dd HH:mm:ss").parse(date);
+                return getFormat("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()).parse(date);
             } else if (P_YMD_HMS_TZ.matcher(date).matches()) {
-                return getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse(date);
+                return getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", TimeZone.getTimeZone("UTC")).parse(date);
             }
         } catch (ParseException e) {
             e.printStackTrace();
         }
         return null;
     }
+
+    /**
+     * 今天日期开始(00:00:00)
+     *
+     * @return
+     */
+    public static Date nowDateStart() {
+        return Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 今天日期截止(23:59:59)
+     *
+     * @return
+     */
+    public static Date nowDateEnd() {
+        return Date.from(LocalDateTime.of(LocalDate.now(), LocalTime.MAX)
+                .atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 今天(含时间)
+     *
+     * @return
+     */
+    public static Date nowDateTime() {
+        return new Date();
+    }
+
+    /**
+     * 日期起始(00:00:00)
+     *
+     * @return
+     */
+    public static Date startOfDate(Date date) {
+        return Date.from(date.toInstant().atZone(ZoneId.systemDefault())
+                .toLocalDate().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 日期截止(23:59:59)
+     *
+     * @return
+     */
+    public static Date endOfDate(Date date) {
+        return Date.from(
+                LocalDateTime.of(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), LocalTime.MAX)
+                        .atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 周一
+     *
+     * @return
+     */
+    public static Date nowWeekStart() {
+        LocalDate now = LocalDate.now();
+        TemporalField fieldISO = WeekFields.of(Locale.FRANCE).dayOfWeek();
+        return Date.from(now.with(fieldISO, 1).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 周天
+     *
+     * @return
+     */
+    public static Date nowWeekEnd() {
+        LocalDate now = LocalDate.now();
+        TemporalField fieldISO = WeekFields.of(Locale.FRANCE).dayOfWeek();
+        return Date.from(
+                LocalDateTime.of(now.with(fieldISO, 7), LocalTime.MAX)
+                        .atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 月初
+     *
+     * @return
+     */
+    public static Date nowMonthStart() {
+        LocalDate date = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        return Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 月末
+     *
+     * @return
+     */
+    public static Date nowMonthEnd() {
+        LocalDate date = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        return Date.from(LocalDateTime.of(date, LocalTime.MAX).atZone(ZoneId.systemDefault()).toInstant());
+    }
 }

+ 10 - 0
framework/framework-core/src/main/java/com/usoftchina/uas/util/HashTable.java

@@ -120,6 +120,16 @@ public class HashTable<R, C, V> implements Table<R, C, V> {
         }
     }
 
+    @Override
+    public void remove(R rowKey, C columnKey) {
+        if (null != rowMap && rowMap.containsKey(rowKey)) {
+            rowMap.get(rowKey).remove(columnKey);
+        }
+        if (null != colMap && colMap.containsKey(columnKey)) {
+            colMap.get(columnKey).remove(rowKey);
+        }
+    }
+
     @Override
     public void forEach(ThConsumer<R, C, V> consumer) {
         if (null != rowMap) {

+ 1 - 1
framework/framework-core/src/main/java/com/usoftchina/uas/util/Iterators.java

@@ -1,4 +1,4 @@
-package com.usoftchina.luban.core.util;
+package com.usoftchina.uas.util;
 
 import java.util.Objects;
 import java.util.function.BiConsumer;

+ 28 - 0
framework/framework-core/src/main/java/com/usoftchina/uas/util/JsonUtils.java

@@ -11,6 +11,7 @@ import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.text.SimpleDateFormat;
 import java.util.List;
+import java.util.Map;
 import java.util.TimeZone;
 
 /**
@@ -79,6 +80,18 @@ public class JsonUtils {
         }
     }
 
+    public static Map<String, Object> fromJsonString(String json) {
+        if (StringUtils.isEmpty(json)) {
+            return null;
+        }
+        try {
+            return mapper.readValue(json, getJavaType(Map.class, String.class, Object.class));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
     public static <T> List<T> fromJsonArray(String json, Class<T> targetCls) {
         if (StringUtils.isEmpty(json)) {
             return null;
@@ -94,6 +107,21 @@ public class JsonUtils {
         }
     }
 
+    public static List<Map<String, Object>> fromJsonArray(String json) {
+        if (StringUtils.isEmpty(json)) {
+            return null;
+        }
+        try {
+            if (!json.startsWith("[")) {
+                json = "[" + json + "]";
+            }
+            return mapper.readValue(json, getJavaType(List.class, getJavaType(Map.class, String.class, Object.class)));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
     /**
      * 从资源文件转换
      *

+ 10 - 0
framework/framework-core/src/main/java/com/usoftchina/uas/util/MapUtils.java

@@ -1,8 +1,18 @@
 package com.usoftchina.uas.util;
 
+import java.util.Map;
+
 /**
  * @author yingp
  * @date 2019/11/11
  */
 public class MapUtils {
+
+    public static <T> T toBean(Map<String, Object> map, Class<T> beanClass) {
+        return JsonUtils.fromJsonString(JsonUtils.toJsonString(map), beanClass);
+    }
+
+    public static Map<String, Object> fromBean(Object bean) {
+        return JsonUtils.fromJsonString(JsonUtils.toJsonString(bean));
+    }
 }

+ 21 - 1
framework/framework-core/src/main/java/com/usoftchina/uas/util/NumberUtils.java

@@ -4,5 +4,25 @@ package com.usoftchina.uas.util;
  * @author yingp
  * @date 2019/10/16
  */
-public class NumberUtils {
+public class NumberUtils extends org.springframework.util.NumberUtils {
+
+    public static int or(Integer... intArray) {
+        int value = 0;
+        for (Integer i : intArray) {
+            if (null != i) {
+                value = value | i;
+            }
+        }
+        return value;
+    }
+
+    public static int and(Integer... intArray) {
+        int value = 0;
+        for (Integer i : intArray) {
+            if (null != i) {
+                value = value & i;
+            }
+        }
+        return value;
+    }
 }

+ 138 - 4
framework/framework-core/src/main/java/com/usoftchina/uas/util/Record.java

@@ -5,6 +5,9 @@ import org.springframework.util.ObjectUtils;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 抽象实体对象
@@ -13,6 +16,9 @@ import java.util.Date;
  * @date 2018/4/11
  */
 public class Record extends LinkedCaseInsensitiveMap<Object> {
+    private final static String PROP_SPLIT = ".";
+    private final static String PROP_SPLIT_REGEXP = "\\.";
+
     public Record() {
         super();
     }
@@ -26,17 +32,81 @@ public class Record extends LinkedCaseInsensitiveMap<Object> {
         super(initialCapacity);
     }
 
-    private Record(Record other) {
-        putAll(other);
+    public Record(Map<String, Object> other) {
+        this();
+        if (null != other) {
+            putAll(other);
+        }
     }
 
     public Record set(String name, Object value) {
-        this.put(name, value);
+        put(name, value);
         return this;
     }
 
+    @Override
+    public Object put(String key, Object value) {
+        if (key.contains(PROP_SPLIT)) {
+            // 多级属性名
+            String[] props = key.split(PROP_SPLIT_REGEXP);
+            return deepPut(props, value);
+        } else {
+            return super.put(key, value);
+        }
+    }
+
+    public Object deepPut(String[] props, Object value) {
+        Map<String, Object> tempData = this;
+        for (int i = 0, len = props.length; i < len; i++) {
+            if (i < len - 1) {
+                if (!tempData.containsKey(props[i])) {
+                    Map<String, Object> nextTempData = new HashMap<>(1);
+                    tempData.put(props[i], nextTempData);
+                    tempData = nextTempData;
+                } else {
+                    tempData = (Map<String, Object>) tempData.get(props[i]);
+                }
+            } else {
+                return tempData.put(props[i], value);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Object get(Object key) {
+        if (key.toString().contains(PROP_SPLIT)) {
+            // 多级属性名
+            String[] props = key.toString().split(PROP_SPLIT_REGEXP);
+            return deepGet(props);
+        } else {
+            return super.get(key);
+        }
+    }
+
+    public Object deepGet(String... props) {
+        Map<String, Object> tempData = this;
+        for (int i = 0, len = props.length; i < len; i++) {
+            if (i < len - 1) {
+                if (tempData.containsKey(props[i])) {
+                    tempData = (Map<String, Object>) tempData.get(props[i]);
+                } else {
+                    return null;
+                }
+            } else {
+                return tempData.get(props[i]);
+            }
+        }
+        return null;
+    }
+
     public String getString(String name) {
-        Object value = this.get(name);
+        Object value = get(name);
+        return null == value ? null : value.toString();
+    }
+
+    public String deepGetString(String... names) {
+        Object value = deepGet(names);
         return null == value ? null : value.toString();
     }
 
@@ -44,58 +114,114 @@ public class Record extends LinkedCaseInsensitiveMap<Object> {
         return TypeUtils.castToDate(get(name));
     }
 
+    public Date deepGetDate(String... names) {
+        return TypeUtils.castToDate(deepGet(names));
+    }
+
     public double getDoubleValue(String name) {
         return TypeUtils.castToDoubleValue(get(name));
     }
 
+    public double deepGetDoubleValue(String... names) {
+        return TypeUtils.castToDoubleValue(deepGet(names));
+    }
+
     public Double getDouble(String name) {
         return TypeUtils.castToDouble(get(name));
     }
 
+    public Double deepGetDouble(String... names) {
+        return TypeUtils.castToDouble(deepGet(names));
+    }
+
     public long getLongValue(String name) {
         return TypeUtils.castToLongValue(get(name));
     }
 
+    public long deepGetLongValue(String... names) {
+        return TypeUtils.castToLongValue(deepGet(names));
+    }
+
     public Long getLong(String name) {
         return TypeUtils.castToLong(get(name));
     }
 
+    public Long deepGetLong(String... names) {
+        return TypeUtils.castToLong(deepGet(names));
+    }
+
     public int getIntValue(String name) {
         return TypeUtils.castToIntValue(get(name));
     }
 
+    public int deepGetIntValue(String... names) {
+        return TypeUtils.castToIntValue(deepGet(names));
+    }
+
     public Integer getInt(String name) {
         return TypeUtils.castToInt(get(name));
     }
 
+    public Integer deepGetInt(String... names) {
+        return TypeUtils.castToInt(deepGet(names));
+    }
+
     public float getFloatValue(String name) {
         return TypeUtils.castToFloatValue(get(name));
     }
 
+    public float deepGetFloatValue(String... names) {
+        return TypeUtils.castToFloatValue(deepGet(names));
+    }
+
     public Float getFloat(String name) {
         return TypeUtils.castToFloat(get(name));
     }
 
+    public Float deepGetFloat(String... names) {
+        return TypeUtils.castToFloat(deepGet(names));
+    }
+
     public short getShortValue(String name) {
         return TypeUtils.castToShortValue(get(name));
     }
 
+    public short deepGetShortValue(String... names) {
+        return TypeUtils.castToShortValue(deepGet(names));
+    }
+
     public Short getShort(String name) {
         return TypeUtils.castToShort(get(name));
     }
 
+    public Short deepGetShort(String... names) {
+        return TypeUtils.castToShort(deepGet(names));
+    }
+
     public boolean getBooleanValue(String name) {
         return TypeUtils.castToBooleanValue(get(name));
     }
 
+    public boolean deepGetBooleanValue(String... names) {
+        return TypeUtils.castToBooleanValue(deepGet(names));
+    }
+
     public Boolean getBoolean(String name) {
         return TypeUtils.castToBoolean(get(name));
     }
 
+    public Boolean deepGetBoolean(String... names) {
+        return TypeUtils.castToBoolean(deepGet(names));
+    }
+
     public BigDecimal getBigDecimal(String name) {
         return TypeUtils.castToBigDecimal(get(name));
     }
 
+    public BigDecimal deepGetBigDecimal(String... names) {
+        return TypeUtils.castToBigDecimal(deepGet(names));
+    }
+
     public boolean is(String name) {
         return getBooleanValue(name);
     }
@@ -120,6 +246,14 @@ public class Record extends LinkedCaseInsensitiveMap<Object> {
         return ObjectUtils.isEmpty(get(name));
     }
 
+    public Map<String, Object> getMap(String name) {
+        return (Map<String, Object>) get(name);
+    }
+
+    public List<Map<String, Object>> getMapList(String name) {
+        return (List<Map<String, Object>>) get(name);
+    }
+
     @Override
     public Record clone() {
         return new Record(this);

+ 34 - 6
framework/framework-core/src/main/java/com/usoftchina/uas/util/Safety.java

@@ -11,30 +11,58 @@ import java.math.BigDecimal;
 public abstract class Safety {
 
     public static double doubleValue(Double value) {
-        return null == value ? 0 : value.doubleValue();
+        return doubleValue(value, 0);
+    }
+
+    public static double doubleValue(Double value, double emptyValue) {
+        return null == value ? emptyValue : value.doubleValue();
     }
 
     public static int intValue(Integer value) {
-        return null == value ? 0 : value.intValue();
+        return intValue(value, 0);
+    }
+
+    public static int intValue(Integer value, int emptyValue) {
+        return null == value ? emptyValue : value.intValue();
     }
 
     public static short shortValue(Short value) {
-        return null == value ? 0 : value.shortValue();
+        return shortValue(value, (short) 0);
+    }
+
+    public static short shortValue(Short value, short emptyValue) {
+        return null == value ? emptyValue : value.shortValue();
     }
 
     public static float floatValue(Float value) {
-        return null == value ? 0 : value.floatValue();
+        return floatValue(value, 0);
+    }
+
+    public static float floatValue(Float value, float emptyValue) {
+        return null == value ? emptyValue : value.floatValue();
     }
 
     public static String stringValue(String value) {
-        return null == value ? "" : value;
+        return stringValue(value, "");
+    }
+
+    public static String stringValue(String value, String emptyValue) {
+        return null == value ? emptyValue : value;
     }
 
     public static BigDecimal bigDecimal(BigDecimal value) {
-        return null == value ? BigDecimal.ZERO : value;
+        return bigDecimal(value, BigDecimal.ZERO);
+    }
+
+    public static BigDecimal bigDecimal(BigDecimal value, BigDecimal emptyValue) {
+        return null == value ? emptyValue : value;
     }
 
     public static boolean booleanValue(Boolean value) {
         return null != value && value.booleanValue();
     }
+
+    public static boolean booleanValue(Boolean value, boolean emptyValue) {
+        return null == value ? emptyValue : value.booleanValue();
+    }
 }

+ 107 - 1
framework/framework-core/src/main/java/com/usoftchina/uas/util/StatefulRecord.java

@@ -1,8 +1,114 @@
 package com.usoftchina.uas.util;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiConsumer;
+
 /**
+ * 记录修改状态
+ *
  * @author yingp
  * @date 2019/10/24
  */
-public class StatefulRecord {
+public class StatefulRecord extends Record {
+
+    private boolean loaded;
+    private Map<String, Object> original;
+
+    public StatefulRecord() {
+        super();
+        loaded = true;
+    }
+
+    public StatefulRecord(Map<String, Object> other) {
+        super(other);
+        loaded = true;
+    }
+
+    /**
+     * 是否有修改
+     *
+     * @return
+     */
+    public boolean isDirty() {
+        return null != original && !original.isEmpty();
+    }
+
+    /**
+     * 修改的字段
+     *
+     * @return
+     */
+    public Set<String> dirtyKeySet() {
+        return null == original ? null : original.keySet();
+    }
+
+    /**
+     * 遍历修改的字段值
+     *
+     * @param consumer
+     */
+    public void dirties(BiConsumer<String, Object> consumer) {
+        Set<String> keys = dirtyKeySet();
+        if (null != keys && !keys.isEmpty()) {
+            keys.forEach(key -> consumer.accept(key, get(key)));
+        }
+    }
+
+    public Record getDirty() {
+        if (isDirty()) {
+            Record dirty = new Record(1);
+            dirties(dirty::put);
+            return dirty;
+        }
+        return null;
+    }
+
+    public void clearDirty() {
+        original = null;
+    }
+
+    @Override
+    public Object put(String key, Object value) {
+        Object oldVal = super.put(key, value);
+        if (loaded) {
+            if (!Objects.equals(value, oldVal)) {
+                if (null != original && original.containsKey(key)) {
+                    Object originalValue = original.get(key);
+                    if (Objects.equals(value, originalValue)) {
+                        original.remove(key);
+                    }
+                } else {
+                    if (null == original) {
+                        original = new HashMap<>(1);
+                    }
+                    original.put(key, oldVal);
+                }
+            }
+        }
+        return oldVal;
+    }
+
+    @Override
+    public Object remove(Object key) {
+        Object oldVal = super.remove(key);
+        if (loaded) {
+            if (null != original && original.containsKey(key)) {
+                Object originalValue = original.get(key);
+                if (null == originalValue) {
+                    original.remove(key);
+                }
+            } else {
+                if (null != oldVal) {
+                    if (null == original) {
+                        original = new HashMap<>(1);
+                    }
+                    original.put(key.toString(), oldVal);
+                }
+            }
+        }
+        return oldVal;
+    }
 }

+ 8 - 0
framework/framework-core/src/main/java/com/usoftchina/uas/util/Table.java

@@ -96,6 +96,14 @@ public interface Table<R, C, V> {
      */
     void removeColumn(C columnKey);
 
+    /**
+     * 删除元素
+     *
+     * @param rowKey
+     * @param columnKey
+     */
+    void remove(R rowKey, C columnKey);
+
     /**
      * 行
      *

+ 12 - 0
framework/framework-core/src/main/java/com/usoftchina/uas/util/TypeUtils.java

@@ -11,6 +11,18 @@ import java.util.Date;
  */
 public abstract class TypeUtils {
 
+    public static String castToString(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof String) {
+            return (String) value;
+        }
+
+        return value.toString();
+    }
+
     public static Date castToDate(Object value) {
         if (value == null) {
             return null;

+ 114 - 1
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/EntityFieldMetadata.java

@@ -2,8 +2,10 @@ package com.usoftchina.uas.entity;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.usoftchina.uas.entity.filter.FilterMetadata;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author yingp
@@ -33,7 +35,13 @@ public class EntityFieldMetadata implements Comparable<EntityFieldMetadata>{
      * 关联基础资料字段
      */
     private String refField;
-
+    /**
+     * 关联基础资料过滤条件
+     */
+    private FilterMetadata refFilter;
+    /**
+     * 文本长度、数字长度
+     */
     private Integer length;
     /**
      * 是否必录
@@ -47,6 +55,37 @@ public class EntityFieldMetadata implements Comparable<EntityFieldMetadata>{
      * 状态列表(type == status)
      */
     private List<Status> statusList;
+    /**
+     * 文本水平对齐方式
+     * <pre>
+     *     为空按字段类型取默认对齐方式
+     * </pre>
+     */
+    private String textAlign;
+    /**
+     * 新增时锁定
+     */
+    private Boolean disableOnAdd;
+    /**
+     * 修改时锁定
+     */
+    private Boolean disableOnEdit;
+    /**
+     * 小数位数
+     */
+    private Integer decimalDigit;
+    /**
+     * 可复制
+     */
+    private Boolean copiable;
+    /**
+     * 可导出
+     */
+    private Boolean exportable;
+    /**
+     * 可导入
+     */
+    private Boolean importable;
 
     public EntityFieldMetadata() {
     }
@@ -127,6 +166,14 @@ public class EntityFieldMetadata implements Comparable<EntityFieldMetadata>{
         this.refField = refField;
     }
 
+    public FilterMetadata getRefFilter() {
+        return refFilter;
+    }
+
+    public void setRefFilter(FilterMetadata refFilter) {
+        this.refFilter = refFilter;
+    }
+
     public Integer getLength() {
         return length;
     }
@@ -160,6 +207,68 @@ public class EntityFieldMetadata implements Comparable<EntityFieldMetadata>{
         this.statusList = statusList;
     }
 
+    public String getTextAlign() {
+        return textAlign;
+    }
+
+    public void setTextAlign(String textAlign) {
+        this.textAlign = textAlign;
+    }
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    public Boolean getDisableOnAdd() {
+        return disableOnAdd;
+    }
+
+    public void setDisableOnAdd(Boolean disableOnAdd) {
+        this.disableOnAdd = disableOnAdd;
+    }
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    public Boolean getDisableOnEdit() {
+        return disableOnEdit;
+    }
+
+    public void setDisableOnEdit(Boolean disableOnEdit) {
+        this.disableOnEdit = disableOnEdit;
+    }
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    public Integer getDecimalDigit() {
+        return decimalDigit;
+    }
+
+    public void setDecimalDigit(Integer decimalDigit) {
+        this.decimalDigit = decimalDigit;
+    }
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    public Boolean getCopiable() {
+        return copiable;
+    }
+
+    public void setCopiable(Boolean copiable) {
+        this.copiable = copiable;
+    }
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    public Boolean getExportable() {
+        return exportable;
+    }
+
+    public void setExportable(Boolean exportable) {
+        this.exportable = exportable;
+    }
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    public Boolean getImportable() {
+        return importable;
+    }
+
+    public void setImportable(Boolean importable) {
+        this.importable = importable;
+    }
+
     @Override
     public int compareTo(EntityFieldMetadata o) {
         return getColumnName().compareTo(o.getColumnName());
@@ -174,4 +283,8 @@ public class EntityFieldMetadata implements Comparable<EntityFieldMetadata>{
     public boolean isVirtualField() {
         return "baseDataProp".equals(type);
     }
+
+    public Optional<Status> getStatus(String statusCode) {
+        return statusList.stream().filter(status -> status.getCode().equals(statusCode)).findFirst();
+    }
 }

+ 45 - 1
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/EntityMetadata.java

@@ -13,10 +13,30 @@ public class EntityMetadata {
     private String type;
     private String idColumnName;
     /**
-     * 序号列
+     * 序号列(针对单据体、子单据体)
      */
     private String seqColumnName;
     private List<EntityFieldMetadata> fields;
+    /**
+     * 缺省行(针对单据体、子单据体)
+     */
+    private Integer defaultRowSize;
+    /**
+     * 是否必填(针对单据体、子单据体)
+     * <pre>
+     *     是 - 至少要有一行明细
+     * </pre>
+     */
+    private Boolean required;
+    /**
+     * 关键字段(针对单据体、子单据体)
+     * <pre>
+     *     例如采购明细的关键字段:物料编号。
+     *     即使其他必填字段填写了,如果该行没有填写物料编号,保存时也会直接遗弃;
+     *     如果该行填写了物料编号,其他必填字段未填写,则会给予错误提示
+     * </pre>
+     */
+    private String keyColumnName;
 
     public String getId() {
         return id;
@@ -74,6 +94,30 @@ public class EntityMetadata {
         this.seqColumnName = seqColumnName;
     }
 
+    public Integer getDefaultRowSize() {
+        return defaultRowSize;
+    }
+
+    public void setDefaultRowSize(Integer defaultRowSize) {
+        this.defaultRowSize = defaultRowSize;
+    }
+
+    public Boolean getRequired() {
+        return required;
+    }
+
+    public void setRequired(Boolean required) {
+        this.required = required;
+    }
+
+    public String getKeyColumnName() {
+        return keyColumnName;
+    }
+
+    public void setKeyColumnName(String keyColumnName) {
+        this.keyColumnName = keyColumnName;
+    }
+
     public boolean isFormHead() {
         return "head".equals(type);
     }

+ 38 - 0
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/Status.java

@@ -1,5 +1,7 @@
 package com.usoftchina.uas.entity;
 
+import java.util.List;
+
 /**
  * @author yingp
  * @date 2019/8/20
@@ -7,6 +9,10 @@ package com.usoftchina.uas.entity;
 public class Status {
     private String code;
     private String name;
+    private String userField;
+    private String dateField;
+    private Boolean clearData;
+    private List<StatusControl> controls;
 
     public String getCode() {
         return code;
@@ -23,4 +29,36 @@ public class Status {
     public void setName(String name) {
         this.name = name;
     }
+
+    public String getUserField() {
+        return userField;
+    }
+
+    public void setUserField(String userField) {
+        this.userField = userField;
+    }
+
+    public String getDateField() {
+        return dateField;
+    }
+
+    public void setDateField(String dateField) {
+        this.dateField = dateField;
+    }
+
+    public Boolean getClearData() {
+        return clearData;
+    }
+
+    public void setClearData(Boolean clearData) {
+        this.clearData = clearData;
+    }
+
+    public List<StatusControl> getControls() {
+        return controls;
+    }
+
+    public void setControls(List<StatusControl> controls) {
+        this.controls = controls;
+    }
 }

+ 29 - 1
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/StatusControl.java

@@ -1,8 +1,36 @@
 package com.usoftchina.uas.entity;
 
+import java.util.List;
+
 /**
+ * 状态控制
+ *
  * @author yingp
- * @date 2019/10/9
+ * @date 2019/8/20
  */
 public class StatusControl {
+    /**
+     * 类型:field、menubar
+     */
+    private String type;
+    /**
+     * 控制范围
+     */
+    private List<String> scope;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public List<String> getScope() {
+        return scope;
+    }
+
+    public void setScope(List<String> scope) {
+        this.scope = scope;
+    }
 }

+ 23 - 21
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/dialect/MsSqlFieldTypeResolver.java

@@ -20,6 +20,8 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
         String type = field.getType();
         String sqlType = null;
         Class<?> javaType = null;
+        int columnSize;
+        int decimalDigit;
         switch (type) {
             case "date":
             case "datetime":
@@ -38,12 +40,16 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
                 javaType = Long.class;
                 break;
             case "enumData":
+            case "billType":
             case "supportData":
-                sqlType = "VARCHAR(30)";
+            case "code":
+                sqlType = "VARCHAR(" + Safety.intValue(field.getLength(), 50) + ")";
                 javaType = String.class;
                 break;
             case "float":
-                sqlType = "DECIMAL(18,6)";
+                columnSize = Safety.intValue(field.getLength(), 18);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 6);
+                sqlType = String.format("DECIMAL(%s,%s)", columnSize, decimalDigit);
                 javaType = Double.class;
                 break;
             case "int":
@@ -52,11 +58,11 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
                 javaType = Integer.class;
                 break;
             case "amount":
-                sqlType = "DECIMAL(18,2)";
-                javaType = BigDecimal.class;
-                break;
             case "qty":
-                sqlType = "DECIMAL(18,6)";
+            case "price":
+                columnSize = Safety.intValue(field.getLength(), 23);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 10);
+                sqlType = String.format("DECIMAL(%s,%s)", columnSize, decimalDigit);
                 javaType = BigDecimal.class;
                 break;
             case "checkbox":
@@ -73,9 +79,8 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
                 break;
             case "text":
             case "textarea":
-            case "code":
             default:
-                sqlType = "VARCHAR(" + getFieldLength(field) + ")";
+                sqlType = "VARCHAR(" + Safety.intValue(field.getLength(), 255) + ")";
                 javaType = String.class;
                 break;
         }
@@ -107,15 +112,16 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
                 columnSize = 20;
                 break;
             case "enumData":
+            case "billType":
             case "supportData":
+            case "code":
                 typeName = "VARCHAR";
-                columnSize = 30;
+                columnSize = Safety.intValue(field.getLength(), 50);
                 break;
             case "float":
-            case "qty":
                 typeName = "DECIMAL";
-                columnSize = 18;
-                decimalDigits = 6;
+                columnSize = Safety.intValue(field.getLength(), 18);
+                decimalDigits = Safety.intValue(field.getDecimalDigit(), 6);
                 break;
             case "int":
             case "seq":
@@ -123,9 +129,11 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
                 columnSize = 11;
                 break;
             case "amount":
+            case "price":
+            case "qty":
                 typeName = "DECIMAL";
-                columnSize = 18;
-                decimalDigits = 2;
+                columnSize = Safety.intValue(field.getLength(), 23);
+                decimalDigits = Safety.intValue(field.getDecimalDigit(), 10);
                 break;
             case "checkbox":
                 typeName = "DECIMAL";
@@ -140,10 +148,9 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
                 break;
             case "text":
             case "textarea":
-            case "code":
             default:
                 typeName = "VARCHAR";
-                columnSize = getFieldLength(field);
+                columnSize = Safety.intValue(field.getLength(), 255);
                 break;
         }
 
@@ -157,9 +164,4 @@ public class MsSqlFieldTypeResolver extends FieldResolver {
         info.setDefaultValue(field.getDefaultValue());
         return info;
     }
-
-    private Integer getFieldLength(EntityFieldMetadata field) {
-        Integer length = field.getLength();
-        return null == length ? 255 : length;
-    }
 }

+ 23 - 21
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/dialect/MySqlFieldTypeResolver.java

@@ -20,6 +20,8 @@ public class MySqlFieldTypeResolver extends FieldResolver {
         String type = field.getType();
         String sqlType = null;
         Class<?> javaType = null;
+        int columnSize;
+        int decimalDigit;
         switch (type) {
             case "date":
             case "createDate":
@@ -41,12 +43,16 @@ public class MySqlFieldTypeResolver extends FieldResolver {
                 javaType = Long.class;
                 break;
             case "enumData":
+            case "billType":
             case "supportData":
-                sqlType = "VARCHAR(30)";
+            case "code":
+                sqlType = "VARCHAR(" + Safety.intValue(field.getLength(), 50) + ")";
                 javaType = String.class;
                 break;
             case "float":
-                sqlType = "DOUBLE";
+                columnSize = Safety.intValue(field.getLength(), 18);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 6);
+                sqlType = String.format("DECIMAL(%s,%s)", columnSize, decimalDigit);
                 javaType = Double.class;
                 break;
             case "int":
@@ -55,11 +61,11 @@ public class MySqlFieldTypeResolver extends FieldResolver {
                 javaType = Integer.class;
                 break;
             case "amount":
-                sqlType = "DECIMAL(18,2)";
-                javaType = BigDecimal.class;
-                break;
+            case "price":
             case "qty":
-                sqlType = "DECIMAL(18,6)";
+                columnSize = Safety.intValue(field.getLength(), 23);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 10);
+                sqlType = String.format("DECIMAL(%s,%s)", columnSize, decimalDigit);
                 javaType = BigDecimal.class;
                 break;
             case "checkbox":
@@ -76,9 +82,8 @@ public class MySqlFieldTypeResolver extends FieldResolver {
                 break;
             case "text":
             case "textarea":
-            case "code":
             default:
-                sqlType = "VARCHAR(" + getFieldLength(field) + ")";
+                sqlType = "VARCHAR(" + Safety.intValue(field.getLength(), 255) + ")";
                 javaType = String.class;
                 break;
         }
@@ -113,15 +118,16 @@ public class MySqlFieldTypeResolver extends FieldResolver {
                 columnSize = 20;
                 break;
             case "enumData":
+            case "billType":
             case "supportData":
+            case "code":
                 typeName = "VARCHAR";
-                columnSize = 30;
+                columnSize = Safety.intValue(field.getLength(), 50);
                 break;
             case "float":
-            case "qty":
                 typeName = "DECIMAL";
-                columnSize = 18;
-                decimalDigits = 6;
+                columnSize = Safety.intValue(field.getLength(), 18);
+                decimalDigits = Safety.intValue(field.getDecimalDigit(), 6);
                 break;
             case "int":
             case "seq":
@@ -129,9 +135,11 @@ public class MySqlFieldTypeResolver extends FieldResolver {
                 columnSize = 11;
                 break;
             case "amount":
+            case "qty":
+            case "price":
                 typeName = "DECIMAL";
-                columnSize = 18;
-                decimalDigits = 2;
+                columnSize = Safety.intValue(field.getLength(), 23);
+                decimalDigits = Safety.intValue(field.getDecimalDigit(), 10);
                 break;
             case "checkbox":
                 typeName = "NUMBER";
@@ -146,10 +154,9 @@ public class MySqlFieldTypeResolver extends FieldResolver {
                 break;
             case "text":
             case "textarea":
-            case "code":
             default:
                 typeName = "VARCHAR";
-                columnSize = getFieldLength(field);
+                columnSize = Safety.intValue(field.getLength(), 255);
                 break;
         }
 
@@ -163,9 +170,4 @@ public class MySqlFieldTypeResolver extends FieldResolver {
         info.setDefaultValue(field.getDefaultValue());
         return info;
     }
-
-    private Integer getFieldLength(EntityFieldMetadata field) {
-        Integer length = field.getLength();
-        return null == length ? 255 : length;
-    }
 }

+ 26 - 24
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/dialect/OracleFieldResolver.java

@@ -21,6 +21,8 @@ public class OracleFieldResolver extends FieldResolver {
         String type = field.getType();
         String sqlType = null;
         Class<?> javaType = null;
+        int columnSize;
+        int decimalDigit;
         switch (type) {
             case "date":
             case "createDate":
@@ -42,12 +44,16 @@ public class OracleFieldResolver extends FieldResolver {
                 javaType = Long.class;
                 break;
             case "enumData":
+            case "billType":
             case "supportData":
-                sqlType = "VARCHAR2(30)";
+            case "code":
+                sqlType = "VARCHAR2(" + Safety.intValue(field.getLength(), 50) + ")";
                 javaType = String.class;
                 break;
             case "float":
-                sqlType = "NUMBER(18,6)";
+                columnSize = Safety.intValue(field.getLength(), 18);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 6);
+                sqlType = String.format("NUMBER(%s,%s)", columnSize, decimalDigit);
                 javaType = Double.class;
                 break;
             case "int":
@@ -56,11 +62,11 @@ public class OracleFieldResolver extends FieldResolver {
                 javaType = Integer.class;
                 break;
             case "amount":
-                sqlType = "NUMBER(18,2)";
-                javaType = BigDecimal.class;
-                break;
+            case "price":
             case "qty":
-                sqlType = "NUMBER(18,6)";
+                columnSize = Safety.intValue(field.getLength(), 23);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 10);
+                sqlType = String.format("NUMBER(%s,%s)", columnSize, decimalDigit);
                 javaType = BigDecimal.class;
                 break;
             case "checkbox":
@@ -77,9 +83,8 @@ public class OracleFieldResolver extends FieldResolver {
                 break;
             case "text":
             case "textarea":
-            case "code":
             default:
-                sqlType = "VARCHAR2(" + getFieldLength(field) + ")";
+                sqlType = "VARCHAR2(" + Safety.intValue(field.getLength(), 255) + ")";
                 javaType = String.class;
                 break;
         }
@@ -91,7 +96,7 @@ public class OracleFieldResolver extends FieldResolver {
         String type = field.getType();
         String typeName = null;
         int columnSize = 0;
-        int decimalDigits = 0;
+        int decimalDigit = 0;
         switch (type) {
             case "date":
             case "createDate":
@@ -102,7 +107,7 @@ public class OracleFieldResolver extends FieldResolver {
             case "datetime":
                 typeName = "TIMESTAMP(6)";
                 columnSize = 11;
-                decimalDigits = 6;
+                decimalDigit = 6;
                 break;
             // 键值
             case "key":
@@ -114,15 +119,16 @@ public class OracleFieldResolver extends FieldResolver {
                 columnSize = 20;
                 break;
             case "enumData":
+            case "billType":
             case "supportData":
+            case "code":
                 typeName = "VARCHAR2";
-                columnSize = 30;
+                columnSize = Safety.intValue(field.getLength(), 50);
                 break;
             case "float":
-            case "qty":
                 typeName = "NUMBER";
-                columnSize = 18;
-                decimalDigits = 6;
+                columnSize = Safety.intValue(field.getLength(), 18);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 6);
                 break;
             case "int":
             case "seq":
@@ -130,9 +136,11 @@ public class OracleFieldResolver extends FieldResolver {
                 columnSize = 11;
                 break;
             case "amount":
+            case "qty":
+            case "price":
                 typeName = "NUMBER";
-                columnSize = 18;
-                decimalDigits = 2;
+                columnSize = Safety.intValue(field.getLength(), 23);
+                decimalDigit = Safety.intValue(field.getDecimalDigit(), 10);
                 break;
             case "checkbox":
                 typeName = "NUMBER";
@@ -147,10 +155,9 @@ public class OracleFieldResolver extends FieldResolver {
                 break;
             case "text":
             case "textarea":
-            case "code":
             default:
                 typeName = "VARCHAR2";
-                columnSize = getFieldLength(field);
+                columnSize = Safety.intValue(field.getLength(), 255);
                 break;
         }
 
@@ -159,14 +166,9 @@ public class OracleFieldResolver extends FieldResolver {
         info.setColumnName(field.getColumnName());
         info.setTypeName(typeName);
         info.setColumnSize(columnSize);
-        info.setDecimalDigits(decimalDigits);
+        info.setDecimalDigits(decimalDigit);
         info.setIsNullable(Safety.booleanValue(field.getRequired()) ? "NO" : "YES");
         info.setDefaultValue(field.getDefaultValue());
         return info;
     }
-
-    private Integer getFieldLength(EntityFieldMetadata field) {
-        Integer length = field.getLength();
-        return null == length ? 255 : length;
-    }
 }

+ 439 - 1
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/filter/FilterMetadata.java

@@ -1,8 +1,446 @@
 package com.usoftchina.uas.entity.filter;
 
+import com.usoftchina.uas.entity.EntityFieldMetadata;
+import com.usoftchina.uas.entity.EntityMetadata;
+import com.usoftchina.uas.entity.EntityMetadataService;
+import com.usoftchina.uas.entity.model.EntityModel;
+import com.usoftchina.uas.jdbc.*;
+import com.usoftchina.uas.util.DateUtils;
+import com.usoftchina.uas.util.Record;
+import com.usoftchina.uas.util.StringUtils;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
 /**
  * @author yingp
  * @date 2019/10/30
  */
-public class FilterMetadata {
+public class FilterMetadata implements Serializable {
+    /**
+     * 字段名
+     * <pre>
+     *     一般格式:表名.字段名
+     *     涉及基础资料多级表关联:表名1.字段名1:表名2.字段名2:表名x.字段名x
+     * </pre>
+     */
+    private String field;
+    private String compare;
+    private Object value;
+    /**
+     * 取字段值
+     * <pre>
+     *     一般格式:表名.字段名
+     *     涉及基础资料多级表关联:表名1.字段名1:表名2.字段名2:表名x.字段名x
+     * </pre>
+     */
+    private String valueField;
+    private String logic;
+    private List<FilterMetadata> items;
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getCompare() {
+        return compare;
+    }
+
+    public void setCompare(String compare) {
+        this.compare = compare;
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
+    public String getLogic() {
+        return logic;
+    }
+
+    public void setLogic(String logic) {
+        this.logic = logic;
+    }
+
+    public String getValueField() {
+        return valueField;
+    }
+
+    public void setValueField(String valueField) {
+        this.valueField = valueField;
+    }
+
+    public List<FilterMetadata> getItems() {
+        return items;
+    }
+
+    public void setItems(List<FilterMetadata> items) {
+        this.items = items;
+    }
+
+    public Conditional toCondition(EntityModel model) {
+        if (null != logic && null != items) {
+            Conditional[] conditions = items.stream().map(item -> item.toCondition(model))
+                    .collect(Collectors.toList())
+                    .toArray(new Conditional[]{});
+            if (Phrase.OR.name().equalsIgnoreCase(logic)) {
+                return Expression.or(conditions);
+            } else {
+                return Expression.and(conditions);
+            }
+        } else {
+            // 多级关联基础资料字段 vs 多级关联基础资料字段
+            if (!StringUtils.isEmpty(valueField)) {
+                return new UnitedEntityField(field, false).compare(compare, new UnitedEntityField(valueField, true), model);
+            } else {
+                // 多级关联基础资料字段 vs 值
+                if (field.contains(":")) {
+                    return new UnitedEntityField(field, false).compareValue(compare, value);
+                } else {
+                    // 常规字段 vs 值
+                    String[] entityFieldPair = field.split("\\.");
+                    return toFieldCondition(entityFieldPair[0], entityFieldPair[1], compare, value);
+                }
+            }
+
+        }
+    }
+
+    private static Conditional toFieldCondition(String entity, String field, String compare, Object value) {
+        EntityFieldMetadata fieldMetadata = EntityMetadataService.getField(entity, field);
+        if (null != fieldMetadata) {
+            String property = entity + "." + field;
+            switch (fieldMetadata.getType()) {
+                case "createDate":
+                case "modifyDate":
+                case "date":
+                case "datetime":
+                    return compareDate(property, compare, (String) value);
+                default:
+                    return compareValue(property, compare, value);
+            }
+        }
+        return Condition.EMPTY;
+    }
+
+    /**
+     * 日期值比较
+     *
+     * @param property
+     * @param compare
+     * @param value
+     * @return
+     */
+    private static Conditional compareDate(String property, String compare, String value) {
+        if (StringUtils.isEmpty(value)) {
+            return compareDateValue(property, compare, null);
+        } else {
+            switch (value) {
+                case "today":
+                    return compareToday(property, compare);
+                case "thisWeek":
+                    return compareThisWeek(property, compare);
+                case "thisMonth":
+                    return compareThisMonth(property, compare);
+                default:
+                    Date date = DateUtils.parse(value);
+                    return compareDateValue(property, compare, date);
+            }
+        }
+    }
+
+    /**
+     * 今天
+     *
+     * @param property
+     * @param compare
+     * @return
+     */
+    private static Conditional compareToday(String property, String compare) {
+        switch (compare) {
+            case ">":
+                return Filter.greaterThan(property, DateUtils.nowDateEnd());
+            case ">=":
+                return Filter.greaterThanOrEqualTo(property, DateUtils.nowDateStart());
+            case "<":
+                return Filter.lessThan(property, DateUtils.nowDateStart());
+            case "<=":
+                return Filter.lessThanOrEqualTo(property, DateUtils.nowDateEnd());
+            default:
+                return Expression.and(Filter.greaterThanOrEqualTo(property, DateUtils.nowDateStart()),
+                        Filter.lessThanOrEqualTo(property, DateUtils.nowDateEnd()));
+        }
+    }
+
+    /**
+     * 本周
+     *
+     * @param property
+     * @param compare
+     * @return
+     */
+    private static Conditional compareThisWeek(String property, String compare) {
+        switch (compare) {
+            case ">":
+                return Filter.greaterThan(property, DateUtils.nowWeekEnd());
+            case ">=":
+                return Filter.greaterThanOrEqualTo(property, DateUtils.nowWeekStart());
+            case "<":
+                return Filter.lessThan(property, DateUtils.nowWeekStart());
+            case "<=":
+                return Filter.lessThanOrEqualTo(property, DateUtils.nowWeekEnd());
+            default:
+                return Expression.and(Filter.greaterThanOrEqualTo(property, DateUtils.nowWeekStart()),
+                        Filter.lessThanOrEqualTo(property, DateUtils.nowWeekEnd()));
+        }
+    }
+
+    /**
+     * 本月
+     *
+     * @param property
+     * @param compare
+     * @return
+     */
+    private static Conditional compareThisMonth(String property, String compare) {
+        switch (compare) {
+            case ">":
+                return Filter.greaterThan(property, DateUtils.nowMonthEnd());
+            case ">=":
+                return Filter.greaterThanOrEqualTo(property, DateUtils.nowMonthStart());
+            case "<":
+                return Filter.lessThan(property, DateUtils.nowMonthStart());
+            case "<=":
+                return Filter.lessThanOrEqualTo(property, DateUtils.nowMonthEnd());
+            default:
+                return Expression.and(Filter.greaterThanOrEqualTo(property, DateUtils.nowMonthStart()),
+                        Filter.lessThanOrEqualTo(property, DateUtils.nowMonthEnd()));
+        }
+    }
+
+    /**
+     * 指定日期值
+     *
+     * @param property
+     * @param compare
+     * @return
+     */
+    private static Conditional compareDateValue(String property, String compare, Date value) {
+        switch (compare) {
+            case ">":
+                return Filter.greaterThan(property, DateUtils.endOfDate(value));
+            case ">=":
+                return Filter.greaterThanOrEqualTo(property, DateUtils.startOfDate(value));
+            case "<":
+                return Filter.lessThan(property, DateUtils.startOfDate(value));
+            case "<=":
+                return Filter.lessThanOrEqualTo(property, DateUtils.endOfDate(value));
+            case "<>":
+            case "!=":
+                return Expression.or(Filter.lessThan(property, DateUtils.startOfDate(value)),
+                        Filter.greaterThan(property, DateUtils.endOfDate(value)));
+            case "n":
+                // null
+                return Filter.isNull(property);
+            case "nn":
+                // not null
+                return Filter.notNull(property);
+            default:
+                // equals
+                // 只考虑日期,忽略时间差异
+                return Expression.and(Filter.greaterThanOrEqualTo(property, DateUtils.startOfDate(value)),
+                        Filter.lessThanOrEqualTo(property, DateUtils.endOfDate(value)));
+        }
+    }
+
+    /**
+     * 比较
+     *
+     * @param property
+     * @param compare
+     * @return
+     */
+    private static Conditional compareValue(String property, String compare, Object value) {
+        switch (compare) {
+            case ">":
+                return Filter.greaterThan(property, value);
+            case ">=":
+                return Filter.greaterThanOrEqualTo(property, value);
+            case "<":
+                return Filter.lessThan(property, value);
+            case "<=":
+                return Filter.lessThanOrEqualTo(property, value);
+            case "<>":
+            case "!=":
+                return Filter.notEqualTo(property, value);
+            case "c":
+                // contains
+                return Filter.like(property, (String) value);
+            case "nc":
+                // not contains
+                return Filter.notLike(property, (String) value);
+            case "lc":
+                // left contains
+                return Filter.like(property, value + "%");
+            case "rc":
+                // right contains
+                return Filter.like(property, "%" + value);
+            case "i":
+                // in
+                return Filter.in(property, (Object[]) value);
+            case "ni":
+                // not in
+                return Filter.notIn(property, (Object[]) value);
+            case "n":
+                // null
+                return Filter.isNull(property);
+            case "nn":
+                // not null
+                return Filter.notNull(property);
+            default:
+                // equals
+                return Filter.equalTo(property, value);
+        }
+    }
+
+    static class UnitedEntityField {
+        private final boolean isValueField;
+        private List<EntityMetadata> entities;
+        private List<EntityFieldMetadata> fields;
+        private String joinedTables;
+        private String joinClause;
+        private List<Object> joinArgs;
+        private Object plainValue;
+
+        public UnitedEntityField(String crumbs, boolean isValueField) {
+            this.isValueField = isValueField;
+            String[] entityFields = crumbs.split("\\:");
+            entities = new ArrayList<>(entityFields.length);
+            fields = new ArrayList<>(entityFields.length);
+            for (String entityField : entityFields) {
+                String[] entityFieldPair = entityField.split("\\.");
+                String entityName = entityFieldPair[0];
+                String fieldName = entityFieldPair[1];
+                entities.add(EntityMetadataService.get(entityName));
+                fields.add(EntityMetadataService.getField(entityName, fieldName));
+            }
+        }
+
+        private void join(EntityModel model) {
+            StringJoiner tables = new StringJoiner(",");
+            StringBuffer clause = new StringBuffer();
+            joinArgs = new ArrayList<>();
+            int i = 0;
+            int size = entities.size();
+
+            for (EntityMetadata entity : entities) {
+                if (i == 0) {
+                    if (isValueField) {
+                        if (null != model) {
+                            // 作为乙方,EntityModel 的数据对应的是 UnitedEntityField 的首个实体字段
+                            Record data = model.getRecord(entity.getTableName());
+                            plainValue = null == data ? null : data.get(fields.get(i).getColumnName());
+                            if (i < size - 1) {
+                                EntityMetadata nextEntity = entities.get(i + 1);
+                                tables.add(nextEntity.getTableName());
+                                clause.append(nextEntity.getTableName()).append(".").append(nextEntity.getIdColumnName())
+                                        .append(" = ?");
+                                joinArgs.add(plainValue);
+                            }
+                            i++;
+                            continue;
+                        }
+                    }
+                }
+                if (i < size - 1) {
+                    EntityMetadata nextEntity = entities.get(i + 1);
+                    if (clause.length() > 0) {
+                        clause.append(" AND ");
+                    }
+                    // 作为甲方,首个实体表不需要出现在exists子句
+                    tables.add(nextEntity.getTableName());
+                    clause.append(entity.getTableName()).append(".").append(fields.get(i).getColumnName())
+                            .append(" = ").append(nextEntity.getTableName()).append(".").append(nextEntity.getIdColumnName());
+
+                }
+                i++;
+            }
+            joinedTables = tables.toString();
+            joinClause = clause.toString();
+        }
+
+        public Conditional compare(String compare, UnitedEntityField other, EntityModel otherModel) {
+            other.join(otherModel);
+            // other直接解析为单个值参数
+            boolean plain = null != otherModel && other.joinClause.isEmpty();
+            if (plain) {
+                return compareValue(compare, other.plainValue);
+            }
+
+            join(null);
+            StringBuffer otherClause = new StringBuffer();
+            if (!other.joinClause.isEmpty()) {
+                otherClause.append(other.joinClause).append(" AND ");
+                joinArgs.addAll(other.joinArgs);
+            }
+            String compareChar = null;
+            switch (compare) {
+                case "<":
+                case "<=":
+                case ">":
+                case ">=":
+                case "<>":
+                case "!=":
+                    compareChar = compare;
+                    break;
+                default:
+                    compareChar = "=";
+                    break;
+            }
+            otherClause.append(entities.get(entities.size() - 1).getTableName()).append(".")
+                    .append(fields.get(fields.size() - 1).getColumnName())
+                    .append(" ").append(compareChar).append(" ")
+                    .append(other.entities.get(other.entities.size() - 1).getTableName()).append(".")
+                    .append(other.fields.get(other.fields.size() - 1).getColumnName());
+
+            StringBuffer clause = new StringBuffer();
+            if (!joinClause.isEmpty()) {
+                clause.append(joinClause).append(" AND ");
+            }
+            clause.append(new Condition(otherClause.toString()).exists(other.joinedTables).getSql());
+
+            if ("ni".equals(compare)) {
+                return new Condition(clause.toString(), joinArgs).notExists(joinedTables);
+            } else {
+                return new Condition(clause.toString(), joinArgs).exists(joinedTables);
+            }
+        }
+
+        public Conditional compareValue(String compare, Object value) {
+            join(null);
+
+            String lastProp = entities.get(entities.size() - 1).getTableName() + "." +
+                    fields.get(fields.size() - 1).getColumnName();
+            Condition lastCond = FilterMetadata.compareValue(lastProp, compare, value).getCondition();
+            StringBuffer clause = new StringBuffer();
+            if (!joinClause.isEmpty()) {
+                clause.append(joinClause).append(" AND ");
+            }
+            clause.append(lastCond.getSql());
+            joinArgs.addAll(lastCond.getArguments());
+            return new Condition(clause.toString(), joinArgs).exists(joinedTables);
+        }
+    }
 }

+ 1 - 1
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/filter/SorterMetadata.java

@@ -4,7 +4,7 @@ package com.usoftchina.uas.entity.filter;
  * @author yingp
  * @date 2019/11/8
  */
-public class SortMetadata {
+public class SorterMetadata {
     private String field;
     private String direction;
 

+ 25 - 1
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/model/EntityModel.java

@@ -1,8 +1,32 @@
 package com.usoftchina.uas.entity.model;
 
+import com.usoftchina.uas.util.Record;
+
 /**
  * @author yingp
  * @date 2019/11/7
  */
-public class EntityModel {
+public interface EntityModel {
+
+    /**
+     * 按实体表名获取实体记录
+     *
+     * @param entityName
+     * @return
+     */
+    Record getRecord(String entityName);
+
+    /**
+     * 取主键,(如果存在主键字段)
+     *
+     * @return
+     */
+    Object id();
+
+    /**
+     * 取编号,(如果存在编号字段)
+     *
+     * @return
+     */
+    String code();
 }

+ 3 - 2
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/util/EntityInsert.java

@@ -12,6 +12,7 @@ import org.springframework.jdbc.support.KeyHolder;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -96,7 +97,7 @@ public class EntityInsert {
      * @param entity
      * @return
      */
-    public static void insertAll(List<Record> records, EntityMetadata entity) {
+    public static void insertAll(Collection<? extends Record> records, EntityMetadata entity) {
         if (!CollectionUtils.isEmpty(records)) {
             if (null != entity.getIdColumnName()) {
                 List<Record> hasKeyList = new ArrayList<>();
@@ -146,7 +147,7 @@ public class EntityInsert {
      * @param records
      * @param entity
      */
-    private static void insertAllNoReturn(List<Record> records, EntityMetadata entity) {
+    private static void insertAllNoReturn(Collection<? extends Record> records, EntityMetadata entity) {
         BatchNamedCondition.InsertBuilder builder = BatchNamedCondition.insert(entity.getTableName());
         records.forEach(record -> {
             record.forEach(builder::set);

+ 61 - 6
framework/framework-entity/src/main/java/com/usoftchina/uas/entity/util/EntityQuery.java

@@ -2,14 +2,12 @@ package com.usoftchina.uas.entity.util;
 
 import com.usoftchina.uas.entity.EntityMetadata;
 import com.usoftchina.uas.entity.EntityMetadataService;
+import com.usoftchina.uas.jdbc.*;
 import com.usoftchina.uas.util.Record;
-import com.usoftchina.uas.jdbc.RecordMapper;
 import com.usoftchina.uas.entity.cache.EntityCache;
 import com.usoftchina.uas.entity.cache.EntityHashCache;
 import com.usoftchina.uas.entity.cache.EntityThreadCache;
-import com.usoftchina.uas.jdbc.Condition;
-import com.usoftchina.uas.jdbc.Conditional;
-import com.usoftchina.uas.jdbc.Filter;
+import com.usoftchina.uas.util.StringUtils;
 import org.springframework.util.Assert;
 import org.springframework.util.CollectionUtils;
 
@@ -54,6 +52,10 @@ public class EntityQuery {
          * 等待行锁释放时间
          */
         private int waitTime;
+        /**
+         * 字段
+         */
+        private String[] columns;
 
         public EntityBuilder(EntityMetadata entity) {
             this.entity = entity;
@@ -115,6 +117,17 @@ public class EntityQuery {
             return this;
         }
 
+        /**
+         * 指定字段
+         *
+         * @param columns
+         * @return
+         */
+        public EntityBuilder columns(String... columns) {
+            this.columns = columns;
+            return this;
+        }
+
         /**
          * 按主键查找
          *
@@ -135,7 +148,13 @@ public class EntityQuery {
             if (null != cache && cache.contains(entity.getTableName(), conditional)) {
                 return cache.get(entity.getTableName(), conditional);
             }
-            Record record = conditional.select(entity.getTableName(), new RecordMapper(), rowLock, waitTime);
+            String columnNames = null;
+            if (null == columns || columns.length == 0) {
+                columnNames = "*";
+            } else {
+                columnNames = StringUtils.commaJoin(columns);
+            }
+            Record record = conditional.select(entity.getTableName(), columnNames, new RecordMapper(), rowLock, waitTime);
             if (null != cache) {
                 cache.put(entity.getTableName(), new Object[]{conditional}, record);
                 // 主键值也做一次缓存映射
@@ -175,6 +194,14 @@ public class EntityQuery {
          * 等待行锁释放时间
          */
         private int waitTime;
+        /**
+         * 字段
+         */
+        private String[] columns;
+        /**
+         * 排序
+         */
+        private Sorter sorter;
 
         public EntityBatchBuilder(EntityMetadata entity) {
             this.entity = entity;
@@ -236,6 +263,28 @@ public class EntityQuery {
             return this;
         }
 
+        /**
+         * 指定查找字段
+         *
+         * @param columns
+         * @return
+         */
+        public EntityBatchBuilder columns(String... columns) {
+            this.columns = columns;
+            return this;
+        }
+
+        /**
+         * 设置排序方式
+         *
+         * @param sorter
+         * @return
+         */
+        public EntityBatchBuilder sort(Sorter sorter) {
+            this.sorter = sorter;
+            return this;
+        }
+
         /**
          * 查找全部
          *
@@ -255,7 +304,13 @@ public class EntityQuery {
             if (null != cache && cache.contains(entity.getTableName(), conditional)) {
                 return cache.getAll(entity.getTableName(), conditional);
             }
-            List<Record> records = conditional.selectAll(entity.getTableName(), new RecordMapper(), rowLock, waitTime);
+            String columnNames = null;
+            if (null == columns || columns.length == 0) {
+                columnNames = "*";
+            } else {
+                columnNames = StringUtils.commaJoin(columns);
+            }
+            List<Record> records = conditional.selectAll(entity.getTableName(), columnNames, new RecordMapper(), rowLock, waitTime, null, sorter);
             if (null != cache) {
                 cache.putAll(entity.getTableName(), new Object[]{conditional}, records);
                 // 主键值也做一次映射

+ 34 - 27
framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainInitialize.java

@@ -1,5 +1,6 @@
 package com.usoftchina.uas.domain;
 
+import com.usoftchina.uas.context.ContextHolder;
 import com.usoftchina.uas.domain.function.FunctionMetadata;
 import com.usoftchina.uas.domain.function.FunctionMetadataService;
 import com.usoftchina.uas.domain.module.ModuleMetadata;
@@ -13,9 +14,10 @@ import com.usoftchina.uas.form.FormMetadataService;
 import com.usoftchina.uas.form.util.FormEntityInsert;
 import com.usoftchina.uas.form.util.FormEntityQuery;
 import com.usoftchina.uas.jdbc.Filter;
-import com.usoftchina.uas.metadata.MetadataScannedEvent;
 import com.usoftchina.uas.util.CollectionUtils;
 import com.usoftchina.uas.util.Record;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
@@ -30,38 +32,41 @@ import java.util.*;
 @Async
 public class DomainInitialize {
 
-    @EventListener(MetadataScannedEvent.class)
-    public void onMetadataScannedEvent(MetadataScannedEvent event) {
-        Collection<DomainMetadata> domains = DomainMetadataService.getAll();
-        if (!CollectionUtils.isEmpty(domains)) {
-            domains.forEach(domain -> {
-                Collection<ModuleMetadata> modules = ModuleMetadataService.getByDomain(domain.getId());
-                if (!CollectionUtils.isEmpty(modules)) {
-                    if (null == domain.getModules()) {
-                        domain.setModules(new ArrayList<>());
-                    }
-                    domain.getModules().addAll(modules);
+    private final Logger logger = LoggerFactory.getLogger(DomainInitialize.class);
 
-                    modules.forEach(module -> {
-                        Collection<FunctionMetadata> fns = FunctionMetadataService.getByModule(module.getId());
-                        if (!CollectionUtils.isEmpty(fns)) {
-                            if (null == module.getFunctions()) {
-                                module.setFunctions(new ArrayList<>());
-                            }
-                            module.getFunctions().addAll(fns);
-                        }
-                    });
+    private void repairDomainMetadata(Collection<DomainMetadata> domains) {
+        domains.forEach(domain -> {
+            Collection<ModuleMetadata> modules = ModuleMetadataService.getByDomain(domain.getId());
+            if (!CollectionUtils.isEmpty(modules)) {
+                if (null == domain.getModules()) {
+                    domain.setModules(new ArrayList<>());
                 }
-            });
-        }
+                domain.getModules().addAll(modules);
+
+                modules.forEach(module -> {
+                    module.setDomain(domain.getId());
+                    Collection<FunctionMetadata> fns = FunctionMetadataService.getByModule(module.getId());
+                    if (!CollectionUtils.isEmpty(fns)) {
+                        if (null == module.getFunctions()) {
+                            module.setFunctions(new ArrayList<>());
+                        }
+                        module.getFunctions().addAll(fns);
+                    }
+                });
+            }
+        });
     }
 
     @EventListener(EntityInitializedEvent.class)
     public void onEntityInitializedEvent(EntityInitializedEvent event) {
+        logger.debug("Start resolve domain metadata");
         Collection<DomainMetadata> domains = DomainMetadataService.getAll();
         if (!CollectionUtils.isEmpty(domains)) {
+            repairDomainMetadata(domains);
             checkDomains(domains);
         }
+        logger.debug("Domain metadata resolved");
+        ContextHolder.getApplicationContext().publishEvent(new DomainInitializedEvent(this));
     }
 
     private void checkDomains(Collection<DomainMetadata> unresolvedDomains) {
@@ -95,14 +100,12 @@ public class DomainInitialize {
                         if (null != moduleRecord) {
                             if (!module.getName().equals(moduleRecord.getString("S_NAME"))
                                     || moduleSeq != moduleRecord.getIntValue("S_SEQ")) {
-                                moduleRecord.set("S_NAME", domain.getName());
+                                moduleRecord.set("S_NAME", module.getName());
                                 moduleRecord.set("S_SEQ", domainSeq);
                                 changedModules.add(moduleRecord);
                             }
                         } else {
-                            moduleRecord = new Record("D_ID", domainRecord.get("D_ID"))
-                                    .set("S_NAME", module.getName())
-                                    .set("S_CODE", module.getId())
+                            moduleRecord = module.toRecord().set("D_ID", domainRecord.get("D_ID"))
                                     .set("S_SEQ", moduleSeq);
                             newModules.add(moduleRecord);
                         }
@@ -116,15 +119,19 @@ public class DomainInitialize {
 
         if (!changedDomains.isEmpty()) {
             EntityUpdate.updateAll(changedDomains, EntityMetadataService.get("META_DOMAIN"));
+            logger.debug("{} sizeof domain metadata updated", changedDomains.size());
         }
         if (!changedModules.isEmpty()) {
             EntityUpdate.updateAll(changedModules, EntityMetadataService.get("META_SUBSYS"));
+            logger.debug("{} sizeof sub-sys metadata updated", changedModules.size());
         }
         if (!newModules.isEmpty()) {
             EntityInsert.insertAll(newModules, EntityMetadataService.get("META_SUBSYS"));
+            logger.debug("{} sizeof sub-sys metadata added", newModules.size());
         }
         if (!newDomainForms.isEmpty()) {
             FormEntityInsert.insertAll(newDomainForms, form);
+            logger.debug("{} sizeof domain metadata added", newDomainForms.size());
         }
     }
 }

+ 8 - 1
framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainInitializedEvent.java

@@ -1,8 +1,15 @@
 package com.usoftchina.uas.domain;
 
+import org.springframework.context.ApplicationEvent;
+
 /**
+ * 业务领域资料修复完成
+ *
  * @author yingp
  * @date 2019/11/5
  */
-public class DomainInitializedEvent {
+public class DomainInitializedEvent extends ApplicationEvent {
+    public DomainInitializedEvent(Object source) {
+        super(source);
+    }
 }

+ 18 - 2
framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainMetadata.java

@@ -15,6 +15,7 @@ public class DomainMetadata implements Metadata {
     private String id;
     private String name;
     private List<ModuleMetadata> modules;
+    private Integer seq;
 
     public void setId(String id) {
         this.id = id;
@@ -57,15 +58,30 @@ public class DomainMetadata implements Metadata {
         this.modules = modules;
     }
 
+    public Integer getSeq() {
+        return seq;
+    }
+
+    public void setSeq(Integer seq) {
+        this.seq = seq;
+    }
+
     public Record toFormRecord() {
         Record record = new Record("META_DOMAIN", new Record("D_SYS", 1)
                 .set("D_NAME", name)
-                .set("D_CODE", id));
+                .set("D_CODE", id)
+                .set("D_SEQ", seq));
         if (null != modules) {
             List<Record> moduleRecords = new ArrayList<>(modules.size());
             int index = 0;
             for (ModuleMetadata module : modules) {
-                moduleRecords.add(module.toRecord().set("S_SEQ", ++index));
+                Record moduleRecord = module.toRecord();
+                if (null == module.getSeq()) {
+                    moduleRecord.set("S_SEQ", ++index);
+                } else {
+                    index = module.getSeq();
+                }
+                moduleRecords.add(moduleRecord);
             }
             record.set("META_SUBSYS", moduleRecords);
         }

+ 10 - 0
framework/framework-form/src/main/java/com/usoftchina/uas/domain/DomainMetadataService.java

@@ -1,5 +1,8 @@
 package com.usoftchina.uas.domain;
 
+import com.usoftchina.uas.domain.module.ModuleMetadataService;
+import org.springframework.util.CollectionUtils;
+
 import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -13,6 +16,13 @@ public class DomainMetadataService {
 
     public static void add(DomainMetadata domain) {
         cache.put(domain.getId(), domain);
+
+        if (!CollectionUtils.isEmpty(domain.getModules())) {
+            domain.getModules().forEach(module -> {
+                module.setDomain(domain.getId());
+            });
+            ModuleMetadataService.addAll(domain.getModules());
+        }
     }
 
     public static void addAll(Collection<DomainMetadata> domains) {

+ 12 - 1
framework/framework-form/src/main/java/com/usoftchina/uas/domain/module/ModuleMetadata.java

@@ -24,6 +24,8 @@ public class ModuleMetadata implements Metadata {
      */
     private List<FunctionMetadata> functions;
 
+    private Integer seq;
+
     public void setId(String id) {
         this.id = id;
     }
@@ -73,9 +75,18 @@ public class ModuleMetadata implements Metadata {
         this.functions = functions;
     }
 
+    public Integer getSeq() {
+        return seq;
+    }
+
+    public void setSeq(Integer seq) {
+        this.seq = seq;
+    }
+
     public Record toRecord() {
         return new Record("S_SYS", 1)
                 .set("S_NAME", name)
-                .set("S_CODE", id);
+                .set("S_CODE", id)
+                .set("S_SEQ", seq);
     }
 }

+ 39 - 1
framework/framework-form/src/main/java/com/usoftchina/uas/form/FormMetadata.java

@@ -17,7 +17,7 @@ public class FormMetadata implements Metadata {
     private String id;
     private String name;
     /**
-     * 表单类型:基础资料、动态表单、单据
+     * 表单类型:基础资料baseData、动态表单dynamicForm、单据bill
      */
     private String type;
     /**
@@ -32,6 +32,10 @@ public class FormMetadata implements Metadata {
      * 名称字段
      */
     private String nameColumnName;
+    /**
+     * 单据类型字段
+     */
+    private String billTypeColumnName;
     /**
      * 实体列表
      */
@@ -52,6 +56,10 @@ public class FormMetadata implements Metadata {
      * 插件
      */
     private List<String> plugins;
+    /**
+     * 子系统
+     */
+    private String subSys;
 
     private Map<String, OperationMetadata> resolvedOperations;
 
@@ -136,6 +144,14 @@ public class FormMetadata implements Metadata {
         this.nameColumnName = nameColumnName;
     }
 
+    public String getBillTypeColumnName() {
+        return billTypeColumnName;
+    }
+
+    public void setBillTypeColumnName(String billTypeColumnName) {
+        this.billTypeColumnName = billTypeColumnName;
+    }
+
     public List<ViewMetadata> getViews() {
         return views;
     }
@@ -160,6 +176,14 @@ public class FormMetadata implements Metadata {
         this.plugins = plugins;
     }
 
+    public String getSubSys() {
+        return subSys;
+    }
+
+    public void setSubSys(String subSys) {
+        this.subSys = subSys;
+    }
+
     /**
      * 单据头
      *
@@ -187,4 +211,18 @@ public class FormMetadata implements Metadata {
         }
         return null != resolvedOperations ? resolvedOperations.get(id) : null;
     }
+
+    public String toJoinedTables() {
+        EntityMetadata headEntity = headEntity();
+        StringBuffer tableJoiner = new StringBuffer();
+        tableJoiner.append(headEntity.getTableName());
+        for (EntityMetadata entity : entities) {
+            if (!entity.isFormHead()) {
+                tableJoiner.append(" LEFT JOIN " + entity.getTableName() + " ON " +
+                        entity.getTableName() + "." + idColumnName + " = " +
+                        headEntity.getTableName() + "." + idColumnName);
+            }
+        }
+        return tableJoiner.toString();
+    }
 }

+ 3 - 2
framework/framework-form/src/main/java/com/usoftchina/uas/form/FormMetadataResolver.java

@@ -33,7 +33,7 @@ public class FormMetadataResolver extends JsonFileResolver<FormMetadata> {
                 // 表单下面所有实体的聚合主键 = 单据头主键 = 其他子单据头、分录的外键
                 String aggregateKey = form.getIdColumnName().toUpperCase();
                 form.setIdColumnName(aggregateKey);
-                EntityMetadataService.addAll(form.getEntities());
+
                 form.getEntities().forEach(entity -> {
                     boolean isHeadEntity = entity.isFormHead();
                     boolean isEntryEntity = entity.isEntryEntity();
@@ -72,11 +72,12 @@ public class FormMetadataResolver extends JsonFileResolver<FormMetadata> {
 
                     Collections.sort(entity.getFields());
                 });
+                EntityMetadataService.addAll(form.getEntities());
             }
 
             if (!CollectionUtils.isEmpty(form.getCodeRules())) {
                 form.getCodeRules().forEach(rule -> {
-                    rule.setFormId(form.getId());
+                    rule.setObjectId(form.getId());
                 });
             }
 

+ 17 - 0
framework/framework-form/src/main/java/com/usoftchina/uas/form/base/EnumData.java

@@ -1,8 +1,12 @@
 package com.usoftchina.uas.form.base;
 
 import com.usoftchina.uas.metadata.Metadata;
+import com.usoftchina.uas.view.virtual.ComboBox;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author yingp
@@ -61,4 +65,17 @@ public class EnumData implements Metadata {
     public void setEntries(List<EnumDataEntry> entries) {
         this.entries = entries;
     }
+
+    public List<Map<String, Object>> toComboOptions() {
+        List<Map<String, Object>> options = null;
+        if (null != entries) {
+            options = entries.stream().map(entry -> {
+                Map<String, Object> item = new HashMap<>(2);
+                item.put(ComboBox.displayField, entry.getEntryName());
+                item.put(ComboBox.valueField, entry.getEntryCode());
+                return item;
+            }).collect(Collectors.toList());
+        }
+        return options;
+    }
 }

+ 2 - 2
framework/framework-form/src/main/java/com/usoftchina/uas/form/base/SupportData.java

@@ -108,8 +108,8 @@ public class SupportData implements Metadata {
         return data;
     }
 
-    public Map<String, Object> toFormData() {
-        Map<String, Object> formData = new HashMap<>(2);
+    public Record toFormRecord() {
+        Record formData = new Record(2);
         Record head = toRecord();
         formData.put("BASE_SUPPORTDATA", head);
         if (!CollectionUtils.isEmpty(entries)) {

+ 10 - 10
framework/framework-form/src/main/java/com/usoftchina/uas/form/base/SupportDataEntry.java

@@ -45,20 +45,20 @@ public class SupportDataEntry {
     }
 
     public Record toRecord() {
-        return new Record("SD_ENTRY_CODE", entryCode)
-                .set("SD_ENTRY_NAME", entryName)
-                .set("SD_ENTRY_SYS", 1)
-                .set("SD_ENTRY_STATUS", "A")
-                .set("SD_ENTRY_DESC", description)
-                .set("SD_ENTRY_PARENT", parentEntryCode);
+        return new Record("SE_CODE", entryCode)
+                .set("SE_NAME", entryName)
+                .set("SE_SYS", 1)
+                .set("SE_STATUS", "A")
+                .set("SE_DESC", description)
+                .set("SE_PARENT", parentEntryCode);
     }
 
     public static SupportDataEntry fromRecord(Record record) {
         SupportDataEntry entry = new SupportDataEntry();
-        entry.setDescription(record.getString("SD_ENTRY_DESC"));
-        entry.setEntryCode(record.getString("SD_ENTRY_CODE"));
-        entry.setEntryName(record.getString("SD_ENTRY_NAME"));
-        entry.setParentEntryCode(record.getString("SD_ENTRY_PARENT"));
+        entry.setDescription(record.getString("SE_DESC"));
+        entry.setEntryCode(record.getString("SE_CODE"));
+        entry.setEntryName(record.getString("SE_NAME"));
+        entry.setParentEntryCode(record.getString("SE_PARENT"));
         return entry;
     }
 }

+ 4 - 3
framework/framework-form/src/main/java/com/usoftchina/uas/form/base/SupportDataInitialize.java

@@ -4,6 +4,7 @@ import com.usoftchina.uas.entity.EntityInitializedEvent;
 import com.usoftchina.uas.form.FormMetadata;
 import com.usoftchina.uas.form.FormMetadataService;
 import com.usoftchina.uas.form.util.FormEntityInsert;
+import com.usoftchina.uas.util.Record;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationListener;
@@ -26,10 +27,10 @@ public class SupportDataInitialize implements ApplicationListener<EntityInitiali
     @Override
     public void onApplicationEvent(EntityInitializedEvent event) {
         Collection<SupportData> collection = SupportDataService.getAll();
-        FormMetadata form = FormMetadataService.get("base_supportdata");
+        FormMetadata form = FormMetadataService.get("frame_supportdata");
         if (!CollectionUtils.isEmpty(collection) && null != form) {
             logger.debug("Found {} kinds of support data", collection.size());
-            List<Map<String, Object>> newList = new ArrayList<>(1);
+            List<Record> newList = new ArrayList<>(1);
             TreeSet<String> codes = SupportDataService.getAllSupportTypes();
             collection.forEach(data -> {
                 // check parent type
@@ -42,7 +43,7 @@ public class SupportDataInitialize implements ApplicationListener<EntityInitiali
                     // need to update
                 } else {
                     // need to insert
-                    newList.add(data.toFormData());
+                    newList.add(data.toFormRecord());
                 }
             });
             if (!newList.isEmpty()) {

+ 1 - 1
framework/framework-form/src/main/java/com/usoftchina/uas/form/base/view/SupportDataController.java

@@ -29,7 +29,7 @@ public class SupportDataController extends ViewController {
 //                String parentRefField = triggerField.getParentRefField()[1];
 //                Map<String, Object> parentRefData = (Map<String, Object>) view.getParent().getData(parentRefTable, parentRefField);
 //                if (null != parentRefData) {
-//                    conditional = Expression.and(conditional, Filter.equalTo("SD_ENTRY_PARENT", parentRefData.get("SD_ENTRY_CODE")));
+//                    conditional = Expression.and(conditional, Filter.equalTo("SE_PARENT", parentRefData.get("SE_CODE")));
 //                }
 //            }
 //

+ 75 - 0
framework/framework-form/src/main/java/com/usoftchina/uas/form/bill/BillInitialize.java

@@ -1,8 +1,83 @@
 package com.usoftchina.uas.form.bill;
 
+import com.usoftchina.uas.domain.DomainInitializedEvent;
+import com.usoftchina.uas.entity.EntityMetadata;
+import com.usoftchina.uas.entity.EntityMetadataService;
+import com.usoftchina.uas.entity.util.EntityInsert;
+import com.usoftchina.uas.entity.util.EntityQuery;
+import com.usoftchina.uas.entity.util.EntityUpdate;
+import com.usoftchina.uas.form.FormMetadataService;
+import com.usoftchina.uas.jdbc.Filter;
+import com.usoftchina.uas.util.CollectionUtils;
+import com.usoftchina.uas.util.Record;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 /**
  * @author yingp
  * @date 2019/11/5
  */
+@Component
+@Async
 public class BillInitialize {
+
+    private final Logger logger = LoggerFactory.getLogger(BillInitialize.class);
+
+    @EventListener(DomainInitializedEvent.class)
+    public void onDomainInitializedEvent(DomainInitializedEvent event) {
+        logger.debug("Start resolve bill metadata");
+        EntityMetadata entity = EntityMetadataService.get("META_BILL");
+        List<Record> billList = EntityQuery.selectAll(entity).where(Filter.equalTo("B_SYS", 1));
+        Map<String, Record> billMap = CollectionUtils.toMap(billList, record -> record.getString("B_CODE"));
+        List<Record> added = new ArrayList<>(1);
+        List<Record> updated = new ArrayList<>(1);
+
+        FormMetadataService.getAll().stream().filter(form -> "bill".equals(form.getType())).forEach(form -> {
+            Record subSysRecord = null != form.getSubSys() ? EntityQuery.select("META_SUBSYS").cache()
+                    .where(Filter.equalTo("S_CODE", form.getSubSys())) : null;
+            Record billRecord = billMap.get(form.getId());
+            if (null != billRecord) {
+                boolean changed = !billRecord.getString("B_NAME").equals(form.getName());
+                changed = changed ||
+                        ((null == subSysRecord && null != billRecord.get("B_SUBSYS")) ||
+                                (null != subSysRecord && !subSysRecord.get("S_ID").equals(billRecord.get("B_SUBSYS"))));
+                if (changed) {
+                    billRecord.set("B_NAME", form.getName());
+                    if (null != subSysRecord) {
+                        billRecord.set("B_SUBSYS", subSysRecord.get("S_ID"));
+                    }
+                    updated.add(billRecord);
+                }
+            } else {
+                billRecord = new Record("B_CODE", form.getId())
+                        .set("B_NAME", form.getName())
+                        .set("B_SYS", 1)
+                        .set("B_STATUS", "A")
+                        .set("B_FORBIDSTATUS", "N");
+                if (null != subSysRecord) {
+                    billRecord.set("B_SUBSYS", subSysRecord.get("S_ID"));
+                }
+                added.add(billRecord);
+            }
+        });
+
+        if (!added.isEmpty()) {
+            EntityInsert.insertAll(added, entity);
+            logger.debug("{} sizeof bill metadata added", added.size());
+        }
+
+        if (!updated.isEmpty()) {
+            EntityUpdate.updateAll(updated, entity);
+            logger.debug("{} sizeof bill metadata updated", updated.size());
+        }
+
+        logger.debug("Bill metadata Resolved");
+    }
 }

+ 37 - 0
framework/framework-form/src/main/java/com/usoftchina/uas/form/bill/BillTypeService.java

@@ -1,8 +1,45 @@
 package com.usoftchina.uas.form.bill;
 
+import com.usoftchina.uas.entity.util.EntityQuery;
+import com.usoftchina.uas.jdbc.Filter;
+import com.usoftchina.uas.jdbc.Sorter;
+import com.usoftchina.uas.util.CollectionUtils;
+import com.usoftchina.uas.util.Record;
+import com.usoftchina.uas.view.virtual.ComboBox;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  * @author yingp
  * @date 2019/11/6
  */
 public class BillTypeService {
+
+    public static List<Record> findByBill(String formId) {
+        Record bill = EntityQuery.select("META_BILL").cache()
+                .where(Filter.equalTo("B_CODE", formId));
+        if (null != bill) {
+            return EntityQuery.selectAll("BASE_BILLTYPE")
+                    .cache()
+                    .sort(new Sorter().asc("T_ID"))
+                    .where(Filter.equalTo("T_BILL", bill.get("B_ID")));
+        }
+        return null;
+    }
+
+    public static List<Map<String, Object>> toComboOptions(List<Record> billTypes) {
+        List<Map<String, Object>> options = null;
+        if (!CollectionUtils.isEmpty(billTypes)) {
+            options = billTypes.stream().map(record -> {
+                Map<String, Object> item = new HashMap<>(2);
+                item.put(ComboBox.displayField, record.get("T_NAME"));
+                item.put(ComboBox.valueField, record.get("T_ID"));
+                return item;
+            }).collect(Collectors.toList());
+        }
+        return options;
+    }
 }

+ 296 - 0
framework/framework-form/src/main/java/com/usoftchina/uas/form/bill/ConvertMetadata.java

@@ -1,8 +1,304 @@
 package com.usoftchina.uas.form.bill;
 
+import com.usoftchina.uas.entity.filter.FilterMetadata;
+import com.usoftchina.uas.entity.filter.SorterMetadata;
+
+import java.util.List;
+
 /**
+ * 转换规则
+ *
  * @author yingp
  * @date 2019/11/13
  */
 public class ConvertMetadata {
+    private String id;
+    private String name;
+    /**
+     * 源单据
+     */
+    private String source;
+    /**
+     * 目标单据
+     */
+    private String target;
+    /**
+     * 下推启动条件
+     */
+    private FilterMetadata startFilter;
+    /**
+     * 单据类型映射
+     */
+    private List<BillTypeMapper> billTypeMappers;
+    /**
+     * 字段映射关系
+     */
+    private List<FieldMapper> fieldMappers;
+    /**
+     * 源单分组策略
+     */
+    private GroupStrategy groupStrategy;
+    /**
+     * 源单排序策略
+     */
+    private List<SorterMetadata> sorters;
+    /**
+     * 选单条件策略
+     */
+    private FilterStrategy filterStrategy;
+
+    /**
+     * 插件
+     */
+
+    /**
+     * 表单服务
+     */
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public String getTarget() {
+        return target;
+    }
+
+    public void setTarget(String target) {
+        this.target = target;
+    }
+
+    public FilterMetadata getStartFilter() {
+        return startFilter;
+    }
+
+    public void setStartFilter(FilterMetadata startFilter) {
+        this.startFilter = startFilter;
+    }
+
+    public List<BillTypeMapper> getBillTypeMappers() {
+        return billTypeMappers;
+    }
+
+    public void setBillTypeMappers(List<BillTypeMapper> billTypeMappers) {
+        this.billTypeMappers = billTypeMappers;
+    }
+
+    public List<FieldMapper> getFieldMappers() {
+        return fieldMappers;
+    }
+
+    public void setFieldMappers(List<FieldMapper> fieldMappers) {
+        this.fieldMappers = fieldMappers;
+    }
+
+    public GroupStrategy getGroupStrategy() {
+        return groupStrategy;
+    }
+
+    public void setGroupStrategy(GroupStrategy groupStrategy) {
+        this.groupStrategy = groupStrategy;
+    }
+
+    public List<SorterMetadata> getSorters() {
+        return sorters;
+    }
+
+    public void setSorters(List<SorterMetadata> sorters) {
+        this.sorters = sorters;
+    }
+
+    public FilterStrategy getFilterStrategy() {
+        return filterStrategy;
+    }
+
+    public void setFilterStrategy(FilterStrategy filterStrategy) {
+        this.filterStrategy = filterStrategy;
+    }
+
+    /**
+     * 单据类型映射
+     */
+    class BillTypeMapper {
+        /**
+         * 源单单据类型
+         */
+        private String source;
+        /**
+         * 目标单据类型
+         */
+        private String target;
+
+        public String getSource() {
+            return source;
+        }
+
+        public void setSource(String source) {
+            this.source = source;
+        }
+
+        public String getTarget() {
+            return target;
+        }
+
+        public void setTarget(String target) {
+            this.target = target;
+        }
+    }
+
+    /**
+     * 字段映射
+     */
+    class FieldMapper {
+        /**
+         * 源单字段
+         */
+        private String source;
+        /**
+         * 自定义公式
+         */
+        private String formula;
+        /**
+         * 目标字段
+         */
+        private String target;
+        /**
+         * 用于选单操作时过滤
+         * <pre>
+         *     例如在新增采购订单界面,先选择供应商X,再点击选单按钮选择采购申请单,出现的采购申请单的 建议供应商 = X;
+         *     在追加选单的操作中,可以保证选出的源单条件一致
+         * </pre>
+         */
+        private Boolean filter;
+
+        public String getSource() {
+            return source;
+        }
+
+        public void setSource(String source) {
+            this.source = source;
+        }
+
+        public String getFormula() {
+            return formula;
+        }
+
+        public void setFormula(String formula) {
+            this.formula = formula;
+        }
+
+        public String getTarget() {
+            return target;
+        }
+
+        public void setTarget(String target) {
+            this.target = target;
+        }
+
+        public Boolean getFilter() {
+            return filter;
+        }
+
+        public void setFilter(Boolean filter) {
+            this.filter = filter;
+        }
+    }
+
+    /**
+     * 针对源单的分组策略
+     */
+    class GroupStrategy {
+        /**
+         * oneToOne 一对一
+         * manyToOne 多对一
+         * manyToMany 多对多,需要定义详细分组策略
+         */
+        private String type;
+        /**
+         * 单据分组字段
+         * <pre>
+         *     例如以采购订单的供应商作为分组
+         * </pre>
+         */
+        private List<String> groupFields;
+        /**
+         * 单据体分录合并
+         * <pre>
+         *     例如以采购订单明细的物料编号作为合并依据
+         * </pre>
+         */
+        private List<String> entryMergeFields;
+
+        public String getType() {
+            return type;
+        }
+
+        public void setType(String type) {
+            this.type = type;
+        }
+
+        public List<String> getGroupFields() {
+            return groupFields;
+        }
+
+        public void setGroupFields(List<String> groupFields) {
+            this.groupFields = groupFields;
+        }
+
+        public List<String> getEntryMergeFields() {
+            return entryMergeFields;
+        }
+
+        public void setEntryMergeFields(List<String> entryMergeFields) {
+            this.entryMergeFields = entryMergeFields;
+        }
+    }
+
+    /**
+     * 选单策略
+     */
+    class FilterStrategy {
+        /**
+         * 选单过滤条件
+         */
+        private FilterMetadata filter;
+        /**
+         * 不符合条件时,给予的提示信息
+         */
+        private String message;
+
+        public FilterMetadata getFilter() {
+            return filter;
+        }
+
+        public void setFilter(FilterMetadata filter) {
+            this.filter = filter;
+        }
+
+        public String getMessage() {
+            return message;
+        }
+
+        public void setMessage(String message) {
+            this.message = message;
+        }
+    }
 }

+ 19 - 1
framework/framework-form/src/main/java/com/usoftchina/uas/form/dynamic/TipController.java

@@ -1,8 +1,26 @@
 package com.usoftchina.uas.form.dynamic;
 
+import com.usoftchina.uas.form.view.DynamicView;
+import com.usoftchina.uas.view.virtual.View;
+import com.usoftchina.uas.view.virtual.ViewController;
+import org.springframework.stereotype.Component;
+
 /**
+ * 处理结果
+ *
  * @author yingp
  * @date 2019/11/12
  */
-public class TipController {
+@Component
+public class TipController extends ViewController<DynamicView> {
+
+    public TipController() {
+        super();
+        // 表单数据初始化
+        on(View.EVENT_INIT, TipController::onInit);
+    }
+
+    private static void onInit(DynamicView view, Object[] args) {
+
+    }
 }

+ 27 - 1
framework/framework-form/src/main/java/com/usoftchina/uas/form/operation/AddViewHandler.java

@@ -2,12 +2,16 @@ package com.usoftchina.uas.form.operation;
 
 import com.usoftchina.uas.form.FormMetadata;
 import com.usoftchina.uas.form.FormMetadataService;
+import com.usoftchina.uas.form.view.FormView;
+import com.usoftchina.uas.form.view.DynamicView;
+import com.usoftchina.uas.form.view.ListView;
 import com.usoftchina.uas.view.ViewMetadata;
 import com.usoftchina.uas.view.ViewMetadataService;
 import com.usoftchina.uas.view.virtual.View;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * 打开表单操作
@@ -35,8 +39,30 @@ public class AddViewHandler implements OperationHandler {
         ViewMetadata viewMetadata = ViewMetadataService.get(viewName, viewType);
         if (null != viewMetadata) {
             FormMetadata form = FormMetadataService.get(viewName);
-            View newView = view.getApplication().addView(viewMetadata, form.getName(), openType);
+
+            // 列表防重复打开
+            if ("card".equals(openType) && "list".equals(viewType)) {
+                Optional<View> existedView = view.getApplication().findView(viewMetadata, openType);
+                if (existedView.isPresent()) {
+                    existedView.get().setActive();
+                    return;
+                }
+            }
+
+            View newView = view.getApplication().addView(viewMetadata, form.getName(), openType, getViewTypeClass(viewType));
             newView.setParent(view);
         }
     }
+
+    private static Class<? extends View> getViewTypeClass(String viewType) {
+        switch (viewType) {
+            case "form":
+            case "baseData":
+                return FormView.class;
+            case "list":
+                return ListView.class;
+            default:
+                return DynamicView.class;
+        }
+    }
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов