From c306cba52bcc3e2c423f77d4a52c35ad04c52038 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期一, 10 三月 2025 11:10:33 +0800
Subject: [PATCH] init

---
 src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeComponent.java |   70 
 src/main/java/com/jsh/erp/datasource/entities/MaterialExtendExample.java            | 1231 
 src/main/java/com/jsh/erp/datasource/entities/Function.java                         |  133 
 src/main/java/com/jsh/erp/controller/TenantController.java                          |   54 
 src/main/java/com/jsh/erp/datasource/entities/InOutItemExample.java                 |  729 
 src/main/java/com/jsh/erp/service/sequence/SequenceResource.java                    |   18 
 src/main/resources/mapper_xml/OrgaUserRelMapper.xml                                 |  351 
 src/main/resources/mapper_xml/FunctionMapperEx.xml                                  |   51 
 src/main/java/com/jsh/erp/datasource/entities/PlatformConfig.java                   |   43 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapper.java        |   30 
 src/main/java/com/jsh/erp/utils/ExceptionCodeConstants.java                         |   43 
 src/main/java/com/jsh/erp/utils/StringUtil.java                                     |  373 
 src/main/java/com/jsh/erp/service/redis/RedisService.java                           |  153 
 src/main/bin/run-manage.sh                                                          |  131 
 src/main/java/com/jsh/erp/service/msg/MsgService.java                               |  336 
 src/main/java/com/jsh/erp/controller/MaterialController.java                        |  737 
 src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java           |   78 
 src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java             |   32 
 src/main/java/com/jsh/erp/service/accountItem/AccountItemComponent.java             |   75 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapperEx.java            |   30 
 src/main/java/com/jsh/erp/service/msg/MsgComponent.java                             |   72 
 src/main/resources/mapper_xml/UserMapperEx.xml                                      |  165 
 src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapper.java                |   30 
 src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelComponent.java             |   67 
 src/main/resources/mapper_xml/SupplierMapper.xml                                    |  527 
 src/main/resources/mapper_xml/RoleMapperEx.xml                                      |   55 
 src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4DetailByTypeAndMId.java   |  117 
 src/main/resources/mapper_xml/MaterialMapperEx.xml                                  |  862 
 src/main/java/com/jsh/erp/constants/ExceptionConstants.java                         |  581 
 src/main/java/com/jsh/erp/datasource/entities/PlatformConfigExample.java            |  469 
 pom.xml                                                                             |  198 
 src/main/resources/mapper_xml/DepotHeadMapperEx.xml                                 | 1488 +
 src/main/java/com/jsh/erp/datasource/entities/UserBusiness.java                     |   73 
 src/main/java/com/jsh/erp/datasource/vo/AccountVo4List.java                         |   16 
 src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigResource.java        |   15 
 src/main/assembly/assembly.xml                                                      |   67 
 src/main/java/com/jsh/erp/datasource/entities/TenantEx.java                         |   54 
 src/main/java/com/jsh/erp/datasource/vo/InOutPriceVo.java                           |   27 
 src/main/java/com/jsh/erp/controller/UserBusinessController.java                    |  109 
 src/main/java/com/jsh/erp/datasource/entities/Role.java                             |  103 
 src/main/java/com/jsh/erp/datasource/entities/OrganizationExample.java              |  850 
 src/main/java/com/jsh/erp/datasource/entities/DepotItemExample.java                 | 1771 +
 src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapperEx.java      |   20 
 src/main/java/com/jsh/erp/datasource/entities/AccountHead.java                      |  176 
 src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStock.java             |   85 
 src/main/java/com/jsh/erp/utils/RandImageUtil.java                                  |  140 
 src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4Body.java               |   34 
 src/main/java/com/jsh/erp/datasource/mappers/TenantMapperEx.java                    |   24 
 src/main/java/com/jsh/erp/service/inOutItem/InOutItemComponent.java                 |   75 
 src/main/java/com/jsh/erp/datasource/mappers/RoleMapperEx.java                      |   27 
 src/main/resources/mapper_xml/AccountHeadMapper.xml                                 |  400 
 src/main/java/com/jsh/erp/datasource/entities/AccountHeadExample.java               | 1291 
 src/main/resources/mapper_xml/LogMapper.xml                                         |  258 
 src/main/java/com/jsh/erp/datasource/mappers/AccountMapperEx.java                   |   88 
 src/main/resources/mapper_xml/UserMapper.xml                                        |  400 
 src/main/java/com/jsh/erp/service/organization/OrganizationService.java             |  262 
 src/main/java/com/jsh/erp/utils/Tools.java                                          |  691 
 src/main/java/com/jsh/erp/service/unit/UnitService.java                             |  310 
 src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapperEx.java               |   64 
 src/main/resources/mapper_xml/MaterialCategoryMapperEx.xml                          |  144 
 src/main/resources/mapper_xml/MaterialPropertyMapperEx.xml                          |   38 
 src/main/java/com/jsh/erp/datasource/entities/InOutItem.java                        |   83 
 src/main/java/com/jsh/erp/datasource/mappers/SequenceMapperEx.java                  |   13 
 src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeResource.java  |   15 
 src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelResource.java              |   19 
 src/main/java/com/jsh/erp/datasource/mappers/PersonMapper.java                      |   30 
 src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java            |   18 
 src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapperEx.java               |   42 
 src/main/java/com/jsh/erp/service/role/RoleService.java                             |  316 
 src/main/java/com/jsh/erp/controller/MaterialPropertyController.java                |   50 
 src/main/java/com/jsh/erp/service/accountHead/AccountHeadService.java               |  426 
 src/main/resources/mapper_xml/SerialNumberMapperEx.xml                              |  221 
 src/main/java/com/jsh/erp/service/user/UserResource.java                            |   15 
 src/main/java/com/jsh/erp/datasource/entities/Unit.java                             |  125 
 src/main/java/com/jsh/erp/datasource/mappers/PersonMapperEx.java                    |   23 
 src/main/java/com/jsh/erp/datasource/entities/AccountVo4Sum.java                    |   47 
 src/main/resources/mapper_xml/OrganizationMapperEx.xml                              |  105 
 src/main/java/com/jsh/erp/utils/AnnotationUtils.java                                |   28 
 src/main/java/com/jsh/erp/datasource/entities/MaterialAttributeExample.java         |  529 
 src/main/java/com/jsh/erp/datasource/entities/MsgExample.java                       |  790 
 src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapper.java                   |   30 
 src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyService.java     |  151 
 src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java                      |   47 
 src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryComponent.java   |   75 
 src/main/java/com/jsh/erp/datasource/mappers/DepotMapper.java                       |   30 
 src/main/java/com/jsh/erp/controller/ResourceController.java                        |  152 
 src/main/java/com/jsh/erp/datasource/mappers/UnitMapperEx.java                      |   25 
 src/main/java/com/jsh/erp/datasource/entities/UserBusinessExample.java              |  669 
 src/main/java/com/jsh/erp/controller/UserController.java                            |  500 
 src/main/java/com/jsh/erp/service/supplier/SupplierService.java                     |  682 
 src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java              |   61 
 src/main/java/com/jsh/erp/datasource/vo/FinishDepositVo.java                        |   26 
 src/main/java/com/jsh/erp/datasource/vo/AccountItemVo4List.java                     |   36 
 src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java              | 1161 
 src/main/java/com/jsh/erp/datasource/entities/UserExample.java                      | 1339 
 src/main/java/com/jsh/erp/service/accountHead/AccountHeadResource.java              |   15 
 src/main/java/com/jsh/erp/service/InterfaceContainer.java                           |   31 
 src/main/java/com/jsh/erp/datasource/entities/DepotExample.java                     | 1030 
 src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java                     |  156 
 .gitattributes                                                                      |    3 
 src/main/resources/mapper_xml/MaterialCurrentStockMapperEx.xml                      |   45 
 src/main/java/com/jsh/erp/config/PluginConfiguration.java                           |  104 
 src/main/resources/mapper_xml/UnitMapper.xml                                        |  323 
 src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapperEx.java            |   19 
 src/main/java/com/jsh/erp/datasource/entities/Log.java                              |   85 
 src/main/java/com/jsh/erp/utils/QueryUtils.java                                     |  142 
 src/main/java/com/jsh/erp/service/systemConfig/SystemConfigComponent.java           |   73 
 src/main/java/com/jsh/erp/datasource/entities/SystemConfig.java                     |  233 
 src/main/java/com/jsh/erp/controller/SequenceController.java                        |   54 
 src/main/java/com/jsh/erp/datasource/vo/NodeAttributes.java                         |   30 
 src/main/java/com/jsh/erp/controller/AccountItemController.java                     |   95 
 src/main/java/com/jsh/erp/service/tenant/TenantResource.java                        |   15 
 src/main/java/com/jsh/erp/datasource/entities/LogExample.java                       |  710 
 src/main/java/com/jsh/erp/service/depot/DepotService.java                           |  376 
 src/main/java/com/jsh/erp/controller/FunctionController.java                        |  280 
 src/main/java/com/jsh/erp/datasource/entities/SystemConfigExample.java              | 1789 +
 src/main/java/com/jsh/erp/datasource/entities/MaterialProperty.java                 |   63 
 src/main/java/com/jsh/erp/service/account/AccountResource.java                      |   15 
 src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockWithMaterial.java |   26 
 src/main/java/com/jsh/erp/controller/MsgController.java                             |  155 
 src/main/java/com/jsh/erp/datasource/entities/DepotHead.java                        |  326 
 src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java                 |  325 
 src/main/java/com/jsh/erp/datasource/vo/MaterialCountVo.java                        |   26 
 src/test/resources/generatorConfig.xml                                              |   74 
 src/main/java/com/jsh/erp/datasource/entities/Material.java                         |  245 
 src/main/java/com/jsh/erp/utils/ComputerInfo.java                                   |  137 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapper.java           |   30 
 src/main/java/com/jsh/erp/service/systemConfig/SystemConfigService.java             |  666 
 src/main/java/com/jsh/erp/service/accountItem/AccountItemService.java               |  264 
 src/main/java/com/jsh/erp/service/depot/DepotComponent.java                         |   75 
 src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeService.java   |  176 
 src/main/java/com/jsh/erp/service/userBusiness/UserBusinessService.java             |  177 
 src/main/bin/stop.sh                                                                |    1 
 src/main/java/com/jsh/erp/datasource/entities/SerialNumberEx.java                   |  110 
 src/main/java/com/jsh/erp/controller/DepotHeadController.java                       |  697 
 src/main/resources/mapper_xml/DepotMapper.xml                                       |  338 
 src/main/java/com/jsh/erp/datasource/entities/Organization.java                     |  105 
 src/main/resources/mapper_xml/FunctionMapper.xml                                    |  338 
 src/main/java/com/jsh/erp/datasource/vo/AccountVo4InOutList.java                    |  116 
 src/main/java/com/jsh/erp/datasource/entities/DepotHeadExample.java                 | 2291 +
 src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java                   | 1442 
 src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapper.java                 |   30 
 src/main/java/com/jsh/erp/utils/ExtJsonUtils.java                                   |  141 
 src/main/java/com/jsh/erp/service/organization/OrganizationComponent.java           |   68 
 src/main/java/com/jsh/erp/service/depot/DepotResource.java                          |   15 
 src/main/resources/mapper_xml/SystemConfigMapperEx.xml                              |   38 
 src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4WithInfoEx.java           |  276 
 src/main/java/com/jsh/erp/controller/AccountHeadController.java                     |  142 
 src/main/resources/mapper_xml/SequenceMapperEx.xml                                  |   13 
 src/main/java/com/jsh/erp/utils/PageQueryInfo.java                                  |   30 
 docs/数据库更新记录-首次安装请勿使用.txt                                                           | 1631 +
 src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStock.java             |   75 
 src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryResource.java    |   15 
 src/main/java/com/jsh/erp/datasource/entities/Depot.java                            |  135 
 src/main/java/com/jsh/erp/constants/BusinessConstants.java                          |  230 
 src/main/resources/mapper_xml/MaterialMapper.xml                                    |  512 
 src/main/java/com/jsh/erp/datasource/entities/UnitExample.java                      |  980 
 src/main/java/com/jsh/erp/datasource/vo/LogVo4List.java                             |   36 
 src/main/resources/mapper_xml/PlatformConfigMapperEx.xml                            |   30 
 src/main/resources/mapper_xml/AccountItemMapperEx.xml                               |  136 
 src/main/java/com/jsh/erp/utils/HttpClient.java                                     |   88 
 src/main/java/com/jsh/erp/datasource/entities/MaterialCategoryExample.java          |  910 
 src/main/resources/mapper_xml/MsgMapperEx.xml                                       |   63 
 src/main/java/com/jsh/erp/datasource/entities/FunctionEx.java                       |   14 
 src/main/java/com/jsh/erp/controller/SupplierController.java                        |  415 
 src/main/java/com/jsh/erp/controller/MaterialCategoryController.java                |  114 
 src/main/java/com/jsh/erp/utils/ColumnPropertyUtil.java                             |   65 
 src/main/java/com/jsh/erp/datasource/mappers/FunctionMapperEx.java                  |   22 
 src/main/resources/mapper_xml/MaterialCategoryMapper.xml                            |  306 
 src/main/java/com/jsh/erp/utils/ResponseCode.java                                   |   24 
 src/main/java/com/jsh/erp/controller/RoleController.java                            |  102 
 src/main/java/com/jsh/erp/config/PluginBeanConfig.java                              |   24 
 src/main/java/com/jsh/erp/datasource/entities/AccountExample.java                   |  910 
 src/main/java/com/jsh/erp/datasource/entities/Person.java                           |   73 
 src/main/resources/mapper_xml/PersonMapper.xml                                      |  243 
 src/main/java/com/jsh/erp/datasource/entities/UserEx.java                           |  138 
 src/main/java/com/jsh/erp/service/ResourceInfo.java                                 |   14 
 src/main/resources/mapper_xml/MaterialAttributeMapperEx.xml                         |   39 
 src/main/java/com/jsh/erp/service/depotHead/DepotHeadResource.java                  |   15 
 src/main/java/com/jsh/erp/datasource/entities/DepotEx.java                          |   26 
 src/main/java/com/jsh/erp/service/role/RoleComponent.java                           |   72 
 src/main/resources/mapper_xml/SerialNumberMapper.xml                                |  370 
 src/main/resources/mapper_xml/AccountHeadMapperEx.xml                               |  221 
 src/main/java/com/jsh/erp/datasource/entities/RoleEx.java                           |   14 
 src/main/java/com/jsh/erp/datasource/entities/MaterialAttribute.java                |   53 
 src/main/java/com/jsh/erp/service/log/LogService.java                               |  192 
 src/main/java/com/jsh/erp/service/tenant/TenantComponent.java                       |   78 
 src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java                |   30 
 src/main/java/com/jsh/erp/controller/SystemConfigController.java                    |  308 
 src/main/java/com/jsh/erp/service/person/PersonResource.java                        |   15 
 src/main/java/com/jsh/erp/service/msg/MsgResource.java                              |   15 
 src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyComponent.java   |   71 
 src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelService.java               |  221 
 src/main/java/com/jsh/erp/utils/PinYinUtil.java                                     |   52 
 src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java             |  404 
 docs/云游管理系统数据库设计汇总.xlsx                                                             |    0 
 src/main/java/com/jsh/erp/controller/PlatformConfigController.java                  |  139 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapper.java        |   30 
 src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigService.java         |  196 
 src/main/java/com/jsh/erp/controller/DepotController.java                           |  226 
 src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendService.java         |  412 
 src/main/java/com/jsh/erp/service/functions/FunctionComponent.java                  |   73 
 src/main/java/com/jsh/erp/service/person/PersonService.java                         |  255 
 src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapper.java                |   30 
 src/main/java/com/jsh/erp/controller/PersonController.java                          |  165 
 src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockExample.java      |  690 
 src/main/java/com/jsh/erp/datasource/entities/TenantExample.java                    |  840 
 src/main/java/com/jsh/erp/service/material/MaterialService.java                     | 1479 +
 src/main/java/com/jsh/erp/service/userBusiness/UserBusinessComponent.java           |   69 
 src/main/java/com/jsh/erp/datasource/entities/Supplier.java                         |  255 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapperEx.java          |   20 
 src/main/java/com/jsh/erp/controller/PluginController.java                          |  368 
 src/main/resources/mapper_xml/MaterialAttributeMapper.xml                           |  211 
 src/main/resources/mapper_xml/SystemConfigMapper.xml                                |  499 
 src/main/java/com/jsh/erp/datasource/entities/MaterialExtend.java                   |  166 
 src/main/java/com/jsh/erp/service/account/AccountComponent.java                     |   75 
 src/main/java/com/jsh/erp/ErpApplication.java                                       |   28 
 src/main/java/com/jsh/erp/filter/LogCostFilter.java                                 |   72 
 src/main/java/com/jsh/erp/datasource/entities/User.java                             |  173 
 src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryService.java     |  308 
 src/main/java/com/jsh/erp/datasource/mappers/TenantMapper.java                      |   30 
 src/main/java/com/jsh/erp/datasource/mappers/SupplierMapperEx.java                  |   39 
 src/main/resources/mapper_xml/MaterialCurrentStockMapper.xml                        |  243 
 src/main/java/com/jsh/erp/utils/FileUtils.java                                      |  320 
 src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4Material.java             |   27 
 src/main/java/com/jsh/erp/datasource/entities/FunctionExample.java                  | 1079 
 src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InOutMCount.java                |  136 
 src/main/java/com/jsh/erp/datasource/entities/DepotItem.java                        |  256 
 src/main/resources/mapper_xml/MaterialExtendMapper.xml                              |  386 
 src/main/java/com/jsh/erp/datasource/vo/MaterialsListVo.java                        |   24 
 src/main/resources/mapper_xml/MaterialInitialStockMapper.xml                        |  258 
 src/main/resources/mapper_xml/UserBusinessMapper.xml                                |  243 
 src/main/java/com/jsh/erp/config/TenantConfig.java                                  |  118 
 src/main/resources/mapper_xml/OrganizationMapper.xml                                |  291 
 src/main/java/com/jsh/erp/service/unit/UnitResource.java                            |   15 
 src/main/java/com/jsh/erp/utils/BaseResponseInfo.java                               |   11 
 src/main/java/com/jsh/erp/datasource/entities/SysLoginModel.java                    |   55 
 src/main/resources/mapper_xml/MsgMapper.xml                                         |  275 
 src/main/java/com/jsh/erp/datasource/entities/MaterialPropertyExample.java          |  599 
 src/main/java/com/jsh/erp/service/log/LogResource.java                              |   15 
 src/main/resources/mapper_xml/PersonMapperEx.xml                                    |   45 
 src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendResource.java        |   15 
 src/main/bin/restart.sh                                                             |    1 
 src/main/resources/mapper_xml/PlatformConfigMapper.xml                              |  196 
 src/main/java/com/jsh/erp/datasource/entities/AccountItem.java                      |  115 
 src/main/java/com/jsh/erp/datasource/vo/BillListCacheVo.java                        |   34 
 src/main/java/com/jsh/erp/service/material/MaterialComponent.java                   |  104 
 src/main/java/com/jsh/erp/utils/OrderUtils.java                                     |   69 
 src/main/java/com/jsh/erp/service/functions/FunctionService.java                    |  244 
 src/main/java/com/jsh/erp/datasource/entities/MaterialCategory.java                 |  115 
 src/main/java/com/jsh/erp/datasource/entities/SupplierExample.java                  | 1840 +
 src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4StatementAccount.java           |  185 
 src/main/resources/mapper_xml/MaterialExtendMapperEx.xml                            |   84 
 src/main/java/com/jsh/erp/datasource/entities/OrgaUserRel.java                      |  325 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapperEx.java         |   20 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialMapper.java                    |   30 
 src/main/java/com/jsh/erp/service/account/AccountService.java                       |  597 
 src/main/java/com/jsh/erp/utils/ErpInfo.java                                        |   37 
 src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java                               |   83 
 src/main/java/com/jsh/erp/controller/MaterialExtendController.java                  |  132 
 src/main/java/com/jsh/erp/utils/ExcelUtils.java                                     |  220 
 src/main/java/com/jsh/erp/utils/RegExpTools.java                                    |  154 
 src/main/resources/mapper_xml/DepotItemMapperEx.xml                                 | 1132 
 src/main/java/com/jsh/erp/service/unit/UnitComponent.java                           |   71 
 src/main/java/com/jsh/erp/service/depotHead/DepotHeadComponent.java                 |  102 
 src/main/java/com/jsh/erp/service/role/RoleResource.java                            |   15 
 src/main/java/com/jsh/erp/controller/AccountController.java                         |  244 
 src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java                  |  262 
 src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapper.java              |   30 
 src/main/java/com/jsh/erp/service/inOutItem/InOutItemResource.java                  |   15 
 src/main/java/com/jsh/erp/service/log/LogComponent.java                             |   85 
 src/main/java/com/jsh/erp/service/person/PersonComponent.java                       |   75 
 src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java                   |   30 
 src/test/java/Test.java                                                             |   12 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapper.java            |   30 
 src/main/resources/mapper_xml/AccountItemMapper.xml                                 |  306 
 src/main/java/com/jsh/erp/service/sequence/SequenceService.java                     |  100 
 src/main/java/com/jsh/erp/datasource/entities/AccountItemExample.java               |  880 
 src/main/resources/mapper_xml/DepotHeadMapper.xml                                   |  638 
 src/main/java/com/jsh/erp/service/sequence/SequenceComponent.java                   |   74 
 src/main/java/com/jsh/erp/datasource/entities/Msg.java                              |   95 
 .gitignore                                                                          |   21 
 src/main/java/com/jsh/erp/datasource/mappers/LogMapperEx.java                       |   41 
 src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStockExample.java      |  630 
 src/main/java/com/jsh/erp/controller/MaterialAttributeController.java               |   76 
 src/main/java/com/jsh/erp/controller/SerialNumberController.java                    |  118 
 src/main/java/com/jsh/erp/datasource/entities/Account.java                          |  115 
 src/main/resources/mapper_xml/MaterialPropertyMapper.xml                            |  228 
 src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4MaterialAndSum.java       |   26 
 src/main/java/com/jsh/erp/service/material/MaterialResource.java                    |   15 
 src/main/resources/mapper_xml/DepotItemMapper.xml                                   |  528 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapperEx.java          |   42 
 src/main/java/com/jsh/erp/datasource/mappers/RoleMapper.java                        |   30 
 src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java                     |   44 
 src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java                 |  263 
 docs/jsh_erp.sql                                                                    |  980 
 src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java                   | 1750 +
 src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java                   |   30 
 src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java                   |   32 
 src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelEx.java                    |   10 
 src/main/java/com/jsh/erp/datasource/mappers/UnitMapper.java                        |   30 
 src/main/java/com/jsh/erp/controller/UnitController.java                            |   79 
 src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java                  | 1810 +
 src/main/java/com/jsh/erp/utils/JsonUtils.java                                      |   22 
 src/main/resources/mapper_xml/InOutItemMapper.xml                                   |  258 
 src/main/java/com/jsh/erp/datasource/vo/DepotItemVo4Stock.java                      |   80 
 src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4ListEx.java             |   57 
 src/main/java/com/jsh/erp/datasource/mappers/SupplierMapper.java                    |   30 
 src/main/java/com/jsh/erp/service/ICommonQuery.java                                 |   80 
 src/main/java/com/jsh/erp/datasource/mappers/AccountMapper.java                     |   30 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java                  |  180 
 src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelExample.java               |  923 
 src/main/java/com/jsh/erp/datasource/vo/TreeNodeEx.java                             |   96 
 src/main/resources/mapper_xml/RoleMapper.xml                                        |  290 
 src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapperEx.java                 |   25 
 src/main/resources/mapper_xml/InOutItemMapperEx.xml                                 |   53 
 src/main/resources/mapper_xml/MaterialInitialStockMapperEx.xml                      |   41 
 src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InDetail.java                   |  228 
 src/main/resources/mapper_xml/UnitMapperEx.xml                                      |   49 
 src/main/java/com/jsh/erp/config/Swagger2Config.java                                |   44 
 src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapper.java                 |   30 
 src/main/resources/mapper_xml/UserBusinessMapperEx.xml                              |   26 
 src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java                        |   30 
 src/main/java/com/jsh/erp/service/accountItem/AccountItemResource.java              |   15 
 src/main/java/com/jsh/erp/datasource/mappers/LogMapper.java                         |   30 
 src/main/java/com/jsh/erp/datasource/mappers/MsgMapperEx.java                       |   26 
 src/main/bin/status.sh                                                              |    1 
 src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4List.java                       |  227 
 src/main/java/com/jsh/erp/service/systemConfig/SystemConfigResource.java            |   15 
 src/main/resources/mapper_xml/AccountMapper.xml                                     |  306 
 src/main/java/com/jsh/erp/datasource/entities/PersonExample.java                    |  659 
 src/main/bin/start.sh                                                               |    1 
 src/main/java/com/jsh/erp/controller/OrganizationController.java                    |  126 
 src/main/java/com/jsh/erp/service/functions/FunctionResource.java                   |   15 
 src/main/java/com/jsh/erp/service/supplier/SupplierResource.java                    |   15 
 src/main/resources/mapper_xml/TenantMapper.xml                                      |  291 
 src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendComponent.java       |   65 
 src/main/java/com/jsh/erp/datasource/entities/RoleExample.java                      |  869 
 src/main/java/com/jsh/erp/service/supplier/SupplierComponent.java                   |   78 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapperEx.java      |   23 
 src/main/java/com/jsh/erp/service/depotItem/DepotItemComponent.java                 |   75 
 src/main/java/com/jsh/erp/datasource/mappers/MsgMapper.java                         |   30 
 src/main/bin/start.bat                                                              |    6 
 src/main/resources/application.properties                                           |   35 
 src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapperEx.java              |   33 
 src/main/java/com/jsh/erp/service/user/UserComponent.java                           |   73 
 src/main/java/com/jsh/erp/service/depotItem/DepotItemResource.java                  |   15 
 src/main/java/com/jsh/erp/exception/JshException.java                               |   27 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapper.java              |   30 
 src/main/java/com/jsh/erp/datasource/vo/MaterialVoSearch.java                       |   74 
 src/main/resources/logback-spring.xml                                               |   34 
 src/main/java/com/jsh/erp/service/CommonQueryManager.java                           |  137 
 src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyResource.java    |   15 
 src/main/java/com/jsh/erp/datasource/mappers/DepotMapperEx.java                     |   27 
 src/main/java/com/jsh/erp/service/organization/OrganizationResource.java            |   18 
 src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapperEx.java              |   21 
 src/main/java/com/jsh/erp/service/userBusiness/UserBusinessResource.java            |   15 
 src/main/java/com/jsh/erp/controller/DepotItemController.java                       | 1232 
 src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapperEx.java              |   24 
 src/main/java/com/jsh/erp/datasource/entities/MsgEx.java                            |   14 
 src/main/java/com/jsh/erp/service/accountHead/AccountHeadComponent.java             |   92 
 src/main/resources/mapper_xml/AccountMapperEx.xml                                   |  527 
 src/main/java/com/jsh/erp/datasource/entities/MaterialWithInitStock.java            |   29 
 src/main/java/com/jsh/erp/datasource/entities/DepotHeadVo4Body.java                 |   46 
 src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapper.java            |   30 
 src/main/resources/mapper_xml/LogMapperEx.xml                                       |   98 
 src/main/java/com/jsh/erp/datasource/vo/DepotItemVoBatchNumberList.java             |  108 
 src/main/resources/mapper_xml/DepotMapperEx.xml                                     |   63 
 src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapper.java                 |   96 
 src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapper.java                |   30 
 src/main/java/com/jsh/erp/service/user/UserService.java                             |  966 
 src/main/java/com/jsh/erp/utils/Constants.java                                      |   34 
 src/main/java/com/jsh/erp/utils/ParamUtils.java                                     |   57 
 src/main/java/com/jsh/erp/datasource/vo/TreeNode.java                               |  114 
 src/main/resources/mapper_xml/SupplierMapperEx.xml                                  |  106 
 src/main/java/com/jsh/erp/datasource/mappers/FunctionMapper.java                    |   30 
 src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapperEx.java               |   14 
 src/main/java/com/jsh/erp/datasource/vo/MaterialExtendVo4List.java                  |   68 
 src/main/java/com/jsh/erp/service/tenant/TenantService.java                         |  223 
 src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigComponent.java       |   70 
 src/main/java/com/jsh/erp/service/inOutItem/InOutItemService.java                   |  229 
 src/main/java/com/jsh/erp/datasource/entities/Tenant.java                           |  105 
 src/main/resources/mapper_xml/OrgaUserRelMapperEx.xml                               |   44 
 src/main/java/com/jsh/erp/controller/InOutItemController.java                       |   84 
 src/main/java/com/jsh/erp/datasource/vo/DepotItemStockWarningCount.java             |  207 
 src/main/resources/mapper_xml/TenantMapperEx.xml                                    |   64 
 386 files changed, 86,641 insertions(+), 0 deletions(-)

diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..7c51ecd
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+*.js linguist-language=Java
+*.css linguist-language=Java
+*.html linguist-language=Java
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6fb8862
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+*.iml
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.log
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+.idea
+/target
+
+**/*.iml
+
diff --git a/docs/jsh_erp.sql b/docs/jsh_erp.sql
new file mode 100644
index 0000000..2d59e00
--- /dev/null
+++ b/docs/jsh_erp.sql
@@ -0,0 +1,980 @@
+/*
+Navicat MySQL Data Transfer
+
+Source Server         : 127.0.0.1
+Source Server Version : 50704
+Source Host           : 127.0.0.1:3306
+Source Database       : jsh_erp
+
+Target Server Type    : MYSQL
+Target Server Version : 50704
+File Encoding         : 65001
+
+Date: 2024-12-08 23:08:03
+*/
+
+SET FOREIGN_KEY_CHECKS=0;
+
+-- ----------------------------
+-- Table structure for jsh_account
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_account`;
+CREATE TABLE `jsh_account` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `name` varchar(50) DEFAULT NULL COMMENT '名称',
+  `serial_no` varchar(50) DEFAULT NULL COMMENT '编号',
+  `initial_amount` decimal(24,6) DEFAULT NULL COMMENT '期初金额',
+  `current_amount` decimal(24,6) DEFAULT NULL COMMENT '当前余额',
+  `remark` varchar(100) DEFAULT NULL COMMENT '备注',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `sort` varchar(10) DEFAULT NULL COMMENT '排序',
+  `is_default` bit(1) DEFAULT NULL COMMENT '是否默认',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COMMENT='账户信息';
+
+-- ----------------------------
+-- Records of jsh_account
+-- ----------------------------
+INSERT INTO `jsh_account` VALUES ('17', '账户1', 'zzz111', '100.000000', '829.000000', 'aabb', '', null, '', '63', '0');
+INSERT INTO `jsh_account` VALUES ('18', '账户2', '1234131324', '200.000000', '-1681.000000', 'bbbb', '', null, '\0', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_account_head
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_account_head`;
+CREATE TABLE `jsh_account_head` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `type` varchar(50) DEFAULT NULL COMMENT '类型(支出/收入/收款/付款/转账)',
+  `organ_id` bigint(20) DEFAULT NULL COMMENT '单位Id(收款/付款单位)',
+  `hands_person_id` bigint(20) DEFAULT NULL COMMENT '经手人id',
+  `creator` bigint(20) DEFAULT NULL COMMENT '操作员',
+  `change_amount` decimal(24,6) DEFAULT NULL COMMENT '变动金额(优惠/收款/付款/实付)',
+  `discount_money` decimal(24,6) DEFAULT NULL COMMENT '优惠金额',
+  `total_price` decimal(24,6) DEFAULT NULL COMMENT '合计金额',
+  `account_id` bigint(20) DEFAULT NULL COMMENT '账户(收款/付款)',
+  `bill_no` varchar(50) DEFAULT NULL COMMENT '单据编号',
+  `bill_time` datetime DEFAULT NULL COMMENT '单据日期',
+  `remark` varchar(1000) DEFAULT NULL COMMENT '备注',
+  `file_name` varchar(500) DEFAULT NULL COMMENT '附件名称',
+  `status` varchar(1) DEFAULT NULL COMMENT '状态,0未审核、1已审核、9审核中',
+  `source` varchar(1) DEFAULT '0' COMMENT '单据来源,0-pc,1-手机',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`),
+  KEY `FK9F4C0D8DB610FC06` (`organ_id`),
+  KEY `FK9F4C0D8DAAE50527` (`account_id`),
+  KEY `FK9F4C0D8DC4170B37` (`hands_person_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8 COMMENT='财务主表';
+
+-- ----------------------------
+-- Records of jsh_account_head
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for jsh_account_item
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_account_item`;
+CREATE TABLE `jsh_account_item` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `header_id` bigint(20) NOT NULL COMMENT '表头Id',
+  `account_id` bigint(20) DEFAULT NULL COMMENT '账户Id',
+  `in_out_item_id` bigint(20) DEFAULT NULL COMMENT '收支项目Id',
+  `bill_id` bigint(20) DEFAULT NULL COMMENT '单据id',
+  `need_debt` decimal(24,6) DEFAULT NULL COMMENT '应收欠款',
+  `finish_debt` decimal(24,6) DEFAULT NULL COMMENT '已收欠款',
+  `each_amount` decimal(24,6) DEFAULT NULL COMMENT '单项金额',
+  `remark` varchar(500) DEFAULT NULL COMMENT '单据备注',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`),
+  KEY `FK9F4CBAC0AAE50527` (`account_id`),
+  KEY `FK9F4CBAC0C5FE6007` (`header_id`),
+  KEY `FK9F4CBAC0D203EDC5` (`in_out_item_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=152 DEFAULT CHARSET=utf8 COMMENT='财务子表';
+
+-- ----------------------------
+-- Records of jsh_account_item
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for jsh_depot
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_depot`;
+CREATE TABLE `jsh_depot` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `name` varchar(20) DEFAULT NULL COMMENT '仓库名称',
+  `address` varchar(50) DEFAULT NULL COMMENT '仓库地址',
+  `warehousing` decimal(24,6) DEFAULT NULL COMMENT '仓储费',
+  `truckage` decimal(24,6) DEFAULT NULL COMMENT '搬运费',
+  `type` int(10) DEFAULT NULL COMMENT '类型',
+  `sort` varchar(10) DEFAULT NULL COMMENT '排序',
+  `remark` varchar(100) DEFAULT NULL COMMENT '描述',
+  `principal` bigint(20) DEFAULT NULL COMMENT '负责人',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_Flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  `is_default` bit(1) DEFAULT NULL COMMENT '是否默认',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='仓库表';
+
+-- ----------------------------
+-- Records of jsh_depot
+-- ----------------------------
+INSERT INTO `jsh_depot` VALUES ('14', '仓库1', 'dizhi', '12.000000', '12.000000', '0', '1', '描述', '131', '', '63', '0', '');
+INSERT INTO `jsh_depot` VALUES ('15', '仓库2', '地址100', '555.000000', '666.000000', '0', '2', 'dfdf', '131', '', '63', '0', '\0');
+INSERT INTO `jsh_depot` VALUES ('17', '仓库3', '123123', '123.000000', '123.000000', '0', '3', '123', '131', '', '63', '0', '\0');
+
+-- ----------------------------
+-- Table structure for jsh_depot_head
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_depot_head`;
+CREATE TABLE `jsh_depot_head` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `type` varchar(50) DEFAULT NULL COMMENT '类型(出库/入库)',
+  `sub_type` varchar(50) DEFAULT NULL COMMENT '出入库分类',
+  `default_number` varchar(50) DEFAULT NULL COMMENT '初始票据号',
+  `number` varchar(50) DEFAULT NULL COMMENT '票据号',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `oper_time` datetime DEFAULT NULL COMMENT '出入库时间',
+  `organ_id` bigint(20) DEFAULT NULL COMMENT '供应商id',
+  `creator` bigint(20) DEFAULT NULL COMMENT '操作员',
+  `account_id` bigint(20) DEFAULT NULL COMMENT '账户id',
+  `change_amount` decimal(24,6) DEFAULT NULL COMMENT '变动金额(收款/付款)',
+  `back_amount` decimal(24,6) DEFAULT NULL COMMENT '找零金额',
+  `total_price` decimal(24,6) DEFAULT NULL COMMENT '合计金额',
+  `pay_type` varchar(50) DEFAULT NULL COMMENT '付款类型(现金、记账等)',
+  `bill_type` varchar(50) DEFAULT NULL COMMENT '单据类型',
+  `remark` varchar(1000) DEFAULT NULL COMMENT '备注',
+  `file_name` varchar(1000) DEFAULT NULL COMMENT '附件名称',
+  `sales_man` varchar(50) DEFAULT NULL COMMENT '销售员(可以多个)',
+  `account_id_list` varchar(50) DEFAULT NULL COMMENT '多账户ID列表',
+  `account_money_list` varchar(200) DEFAULT NULL COMMENT '多账户金额列表',
+  `discount` decimal(24,6) DEFAULT NULL COMMENT '优惠率',
+  `discount_money` decimal(24,6) DEFAULT NULL COMMENT '优惠金额',
+  `discount_last_money` decimal(24,6) DEFAULT NULL COMMENT '优惠后金额',
+  `other_money` decimal(24,6) DEFAULT NULL COMMENT '销售或采购费用合计',
+  `deposit` decimal(24,6) DEFAULT NULL COMMENT '订金',
+  `status` varchar(1) DEFAULT NULL COMMENT '状态,0未审核、1已审核、2完成采购|销售、3部分采购|销售、9审核中',
+  `purchase_status` varchar(1) DEFAULT NULL COMMENT '采购状态,0未采购、2完成采购、3部分采购',
+  `source` varchar(1) DEFAULT '0' COMMENT '单据来源,0-pc,1-手机',
+  `link_number` varchar(50) DEFAULT NULL COMMENT '关联订单号',
+  `link_apply` varchar(50) DEFAULT NULL COMMENT '关联请购单',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`),
+  KEY `FK2A80F214B610FC06` (`organ_id`),
+  KEY `FK2A80F214AAE50527` (`account_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=277 DEFAULT CHARSET=utf8 COMMENT='单据主表';
+
+-- ----------------------------
+-- Records of jsh_depot_head
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for jsh_depot_item
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_depot_item`;
+CREATE TABLE `jsh_depot_item` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `header_id` bigint(20) NOT NULL COMMENT '表头Id',
+  `material_id` bigint(20) NOT NULL COMMENT '商品Id',
+  `material_extend_id` bigint(20) DEFAULT NULL COMMENT '商品扩展id',
+  `material_unit` varchar(20) DEFAULT NULL COMMENT '商品单位',
+  `sku` varchar(50) DEFAULT NULL COMMENT '多属性',
+  `oper_number` decimal(24,6) DEFAULT NULL COMMENT '数量',
+  `basic_number` decimal(24,6) DEFAULT NULL COMMENT '基础数量,如kg、瓶',
+  `unit_price` decimal(24,6) DEFAULT NULL COMMENT '单价',
+  `purchase_unit_price` decimal(24,6) DEFAULT NULL COMMENT '采购单价',
+  `tax_unit_price` decimal(24,6) DEFAULT NULL COMMENT '含税单价',
+  `all_price` decimal(24,6) DEFAULT NULL COMMENT '金额',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `depot_id` bigint(20) DEFAULT NULL COMMENT '仓库ID',
+  `another_depot_id` bigint(20) DEFAULT NULL COMMENT '调拨时,对方仓库Id',
+  `tax_rate` decimal(24,6) DEFAULT NULL COMMENT '税率',
+  `tax_money` decimal(24,6) DEFAULT NULL COMMENT '税额',
+  `tax_last_money` decimal(24,6) DEFAULT NULL COMMENT '价税合计',
+  `material_type` varchar(20) DEFAULT NULL COMMENT '商品类型',
+  `sn_list` varchar(2000) DEFAULT NULL COMMENT '序列号列表',
+  `batch_number` varchar(100) DEFAULT NULL COMMENT '批号',
+  `expiration_date` datetime DEFAULT NULL COMMENT '有效日期',
+  `link_id` bigint(20) DEFAULT NULL COMMENT '关联明细id',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`),
+  KEY `FK2A819F475D61CCF7` (`material_id`),
+  KEY `FK2A819F474BB6190E` (`header_id`),
+  KEY `FK2A819F479485B3F5` (`depot_id`),
+  KEY `FK2A819F47729F5392` (`another_depot_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=334 DEFAULT CHARSET=utf8 COMMENT='单据子表';
+
+-- ----------------------------
+-- Records of jsh_depot_item
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for jsh_function
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_function`;
+CREATE TABLE `jsh_function` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `number` varchar(50) DEFAULT NULL COMMENT '编号',
+  `name` varchar(50) DEFAULT NULL COMMENT '名称',
+  `parent_number` varchar(50) DEFAULT NULL COMMENT '上级编号',
+  `url` varchar(100) DEFAULT NULL COMMENT '链接',
+  `component` varchar(100) DEFAULT NULL COMMENT '组件',
+  `state` bit(1) DEFAULT NULL COMMENT '收缩',
+  `sort` varchar(50) DEFAULT NULL COMMENT '排序',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `type` varchar(50) DEFAULT NULL COMMENT '类型',
+  `push_btn` varchar(50) DEFAULT NULL COMMENT '功能按钮',
+  `icon` varchar(50) DEFAULT NULL COMMENT '图标',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `url` (`url`)
+) ENGINE=InnoDB AUTO_INCREMENT=262 DEFAULT CHARSET=utf8 COMMENT='功能模块表';
+
+-- ----------------------------
+-- Records of jsh_function
+-- ----------------------------
+INSERT INTO `jsh_function` VALUES ('1', '0001', '系统管理', '0', '/system', '/layouts/TabLayout', '', '0910', '', '电脑版', '', 'setting', '0');
+INSERT INTO `jsh_function` VALUES ('13', '000102', '角色管理', '0001', '/system/role', '/system/RoleList', '\0', '0130', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('14', '000103', '用户管理', '0001', '/system/user', '/system/UserList', '\0', '0140', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('15', '000104', '日志管理', '0001', '/system/log', '/system/LogList', '\0', '0160', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('16', '000105', '功能管理', '0001', '/system/function', '/system/FunctionList', '\0', '0166', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('18', '000109', '租户管理', '0001', '/system/tenant', '/system/TenantList', '\0', '0167', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('21', '0101', '商品管理', '0', '/material', '/layouts/TabLayout', '\0', '0620', '', '电脑版', null, 'shopping', '0');
+INSERT INTO `jsh_function` VALUES ('22', '010101', '商品类别', '0101', '/material/material_category', '/material/MaterialCategoryList', '\0', '0230', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('23', '010102', '商品信息', '0101', '/material/material', '/material/MaterialList', '\0', '0240', '', '电脑版', '1,3', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('24', '0102', '基本资料', '0', '/systemA', '/layouts/TabLayout', '\0', '0750', '', '电脑版', null, 'appstore', '0');
+INSERT INTO `jsh_function` VALUES ('25', '01020101', '供应商信息', '0102', '/system/vendor', '/system/VendorList', '\0', '0260', '', '电脑版', '1,3', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('26', '010202', '仓库信息', '0102', '/system/depot', '/system/DepotList', '\0', '0270', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('31', '010206', '经手人管理', '0102', '/system/person', '/system/PersonList', '\0', '0284', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('32', '0502', '采购管理', '0', '/bill', '/layouts/TabLayout', '\0', '0330', '', '电脑版', '', 'retweet', '0');
+INSERT INTO `jsh_function` VALUES ('33', '050201', '采购入库', '0502', '/bill/purchase_in', '/bill/PurchaseInList', '\0', '0340', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('38', '0603', '销售管理', '0', '/billB', '/layouts/TabLayout', '\0', '0390', '', '电脑版', '', 'shopping-cart', '0');
+INSERT INTO `jsh_function` VALUES ('40', '080107', '调拨出库', '0801', '/bill/allocation_out', '/bill/AllocationOutList', '\0', '0807', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('41', '060303', '销售出库', '0603', '/bill/sale_out', '/bill/SaleOutList', '\0', '0394', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('44', '0704', '财务管理', '0', '/financial', '/layouts/TabLayout', '\0', '0450', '', '电脑版', '', 'money-collect', '0');
+INSERT INTO `jsh_function` VALUES ('59', '030101', '进销存统计', '0301', '/report/in_out_stock_report', '/report/InOutStockReport', '\0', '0658', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('194', '010204', '收支项目', '0102', '/system/in_out_item', '/system/InOutItemList', '\0', '0282', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('195', '010205', '结算账户', '0102', '/system/account', '/system/AccountList', '\0', '0283', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('197', '070402', '收入单', '0704', '/financial/item_in', '/financial/ItemInList', '\0', '0465', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('198', '0301', '报表查询', '0', '/report', '/layouts/TabLayout', '\0', '0570', '', '电脑版', null, 'pie-chart', '0');
+INSERT INTO `jsh_function` VALUES ('199', '050204', '采购退货', '0502', '/bill/purchase_back', '/bill/PurchaseBackList', '\0', '0345', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('200', '060305', '销售退货', '0603', '/bill/sale_back', '/bill/SaleBackList', '\0', '0396', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('201', '080103', '其它入库', '0801', '/bill/other_in', '/bill/OtherInList', '\0', '0803', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('202', '080105', '其它出库', '0801', '/bill/other_out', '/bill/OtherOutList', '\0', '0805', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('203', '070403', '支出单', '0704', '/financial/item_out', '/financial/ItemOutList', '\0', '0470', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('204', '070404', '收款单', '0704', '/financial/money_in', '/financial/MoneyInList', '\0', '0475', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('205', '070405', '付款单', '0704', '/financial/money_out', '/financial/MoneyOutList', '\0', '0480', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('206', '070406', '转账单', '0704', '/financial/giro', '/financial/GiroList', '\0', '0490', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('207', '030102', '账户统计', '0301', '/report/account_report', '/report/AccountReport', '\0', '0610', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('208', '030103', '采购统计', '0301', '/report/buy_in_report', '/report/BuyInReport', '\0', '0620', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('209', '030104', '销售统计', '0301', '/report/sale_out_report', '/report/SaleOutReport', '\0', '0630', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('210', '040102', '零售出库', '0401', '/bill/retail_out', '/bill/RetailOutList', '\0', '0405', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('211', '040104', '零售退货', '0401', '/bill/retail_back', '/bill/RetailBackList', '\0', '0407', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('212', '070407', '收预付款', '0704', '/financial/advance_in', '/financial/AdvanceInList', '\0', '0495', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('217', '01020102', '客户信息', '0102', '/system/customer', '/system/CustomerList', '\0', '0262', '', '电脑版', '1,3', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('218', '01020103', '会员信息', '0102', '/system/member', '/system/MemberList', '\0', '0263', '', '电脑版', '1,3', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('220', '010103', '多单位', '0101', '/system/unit', '/system/UnitList', '\0', '0245', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('225', '0401', '零售管理', '0', '/billC', '/layouts/TabLayout', '\0', '0101', '', '电脑版', '', 'gift', '0');
+INSERT INTO `jsh_function` VALUES ('226', '030106', '入库明细', '0301', '/report/in_detail', '/report/InDetail', '\0', '0640', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('227', '030107', '出库明细', '0301', '/report/out_detail', '/report/OutDetail', '\0', '0645', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('228', '030108', '入库汇总', '0301', '/report/in_material_count', '/report/InMaterialCount', '\0', '0650', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('229', '030109', '出库汇总', '0301', '/report/out_material_count', '/report/OutMaterialCount', '\0', '0655', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('232', '080109', '组装单', '0801', '/bill/assemble', '/bill/AssembleList', '\0', '0809', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('233', '080111', '拆卸单', '0801', '/bill/disassemble', '/bill/DisassembleList', '\0', '0811', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('234', '000105', '系统配置', '0001', '/system/system_config', '/system/SystemConfigList', '\0', '0165', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('235', '030110', '客户对账', '0301', '/report/customer_account', '/report/CustomerAccount', '\0', '0660', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('236', '000106', '商品属性', '0001', '/material/material_property', '/material/MaterialPropertyList', '\0', '0168', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('237', '030111', '供应商对账', '0301', '/report/vendor_account', '/report/VendorAccount', '\0', '0665', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('239', '0801', '仓库管理', '0', '/billD', '/layouts/TabLayout', '\0', '0420', '', '电脑版', '', 'hdd', '0');
+INSERT INTO `jsh_function` VALUES ('241', '050202', '采购订单', '0502', '/bill/purchase_order', '/bill/PurchaseOrderList', '\0', '0335', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('242', '060301', '销售订单', '0603', '/bill/sale_order', '/bill/SaleOrderList', '\0', '0392', '', '电脑版', '1,2,3,7', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('243', '000108', '机构管理', '0001', '/system/organization', '/system/OrganizationList', '', '0150', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('244', '030112', '库存预警', '0301', '/report/stock_warning_report', '/report/StockWarningReport', '\0', '0670', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('245', '000107', '插件管理', '0001', '/system/plugin', '/system/PluginList', '\0', '0170', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('246', '030113', '商品库存', '0301', '/report/material_stock', '/report/MaterialStock', '\0', '0605', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('247', '010105', '多属性', '0101', '/material/material_attribute', '/material/MaterialAttributeList', '\0', '0250', '', '电脑版', '1', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('248', '030150', '调拨明细', '0301', '/report/allocation_detail', '/report/AllocationDetail', '\0', '0646', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('258', '000112', '平台配置', '0001', '/system/platform_config', '/system/PlatformConfigList', '\0', '0175', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('259', '030105', '零售统计', '0301', '/report/retail_out_report', '/report/RetailOutReport', '\0', '0615', '', '电脑版', '', 'profile', '0');
+INSERT INTO `jsh_function` VALUES ('261', '050203', '请购单', '0502', '/bill/purchase_apply', '/bill/PurchaseApplyList', '\0', '0330', '', '电脑版', '1,2,3,7', 'profile', '0');
+
+-- ----------------------------
+-- Table structure for jsh_in_out_item
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_in_out_item`;
+CREATE TABLE `jsh_in_out_item` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `name` varchar(50) DEFAULT NULL COMMENT '名称',
+  `type` varchar(20) DEFAULT NULL COMMENT '类型',
+  `remark` varchar(100) DEFAULT NULL COMMENT '备注',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `sort` varchar(10) DEFAULT NULL COMMENT '排序',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='收支项目';
+
+-- ----------------------------
+-- Records of jsh_in_out_item
+-- ----------------------------
+INSERT INTO `jsh_in_out_item` VALUES ('21', '快递费', '支出', '', '', null, '63', '0');
+INSERT INTO `jsh_in_out_item` VALUES ('22', '房租收入', '收入', '', '', null, '63', '0');
+INSERT INTO `jsh_in_out_item` VALUES ('23', '利息收入', '收入', '收入', '', null, '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_log
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_log`;
+CREATE TABLE `jsh_log` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
+  `operation` varchar(500) DEFAULT NULL COMMENT '操作模块名称',
+  `client_ip` varchar(200) DEFAULT NULL COMMENT '客户端IP',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `status` tinyint(4) DEFAULT NULL COMMENT '操作状态 0==成功,1==失败',
+  `content` varchar(5000) DEFAULT NULL COMMENT '详情',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  PRIMARY KEY (`id`),
+  KEY `FKF2696AA13E226853` (`user_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=7599 DEFAULT CHARSET=utf8 COMMENT='操作日志';
+
+-- ----------------------------
+-- Records of jsh_log
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for jsh_material
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_material`;
+CREATE TABLE `jsh_material` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `category_id` bigint(20) DEFAULT NULL COMMENT '产品类型id',
+  `name` varchar(100) DEFAULT NULL COMMENT '名称',
+  `mfrs` varchar(50) DEFAULT NULL COMMENT '制造商',
+  `model` varchar(100) DEFAULT NULL COMMENT '型号',
+  `standard` varchar(100) DEFAULT NULL COMMENT '规格',
+  `brand` varchar(100) DEFAULT NULL COMMENT '品牌',
+  `mnemonic` varchar(100) DEFAULT NULL COMMENT '助记码',
+  `color` varchar(50) DEFAULT NULL COMMENT '颜色',
+  `unit` varchar(50) DEFAULT NULL COMMENT '单位-单个',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `img_name` varchar(1000) DEFAULT NULL COMMENT '图片名称',
+  `unit_id` bigint(20) DEFAULT NULL COMMENT '单位Id',
+  `expiry_num` int(10) DEFAULT NULL COMMENT '保质期天数',
+  `weight` decimal(24,6) DEFAULT NULL COMMENT '基础重量(kg)',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用 0-禁用  1-启用',
+  `other_field1` varchar(50) DEFAULT NULL COMMENT '自定义1',
+  `other_field2` varchar(50) DEFAULT NULL COMMENT '自定义2',
+  `other_field3` varchar(50) DEFAULT NULL COMMENT '自定义3',
+  `enable_serial_number` varchar(1) DEFAULT '0' COMMENT '是否开启序列号,0否,1是',
+  `enable_batch_number` varchar(1) DEFAULT '0' COMMENT '是否开启批号,0否,1是',
+  `position` varchar(100) DEFAULT NULL COMMENT '仓位货架',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`),
+  KEY `FK675951272AB6672C` (`category_id`),
+  KEY `UnitId` (`unit_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=620 DEFAULT CHARSET=utf8 COMMENT='产品表';
+
+-- ----------------------------
+-- Records of jsh_material
+-- ----------------------------
+INSERT INTO `jsh_material` VALUES ('568', '17', '商品1', '制1', 'sp1', '', null, null, '', '个', '', null, null, null, null, '', '', '', '', '0', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('569', '17', '商品2', '', 'sp2', '', null, null, '', '只', '', null, null, null, null, '', '', '', '', '0', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('570', '17', '商品3', '', 'sp3', '', null, null, '', '个', '', null, null, null, null, '', '', '', '', '0', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('577', null, '商品8', '', 'sp8', '', null, null, '', '', '', null, '15', null, null, '', '', '', '', '0', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('579', '21', '商品17', '', 'sp17', '', null, null, '', '', '', null, '15', null, null, '', '', '', '', '0', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('586', '17', '序列号商品测试', '', 'xlh123', '', null, null, '', '个', '', null, null, null, null, '', '', '', '', '1', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('587', '17', '商品test1', '南通中远', '', 'test1', null, null, '', '个', '', null, null, null, null, '', '', '', '', '0', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('588', '21', '商品200', 'fafda', 'weqwe', '300ml', null, null, '红色', '个', 'aaaabbbbb', null, null, null, null, '', '', '', '', '0', '0', null, '63', '0');
+INSERT INTO `jsh_material` VALUES ('619', null, '衣服', null, null, null, null, null, null, '件', null, '', null, null, null, '', null, null, null, '0', '0', null, '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_material_attribute
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_material_attribute`;
+CREATE TABLE `jsh_material_attribute` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `attribute_name` varchar(50) DEFAULT NULL COMMENT '属性名',
+  `attribute_value` varchar(500) DEFAULT NULL COMMENT '属性值',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='产品属性表';
+
+-- ----------------------------
+-- Records of jsh_material_attribute
+-- ----------------------------
+INSERT INTO `jsh_material_attribute` VALUES ('1', '多颜色', '红色|橙色|黄色|绿色|蓝色|紫色', '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('2', '多尺寸', 'S|M|L|XL|XXL|XXXL', '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('3', '自定义1', '小米|华为', '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('4', '自定义2', null, '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('5', '自定义3', null, '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_material_category
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_material_category`;
+CREATE TABLE `jsh_material_category` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `name` varchar(50) DEFAULT NULL COMMENT '名称',
+  `category_level` smallint(6) DEFAULT NULL COMMENT '等级',
+  `parent_id` bigint(20) DEFAULT NULL COMMENT '上级id',
+  `sort` varchar(10) DEFAULT NULL COMMENT '显示顺序',
+  `serial_no` varchar(100) DEFAULT NULL COMMENT '编号',
+  `remark` varchar(1024) DEFAULT NULL COMMENT '备注',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`),
+  KEY `FK3EE7F725237A77D8` (`parent_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT='产品类型表';
+
+-- ----------------------------
+-- Records of jsh_material_category
+-- ----------------------------
+INSERT INTO `jsh_material_category` VALUES ('17', '目录1', null, null, '11', 'wae12', 'eee', '2019-04-10 22:18:12', '2021-02-17 15:11:35', '63', '0');
+INSERT INTO `jsh_material_category` VALUES ('21', '目录2', null, '17', '22', 'ada112', 'ddd', '2020-07-20 23:08:44', '2020-07-20 23:08:44', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_material_current_stock
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_material_current_stock`;
+CREATE TABLE `jsh_material_current_stock` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `material_id` bigint(20) DEFAULT NULL COMMENT '产品id',
+  `depot_id` bigint(20) DEFAULT NULL COMMENT '仓库id',
+  `current_number` decimal(24,6) DEFAULT NULL COMMENT '当前库存数量',
+  `current_unit_price` decimal(24,6) DEFAULT NULL COMMENT '当前单价',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='产品当前库存';
+
+-- ----------------------------
+-- Records of jsh_material_current_stock
+-- ----------------------------
+INSERT INTO `jsh_material_current_stock` VALUES ('19', '588', '14', '7.000000', null, '63', '0');
+INSERT INTO `jsh_material_current_stock` VALUES ('20', '568', '14', '2.000000', null, '63', '0');
+INSERT INTO `jsh_material_current_stock` VALUES ('21', '568', '15', '1.000000', null, '63', '0');
+INSERT INTO `jsh_material_current_stock` VALUES ('22', '570', '14', '8.000000', null, '63', '0');
+INSERT INTO `jsh_material_current_stock` VALUES ('23', '619', '14', '5.000000', null, '63', '0');
+INSERT INTO `jsh_material_current_stock` VALUES ('24', '619', '15', '0.000000', null, '63', '0');
+INSERT INTO `jsh_material_current_stock` VALUES ('25', '619', '17', '0.000000', null, '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_material_extend
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_material_extend`;
+CREATE TABLE `jsh_material_extend` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `material_id` bigint(20) DEFAULT NULL COMMENT '商品id',
+  `bar_code` varchar(50) DEFAULT NULL COMMENT '商品条码',
+  `commodity_unit` varchar(50) DEFAULT NULL COMMENT '商品单位',
+  `sku` varchar(50) DEFAULT NULL COMMENT '多属性',
+  `purchase_decimal` decimal(24,6) DEFAULT NULL COMMENT '采购价格',
+  `commodity_decimal` decimal(24,6) DEFAULT NULL COMMENT '零售价格',
+  `wholesale_decimal` decimal(24,6) DEFAULT NULL COMMENT '销售价格',
+  `low_decimal` decimal(24,6) DEFAULT NULL COMMENT '最低售价',
+  `default_flag` varchar(1) DEFAULT '1' COMMENT '是否为默认单位,1是,0否',
+  `create_time` datetime DEFAULT NULL COMMENT '创建日期',
+  `create_serial` varchar(50) DEFAULT NULL COMMENT '创建人编码',
+  `update_serial` varchar(50) DEFAULT NULL COMMENT '更新人编码',
+  `update_time` bigint(20) DEFAULT NULL COMMENT '更新时间戳',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_Flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='产品价格扩展';
+
+-- ----------------------------
+-- Records of jsh_material_extend
+-- ----------------------------
+INSERT INTO `jsh_material_extend` VALUES ('1', '587', '1000', '个', null, '11.000000', '22.000000', '22.000000', '22.000000', '1', '2020-02-20 23:22:03', 'jsh', 'jsh', '1595263657135', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('2', '568', '1001', '个', null, '11.000000', '15.000000', '15.000000', '15.000000', '1', '2020-02-20 23:44:57', 'jsh', 'jsh', '1595265439418', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('3', '569', '1002', '只', null, '10.000000', '15.000000', '15.000000', '13.000000', '1', '2020-02-20 23:45:15', 'jsh', 'jsh', '1582213514731', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('4', '570', '1003', '个', null, '8.000000', '15.000000', '14.000000', '13.000000', '1', '2020-02-20 23:45:37', 'jsh', 'jsh', '1587657604430', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('5', '577', '1004', '个', null, '10.000000', '20.000000', '20.000000', '20.000000', '1', '2020-02-20 23:46:36', 'jsh', 'jsh', '1582213596494', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('6', '577', '1005', '箱', null, '120.000000', '240.000000', '240.000000', '240.000000', '0', '2020-02-20 23:46:36', 'jsh', 'jsh', '1582213596497', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('7', '579', '1006', '个', null, '20.000000', '30.000000', '30.000000', '30.000000', '1', '2020-02-20 23:47:04', 'jsh', 'jsh', '1595264270458', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('8', '579', '1007', '箱', null, '240.000000', '360.000000', '360.000000', '360.000000', '0', '2020-02-20 23:47:04', 'jsh', 'jsh', '1595264270466', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('9', '586', '1008', '个', null, '12.000000', '15.000000', '15.000000', '15.000000', '1', '2020-02-20 23:47:23', 'jsh', 'jsh', '1595254981896', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('10', '588', '1009', '个', null, '11.000000', '22.000000', '22.000000', '22.000000', '1', '2020-07-21 00:58:15', 'jsh', 'jsh', '1614699799073', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('36', '619', '1014', '件', '橙色,M', '12.000000', '15.000000', '14.000000', null, '1', '2021-07-28 01:00:20', 'jsh', 'jsh', '1627405220316', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('37', '619', '1015', '件', '橙色,L', '12.000000', '15.000000', '14.000000', null, '0', '2021-07-28 01:00:20', 'jsh', 'jsh', '1627405220327', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('38', '619', '1016', '件', '绿色,M', '12.000000', '15.000000', '14.000000', null, '0', '2021-07-28 01:00:20', 'jsh', 'jsh', '1627405220336', '63', '0');
+INSERT INTO `jsh_material_extend` VALUES ('39', '619', '1017', '件', '绿色,L', '12.000000', '15.000000', '14.000000', null, '0', '2021-07-28 01:00:20', 'jsh', 'jsh', '1627405220346', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_material_initial_stock
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_material_initial_stock`;
+CREATE TABLE `jsh_material_initial_stock` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `material_id` bigint(20) DEFAULT NULL COMMENT '产品id',
+  `depot_id` bigint(20) DEFAULT NULL COMMENT '仓库id',
+  `number` decimal(24,6) DEFAULT NULL COMMENT '初始库存数量',
+  `low_safe_stock` decimal(24,6) DEFAULT NULL COMMENT '最低库存数量',
+  `high_safe_stock` decimal(24,6) DEFAULT NULL COMMENT '最高库存数量',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=205 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='产品初始库存';
+
+-- ----------------------------
+-- Records of jsh_material_initial_stock
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for jsh_material_property
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_material_property`;
+CREATE TABLE `jsh_material_property` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `native_name` varchar(50) DEFAULT NULL COMMENT '原始名称',
+  `enabled` bit(1) DEFAULT NULL COMMENT '是否启用',
+  `sort` varchar(10) DEFAULT NULL COMMENT '排序',
+  `another_name` varchar(50) DEFAULT NULL COMMENT '别名',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='产品扩展字段表';
+
+-- ----------------------------
+-- Records of jsh_material_property
+-- ----------------------------
+INSERT INTO `jsh_material_property` VALUES ('1', '制造商', '', '01', '制造商', '0');
+INSERT INTO `jsh_material_property` VALUES ('2', '自定义1', '', '02', '自定义1', '0');
+INSERT INTO `jsh_material_property` VALUES ('3', '自定义2', '', '03', '自定义2', '0');
+INSERT INTO `jsh_material_property` VALUES ('4', '自定义3', '', '04', '自定义3', '0');
+
+-- ----------------------------
+-- Table structure for jsh_msg
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_msg`;
+CREATE TABLE `jsh_msg` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `msg_title` varchar(100) DEFAULT NULL COMMENT '消息标题',
+  `msg_content` varchar(500) DEFAULT NULL COMMENT '消息内容',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `type` varchar(20) DEFAULT NULL COMMENT '消息类型',
+  `user_id` bigint(20) DEFAULT NULL COMMENT '接收人id',
+  `status` varchar(1) DEFAULT NULL COMMENT '状态,1未读 2已读',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_Flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='消息表';
+
+-- ----------------------------
+-- Records of jsh_msg
+-- ----------------------------
+INSERT INTO `jsh_msg` VALUES ('2', '标题1', '内容1', '2019-09-10 00:11:39', '类型1', '63', '2', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_organization
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_organization`;
+CREATE TABLE `jsh_organization` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `org_no` varchar(20) DEFAULT NULL COMMENT '机构编号',
+  `org_abr` varchar(20) DEFAULT NULL COMMENT '机构简称',
+  `parent_id` bigint(20) DEFAULT NULL COMMENT '父机构id',
+  `sort` varchar(20) DEFAULT NULL COMMENT '机构显示顺序',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COMMENT='机构表';
+
+-- ----------------------------
+-- Records of jsh_organization
+-- ----------------------------
+INSERT INTO `jsh_organization` VALUES ('12', '001', '测试机构', null, '2', 'aaaa2', '2019-12-28 12:13:01', '2019-12-28 12:13:01', '63', '0');
+INSERT INTO `jsh_organization` VALUES ('13', 'jg1', '机构1', '12', '3', '', '2020-07-21 00:09:57', '2020-07-21 00:10:22', '63', '0');
+INSERT INTO `jsh_organization` VALUES ('14', '12', '机构2', '13', '4', '', '2020-07-21 22:45:42', '2021-02-15 22:18:30', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_orga_user_rel
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_orga_user_rel`;
+CREATE TABLE `jsh_orga_user_rel` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `orga_id` bigint(20) NOT NULL COMMENT '机构id',
+  `user_id` bigint(20) NOT NULL COMMENT '用户id',
+  `user_blng_orga_dspl_seq` varchar(20) DEFAULT NULL COMMENT '用户在所属机构中显示顺序',
+  `delete_flag` char(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `creator` bigint(20) DEFAULT NULL COMMENT '创建人',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `updater` bigint(20) DEFAULT NULL COMMENT '更新人',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='机构用户关系表';
+
+-- ----------------------------
+-- Records of jsh_orga_user_rel
+-- ----------------------------
+INSERT INTO `jsh_orga_user_rel` VALUES ('10', '13', '131', '2', '0', '2019-12-28 12:13:15', '63', '2021-03-18 22:33:19', '63', '63');
+INSERT INTO `jsh_orga_user_rel` VALUES ('11', '12', '63', '15', '0', '2020-09-13 18:42:45', '63', '2021-03-19 00:11:40', '63', '63');
+INSERT INTO `jsh_orga_user_rel` VALUES ('12', '13', '135', '9', '0', '2021-03-18 22:24:25', '63', '2021-03-19 00:09:23', '63', '63');
+INSERT INTO `jsh_orga_user_rel` VALUES ('13', '13', '134', '1', '0', '2021-03-18 22:31:39', '63', '2021-03-18 23:59:55', '63', '63');
+INSERT INTO `jsh_orga_user_rel` VALUES ('14', '22', '133', '22', '0', '2021-03-18 22:31:44', '63', '2021-03-18 22:32:04', '63', '63');
+INSERT INTO `jsh_orga_user_rel` VALUES ('15', '12', '144', null, '0', '2021-03-19 00:00:40', '63', '2021-03-19 00:08:07', '63', '63');
+INSERT INTO `jsh_orga_user_rel` VALUES ('16', '12', '145', null, '0', '2021-03-19 00:03:44', '63', '2021-03-19 00:03:44', '63', '63');
+
+-- ----------------------------
+-- Table structure for jsh_person
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_person`;
+CREATE TABLE `jsh_person` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `type` varchar(20) DEFAULT NULL COMMENT '类型',
+  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `sort` varchar(10) DEFAULT NULL COMMENT '排序',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COMMENT='经手人表';
+
+-- ----------------------------
+-- Records of jsh_person
+-- ----------------------------
+INSERT INTO `jsh_person` VALUES ('14', '销售员', '小李', '', null, '63', '0');
+INSERT INTO `jsh_person` VALUES ('15', '仓管员', '小军', '', null, '63', '0');
+INSERT INTO `jsh_person` VALUES ('16', '财务员', '小夏', '', null, '63', '0');
+INSERT INTO `jsh_person` VALUES ('17', '财务员', '小曹', '', null, '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_platform_config
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_platform_config`;
+CREATE TABLE `jsh_platform_config` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `platform_key` varchar(100) DEFAULT NULL COMMENT '关键词',
+  `platform_key_info` varchar(100) DEFAULT NULL COMMENT '关键词名称',
+  `platform_value` varchar(200) DEFAULT NULL COMMENT '值',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='平台参数';
+
+-- ----------------------------
+-- Records of jsh_platform_config
+-- ----------------------------
+INSERT INTO `jsh_platform_config` VALUES ('1', 'platform_name', '平台名称', '云游管理系统');
+INSERT INTO `jsh_platform_config` VALUES ('2', 'activation_code', '激活码', '');
+INSERT INTO `jsh_platform_config` VALUES ('3', 'platform_url', '官方网站', 'http://www.gyjerp.com/');
+INSERT INTO `jsh_platform_config` VALUES ('4', 'bill_print_flag', '三联打印启用标记', '0');
+INSERT INTO `jsh_platform_config` VALUES ('5', 'bill_print_url', '三联打印地址', '');
+INSERT INTO `jsh_platform_config` VALUES ('6', 'pay_fee_url', '租户续费地址', '');
+INSERT INTO `jsh_platform_config` VALUES ('7', 'register_flag', '注册启用标记', '1');
+INSERT INTO `jsh_platform_config` VALUES ('8', 'app_activation_code', '手机端激活码', '');
+INSERT INTO `jsh_platform_config` VALUES ('9', 'send_workflow_url', '发起流程地址', '');
+INSERT INTO `jsh_platform_config` VALUES ('10', 'weixinUrl', '微信url', '');
+INSERT INTO `jsh_platform_config` VALUES ('11', 'weixinAppid', '微信appid', '');
+INSERT INTO `jsh_platform_config` VALUES ('12', 'weixinSecret', '微信secret', '');
+INSERT INTO `jsh_platform_config` VALUES ('13', 'aliOss_endpoint', '阿里OSS-endpoint', '');
+INSERT INTO `jsh_platform_config` VALUES ('14', 'aliOss_accessKeyId', '阿里OSS-accessKeyId', '');
+INSERT INTO `jsh_platform_config` VALUES ('15', 'aliOss_accessKeySecret', '阿里OSS-accessKeySecret', '');
+INSERT INTO `jsh_platform_config` VALUES ('16', 'aliOss_bucketName', '阿里OSS-bucketName', '');
+INSERT INTO `jsh_platform_config` VALUES ('17', 'aliOss_linkUrl', '阿里OSS-linkUrl', '');
+INSERT INTO `jsh_platform_config` VALUES ('18', 'bill_excel_url', '单据Excel地址', '');
+
+-- ----------------------------
+-- Table structure for jsh_role
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_role`;
+CREATE TABLE `jsh_role` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `name` varchar(50) DEFAULT NULL COMMENT '名称',
+  `type` varchar(50) DEFAULT NULL COMMENT '类型',
+  `price_limit` varchar(50) DEFAULT NULL COMMENT '价格屏蔽 1-屏蔽采购价 2-屏蔽零售价 3-屏蔽销售价',
+  `value` varchar(200) DEFAULT NULL COMMENT '值',
+  `description` varchar(100) DEFAULT NULL COMMENT '描述',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `sort` varchar(10) DEFAULT NULL COMMENT '排序',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='角色表';
+
+-- ----------------------------
+-- Records of jsh_role
+-- ----------------------------
+INSERT INTO `jsh_role` VALUES ('4', '管理员', '全部数据', null, null, null, '', null, null, '0');
+INSERT INTO `jsh_role` VALUES ('10', '租户', '全部数据', null, null, '', '', null, null, '0');
+INSERT INTO `jsh_role` VALUES ('16', '销售经理', '全部数据', null, null, 'ddd', '', null, '63', '0');
+INSERT INTO `jsh_role` VALUES ('17', '销售代表', '个人数据', null, null, 'rrr', '', null, '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_sequence
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_sequence`;
+CREATE TABLE `jsh_sequence` (
+  `seq_name` varchar(50) NOT NULL COMMENT '序列名称',
+  `min_value` bigint(20) NOT NULL COMMENT '最小值',
+  `max_value` bigint(20) NOT NULL COMMENT '最大值',
+  `current_val` bigint(20) NOT NULL COMMENT '当前值',
+  `increment_val` int(11) NOT NULL DEFAULT '1' COMMENT '增长步数',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`seq_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='单据编号表';
+
+-- ----------------------------
+-- Records of jsh_sequence
+-- ----------------------------
+INSERT INTO `jsh_sequence` VALUES ('depot_number_seq', '1', '999999999999999999', '672', '1', '单据编号sequence');
+
+-- ----------------------------
+-- Table structure for jsh_serial_number
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_serial_number`;
+CREATE TABLE `jsh_serial_number` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `material_id` bigint(20) DEFAULT NULL COMMENT '产品表id',
+  `depot_id` bigint(20) DEFAULT NULL COMMENT '仓库id',
+  `serial_number` varchar(64) DEFAULT NULL COMMENT '序列号',
+  `is_sell` varchar(1) DEFAULT '0' COMMENT '是否卖出,0未卖出,1卖出',
+  `in_price` decimal(24,6) DEFAULT NULL COMMENT '入库单价',
+  `remark` varchar(1024) DEFAULT NULL COMMENT '备注',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `creator` bigint(20) DEFAULT NULL COMMENT '创建人',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `updater` bigint(20) DEFAULT NULL COMMENT '更新人',
+  `in_bill_no` varchar(50) DEFAULT NULL COMMENT '入库单号',
+  `out_bill_no` varchar(50) DEFAULT NULL COMMENT '出库单号',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8 COMMENT='序列号表';
+
+-- ----------------------------
+-- Records of jsh_serial_number
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for jsh_supplier
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_supplier`;
+CREATE TABLE `jsh_supplier` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `supplier` varchar(255) NOT NULL COMMENT '供应商名称',
+  `contacts` varchar(100) DEFAULT NULL COMMENT '联系人',
+  `phone_num` varchar(30) DEFAULT NULL COMMENT '联系电话',
+  `email` varchar(50) DEFAULT NULL COMMENT '电子邮箱',
+  `description` varchar(500) DEFAULT NULL COMMENT '备注',
+  `isystem` tinyint(4) DEFAULT NULL COMMENT '是否系统自带 0==系统 1==非系统',
+  `type` varchar(20) DEFAULT NULL COMMENT '类型',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `advance_in` decimal(24,6) DEFAULT '0.000000' COMMENT '预收款',
+  `begin_need_get` decimal(24,6) DEFAULT NULL COMMENT '期初应收',
+  `begin_need_pay` decimal(24,6) DEFAULT NULL COMMENT '期初应付',
+  `all_need_get` decimal(24,6) DEFAULT NULL COMMENT '累计应收',
+  `all_need_pay` decimal(24,6) DEFAULT NULL COMMENT '累计应付',
+  `fax` varchar(30) DEFAULT NULL COMMENT '传真',
+  `telephone` varchar(30) DEFAULT NULL COMMENT '手机',
+  `address` varchar(50) DEFAULT NULL COMMENT '地址',
+  `tax_num` varchar(50) DEFAULT NULL COMMENT '纳税人识别号',
+  `bank_name` varchar(50) DEFAULT NULL COMMENT '开户行',
+  `account_number` varchar(50) DEFAULT NULL COMMENT '账号',
+  `tax_rate` decimal(24,6) DEFAULT NULL COMMENT '税率',
+  `sort` varchar(10) DEFAULT NULL COMMENT '排序',
+  `creator` bigint(20) DEFAULT NULL COMMENT '操作员',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8 COMMENT='供应商/客户信息表';
+
+-- ----------------------------
+-- Records of jsh_supplier
+-- ----------------------------
+INSERT INTO `jsh_supplier` VALUES ('57', '供应商1', '小军', '12345678', '', '', null, '供应商', '', '0.000000', '0.000000', '0.000000', '0.000000', '4.000000', '', '15000000000', '地址1', '', '', '', '12.000000', null, '63', '63', '0');
+INSERT INTO `jsh_supplier` VALUES ('58', '客户1', '小李', '12345678', '', '', null, '客户', '', '0.000000', '0.000000', '0.000000', '-100.000000', null, '', '', '', '', '', '', '12.000000', null, '63', '63', '0');
+INSERT INTO `jsh_supplier` VALUES ('59', '客户2', '小陈', '', '', '', null, '客户', '', '0.000000', '0.000000', '0.000000', '0.000000', null, '', '', '', '', '', '', null, null, '63', '63', '0');
+INSERT INTO `jsh_supplier` VALUES ('60', '12312666', '小曹', '', '', '', null, '会员', '', '970.000000', '0.000000', '0.000000', null, null, '', '13000000000', '', '', '', '', null, null, '63', '63', '0');
+INSERT INTO `jsh_supplier` VALUES ('68', '供应商3', '晓丽', '12345678', '', 'fasdfadf', null, '供应商', '', '0.000000', '0.000000', '0.000000', '0.000000', '-35.000000', '', '13000000000', 'aaaa', '1341324', '', '', '13.000000', null, '63', '63', '0');
+INSERT INTO `jsh_supplier` VALUES ('71', '客户3', '小周', '', '', '', null, '客户', '', '0.000000', '0.000000', '0.000000', '0.000000', null, '', '', '', '', '', '', null, null, '63', '63', '0');
+INSERT INTO `jsh_supplier` VALUES ('74', '供应商5', '小季', '77779999', '', '', null, '供应商', '', '0.000000', '0.000000', '5.000000', '0.000000', '5.000000', '', '15806283912', '', '', '', '', '3.000000', null, '63', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_system_config
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_system_config`;
+CREATE TABLE `jsh_system_config` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `company_name` varchar(50) DEFAULT NULL COMMENT '公司名称',
+  `company_contacts` varchar(20) DEFAULT NULL COMMENT '公司联系人',
+  `company_address` varchar(50) DEFAULT NULL COMMENT '公司地址',
+  `company_tel` varchar(20) DEFAULT NULL COMMENT '公司电话',
+  `company_fax` varchar(20) DEFAULT NULL COMMENT '公司传真',
+  `company_post_code` varchar(20) DEFAULT NULL COMMENT '公司邮编',
+  `sale_agreement` varchar(500) DEFAULT NULL COMMENT '销售协议',
+  `depot_flag` varchar(1) DEFAULT '0' COMMENT '仓库启用标记,0未启用,1启用',
+  `customer_flag` varchar(1) DEFAULT '0' COMMENT '客户启用标记,0未启用,1启用',
+  `minus_stock_flag` varchar(1) DEFAULT '0' COMMENT '负库存启用标记,0未启用,1启用',
+  `purchase_by_sale_flag` varchar(1) DEFAULT '0' COMMENT '以销定购启用标记,0未启用,1启用',
+  `multi_level_approval_flag` varchar(1) DEFAULT '0' COMMENT '多级审核启用标记,0未启用,1启用',
+  `multi_bill_type` varchar(200) DEFAULT NULL COMMENT '流程类型,可多选',
+  `force_approval_flag` varchar(1) DEFAULT '0' COMMENT '强审核启用标记,0未启用,1启用',
+  `update_unit_price_flag` varchar(1) DEFAULT '1' COMMENT '更新单价启用标记,0未启用,1启用',
+  `over_link_bill_flag` varchar(1) DEFAULT '0' COMMENT '超出关联单据启用标记,0未启用,1启用',
+  `in_out_manage_flag` varchar(1) DEFAULT '0' COMMENT '出入库管理启用标记,0未启用,1启用',
+  `multi_account_flag` varchar(1) DEFAULT '0' COMMENT '多账户启用标记,0未启用,1启用',
+  `move_avg_price_flag` varchar(1) DEFAULT '0' COMMENT '移动平均价启用标记,0未启用,1启用',
+  `audit_print_flag` varchar(1) DEFAULT '0' COMMENT '先审核后打印启用标记,0未启用,1启用',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='系统参数';
+
+-- ----------------------------
+-- Records of jsh_system_config
+-- ----------------------------
+INSERT INTO `jsh_system_config` VALUES ('11', '公司test', '小李', '地址1', '12345678', null, null, '注:本单为我公司与客户约定账期内结款的依据,由客户或其单位员工签字生效,并承担法律责任。', '0', '0', '1', '0', '0', '', '0', '1', '0', '0', '0', '0', '0', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_tenant
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_tenant`;
+CREATE TABLE `jsh_tenant` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '用户id',
+  `login_name` varchar(255) DEFAULT NULL COMMENT '登录名',
+  `user_num_limit` int(11) DEFAULT NULL COMMENT '用户数量限制',
+  `type` varchar(1) DEFAULT '0' COMMENT '租户类型,0免费租户,1付费租户',
+  `enabled` bit(1) DEFAULT b'1' COMMENT '启用 0-禁用  1-启用',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `expire_time` datetime DEFAULT NULL COMMENT '到期时间',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='租户';
+
+-- ----------------------------
+-- Records of jsh_tenant
+-- ----------------------------
+INSERT INTO `jsh_tenant` VALUES ('13', '63', 'jsh', '2000', '1', '', '2021-02-17 23:19:17', '2099-02-17 23:19:17', null, '0');
+
+-- ----------------------------
+-- Table structure for jsh_unit
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_unit`;
+CREATE TABLE `jsh_unit` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `name` varchar(50) DEFAULT NULL COMMENT '名称,支持多单位',
+  `basic_unit` varchar(50) DEFAULT NULL COMMENT '基础单位',
+  `other_unit` varchar(50) DEFAULT NULL COMMENT '副单位',
+  `other_unit_two` varchar(50) DEFAULT NULL COMMENT '副单位2',
+  `other_unit_three` varchar(50) DEFAULT NULL COMMENT '副单位3',
+  `ratio` decimal(24,3) DEFAULT NULL COMMENT '比例',
+  `ratio_two` decimal(24,3) DEFAULT NULL COMMENT '比例2',
+  `ratio_three` decimal(24,3) DEFAULT NULL COMMENT '比例3',
+  `enabled` bit(1) DEFAULT NULL COMMENT '启用',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 COMMENT='多单位表';
+
+-- ----------------------------
+-- Records of jsh_unit
+-- ----------------------------
+INSERT INTO `jsh_unit` VALUES ('15', '个/(箱=12个)', '个', '箱', null, null, '12.000', null, null, '', '63', '0');
+INSERT INTO `jsh_unit` VALUES ('19', '个/(盒=15个)', '个', '盒', null, null, '15.000', null, null, '', '63', '0');
+INSERT INTO `jsh_unit` VALUES ('20', '盒/(箱=8盒)', '盒', '箱', null, null, '8.000', null, null, '', '63', '0');
+INSERT INTO `jsh_unit` VALUES ('21', '瓶/(箱=12瓶)', '瓶', '箱', null, null, '12.000', null, null, '', '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_user
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_user`;
+CREATE TABLE `jsh_user` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `username` varchar(255) NOT NULL COMMENT '用户姓名--例如张三',
+  `login_name` varchar(255) NOT NULL COMMENT '登录用户名',
+  `password` varchar(50) DEFAULT NULL COMMENT '登陆密码',
+  `leader_flag` varchar(1) DEFAULT '0' COMMENT '是否经理,0否,1是',
+  `position` varchar(200) DEFAULT NULL COMMENT '职位',
+  `department` varchar(255) DEFAULT NULL COMMENT '所属部门',
+  `email` varchar(100) DEFAULT NULL COMMENT '电子邮箱',
+  `phonenum` varchar(100) DEFAULT NULL COMMENT '手机号码',
+  `ismanager` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否为管理者 0==管理者 1==员工',
+  `isystem` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否系统自带数据 ',
+  `status` tinyint(4) DEFAULT '0' COMMENT '状态,0正常,2封禁',
+  `description` varchar(500) DEFAULT NULL COMMENT '用户描述信息',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `weixin_open_id` varchar(100) DEFAULT NULL COMMENT '微信绑定',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=146 DEFAULT CHARSET=utf8 COMMENT='用户表';
+
+-- ----------------------------
+-- Records of jsh_user
+-- ----------------------------
+INSERT INTO `jsh_user` VALUES ('63', '测试用户', 'jsh', 'e10adc3949ba59abbe56e057f20f883e', '0', '主管', null, '666666@qq.com', '1123123123132', '1', '1', '0', '', null, null, '63', '0');
+INSERT INTO `jsh_user` VALUES ('120', '管理员', 'admin', 'e10adc3949ba59abbe56e057f20f883e', '0', null, null, null, null, '1', '0', '0', null, null, null, '0', '0');
+INSERT INTO `jsh_user` VALUES ('131', 'test123', 'test123', 'e10adc3949ba59abbe56e057f20f883e', '0', '总监', null, '7777777@qq.com', '', '1', '0', '0', '', null, null, '63', '0');
+
+-- ----------------------------
+-- Table structure for jsh_user_business
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_user_business`;
+CREATE TABLE `jsh_user_business` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `type` varchar(50) DEFAULT NULL COMMENT '类别',
+  `key_id` varchar(50) DEFAULT NULL COMMENT '主id',
+  `value` varchar(10000) DEFAULT NULL COMMENT '值',
+  `btn_str` varchar(2000) DEFAULT NULL COMMENT '按钮权限',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=83 DEFAULT CHARSET=utf8 COMMENT='用户/角色/模块关系表';
+
+-- ----------------------------
+-- Records of jsh_user_business
+-- ----------------------------
+INSERT INTO `jsh_user_business` VALUES ('5', 'RoleFunctions', '4', '[210][225][211][241][33][199][242][38][41][200][201][239][202][40][232][233][197][44][203][204][205][206][212][246][198][207][259][208][209][226][227][248][228][229][59][235][237][244][22][21][23][220][247][25][24][217][218][26][194][195][31][13][1][14][243][15][234][16][18][236][245][258][261][32]', '[{\"funId\":13,\"btnStr\":\"1\"},{\"funId\":14,\"btnStr\":\"1\"},{\"funId\":243,\"btnStr\":\"1\"},{\"funId\":234,\"btnStr\":\"1\"},{\"funId\":16,\"btnStr\":\"1\"},{\"funId\":18,\"btnStr\":\"1\"},{\"funId\":236,\"btnStr\":\"1\"},{\"funId\":245,\"btnStr\":\"1\"},{\"funId\":22,\"btnStr\":\"1\"},{\"funId\":23,\"btnStr\":\"1,3\"},{\"funId\":220,\"btnStr\":\"1\"},{\"funId\":247,\"btnStr\":\"1\"},{\"funId\":25,\"btnStr\":\"1,3\"},{\"funId\":217,\"btnStr\":\"1,3\"},{\"funId\":218,\"btnStr\":\"1,3\"},{\"funId\":26,\"btnStr\":\"1\"},{\"funId\":194,\"btnStr\":\"1\"},{\"funId\":195,\"btnStr\":\"1\"},{\"funId\":31,\"btnStr\":\"1\"},{\"funId\":261,\"btnStr\":\"1,2,7,3\"},{\"funId\":241,\"btnStr\":\"1,2,7,3\"},{\"funId\":33,\"btnStr\":\"1,2,7,3\"},{\"funId\":199,\"btnStr\":\"1,2,7,3\"},{\"funId\":242,\"btnStr\":\"1,2,7,3\"},{\"funId\":41,\"btnStr\":\"1,2,7,3\"},{\"funId\":200,\"btnStr\":\"1,2,7,3\"},{\"funId\":210,\"btnStr\":\"1,2,7,3\"},{\"funId\":211,\"btnStr\":\"1,2,7,3\"},{\"funId\":197,\"btnStr\":\"1,7,2,3\"},{\"funId\":203,\"btnStr\":\"1,7,2,3\"},{\"funId\":204,\"btnStr\":\"1,7,2,3\"},{\"funId\":205,\"btnStr\":\"1,7,2,3\"},{\"funId\":206,\"btnStr\":\"1,2,7,3\"},{\"funId\":212,\"btnStr\":\"1,7,2,3\"},{\"funId\":201,\"btnStr\":\"1,2,7,3\"},{\"funId\":202,\"btnStr\":\"1,2,7,3\"},{\"funId\":40,\"btnStr\":\"1,2,7,3\"},{\"funId\":232,\"btnStr\":\"1,2,7,3\"},{\"funId\":233,\"btnStr\":\"1,2,7,3\"}]', null, '0');
+INSERT INTO `jsh_user_business` VALUES ('6', 'RoleFunctions', '5', '[22][23][25][26][194][195][31][33][200][201][41][199][202]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('7', 'RoleFunctions', '6', '[22][23][220][240][25][217][218][26][194][195][31][59][207][208][209][226][227][228][229][235][237][210][211][241][33][199][242][41][200][201][202][40][232][233][197][203][204][205][206][212]', '[{\"funId\":\"33\",\"btnStr\":\"4\"}]', null, '0');
+INSERT INTO `jsh_user_business` VALUES ('9', 'RoleFunctions', '7', '[168][13][12][16][14][15][189][18][19][132]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('10', 'RoleFunctions', '8', '[168][13][12][16][14][15][189][18][19][132][22][23][25][26][27][157][158][155][156][125][31][127][126][128][33][34][35][36][37][39][40][41][42][43][46][47][48][49][50][51][52][53][54][55][56][57][192][59][60][61][62][63][65][66][68][69][70][71][73][74][76][77][79][191][81][82][83][85][89][161][86][176][165][160][28][134][91][92][29][94][95][97][104][99][100][101][102][105][107][108][110][111][113][114][116][117][118][120][121][131][135][123][122][20][130][146][147][138][148][149][153][140][145][184][152][143][170][171][169][166][167][163][164][172][173][179][178][181][182][183][186][187][247]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('11', 'RoleFunctions', '9', '[168][13][12][16][14][15][189][18][19][132][22][23][25][26][27][157][158][155][156][125][31][127][126][128][33][34][35][36][37][39][40][41][42][43][46][47][48][49][50][51][52][53][54][55][56][57][192][59][60][61][62][63][65][66][68][69][70][71][73][74][76][77][79][191][81][82][83][85][89][161][86][176][165][160][28][134][91][92][29][94][95][97][104][99][100][101][102][105][107][108][110][111][113][114][116][117][118][120][121][131][135][123][122][20][130][146][147][138][148][149][153][140][145][184][152][143][170][171][169][166][167][163][164][172][173][179][178][181][182][183][186][187][188]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('12', 'UserRole', '1', '[5]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('13', 'UserRole', '2', '[6][7]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('14', 'UserDepot', '2', '[1][2][6][7]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('15', 'UserDepot', '1', '[1][2][5][6][7][10][12][14][15][17]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('16', 'UserRole', '63', '[10]', null, '63', '0');
+INSERT INTO `jsh_user_business` VALUES ('18', 'UserDepot', '63', '[14][15]', null, '63', '0');
+INSERT INTO `jsh_user_business` VALUES ('19', 'UserDepot', '5', '[6][45][46][50]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('20', 'UserRole', '5', '[5]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('21', 'UserRole', '64', '[13]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('22', 'UserDepot', '64', '[1]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('23', 'UserRole', '65', '[5]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('24', 'UserDepot', '65', '[1]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('25', 'UserCustomer', '64', '[5][2]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('26', 'UserCustomer', '65', '[6]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('27', 'UserCustomer', '63', '[58]', null, '63', '0');
+INSERT INTO `jsh_user_business` VALUES ('28', 'UserDepot', '96', '[7]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('29', 'UserRole', '96', '[6]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('30', 'UserRole', '113', '[10]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('32', 'RoleFunctions', '10', '[210][225][211][241][33][199][242][38][41][200][201][239][202][40][232][233][197][44][203][204][205][206][212][246][198][207][259][208][209][226][227][248][228][229][59][235][237][244][22][21][23][220][247][25][24][217][218][26][194][195][31][13][14][243][15][234][261][32]', '[{\"funId\":13,\"btnStr\":\"1\"},{\"funId\":14,\"btnStr\":\"1\"},{\"funId\":243,\"btnStr\":\"1\"},{\"funId\":234,\"btnStr\":\"1\"},{\"funId\":22,\"btnStr\":\"1\"},{\"funId\":23,\"btnStr\":\"1,3\"},{\"funId\":220,\"btnStr\":\"1\"},{\"funId\":247,\"btnStr\":\"1\"},{\"funId\":25,\"btnStr\":\"1,3\"},{\"funId\":217,\"btnStr\":\"1,3\"},{\"funId\":218,\"btnStr\":\"1,3\"},{\"funId\":26,\"btnStr\":\"1\"},{\"funId\":194,\"btnStr\":\"1\"},{\"funId\":195,\"btnStr\":\"1\"},{\"funId\":31,\"btnStr\":\"1\"},{\"funId\":261,\"btnStr\":\"1,2,7,3\"},{\"funId\":241,\"btnStr\":\"1,2,7,3\"},{\"funId\":33,\"btnStr\":\"1,2,7,3\"},{\"funId\":199,\"btnStr\":\"1,7,2,3\"},{\"funId\":242,\"btnStr\":\"1,2,7,3\"},{\"funId\":41,\"btnStr\":\"1,2,7,3\"},{\"funId\":200,\"btnStr\":\"1,2,7,3\"},{\"funId\":210,\"btnStr\":\"1,2,7,3\"},{\"funId\":211,\"btnStr\":\"1,2,7,3\"},{\"funId\":197,\"btnStr\":\"1,2,7,3\"},{\"funId\":203,\"btnStr\":\"1,7,2,3\"},{\"funId\":204,\"btnStr\":\"1,7,2,3\"},{\"funId\":205,\"btnStr\":\"1,2,7,3\"},{\"funId\":206,\"btnStr\":\"1,7,2,3\"},{\"funId\":212,\"btnStr\":\"1,2,7,3\"},{\"funId\":201,\"btnStr\":\"1,2,7,3\"},{\"funId\":202,\"btnStr\":\"1,2,7,3\"},{\"funId\":40,\"btnStr\":\"1,2,7,3\"},{\"funId\":232,\"btnStr\":\"1,2,7,3\"},{\"funId\":233,\"btnStr\":\"1,2,7,3\"}]', null, '0');
+INSERT INTO `jsh_user_business` VALUES ('34', 'UserRole', '115', '[10]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('35', 'UserRole', '117', '[10]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('36', 'UserDepot', '117', '[8][9]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('37', 'UserCustomer', '117', '[52]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('38', 'UserRole', '120', '[4]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('41', 'RoleFunctions', '12', '', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('48', 'RoleFunctions', '13', '[59][207][208][209][226][227][228][229][235][237][210][211][241][33][199][242][41][200]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('51', 'UserRole', '74', '[10]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('52', 'UserDepot', '121', '[13]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('54', 'UserDepot', '115', '[13]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('56', 'UserCustomer', '115', '[56]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('57', 'UserCustomer', '121', '[56]', null, null, '0');
+INSERT INTO `jsh_user_business` VALUES ('67', 'UserRole', '131', '[17]', null, '63', '0');
+INSERT INTO `jsh_user_business` VALUES ('68', 'RoleFunctions', '16', '[210]', null, '63', '0');
+INSERT INTO `jsh_user_business` VALUES ('69', 'RoleFunctions', '17', '[210][225][211][241][32][33][199][242][38][41][200][201][239][202][40][232][233][197][44][203][204][205][206][212]', '[{\"funId\":\"241\",\"btnStr\":\"1,2\"},{\"funId\":\"33\",\"btnStr\":\"1,2\"},{\"funId\":\"199\",\"btnStr\":\"1,2\"},{\"funId\":\"242\",\"btnStr\":\"1,2\"},{\"funId\":\"41\",\"btnStr\":\"1,2\"},{\"funId\":\"200\",\"btnStr\":\"1,2\"},{\"funId\":\"210\",\"btnStr\":\"1,2\"},{\"funId\":\"211\",\"btnStr\":\"1,2\"},{\"funId\":\"197\",\"btnStr\":\"1\"},{\"funId\":\"203\",\"btnStr\":\"1\"},{\"funId\":\"204\",\"btnStr\":\"1\"},{\"funId\":\"205\",\"btnStr\":\"1\"},{\"funId\":\"206\",\"btnStr\":\"1\"},{\"funId\":\"212\",\"btnStr\":\"1\"},{\"funId\":\"201\",\"btnStr\":\"1,2\"},{\"funId\":\"202\",\"btnStr\":\"1,2\"},{\"funId\":\"40\",\"btnStr\":\"1,2\"},{\"funId\":\"232\",\"btnStr\":\"1,2\"},{\"funId\":\"233\",\"btnStr\":\"1,2\"}]', '63', '0');
diff --git "a/docs/\344\272\221\346\270\270\347\256\241\347\220\206\347\263\273\347\273\237\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\261\207\346\200\273.xlsx" "b/docs/\344\272\221\346\270\270\347\256\241\347\220\206\347\263\273\347\273\237\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\261\207\346\200\273.xlsx"
new file mode 100644
index 0000000..f4d85af
--- /dev/null
+++ "b/docs/\344\272\221\346\270\270\347\256\241\347\220\206\347\263\273\347\273\237\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\261\207\346\200\273.xlsx"
Binary files differ
diff --git "a/docs/\346\225\260\346\215\256\345\272\223\346\233\264\346\226\260\350\256\260\345\275\225-\351\246\226\346\254\241\345\256\211\350\243\205\350\257\267\345\213\277\344\275\277\347\224\250.txt" "b/docs/\346\225\260\346\215\256\345\272\223\346\233\264\346\226\260\350\256\260\345\275\225-\351\246\226\346\254\241\345\256\211\350\243\205\350\257\267\345\213\277\344\275\277\347\224\250.txt"
new file mode 100644
index 0000000..ef8b8d1
--- /dev/null
+++ "b/docs/\346\225\260\346\215\256\345\272\223\346\233\264\346\226\260\350\256\260\345\275\225-\351\246\226\346\254\241\345\256\211\350\243\205\350\257\267\345\213\277\344\275\277\347\224\250.txt"
@@ -0,0 +1,1631 @@
+---------------------------------------------------------------------------------------------------
+****注意第一次初始化数据库不需要执行下面的内容,该文档会随着代码更新持续更新,方便大家手动升级数据库****
+****注意第一次初始化数据库不需要执行下面的内容,该文档会随着代码更新持续更新,方便大家手动升级数据库****
+****注意第一次初始化数据库不需要执行下面的内容,该文档会随着代码更新持续更新,方便大家手动升级数据库****
+---------------------------------------------------------------------------------------------------
+
+
+-- ----------------------------
+-- 时间:2019年1月21日
+-- version:1.0.0
+-- 此次更新添加序列号功能
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+
+-- ----------------------------
+-- 添加序列号表
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_serial_number`;
+CREATE TABLE `jsh_serial_number` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `material_Id` bigint(20) DEFAULT NULL COMMENT '产品表id',
+  `serial_Number` varchar(64) DEFAULT NULL COMMENT '序列号',
+  `is_Sell` bit(1) DEFAULT 0 COMMENT '是否卖出,0未卖出,1卖出',
+  `remark` varchar(1024) DEFAULT NULL COMMENT '备注',
+  `delete_Flag` bit(1) DEFAULT 0 COMMENT '删除标记,0未删除,1删除',
+  `create_Time` datetime DEFAULT NULL COMMENT '创建时间',
+  `creator` bigint(20) DEFAULT NULL COMMENT '创建人',
+  `update_Time` datetime DEFAULT NULL COMMENT '更新时间',
+  `updater` bigint(20) DEFAULT NULL COMMENT '更新人',
+  PRIMARY KEY (`Id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='序列号表';
+
+-- ----------------------------
+-- 产品表新增字段是否启用序列号
+-- ----------------------------
+alter table jsh_material add enableSerialNumber bit(1) DEFAULT 0 COMMENT '是否开启序列号,0否,1是';
+-- ----------------------------
+-- 时间:2019年1月24日
+-- version:1.0.1
+-- 此次更新添加序列号菜单
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+-- ----------------------------
+-- 添加序列号菜单
+-- ----------------------------
+delete from `jsh_functions` where Name='序列号';
+INSERT INTO `jsh_functions`(`Number`, `Name`, `PNumber`, `URL`, `State`, `Sort`, `Enabled`, `Type`, `PushBtn`) VALUES ('010104', '序列号', '0101', '../manage/serialNumber.html', b'0', '0246', b'1', '电脑版', '');
+-- ----------------------------
+-- 删除单据主表供应商id字段对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_depot_head DROP FOREIGN KEY jsh_depot_head_ibfk_3;
+-- ----------------------------
+-- 序列号表添加单据主表id字段,用于跟踪序列号流向
+-- ----------------------------
+alter table jsh_serial_number add depothead_Id bigint(20) DEFAULT null COMMENT '单据主表id,用于跟踪序列号流向';
+-- ----------------------------
+-- 修改商品表enableSerialNumber字段类型为varchar(1)
+-- ----------------------------
+alter table jsh_material change enableSerialNumber enableSerialNumber varchar(1) DEFAULT '0' COMMENT '是否开启序列号,0否,1是';
+-- ----------------------------
+-- 修改序列号表is_Sell字段类型为varchar(1)
+-- 修改序列号表delete_Flag字段类型为varchar(1)
+-- ----------------------------
+alter table jsh_serial_number change is_Sell is_Sell varchar(1) DEFAULT '0' COMMENT '是否卖出,0未卖出,1卖出';
+alter table jsh_serial_number change delete_Flag delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- ----------------------------
+-- 删除单据子表单据主表id字段对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_depot_item DROP FOREIGN KEY jsh_depot_item_ibfk_1;
+-- ----------------------------
+-- 时间:2019年2月1日
+-- version:1.0.2
+-- 此次更新添加sequence表,用于获取一个唯一的数值
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+-- ----------------------------
+-- 添加表tbl_sequence
+-- ----------------------------
+DROP TABLE IF EXISTS `tbl_sequence`;
+CREATE TABLE tbl_sequence (
+  seq_name VARCHAR(50) NOT NULL COMMENT '序列名称',
+  min_value bigint(20) NOT NULL COMMENT '最小值',
+  max_value bigint(20) NOT NULL COMMENT '最大值',
+  current_val bigint(20) NOT NULL COMMENT '当前值',
+  increment_val INT DEFAULT '1' NOT NULL COMMENT '增长步数',
+  remark VARCHAR(500) DEFAULT null  COMMENT '备注',
+  PRIMARY KEY (seq_name)
+  )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='sequence表';
+
+-- ----------------------------
+-- 添加表单据编号sequence
+-- 插入数据前判断,防止数据重复插入
+-- ----------------------------
+insert into tbl_sequence (seq_name, min_value, max_value, current_val, increment_val,remark)
+select 'depot_number_seq', 1, 999999999999999999, 1, 1,'单据编号sequence' from dual where not exists
+(select * from tbl_sequence where  seq_name='depot_number_seq');
+-- ----------------------------
+-- 创建function _nextval() 用于获取当前序列号
+-- ----------------------------
+DROP FUNCTION IF EXISTS `_nextval`;
+DELIMITER ;;
+CREATE FUNCTION `_nextval`(name varchar(50)) RETURNS mediumtext CHARSET utf8
+begin
+declare _cur bigint;
+declare _maxvalue bigint;  -- 接收最大值
+declare _increment int; -- 接收增长步数
+set _increment = (select increment_val from tbl_sequence where seq_name = name);
+set _maxvalue = (select max_value from tbl_sequence where seq_name = name);
+set _cur = (select current_val from tbl_sequence where seq_name = name for update);
+update tbl_sequence                      -- 更新当前值
+ set current_val = _cur + increment_val
+ where seq_name = name ;
+if(_cur + _increment >= _maxvalue) then  -- 判断是都达到最大值
+      update tbl_sequence
+        set current_val = minvalue
+        where seq_name = name ;
+end if;
+return _cur;
+end
+;;
+DELIMITER ;
+
+-- ----------------------------
+-- 时间:2019年2月18日
+-- version:1.0.3
+-- 此次更新修改产品类型表jsh_materialcategory,添加一些字段
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+-- ----------------------------
+-- 产品类型表添加字段sort,显示顺序
+-- ----------------------------
+alter table jsh_materialcategory add sort varchar(10) DEFAULT null COMMENT '显示顺序';
+-- ----------------------------
+-- 产品类型表添加字段status,状态,0系统默认,1启用,2删除
+-- ----------------------------
+alter table jsh_materialcategory add status varchar(1) DEFAULT '0' COMMENT '状态,0系统默认,1启用,2删除';
+-- ----------------------------
+-- 产品类型表添加字段serial_no,编号
+-- ----------------------------
+alter table jsh_materialcategory add serial_no varchar(100) DEFAULT null COMMENT '编号';
+-- ----------------------------
+-- 产品类型表添加字段remark,备注
+-- ----------------------------
+alter table jsh_materialcategory add remark varchar(1024) DEFAULT null COMMENT '备注';
+-- ----------------------------
+-- 产品类型表添加字段create_time,创建时间
+-- ----------------------------
+alter table jsh_materialcategory add create_time datetime DEFAULT null COMMENT '创建时间';
+-- ----------------------------
+-- 产品类型表添加字段creator,创建人
+-- ----------------------------
+alter table jsh_materialcategory add creator bigint(20) DEFAULT null COMMENT '创建人';
+-- ----------------------------
+-- 产品类型表添加字段update_time,更新时间
+-- ----------------------------
+alter table jsh_materialcategory add update_time datetime DEFAULT null COMMENT '更新时间';
+-- ----------------------------
+-- 产品类型表添加字段updater,更新人
+-- ----------------------------
+alter table jsh_materialcategory add updater bigint(20) DEFAULT null COMMENT '更新人';
+
+-- ----------------------------
+-- 去掉jsh_materialcategory外键
+-- ----------------------------
+ALTER TABLE jsh_materialcategory DROP FOREIGN KEY FK3EE7F725237A77D8;
+
+-- ----------------------------
+-- 修改根目录父节点id为-1
+-- 设置根目录编号为1
+-- ----------------------------
+update jsh_materialcategory set ParentId='-1' where id='1';
+
+-- ----------------------------
+-- 删除礼品卡管理、礼品充值、礼品销售、礼品卡统计的功能数据
+-- ----------------------------
+delete from jsh_functions where id in (213,214,215,216);
+
+-- ----------------------------
+-- 新增采购订单、销售订单的功能数据
+-- 主键自增长,直接指定主键插入数据的方式可能会和本地数据冲突
+-- 插入数据前判断,防止数据重复插入
+-- ----------------------------
+insert into `jsh_functions`(`Number`, `Name`, `PNumber`, `URL`, `State`, `Sort`, `Enabled`, `Type`, `PushBtn`)
+select '050202', '采购订单', '0502', '../materials/purchase_orders_list.html', b'0', '0335',b'1', '电脑版', '' from dual where not exists
+(select * from jsh_functions where  Number='050202' and PNumber='0502');
+insert into `jsh_functions`(`Number`, `Name`, `PNumber`, `URL`, `State`, `Sort`, `Enabled`, `Type`, `PushBtn`)
+select '060301', '销售订单', '0603', '../materials/sale_orders_list.html', b'0', '0392', b'1', '电脑版', '' from dual where not exists
+(select * from jsh_functions where  Number='060301' and PNumber='0603');
+
+-- ----------------------------
+-- 改管理员的功能权限
+-- ----------------------------
+update jsh_userbusiness SET Type = 'RoleFunctions', KeyId = '4', 
+Value = '[13][12][16][14][15][234][236][22][23][220][240][25][217][218][26][194][195][31][59][207][208][209][226][227][228][229][235][237][210][211][242][33][199][243][41][200][201][202][40][232][233][197][203][204][205][206][212]' 
+where Id = 5;
+
+-- ----------------------------
+-- 时间:2019年2月25日
+-- version:1.0.4
+-- 此次更新仓库添加负责人信息,负责人信息从用户表获取
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+-- ----------------------------
+-- 仓库表添加字段principal,负责人
+-- ----------------------------
+alter table jsh_depot add principal bigint(20) DEFAULT null COMMENT '负责人';
+
+-- ----------------------------
+-- 时间:2019年3月6日
+-- version:1.0.5
+-- 此次更新
+-- 1、添加机构表
+-- 2、添加机构用户关系表
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+-- ----------------------------
+-- 添加机构表
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_organization`;
+CREATE TABLE `jsh_organization` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `org_no` varchar(20) DEFAULT NULL COMMENT '机构编号',
+  `org_full_name` varchar(500) DEFAULT NULL COMMENT '机构全称',
+  `org_abr` varchar(20) DEFAULT NULL COMMENT '机构简称',
+  `org_tpcd` varchar(9) DEFAULT NULL COMMENT '机构类型',
+  `org_stcd` char(1) DEFAULT NULL COMMENT '机构状态,1未营业、2正常营业、3暂停营业、4终止营业、5已除名',
+  `org_parent_no` varchar(20) DEFAULT NULL COMMENT '机构父节点编号',
+  `sort` varchar(20) DEFAULT NULL COMMENT '机构显示顺序',
+  remark VARCHAR(500) DEFAULT null  COMMENT '备注',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `creator` bigint(20) DEFAULT NULL COMMENT '创建人',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `updater` bigint(20) DEFAULT NULL COMMENT '更新人',
+  `org_create_time` datetime DEFAULT NULL COMMENT '机构创建时间',
+  `org_stop_time` datetime DEFAULT NULL COMMENT '机构停运时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='机构表';
+-- ----------------------------
+-- 添加机构用户关系表
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_orga_user_rel`;
+CREATE TABLE `jsh_orga_user_rel` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `orga_id` bigint(20) NOT NULL  COMMENT '机构id',
+  `user_id` bigint(20) NOT NULL COMMENT '用户id',
+  `user_blng_orga_dspl_seq` varchar(20) DEFAULT NULL COMMENT '用户在所属机构中显示顺序',
+  `delete_flag` char(1) DEFAULT 0 COMMENT '删除标记,0未删除,1删除',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `creator` bigint(20) DEFAULT NULL COMMENT '创建人',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `updater` bigint(20) DEFAULT NULL COMMENT '更新人',
+   PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='机构用户关系表';
+-- ----------------------------
+-- 添加机构管理菜单
+-- 插入数据前判断,防止数据重复插入
+-- ----------------------------
+INSERT INTO `jsh_functions`(`Number`, `Name`, `PNumber`, `URL`, `State`, `Sort`, `Enabled`, `Type`, `PushBtn`)
+select '000108', '机构管理', '0001', '../manage/organization.html', b'1', '0139', b'1', '电脑版', '' from dual where not exists
+(select * from jsh_functions where  Number='000108' and PNumber='0001');
+-- ----------------------------
+-- 添加根机构
+-- 插入时判断对应数据是否存在,防止多次执行产生重复数据
+-- ----------------------------
+INSERT INTO jsh_organization (org_no, org_full_name, org_abr, org_tpcd, org_stcd, org_parent_no, sort, remark, create_time, creator, update_time, updater, org_create_time, org_stop_time)
+select '01', '根机构', '根机构', NULL, '2', '-1', '1', '根机构,初始化存在', NULL, NULL, NULL, NULL, NULL, NULL from dual where not exists
+(select * from jsh_organization where org_no='01' and org_abr='根机构' and org_parent_no='-1'  );
+-- ----------------------------
+-- 时间:2019年3月9日
+-- version:1.0.6
+-- 此次更新
+-- 整改jsh_systemconfig表的字段
+-- ----------------------------
+alter table jsh_systemconfig drop type;
+alter table jsh_systemconfig drop name;
+alter table jsh_systemconfig drop value;
+alter table jsh_systemconfig drop description;
+alter table jsh_systemconfig add company_name varchar(50) DEFAULT null COMMENT '公司名称';
+alter table jsh_systemconfig add company_contacts varchar(20) DEFAULT null COMMENT '公司联系人';
+alter table jsh_systemconfig add company_address varchar(50) DEFAULT null COMMENT '公司地址';
+alter table jsh_systemconfig add company_tel varchar(20) DEFAULT null COMMENT '公司电话';
+alter table jsh_systemconfig add company_fax varchar(20) DEFAULT null COMMENT '公司传真';
+alter table jsh_systemconfig add company_post_code varchar(20) DEFAULT null COMMENT '公司邮编';
+delete from jsh_systemconfig;
+insert into jsh_systemconfig (`company_name`, `company_contacts`, `company_address`, `company_tel`, `company_fax`, `company_post_code`) values("南通jshERP公司","张三","南通市通州区某某路","0513-10101010","0513-18181818","226300");
+
+-- ----------------------------
+-- 时间:2019年3月9日
+-- version:1.0.7
+-- 改管理员的功能权限
+-- ----------------------------
+update jsh_userbusiness SET
+Value = '[13][12][16][243][14][15][234][236][22][23][220][240][25][217][218][26][194][195][31][59][207][208][209][226][227][228][229][235][237][210][211][241][33][199][242][41][200][201][202][40][232][233][197][203][204][205][206][212]'
+where Id = 5;
+-- ----------------------------
+-- 给订单功能加审核和反审核的功能按钮权限
+-- ----------------------------
+update jsh_functions SET PushBtn = '3' where Number = '050202' and PNumber = '0502';
+update jsh_functions SET PushBtn = '3' where Number = '060301' and PNumber = '0603';
+-- ----------------------------
+-- 改管理员的按钮权限
+-- ----------------------------
+update jsh_userbusiness SET
+BtnStr = '[{"funId":"25","btnStr":"1"},{"funId":"217","btnStr":"1"},{"funId":"218","btnStr":"1"},{"funId":"241","btnStr":"3"},{"funId":"242","btnStr":"3"}]'
+where Id = 5;
+
+-- ----------------------------
+-- 时间:2019年3月10日
+-- version:1.0.8
+-- 改状态字段的类型,增加关联单据字段
+-- ----------------------------
+alter table jsh_depot_head change Status Status varchar(1) DEFAULT '0' COMMENT '状态,0未审核、1已审核、2已转采购|销售';
+alter table jsh_depot_head add `LinkNumber` varchar(50) DEFAULT null COMMENT '关联订单号';
+-- ----------------------------
+-- 时间:2019年3月12日
+-- version:1.0.9
+-- 此次更新
+-- 1、根据本地用户表中现有部门生成机构表数据,同时重建机构和用户的关联关系
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+DROP FUNCTION IF EXISTS `_buildOrgAndOrgUserRel`;
+DELIMITER ;;
+CREATE FUNCTION `_buildOrgAndOrgUserRel` (name varchar(50)) RETURNS mediumtext CHARSET utf8
+begin
+
+declare _org_full_name varchar(500); -- 机构全称
+declare _org_abr varchar(20);  -- 机构简称
+declare _sort int default 0;
+declare _success_msg varchar(50) default '重建机构及机构用户关系成功'; -- 机构全称
+ -- 遍历数据结束标志
+declare done int DEFAULT 0;
+-- 获取用户表中唯一的部门信息列表
+declare orgCur cursor for select distinct department from jsh_user where department!='' and department is not null;
+
+ -- 将结束标志绑定到游标
+declare continue handler for not found set done = 1;
+  -- 循环部门信息列表在机构表插入数据
+  -- 打开游标
+  open orgCur;
+  -- 开始循环
+  read_loop: loop
+    -- 提取游标里的数据,这里只有一个,多个的话也一样;
+    fetch orgCur into _org_full_name;
+    -- 声明结束的时候
+    if done=1 then
+      leave read_loop;
+    end if;
+    -- 这里做你想做的循环的事件
+    if length(_org_full_name)<=20 then
+			set _org_abr=_org_full_name;
+		else
+			set _org_abr=left(_org_full_name,20);
+	end if;
+	set _sort=_sort+1;
+	insert into jsh_organization (org_full_name, org_abr,  org_stcd, org_parent_no, sort, remark)
+	values (_org_full_name,_org_abr, '1', '01', _sort, '机构表初始化');
+		begin
+			declare _userId bigint;
+			declare _orgId bigint;
+			 -- 遍历数据结束标志
+			declare ogrUserRelDone int DEFAULT 0;
+			-- 根据用户表和机构表部门关联关系,重建用户和机构关联关系
+			declare ogrUserRelCur cursor for select user.id as userId,org.id as orgId from jsh_user user,jsh_organization org
+			where 1=1  and user.department=org.org_full_name and user.department =_org_full_name;
+			 -- 将结束标志绑定到游标
+			declare continue handler for not found set ogrUserRelDone = 1;
+			-- 打开游标
+			  open ogrUserRelCur;
+			  -- 开始循环
+			  rel_read_loop: loop
+			    -- 提取游标里的数据,这里只有一个,多个的话也一样;
+			    fetch ogrUserRelCur into _userId,_orgId;
+			    -- 声明结束的时候
+			    if ogrUserRelDone=1 then
+			      leave rel_read_loop;
+			    end if;
+				insert into `jsh_orga_user_rel`(`orga_id`, `user_id`, `delete_flag`) VALUES (_orgId,_userId,'0');
+
+			  end loop rel_read_loop;
+		  -- 关闭游标
+		  close ogrUserRelCur;
+		end;
+
+  end loop read_loop;
+  -- 关闭游标
+  close orgCur;
+
+-- 清空用户表中的部门信息
+update jsh_user set department=null;
+
+return _success_msg;
+end
+;;
+DELIMITER ;
+-- ----------------------------
+-- 初始化机构数据,重建机构用户关系
+-- ----------------------------
+select _buildOrgAndOrgUserRel('初始化机构数据,重建机构用户关系') from dual;
+-- ----------------------------
+-- 删除一次性函数
+-- ----------------------------
+DROP FUNCTION _buildOrgAndOrgUserRel;
+
+-- ----------------------------
+-- 时间:2019年3月13日
+-- version:1.0.10
+-- 此次更新
+-- 1、设置用户表的用户状态status默认值为0
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+
+alter table jsh_user change Status Status tinyint(4) DEFAULT '0' COMMENT '状态,0:正常,1:删除,2封禁';
+update jsh_user set status='0' where status is null;
+-- ----------------------------
+-- 设置根目录编号为1
+-- ----------------------------
+update jsh_materialcategory set serial_no='1' where id='1';
+
+-- ----------------------------
+-- 时间:2019年3月18日
+-- version:1.0.11
+-- 此次更新
+-- 1、批量增加大部分表的tenant_id租户字段
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+alter table jsh_account add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_accounthead add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_accountitem add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_asset add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_assetcategory add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_assetname add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_depot add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_depot_head add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_depot_item add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_inoutitem add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_log add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_material add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_materialcategory add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_orga_user_rel add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_organization add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_person add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_role add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_serial_number add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_supplier add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_systemconfig add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_unit add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+alter table jsh_user add tenant_id bigint(20) DEFAULT null COMMENT '租户id';
+
+-- ----------------------------
+-- 时间:2019年3月27日
+-- version:1.0.12
+-- 此次更新
+-- 添加删除标记,将物理删除修改为逻辑删除
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+-- 角色表	jsh_role
+alter table jsh_role add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 用户 角色 模块关系表	jsh_userbusiness
+alter table jsh_userbusiness add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 功能模块表	jsh_functions
+alter table jsh_functions add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 应用表	jsh_app
+alter table jsh_app add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 产品表	jsh_material
+alter table jsh_material add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 产品扩展字段表	jsh_materialproperty
+alter table jsh_materialproperty add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 经手人表	jsh_person
+alter table jsh_person add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 供应商 客户信息表	jsh_supplier
+alter table jsh_supplier add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 系统参数表	jsh_systemconfig
+alter table jsh_systemconfig add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 多单位表	jsh_unit
+alter table jsh_unit add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 仓库表	jsh_depot
+alter table jsh_depot add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 账户信息表	jsh_account
+alter table jsh_account add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 财务主表	jsh_accounthead
+alter table jsh_accounthead add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 财务子表	jsh_accountitem
+alter table jsh_accountitem add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 资产记录表	jsh_asset
+alter table jsh_asset add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 资产类型表	jsh_assetcategory
+alter table jsh_assetcategory add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 资产信息表	jsh_assetname
+alter table jsh_assetname add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 单据主表	jsh_depot_head
+alter table jsh_depot_head add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 单据子表	jsh_depot_item
+alter table jsh_depot_item add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+-- 收支项目表	jsh_inoutitem
+alter table jsh_inoutitem add  delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+-- ----------------------------
+-- 时间:2019年4月11日
+-- version:1.0.13
+-- 此次更新
+-- 删除所有外键
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+
+-- ----------------------------
+-- 删除财务主表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_accounthead DROP FOREIGN KEY FK9F4C0D8DAAE50527;
+ALTER TABLE jsh_accounthead DROP FOREIGN KEY FK9F4C0D8DB610FC06;
+ALTER TABLE jsh_accounthead DROP FOREIGN KEY FK9F4C0D8DC4170B37;
+-- ----------------------------
+-- 删除财务子表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_accountitem DROP FOREIGN KEY FK9F4CBAC0AAE50527;
+ALTER TABLE jsh_accountitem DROP FOREIGN KEY FK9F4CBAC0C5FE6007;
+ALTER TABLE jsh_accountitem DROP FOREIGN KEY FK9F4CBAC0D203EDC5;
+-- ----------------------------
+-- 删除资产记录表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_asset DROP FOREIGN KEY FK353690ED27D23FE4;
+ALTER TABLE jsh_asset DROP FOREIGN KEY FK353690ED3E226853;
+ALTER TABLE jsh_asset DROP FOREIGN KEY FK353690ED61FE182C;
+ALTER TABLE jsh_asset DROP FOREIGN KEY FK353690ED9B6CB285;
+ALTER TABLE jsh_asset DROP FOREIGN KEY FK353690EDAD45B659;
+-- ----------------------------
+-- 删除资产信息表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_assetname DROP FOREIGN KEY FKA4ADCCF866BC8AD3;
+-- ----------------------------
+-- 删除单据主表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_depot_head DROP FOREIGN KEY FK2A80F214AAE50527;
+ALTER TABLE jsh_depot_head DROP FOREIGN KEY jsh_depot_head_ibfk_1;
+ALTER TABLE jsh_depot_head DROP FOREIGN KEY jsh_depot_head_ibfk_4;
+ALTER TABLE jsh_depot_head DROP FOREIGN KEY jsh_depot_head_ibfk_5;
+-- ----------------------------
+-- 删除单据子表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_depot_item DROP FOREIGN KEY FK2A819F47729F5392;
+ALTER TABLE jsh_depot_item DROP FOREIGN KEY FK2A819F479485B3F5;
+ALTER TABLE jsh_depot_item DROP FOREIGN KEY jsh_depot_item_ibfk_2;
+-- ----------------------------
+-- 删除操作日志表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_log DROP FOREIGN KEY FKF2696AA13E226853;
+-- ----------------------------
+-- 删除产品表对应外键约束
+-- ----------------------------
+ALTER TABLE jsh_material DROP FOREIGN KEY FK675951272AB6672C;
+ALTER TABLE jsh_material DROP FOREIGN KEY jsh_material_ibfk_1;
+
+-- ----------------------------
+-- 时间:2019年4月30日
+-- version:1.0.14
+-- 此次更新
+-- 增加仓库默认功能 增加库存预警功能
+-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新
+-- ----------------------------
+alter table jsh_depot add  is_default bit(1) DEFAULT NULL COMMENT '是否默认';
+insert into `jsh_functions`(`Number`, `Name`, `PNumber`, `URL`, `State`, `Sort`, `Enabled`, `Type`, `PushBtn`)
+select '030112', '库存预警', '0301', '../reports/stock_warning_report.html', b'0', '0670', b'1', '电脑版', '' from dual where not exists
+(select * from jsh_functions where  Number='030112' and PNumber='0301');
+
+-- ----------------------------
+-- 改管理员的功能权限
+-- ----------------------------
+update jsh_userbusiness SET Type = 'RoleFunctions', KeyId = '4',
+Value = '[13][12][16][243][14][15][234][236][22][23][220][240][25][217][218][26][194][195][31][59][207][208][209][226][227][228][229][235][237][244][210][211][241][33][199][242][41][200][201][202][40][232][233][197][203][204][205][206][212]'
+where Id = 5;
+
+-- ----------------------------
+-- 给app的功能增加代号 在功能表增加个人信息
+-- ----------------------------
+update jsh_app SET Number = '02' where name='个人信息';
+insert into `jsh_functions`(`Number`, `Name`, `PNumber`, `URL`, `State`, `Sort`, `Enabled`, `Type`, `PushBtn`)
+select '02', '个人信息', '0', '', b'1', '0005', b'1', '电脑版', '' from dual where not exists
+(select * from jsh_functions where  Number='02' and PNumber='0');
+
+-- ----------------------------
+-- 时间:2019年6月23日
+-- 增加新手引导模块
+-- ----------------------------
+INSERT INTO `jsh_app` VALUES ('28', '09', '新手引导', 'app', 'userHelp.png', '../user/userHelp.html', '1000', '500', '\0', '\0', '\0', 'dock', '210', '', '', '0');
+INSERT INTO `jsh_functions` VALUES ('246', '09', '新手引导', '0', '', '', '0115', '', '电脑版', '', '0');
+update jsh_userbusiness SET Value = '[3][6][7][22][23][24][25][26][27][28]'
+where Type = 'RoleAPP' and (KeyId = '4' or KeyId = '10');
+update jsh_userbusiness SET
+Value = '[245][13][12][16][243][14][15][234][236][22][23][220][240][25][217][218][26][194][195][31][59][207][208][209][226][227][228][229][235][237][244][210][211][241][33][199][242][41][200][201][202][40][232][233][197][203][204][205][206][212][246]'
+where Type = 'RoleFunctions' and KeyId = '4';
+update jsh_userbusiness SET
+Value = '[245][13][243][14][15][234][22][23][220][240][25][217][218][26][194][195][31][59][207][208][209][226][227][228][229][235][237][244][210][211][241][33][199][242][41][200][201][202][40][232][233][197][203][204][205][206][212][246]'
+where Type = 'RoleFunctions' and KeyId = '10';
+
+
+-- ----------------------------
+-- 时间:2019年6月26日
+-- 删除多余的资产相关表
+-- ----------------------------
+drop table jsh_asset;
+drop table jsh_assetcategory;
+drop table jsh_assetname;
+
+
+-- ----------------------------
+-- 时间:2019年6月27日
+-- 增加租户表
+-- ----------------------------
+DROP TABLE IF EXISTS `jsh_tenant`;
+CREATE TABLE `jsh_tenant` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '用户id',
+  `login_name` varchar(255) DEFAULT NULL COMMENT '登录名',
+  `user_num_limit` int(11) DEFAULT NULL COMMENT '用户数量限制',
+  `bills_num_limit` int(11) DEFAULT NULL COMMENT '单据数量限制',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8 COMMENT='租户';
+
+-- ----------------------------
+-- 时间:2019年6月27日
+-- 给租户表增加数据
+-- ----------------------------
+INSERT INTO `jsh_tenant` VALUES ('13', '63', 'jsh', '20', '2000', null);
+
+-- ----------------------------
+-- 时间:2019年7月10日
+-- 删除函数
+-- ----------------------------
+DROP FUNCTION IF EXISTS `_nextval`;
+
+-- ----------------------------
+-- 时间:2019年8月1日
+-- 增加仓库和客户的启用标记
+-- ----------------------------
+alter table jsh_systemconfig add  customer_flag varchar(1) DEFAULT '0' COMMENT '客户启用标记,0未启用,1启用' after company_post_code;
+alter table jsh_systemconfig add  depot_flag varchar(1) DEFAULT '0' COMMENT '仓库启用标记,0未启用,1启用' after company_post_code;
+
+-- ----------------------------
+-- 时间:2019年9月13日
+-- 给功能表增加icon字段
+-- ----------------------------
+alter table jsh_functions add  icon varchar(50) DEFAULT NULL COMMENT '图标' after PushBtn;
+
+-- ----------------------------
+-- 时间:2019年9月13日
+-- 创建消息表
+-- ----------------------------
+CREATE TABLE `jsh_msg` (
+`id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键' ,
+`msg_title`  varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息标题' ,
+`msg_content`  varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息内容' ,
+`create_time`  datetime NULL DEFAULT NULL COMMENT '创建时间' ,
+`type`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息类型' ,
+`status`  varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态,1未读 2已读' ,
+`tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户id' ,
+`delete_Flag`  varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标记,0未删除,1删除' ,
+PRIMARY KEY (`id`)
+)
+ENGINE=InnoDB
+DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
+COMMENT='消息表'
+AUTO_INCREMENT=2
+ROW_FORMAT=COMPACT
+;
+
+-- ----------------------------
+-- 时间:2019年9月13日
+-- 删除表 jsh_app  databasechangelog databasechangeloglock
+-- ----------------------------
+drop table databasechangelog;
+drop table databasechangeloglock;
+drop table jsh_app;
+
+-- ----------------------------
+-- 时间:2019年11月28日
+-- 单据编号表-改表名
+-- ----------------------------
+ALTER TABLE tbl_sequence RENAME TO jsh_sequence;
+
+-- ----------------------------
+-- 增加产品初始库存表
+-- 时间 2019-11-28
+-- by jishenghua
+-- ----------------------------
+CREATE TABLE `jsh_material_stock` (
+`id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键' ,
+`material_id`  bigint(20) NULL DEFAULT NULL COMMENT '产品id' ,
+`depot_id`  bigint(20) NULL DEFAULT NULL COMMENT '仓库id' ,
+`number`  decimal(24,6) NULL DEFAULT NULL COMMENT '初始库存数量' ,
+`tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户id' ,
+`delete_fag`  varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标记,0未删除,1删除' ,
+PRIMARY KEY (`id`)
+)
+ENGINE=InnoDB
+DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
+COMMENT='产品初始库存'
+AUTO_INCREMENT=48
+ROW_FORMAT=COMPACT
+;
+
+-- ----------------------------
+-- 增加商品扩展信息表
+-- 时间 2020-02-15
+-- by jishenghua
+-- ----------------------------
+CREATE TABLE `jsh_material_extend` (
+`id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键' ,
+`material_id`  bigint(20) NULL DEFAULT NULL COMMENT '商品id' ,
+`bar_code`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品条码' ,
+`commodity_unit`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品单位' ,
+`purchase_decimal`  decimal(24,6) NULL DEFAULT NULL COMMENT '采购价格' ,
+`commodity_decimal`  decimal(24,6) NULL DEFAULT NULL COMMENT '零售价格' ,
+`wholesale_decimal`  decimal(24,6) NULL DEFAULT NULL COMMENT '销售价格' ,
+`low_decimal`  decimal(24,6) NULL DEFAULT NULL COMMENT '最低售价' ,
+`create_time`  datetime NULL DEFAULT NULL COMMENT '创建日期' ,
+`create_serial`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人编码' ,
+`update_serial`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人编码' ,
+`update_time`  bigint(20) NULL DEFAULT NULL COMMENT '更新时间戳' ,
+`tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户id' ,
+`delete_Flag`  varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标记,0未删除,1删除' ,
+PRIMARY KEY (`id`)
+)
+ENGINE=InnoDB
+DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
+COMMENT='产品价格扩展'
+AUTO_INCREMENT=1
+ROW_FORMAT=COMPACT
+;
+
+-- ----------------------------
+-- 给单据明细表增加商品扩展id
+-- 时间 2020-02-16
+-- by jishenghua
+-- ----------------------------
+alter table jsh_depot_item add material_extend_id bigint(20) DEFAULT NULL COMMENT '商品扩展id' after MaterialId;
+
+-- ----------------------------
+-- 给单据主表删除字段ProjectId 和 AllocationProjectId
+-- 时间 2020-02-18
+-- by jishenghua
+-- ----------------------------
+alter table jsh_depot_head drop column ProjectId;
+alter table jsh_depot_head drop column AllocationProjectId;
+
+-- ----------------------------
+-- 给计量单位表增加基础单位、副单位、比例三个字段
+-- 时间 2020-03-24
+-- by jishenghua
+-- ----------------------------
+alter table jsh_unit add basic_unit varchar(50) DEFAULT NULL COMMENT '基础单位' after UName;
+alter table jsh_unit add other_unit varchar(50) DEFAULT NULL COMMENT '副单位' after basic_unit;
+alter table jsh_unit add ratio INT DEFAULT NULL COMMENT '比例' after other_unit;
+
+-- ----------------------------
+-- 时间:2020年03月31日
+-- by jishenghua
+-- 给用户表增加 登录用户名 字段
+-- ----------------------------
+alter table jsh_user change loginame login_name varchar(255) NOT NULL COMMENT '登录用户名';
+
+-- ----------------------------
+-- 时间:2020年04月12日
+-- by jishenghua
+-- 给功能表增加插件管理
+-- ----------------------------
+INSERT INTO `jsh_functions` VALUES (245,'000107', '插件管理', '0001', '/pages/manage/plugin.html', '\0', '0170', '', '电脑版', '', 'icon-notebook', '0');
+
+-- ----------------------------
+-- 时间:2020年04月25日
+-- by jishenghua
+-- 给商品扩展表增加 是否默认基础单位 字段
+-- ----------------------------
+alter table jsh_material_extend add default_flag VARCHAR(1) DEFAULT 1 COMMENT '是否为默认单位,1是,0否' after low_decimal;
+
+-- ----------------------------
+-- 时间:2020年05月04日
+-- by jishenghua
+-- 删除商品表的多价格相关的字段
+-- ----------------------------
+alter table jsh_material drop Packing;
+alter table jsh_material drop RetailPrice;
+alter table jsh_material drop LowPrice;
+alter table jsh_material drop PresetPriceOne;
+alter table jsh_material drop PresetPriceTwo;
+alter table jsh_material drop FirstOutUnit;
+alter table jsh_material drop FirstInUnit;
+alter table jsh_material drop PriceStrategy;
+
+-- ----------------------------
+-- 时间:2020年6月18日
+-- 增加负库存的启用标记
+-- ----------------------------
+alter table jsh_systemconfig add minus_stock_flag varchar(1) DEFAULT '0' COMMENT '负库存启用标记,0未启用,1启用' after customer_flag;
+
+-- ----------------------------
+-- 时间 2020年07月13日
+-- by jishenghua
+-- 增加产品当前库存表
+-- ----------------------------
+CREATE TABLE `jsh_material_current_stock` (
+`id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键' ,
+`material_id`  bigint(20) NULL DEFAULT NULL COMMENT '产品id' ,
+`depot_id`  bigint(20) NULL DEFAULT NULL COMMENT '仓库id' ,
+`current_number`  decimal(24,6) NULL DEFAULT NULL COMMENT '当前库存数量' ,
+`tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户id' ,
+`delete_flag`  varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '删除标记,0未删除,1删除' ,
+PRIMARY KEY (`id`)
+)
+ENGINE=InnoDB
+DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
+COMMENT='产品当前库存'
+AUTO_INCREMENT=1
+ROW_FORMAT=COMPACT
+;
+
+-- --------------------------------------------------------
+-- 时间 2020年07月13日
+-- by jishenghua
+-- 修改jsh_material_stock的表名为jsh_material_initial_stock
+-- 修改jsh_material_initial_stock表的删除字段
+-- --------------------------------------------------------
+alter table jsh_material_stock rename to jsh_material_initial_stock;
+alter table jsh_material_initial_stock change delete_fag delete_flag varchar(1) NULL DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+-- --------------------------------------------------------
+-- 时间 2020年07月20日
+-- by jishenghua
+-- 优化表和字段的格式
+-- --------------------------------------------------------
+alter table jsh_log change userID user_id bigint(20) DEFAULT NULL COMMENT '用户id';
+alter table jsh_log change clientIP client_ip varchar(50) DEFAULT NULL COMMENT '客户端IP';
+alter table jsh_log change createtime create_time datetime DEFAULT NULL COMMENT '创建时间';
+alter table jsh_log change contentdetails content varchar(1000) DEFAULT NULL COMMENT '详情';
+alter table jsh_log drop column remark;
+
+alter table jsh_materialcategory rename to jsh_material_category;
+alter table jsh_material_category change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_material_category change Name name varchar(50) DEFAULT NULL COMMENT '名称';
+alter table jsh_material_category change CategoryLevel category_level smallint(6) DEFAULT NULL COMMENT '等级';
+alter table jsh_material_category change ParentId parent_id bigint(20) DEFAULT NULL COMMENT '上级id';
+
+alter table jsh_materialproperty rename to jsh_material_property;
+alter table jsh_material_property change nativeName native_name varchar(50) DEFAULT NULL COMMENT '原始名称';
+alter table jsh_material_property change anotherName another_name varchar(50) DEFAULT NULL COMMENT '别名';
+alter table jsh_material_property change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_role change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_role change Name name varchar(50) DEFAULT NULL COMMENT '名称';
+alter table jsh_role change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_person change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_person change Type type varchar(20) DEFAULT NULL COMMENT '类型';
+alter table jsh_person change Name name varchar(50) DEFAULT NULL COMMENT '姓名';
+alter table jsh_person change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_systemconfig rename to jsh_system_config;
+alter table jsh_system_config change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_account change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_account change Name name varchar(50) DEFAULT NULL COMMENT '名称';
+alter table jsh_account change SerialNo serial_no varchar(50) DEFAULT NULL COMMENT '编号';
+alter table jsh_account change InitialAmount initial_amount decimal(24,6) DEFAULT NULL COMMENT '期初金额';
+alter table jsh_account change CurrentAmount current_amount decimal(24,6) DEFAULT NULL COMMENT '当前余额';
+alter table jsh_account change Remark remark varchar(100) DEFAULT NULL COMMENT '备注';
+alter table jsh_account change IsDefault is_default bit(1) DEFAULT NULL COMMENT '是否默认';
+alter table jsh_account change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_functions rename to jsh_function;
+alter table jsh_function change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_function change Number number varchar(50) DEFAULT NULL COMMENT '编号';
+alter table jsh_function change Name name varchar(50) DEFAULT NULL COMMENT '名称';
+alter table jsh_function change PNumber parent_number varchar(50) DEFAULT NULL COMMENT '上级编号';
+alter table jsh_function change URL url varchar(100) DEFAULT NULL COMMENT '链接';
+alter table jsh_function change State state bit(1) DEFAULT NULL COMMENT '收缩';
+alter table jsh_function change Sort sort varchar(50) DEFAULT NULL COMMENT '排序';
+alter table jsh_function change Enabled enabled bit(1) DEFAULT NULL COMMENT '启用';
+alter table jsh_function change Type type varchar(50) DEFAULT NULL COMMENT '类型';
+alter table jsh_function change PushBtn push_btn varchar(50) DEFAULT NULL COMMENT '功能按钮';
+alter table jsh_function change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_userbusiness rename to jsh_user_business;
+alter table jsh_user_business change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_user_business change Type type varchar(50) DEFAULT NULL COMMENT '类别';
+alter table jsh_user_business change KeyId key_id varchar(50) DEFAULT NULL COMMENT '主id';
+alter table jsh_user_business change Value value varchar(10000) DEFAULT NULL COMMENT '值';
+alter table jsh_user_business change BtnStr btn_str varchar(2000) DEFAULT NULL COMMENT '按钮权限';
+alter table jsh_user_business change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_unit change UName name varchar(50) DEFAULT NULL COMMENT '名称,支持多单位';
+alter table jsh_unit change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_inoutitem rename to jsh_in_out_item;
+alter table jsh_in_out_item change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_in_out_item change Name name varchar(50) DEFAULT NULL COMMENT '名称';
+alter table jsh_in_out_item change Type type varchar(20) DEFAULT NULL COMMENT '类型';
+alter table jsh_in_out_item change Remark remark varchar(100) DEFAULT NULL COMMENT '备注';
+alter table jsh_in_out_item change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_serial_number change material_Id material_id bigint(20) DEFAULT NULL COMMENT '产品表id';
+alter table jsh_serial_number change serial_Number serial_number varchar(64) DEFAULT NULL COMMENT '序列号';
+alter table jsh_serial_number change is_Sell is_sell varchar(1) DEFAULT '0' COMMENT '是否卖出,0未卖出,1卖出';
+alter table jsh_serial_number change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+alter table jsh_serial_number change create_Time create_time datetime DEFAULT NULL COMMENT '创建时间';
+alter table jsh_serial_number change update_Time update_time datetime DEFAULT NULL COMMENT '更新时间';
+alter table jsh_serial_number change depothead_Id depot_head_id bigint(20) DEFAULT NULL COMMENT '单据主表id,用于跟踪序列号流向';
+
+alter table jsh_supplier change phonenum phone_num varchar(30) DEFAULT NULL COMMENT '联系电话';
+alter table jsh_supplier change AdvanceIn advance_in decimal(24,6) DEFAULT '0.000000' COMMENT '预收款';
+alter table jsh_supplier change BeginNeedGet begin_need_get decimal(24,6) DEFAULT NULL COMMENT '期初应收';
+alter table jsh_supplier change BeginNeedPay begin_need_pay decimal(24,6) DEFAULT NULL COMMENT '期初应付';
+alter table jsh_supplier change AllNeedGet all_need_get decimal(24,6) DEFAULT NULL COMMENT '累计应收';
+alter table jsh_supplier change AllNeedPay all_need_pay decimal(24,6) DEFAULT NULL COMMENT '累计应付';
+alter table jsh_supplier change taxNum tax_num varchar(50) DEFAULT NULL COMMENT '纳税人识别号';
+alter table jsh_supplier change bankName bank_name varchar(50) DEFAULT NULL COMMENT '开户行';
+alter table jsh_supplier change accountNumber account_number varchar(50) DEFAULT NULL COMMENT '账号';
+alter table jsh_supplier change taxRate tax_rate decimal(24,6) DEFAULT NULL COMMENT '税率';
+alter table jsh_supplier change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_accounthead rename to jsh_account_head;
+alter table jsh_account_head change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_account_head change Type type varchar(50) DEFAULT NULL COMMENT '类型(支出/收入/收款/付款/转账)';
+alter table jsh_account_head change OrganId organ_id bigint(20) DEFAULT NULL COMMENT '单位Id(收款/付款单位)';
+alter table jsh_account_head change HandsPersonId hands_person_id bigint(20) DEFAULT NULL COMMENT '经手人id';
+alter table jsh_account_head change ChangeAmount change_amount decimal(24,6) DEFAULT NULL COMMENT '变动金额(优惠/收款/付款/实付)';
+alter table jsh_account_head change TotalPrice total_price decimal(24,6) DEFAULT NULL COMMENT '合计金额';
+alter table jsh_account_head change AccountId account_id bigint(20) DEFAULT NULL COMMENT '账户(收款/付款)';
+alter table jsh_account_head change BillNo bill_no varchar(50) DEFAULT NULL COMMENT '单据编号';
+alter table jsh_account_head change BillTime bill_time datetime DEFAULT NULL COMMENT '单据日期';
+alter table jsh_account_head change Remark remark varchar(100) DEFAULT NULL COMMENT '备注';
+alter table jsh_account_head change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_accountitem rename to jsh_account_item;
+alter table jsh_account_item change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_account_item change HeaderId header_id bigint(20) NOT NULL COMMENT '表头Id';
+alter table jsh_account_item change AccountId account_id bigint(20) DEFAULT NULL COMMENT '账户Id';
+alter table jsh_account_item change InOutItemId in_out_item_id bigint(20) DEFAULT NULL COMMENT '收支项目Id';
+alter table jsh_account_item change EachAmount each_amount decimal(24,6) DEFAULT NULL COMMENT '单项金额';
+alter table jsh_account_item change Remark remark varchar(100) DEFAULT NULL COMMENT '单据备注';
+alter table jsh_account_item change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_material change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_material change CategoryId category_id bigint(20) DEFAULT NULL COMMENT '产品类型id';
+alter table jsh_material change Name name varchar(50) DEFAULT NULL COMMENT '名称';
+alter table jsh_material change Mfrs mfrs varchar(50) DEFAULT NULL COMMENT '制造商';
+alter table jsh_material change SafetyStock safety_stock decimal(24,6) DEFAULT NULL COMMENT '安全存量(KG)';
+alter table jsh_material change Model model varchar(50) DEFAULT NULL COMMENT '型号';
+alter table jsh_material change Standard standard varchar(50) DEFAULT NULL COMMENT '规格';
+alter table jsh_material change Color color varchar(50) DEFAULT NULL COMMENT '颜色';
+alter table jsh_material change Unit unit varchar(50) DEFAULT NULL COMMENT '单位-单个';
+alter table jsh_material change Remark remark varchar(100) DEFAULT NULL COMMENT '备注';
+alter table jsh_material change UnitId unit_id bigint(20) DEFAULT NULL COMMENT '计量单位Id';
+alter table jsh_material change Enabled enabled bit(1) DEFAULT NULL COMMENT '启用 0-禁用  1-启用';
+alter table jsh_material change OtherField1 other_field1 varchar(50) DEFAULT NULL COMMENT '自定义1';
+alter table jsh_material change OtherField2 other_field2 varchar(50) DEFAULT NULL COMMENT '自定义2';
+alter table jsh_material change OtherField3 other_field3 varchar(50) DEFAULT NULL COMMENT '自定义3';
+alter table jsh_material change enableSerialNumber enable_serial_number varchar(1) DEFAULT '0' COMMENT '是否开启序列号,0否,1是';
+alter table jsh_material change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_depothead rename to jsh_depot_head;
+alter table jsh_depot_head change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_depot_head change Type type varchar(50) DEFAULT NULL COMMENT '类型(出库/入库)';
+alter table jsh_depot_head change SubType sub_type varchar(50) DEFAULT NULL COMMENT '出入库分类';
+alter table jsh_depot_head change DefaultNumber default_number varchar(50) DEFAULT NULL COMMENT '初始票据号';
+alter table jsh_depot_head change Number number varchar(50) DEFAULT NULL COMMENT '票据号';
+alter table jsh_depot_head change OperPersonName oper_person_name varchar(50) DEFAULT NULL COMMENT '操作员名字';
+alter table jsh_depot_head change CreateTime create_time datetime DEFAULT NULL COMMENT '创建时间';
+alter table jsh_depot_head change OperTime oper_time datetime DEFAULT NULL COMMENT '出入库时间';
+alter table jsh_depot_head change OrganId organ_id bigint(20) DEFAULT NULL COMMENT '供应商id';
+alter table jsh_depot_head change HandsPersonId hands_person_id bigint(20) DEFAULT NULL COMMENT '采购/领料-经手人id';
+alter table jsh_depot_head change AccountId account_id bigint(20) DEFAULT NULL COMMENT '账户id';
+alter table jsh_depot_head change ChangeAmount change_amount decimal(24,6) DEFAULT NULL COMMENT '变动金额(收款/付款)';
+alter table jsh_depot_head change TotalPrice total_price decimal(24,6) DEFAULT NULL COMMENT '合计金额';
+alter table jsh_depot_head change PayType pay_type varchar(50) DEFAULT NULL COMMENT '付款类型(现金、记账等)';
+alter table jsh_depot_head change Remark remark varchar(1000) DEFAULT NULL COMMENT '备注';
+alter table jsh_depot_head change Salesman sales_man varchar(50) DEFAULT NULL COMMENT '销售员(可以多个)';
+alter table jsh_depot_head change AccountIdList account_id_list varchar(50) DEFAULT NULL COMMENT '多账户ID列表';
+alter table jsh_depot_head change AccountMoneyList account_money_list varchar(200) DEFAULT NULL COMMENT '多账户金额列表';
+alter table jsh_depot_head change Discount discount decimal(24,6) DEFAULT NULL COMMENT '优惠率';
+alter table jsh_depot_head change DiscountMoney discount_money decimal(24,6) DEFAULT NULL COMMENT '优惠金额';
+alter table jsh_depot_head change DiscountLastMoney discount_last_money decimal(24,6) DEFAULT NULL COMMENT '优惠后金额';
+alter table jsh_depot_head change OtherMoney other_money decimal(24,6) DEFAULT NULL COMMENT '销售或采购费用合计';
+alter table jsh_depot_head change OtherMoneyList other_money_list varchar(200) DEFAULT NULL COMMENT '销售或采购费用涉及项目Id数组(包括快递、招待等)';
+alter table jsh_depot_head change OtherMoneyItem other_money_item varchar(200) DEFAULT NULL COMMENT '销售或采购费用涉及项目(包括快递、招待等)';
+alter table jsh_depot_head change AccountDay account_day int(10) DEFAULT NULL COMMENT '结算天数';
+alter table jsh_depot_head change Status status varchar(1) DEFAULT NULL COMMENT '状态,0未审核、1已审核、2已转采购|销售';
+alter table jsh_depot_head change LinkNumber link_number varchar(50) DEFAULT NULL COMMENT '关联订单号';
+alter table jsh_depot_head change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+alter table jsh_depotitem rename to jsh_depot_item;
+alter table jsh_depot_item change Id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键';
+alter table jsh_depot_item change HeaderId header_id bigint(20) NOT NULL COMMENT '表头Id';
+alter table jsh_depot_item change MaterialId material_id bigint(20) NOT NULL COMMENT '商品Id';
+alter table jsh_depot_item change MUnit material_unit varchar(20) DEFAULT NULL COMMENT '商品计量单位';
+alter table jsh_depot_item change OperNumber oper_number decimal(24,6) DEFAULT NULL COMMENT '数量';
+alter table jsh_depot_item change BasicNumber basic_number decimal(24,6) DEFAULT NULL COMMENT '基础数量,如kg、瓶';
+alter table jsh_depot_item change UnitPrice unit_price decimal(24,6) DEFAULT NULL COMMENT '单价';
+alter table jsh_depot_item change TaxUnitPrice tax_unit_price decimal(24,6) DEFAULT NULL COMMENT '含税单价';
+alter table jsh_depot_item change AllPrice all_price decimal(24,6) DEFAULT NULL COMMENT '金额';
+alter table jsh_depot_item change Remark remark varchar(200) DEFAULT NULL COMMENT '备注';
+alter table jsh_depot_item change Img img varchar(50) DEFAULT NULL COMMENT '图片';
+alter table jsh_depot_item change Incidentals incidentals decimal(24,6) DEFAULT NULL COMMENT '运杂费';
+alter table jsh_depot_item change DepotId depot_id bigint(20) DEFAULT NULL COMMENT '仓库ID';
+alter table jsh_depot_item change AnotherDepotId another_depot_id bigint(20) DEFAULT NULL COMMENT '调拨时,对方仓库Id';
+alter table jsh_depot_item change TaxRate tax_rate decimal(24,6) DEFAULT NULL COMMENT '税率';
+alter table jsh_depot_item change TaxMoney tax_money decimal(24,6) DEFAULT NULL COMMENT '税额';
+alter table jsh_depot_item change TaxLastMoney tax_last_money decimal(24,6) DEFAULT NULL COMMENT '价税合计';
+alter table jsh_depot_item change OtherField1 other_field1 varchar(50) DEFAULT NULL COMMENT '自定义字段1-名称';
+alter table jsh_depot_item change OtherField2 other_field2 varchar(50) DEFAULT NULL COMMENT '自定义字段2-型号';
+alter table jsh_depot_item change OtherField3 other_field3 varchar(50) DEFAULT NULL COMMENT '自定义字段3-制造商';
+alter table jsh_depot_item change OtherField4 other_field4 varchar(50) DEFAULT NULL COMMENT '自定义字段4-名称';
+alter table jsh_depot_item change OtherField5 other_field5 varchar(50) DEFAULT NULL COMMENT '自定义字段5-名称';
+alter table jsh_depot_item change MType material_type varchar(20) DEFAULT NULL COMMENT '商品类型';
+alter table jsh_depot_item change delete_Flag delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+
+-- --------------------------------------------------------
+-- 时间 2020年09月13日
+-- by jishenghua
+-- 给单据表增加操作员字段,去掉经手头姓名字段
+-- --------------------------------------------------------
+alter table jsh_depot_head add creator bigint(20) DEFAULT NULL COMMENT '操作员' after hands_person_id;
+alter table jsh_account_head add creator bigint(20) DEFAULT NULL COMMENT '操作员' after hands_person_id;
+alter table jsh_depot_head drop column oper_person_name;
+update jsh_depot_head set creator=hands_person_id;
+
+
+-- --------------------------------------------------------
+-- 时间 2020年10月17日
+-- by jishenghua
+-- 增加平台表
+-- --------------------------------------------------------
+DROP TABLE IF EXISTS `jsh_platform_config`;
+CREATE TABLE `jsh_platform_config` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `platform_key` varchar(100) DEFAULT NULL COMMENT '关键词',
+  `platform_key_info` varchar(100) DEFAULT NULL COMMENT '关键词名称',
+  `platform_value` varchar(200) DEFAULT NULL COMMENT '值',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='平台参数';
+
+INSERT INTO `jsh_platform_config` VALUES ('1', 'platform_name', '平台名称', '云游管理系统');
+INSERT INTO `jsh_platform_config` VALUES ('2', 'activation_code', '激活码', null);
+
+-- --------------------------------------------------------
+-- 时间 2020年11月24日
+-- by jishenghua
+-- 给单据主表增加单据类型字段bill_type
+-- --------------------------------------------------------
+alter table jsh_depot_head add bill_type varchar(50) DEFAULT NULL COMMENT '单据类型' after pay_type;
+
+-- --------------------------------------------------------
+-- 时间 2021年1月19日
+-- by jishenghua
+-- 给功能表增加组件字段component
+-- --------------------------------------------------------
+alter table jsh_function add component varchar(100) DEFAULT NULL COMMENT '组件' after url;
+
+-- --------------------------------------------------------
+-- 时间 2021年2月13日
+-- by jishenghua
+-- 优化机构和商品类型表的字段
+-- --------------------------------------------------------
+alter table jsh_organization change org_parent_no parent_id bigint(20) DEFAULT NULL COMMENT '父机构id';
+alter table jsh_organization change org_stcd delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+alter table jsh_organization drop column org_tpcd;
+alter table jsh_organization drop column org_create_time;
+alter table jsh_organization drop column org_stop_time;
+alter table jsh_organization drop column creator;
+alter table jsh_organization drop column updater;
+alter table jsh_material_category drop column creator;
+alter table jsh_material_category drop column updater;
+alter table jsh_material_category change status delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除';
+update jsh_material_category set delete_flag='0';
+
+-- --------------------------------------------------------
+-- 时间 2021年6月1日
+-- by jishenghua
+-- 增加租户管理菜单
+-- --------------------------------------------------------
+INSERT INTO `jsh_function` (`id`, `number`, `name`, `parent_number`, `url`, `component`, `state`, `sort`, `enabled`, `type`, `push_btn`, `icon`, `delete_flag`) VALUES ('18', '000109', '租户管理', '0001', '/system/tenant', '/system/TenantList', b'0', '0167', b'1', '电脑版', '1', 'profile', '0');
+
+-- --------------------------------------------------------
+-- 时间 2021年6月19日
+-- by jishenghua
+-- 更新jsh_platform_config数据
+-- --------------------------------------------------------
+INSERT INTO `jsh_platform_config` (`id`, `platform_key`, `platform_key_info`, `platform_value`) VALUES ('3', 'platform_url', '官方网站', 'http://www.huaxiaerp.com/');
+
+-- --------------------------------------------------------
+-- 时间 2021年6月20日
+-- by jishenghua
+-- 将库存状态报表改为进销存统计报表
+-- --------------------------------------------------------
+update jsh_function set name='进销存统计', sort='0658' where id=59;
+
+-- --------------------------------------------------------
+-- 时间 2021年6月20日
+-- by jishenghua
+-- 增加商品库存报表
+-- --------------------------------------------------------
+INSERT INTO `jsh_function` (`number`, `name`, `parent_number`, `url`, `component`, `state`, `sort`, `enabled`, `type`, `push_btn`, `icon`, `delete_flag`) VALUES ('030113', '商品库存', '0301', '/report/material_stock', '/report/MaterialStock', b'0', '0605', b'1', '电脑版', '', 'profile', '0');
+
+-- --------------------------------------------------------
+-- 时间 2021年6月29日
+-- by jishenghua
+-- 给jsh_account_item增加字段进销存单据id 应收欠款 已收欠款
+-- 给jsh_depot_head增加附件字段附件名称
+-- 给jsh_account_head增加附件字段附件名称 优惠金额
+-- --------------------------------------------------------
+alter table jsh_account_item add bill_id bigint(20) DEFAULT NULL COMMENT '进销存单据id' after in_out_item_id;
+alter table jsh_account_item add need_debt decimal(24,6) DEFAULT NULL COMMENT '应收欠款' after bill_id;
+alter table jsh_account_item add finish_debt decimal(24,6) DEFAULT NULL COMMENT '已收欠款' after need_debt;
+alter table jsh_depot_head add file_name varchar(1000) DEFAULT NULL COMMENT '附件名称' after remark;
+alter table jsh_account_head add file_name varchar(500) DEFAULT NULL COMMENT '附件名称' after remark;
+alter table jsh_account_head add discount_money decimal(24,6) DEFAULT NULL COMMENT '优惠金额' after change_amount;
+
+-- --------------------------------------------------------
+-- 时间 2021年7月1日
+-- by jishenghua
+-- 给商品表增加附件名称字段
+-- --------------------------------------------------------
+alter table jsh_material add img_name varchar(1000) DEFAULT NULL COMMENT '图片名称' after remark;
+
+-- --------------------------------------------------------
+-- 时间 2021年7月6日
+-- by jishenghua
+-- 给租户表增加字段enabled
+-- --------------------------------------------------------
+alter table jsh_tenant add enabled bit(1) DEFAULT 1 COMMENT '启用 0-禁用  1-启用' after bills_num_limit;
+
+-- --------------------------------------------------------
+-- 时间 2021年7月21日
+-- by jishenghua
+-- 增加商品属性表
+-- --------------------------------------------------------
+DROP TABLE IF EXISTS `jsh_material_attribute`;
+CREATE TABLE `jsh_material_attribute` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `attribute_field` varchar(50) DEFAULT NULL COMMENT '属性字段',
+  `attribute_name` varchar(50) DEFAULT NULL COMMENT '属性名',
+  `attribute_value` varchar(500) DEFAULT NULL COMMENT '属性值',
+  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
+  `delete_flag` varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='产品属性表';
+
+INSERT INTO `jsh_material_attribute` VALUES ('1', 'manyColor', '多颜色', '红色|橙色|黄色|绿色|蓝色|紫色', '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('2', 'manySize', '多尺寸', 'S|M|L|XL|XXL|XXXL', '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('3', 'other1', '自定义1', '小米|华为', '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('4', 'other2', '自定义2', null, '63', '0');
+INSERT INTO `jsh_material_attribute` VALUES ('5', 'other3', '自定义3', null, '63', '0');
+
+-- --------------------------------------------------------
+-- 时间 2021年7月22日
+-- by jishenghua
+-- 增加多属性设置菜单
+-- --------------------------------------------------------
+INSERT INTO `jsh_function` (`id`, `number`, `name`, `parent_number`, `url`, `component`, `state`, `sort`, `enabled`, `type`, `push_btn`, `icon`, `delete_flag`) VALUES ('247', '010105', '多属性', '0101', '/material/material_attribute', '/material/MaterialAttributeList', '\0', '0250', '', '电脑版', '1', 'profile', '0');
+
+-- --------------------------------------------------------
+-- 时间 2021年7月22日
+-- by jishenghua
+-- 移除机构表的全名字段
+-- 给商品扩展表加sku字段
+-- 给单据主表移除多余字段
+-- 给单据子表移除多余字段
+-- --------------------------------------------------------
+alter table jsh_organization drop column org_full_name;
+alter table jsh_material_extend add sku varchar(50) DEFAULT NULL COMMENT '多属性' after commodity_unit;
+alter table jsh_depot_head drop column hands_person_id;
+alter table jsh_depot_head drop column other_money_list;
+alter table jsh_depot_head drop column other_money_item;
+alter table jsh_depot_head drop column account_day;
+alter table jsh_depot_item drop column img;
+alter table jsh_depot_item drop column incidentals;
+alter table jsh_depot_item drop column other_field1;
+alter table jsh_depot_item drop column other_field2;
+alter table jsh_depot_item drop column other_field3;
+alter table jsh_depot_item drop column other_field4;
+alter table jsh_depot_item drop column other_field5;
+
+-- --------------------------------------------------------
+-- 时间 2021年7月27日
+-- by jishenghua
+-- 给单据子表加sku字段
+-- --------------------------------------------------------
+alter table jsh_depot_item add sku varchar(50) DEFAULT NULL COMMENT '多属性' after material_unit;
+
+-- --------------------------------------------------------
+-- 时间 2021年7月29日
+-- by jishenghua
+-- 增加调拨明细菜单
+-- --------------------------------------------------------
+INSERT INTO `jsh_function` VALUES ('248', '030150', '调拨明细', '0301', '/report/allocation_detail', '/report/AllocationDetail', '\0', '0646', '', '电脑版', '', 'profile', '0');
+
+-- --------------------------------------------------------
+-- 时间 2021年8月24日
+-- by jishenghua
+-- 给租户表加sku字段
+-- 给租户表移除单据数量限制字段
+-- --------------------------------------------------------
+alter table jsh_tenant add type varchar(1) DEFAULT '0' COMMENT '租户类型,0免费租户,1付费租户' after bills_num_limit;
+alter table jsh_tenant drop column bills_num_limit;
+alter table jsh_tenant add expire_time datetime DEFAULT NULL COMMENT '到期时间' after create_time;
+
+-- --------------------------------------------------------
+-- 时间 2021年8月29日
+-- by jishenghua
+-- 给日志表的ip字段改长度
+-- --------------------------------------------------------
+alter table jsh_log change client_ip client_ip varchar(200) DEFAULT NULL COMMENT '客户端IP';
+
+-- --------------------------------------------------------
+-- 时间 2021年9月5日
+-- by jishenghua
+-- 给财务表增加状态字段,给历史数据赋值为0
+-- --------------------------------------------------------
+alter table jsh_account_head add status varchar(1) DEFAULT NULL COMMENT '状态,0未审核、1已审核' after file_name;
+update jsh_account_head set status=0;
+
+-- --------------------------------------------------------
+-- 时间 2021年9月12日
+-- by jishenghua
+-- 插入jsh_platform_config数据,控制是否显示三联打印
+-- --------------------------------------------------------
+INSERT INTO `jsh_platform_config` (`id`, `platform_key`, `platform_key_info`, `platform_value`) VALUES ('4', 'bill_print_flag', '三联打印启用标记', '0');
+INSERT INTO `jsh_platform_config` (`id`, `platform_key`, `platform_key_info`, `platform_value`) VALUES ('5', 'bill_print_url', '三联打印地址', '');
+
+-- --------------------------------------------------------
+-- 时间 2021年9月24日
+-- by jishenghua
+-- 修改单据主表的状态字段描述
+-- --------------------------------------------------------
+alter table jsh_depot_head change status status varchar(1) DEFAULT NULL COMMENT '状态,0未审核、1已审核、2完成采购|销售、3部分采购|销售';
+
+-- --------------------------------------------------------
+-- 时间 2021年9月27日
+-- by jishenghua
+-- 给商品表和单据字表增加字段
+-- --------------------------------------------------------
+alter table jsh_material add enable_batch_number varchar(1) DEFAULT 0 COMMENT '是否开启批号,0否,1是' after enable_serial_number;
+alter table jsh_material add expiry_num int(10) DEFAULT NULL COMMENT '保质期天数' after unit_id;
+alter table jsh_depot_item add sn_list varchar(2000) DEFAULT NULL COMMENT '序列号列表' after material_type;
+alter table jsh_depot_item add batch_number varchar(100) DEFAULT NULL COMMENT '批号' after sn_list;
+alter table jsh_depot_item add expiration_date datetime DEFAULT NULL COMMENT '有效日期' after batch_number;
+
+-- --------------------------------------------------------
+-- 时间 2021年9月27日
+-- by jishenghua
+-- 插入jsh_platform_config数据,配置租户续费地址
+-- --------------------------------------------------------
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('pay_fee_url', '租户续费地址', '');
+
+-- --------------------------------------------------------
+-- 时间 2021年9月28日
+-- by jishenghua
+-- 给序列号表增加仓库id
+-- --------------------------------------------------------
+alter table jsh_serial_number add depot_id bigint(20) DEFAULT NULL COMMENT '仓库id' after material_Id;
+
+-- --------------------------------------------------------
+-- 时间 2021年10月4日
+-- by jishenghua
+-- 给序列号表增加入库单号和出库单号字段,另外去掉单据id字段
+-- 移除序列号菜单
+-- --------------------------------------------------------
+alter table jsh_serial_number add in_bill_no varchar(50) DEFAULT NULL COMMENT '入库单号' after updater;
+alter table jsh_serial_number add out_bill_no varchar(50) DEFAULT NULL COMMENT '出库单号' after in_bill_no;
+alter table jsh_serial_number drop column depot_head_id;
+delete from jsh_function where number='010104';
+
+-- --------------------------------------------------------
+-- 时间 2021年10月12日
+-- by jishenghua
+-- 给租户表增加备注字段
+-- --------------------------------------------------------
+alter table jsh_tenant add remark varchar(500) DEFAULT NULL COMMENT '备注' after expire_time;
+
+-- --------------------------------------------------------
+-- 时间 2021年10月29日
+-- by jishenghua
+-- 给商品初始库存表增加最低库存数量、最高库存数量字段
+-- 给商品表增加基础重量字段
+-- 给商品表移除安全库存字段
+-- --------------------------------------------------------
+alter table jsh_material_initial_stock add low_safe_stock decimal(24,6) DEFAULT NULL COMMENT '最低库存数量' after number;
+alter table jsh_material_initial_stock add high_safe_stock decimal(24,6) DEFAULT NULL COMMENT '最高库存数量' after low_safe_stock;
+alter table jsh_material add weight decimal(24,6) DEFAULT NULL COMMENT '基础重量(kg)' after expiry_num;
+alter table jsh_material drop column safety_stock;
+
+-- --------------------------------------------------------
+-- 时间 2021年11月5日
+-- by jishenghua
+-- 给用户/角色/模块关系表增加租户字段
+-- 给用户/角色/模块关系表的租户字段赋值
+-- --------------------------------------------------------
+alter table jsh_user_business add tenant_id bigint(20) DEFAULT null COMMENT '租户id' after btn_str;
+update jsh_user_business ub left join jsh_user u on ub.key_id=u.id set ub.tenant_id=u.tenant_id
+where (ub.type='UserRole' or ub.type='UserDepot' or ub.type='UserCustomer') and u.tenant_id!=0;
+update jsh_user_business ub left join jsh_role r on ub.key_id=r.id set ub.tenant_id=r.tenant_id
+where (ub.type='RoleFunctions') and r.tenant_id is not null;
+
+-- --------------------------------------------------------
+-- 时间 2021年11月30日
+-- by jishenghua
+-- 给计量单位表增加副单位2、副单位3、比例2、比例3 四个字段
+-- --------------------------------------------------------
+alter table jsh_unit add other_unit_two varchar(50) DEFAULT NULL COMMENT '副单位2' after other_unit;
+alter table jsh_unit add other_unit_three varchar(50) DEFAULT NULL COMMENT '副单位3' after other_unit_two;
+alter table jsh_unit add ratio_two int(11) DEFAULT NULL COMMENT '比例2' after ratio;
+alter table jsh_unit add ratio_three int(11) DEFAULT NULL COMMENT '比例3' after ratio_two;
+
+-- --------------------------------------------------------
+-- 时间 2021年12月07日
+-- by jishenghua
+-- 更新菜单名称-进货统计改为采购统计
+-- 增加平台配置菜单
+-- 给平台配置增加注册启用标记
+-- 更新消息表中已有信息的状态
+-- --------------------------------------------------------
+update jsh_function set name='采购统计' where name='进货统计';
+insert into `jsh_function`(`number`, `name`, `parent_number`, `url`, `component`, `state`, `sort`, `enabled`, `type`, `push_btn`, `icon`, `delete_flag`)
+ values ('000112', '平台配置', '0001', '/system/platform_config', '/system/PlatformConfigList', '\0', '0175', '', '电脑版', '', 'profile', '0');
+insert into `jsh_platform_config`(`platform_key`, `platform_key_info`, `platform_value`)
+ values ('register_flag', '注册启用标记', '1');
+update jsh_msg set status='2' where id=2;
+
+-- --------------------------------------------------------
+-- 时间 2021年12月12日
+-- by jishenghua
+-- 给单据表增加找零字段backAmount
+-- --------------------------------------------------------
+alter table jsh_depot_head add back_amount decimal(24,6) DEFAULT NULL COMMENT '找零金额' after change_amount;
+
+-- --------------------------------------------------------
+-- 时间 2022年04月21日
+-- by jishenghua
+-- 修改商品表的名称字段的长度
+-- --------------------------------------------------------
+alter table jsh_material change name name varchar(100) DEFAULT NULL COMMENT '名称';
+
+-- --------------------------------------------------------
+-- 时间 2022年05月03日
+-- by jishenghua
+-- 给系统参数表增加销售协议字段
+-- --------------------------------------------------------
+alter table jsh_system_config add sale_agreement varchar(500) DEFAULT NULL COMMENT '销售协议' after company_post_code;
+
+-- --------------------------------------------------------
+-- 时间 2022年05月17日
+-- by jishenghua
+-- 给单据主表增加采购状态字段
+-- 给系统参数表增加以销定购开关字段
+-- --------------------------------------------------------
+alter table jsh_depot_head add purchase_status varchar(1) DEFAULT NULL COMMENT '采购状态,0未采购、2完成采购、3部分采购' after status;
+alter table jsh_system_config add purchase_by_sale_flag varchar(1) DEFAULT '0' COMMENT '以销定购启用标记,0未启用,1启用' after minus_stock_flag;
+update jsh_depot_head set purchase_status='0';
+
+-- --------------------------------------------------------
+-- 时间 2022年05月28日
+-- by jishenghua
+-- 给单据子表增加关联明细id
+-- 给单据主表增加订金字段
+-- --------------------------------------------------------
+alter table jsh_depot_item add link_id bigint(20) DEFAULT NULL COMMENT '关联明细id' after expiration_date;
+alter table jsh_depot_head add deposit decimal(24,6) DEFAULT NULL COMMENT '订金' after other_money;
+
+-- --------------------------------------------------------
+-- 时间 2022年07月25日
+-- by jishenghua
+-- 给平台参数表添加手机端激活码
+-- --------------------------------------------------------
+INSERT INTO `jsh_platform_config` VALUES ('8', 'app_activation_code', '手机端激活码', '');
+
+-- --------------------------------------------------------
+-- 时间 2022年08月25日
+-- by jishenghua
+-- 给部分表增加启用状态和排序字段
+-- --------------------------------------------------------
+alter table jsh_unit add enabled bit(1) DEFAULT NULL COMMENT '启用' after ratio_three;
+update jsh_unit set enabled=1;
+alter table jsh_supplier add sort varchar(10) DEFAULT NULL COMMENT '排序' after tax_rate;
+alter table jsh_depot add enabled bit(1) DEFAULT NULL COMMENT '启用' after principal;
+update jsh_depot set enabled=1;
+alter table jsh_in_out_item add enabled bit(1) DEFAULT NULL COMMENT '启用' after remark;
+alter table jsh_in_out_item add sort varchar(10) DEFAULT NULL COMMENT '排序' after enabled;
+update jsh_in_out_item set enabled=1;
+alter table jsh_account add enabled bit(1) DEFAULT NULL COMMENT '启用' after remark;
+alter table jsh_account add sort varchar(10) DEFAULT NULL COMMENT '排序' after enabled;
+update jsh_account set enabled=1;
+alter table jsh_person add enabled bit(1) DEFAULT NULL COMMENT '启用' after name;
+alter table jsh_person add sort varchar(10) DEFAULT NULL COMMENT '排序' after enabled;
+update jsh_person set enabled=1;
+alter table jsh_role add enabled bit(1) DEFAULT NULL COMMENT '启用' after description;
+alter table jsh_role add sort varchar(10) DEFAULT NULL COMMENT '排序' after enabled;
+update jsh_role set enabled=1;
+
+-- --------------------------------------------------------
+-- 时间 2022年08月30日
+-- by jishenghua
+-- 给产品属性表移除属性字段
+-- --------------------------------------------------------
+alter table jsh_material_attribute drop column attribute_field;
+
+-- --------------------------------------------------------
+-- 时间 2022年09月13日
+-- by jishenghua
+-- 给商品和财务单据的备注修改字段长度
+-- --------------------------------------------------------
+alter table jsh_material change remark remark varchar(500) DEFAULT NULL COMMENT '备注';
+alter table jsh_account_head change remark remark varchar(1000) DEFAULT NULL COMMENT '备注';
+
+-- --------------------------------------------------------
+-- 时间 2022年10月2日
+-- by jishenghua
+-- 给单据明细增加采购单价字段
+-- --------------------------------------------------------
+alter table jsh_depot_item add purchase_unit_price decimal(24,6) DEFAULT NULL COMMENT '采购单价' after unit_price;
+
+-- --------------------------------------------------------
+-- 时间 2022年10月23日
+-- by jishenghua
+-- 给角色表增加价格屏蔽字段
+-- --------------------------------------------------------
+alter table jsh_role add price_limit varchar(50) DEFAULT NULL COMMENT '价格屏蔽 1-屏蔽采购价 2-屏蔽零售价 3-屏蔽销售价' after type;
+
+-- --------------------------------------------------------
+-- 时间 2023年02月19日
+-- by jishenghua
+-- 给系统参数表增加多级审核开关字段
+-- 给用户表增加是否经理字段,默认为否
+-- 给平台配置表增加发起流程地址
+-- --------------------------------------------------------
+alter table jsh_system_config add multi_level_approval_flag varchar(1) DEFAULT '0' COMMENT '多级审核启用标记,0未启用,1启用' after purchase_by_sale_flag;
+alter table jsh_user add leader_flag varchar(1) DEFAULT '0' COMMENT '是否经理,0否,1是' after password;
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('send_workflow_url', '发起流程地址', '');
+
+-- --------------------------------------------------------
+-- 时间 2023年02月25日
+-- by jishenghua
+-- 给消息表增加接收人字段
+-- 更新接收人id字段的值
+-- 给系统参数表增加流程类型
+-- --------------------------------------------------------
+alter table jsh_msg add user_id bigint(20) DEFAULT NULL COMMENT '接收人id' after type;
+update jsh_msg set user_id=tenant_id where user_id is null;
+alter table jsh_system_config add multi_bill_type varchar(200) DEFAULT NULL COMMENT '流程类型,可多选' after multi_level_approval_flag;
+
+-- --------------------------------------------------------
+-- 时间 2023年03月08日
+-- by jishenghua
+-- 给计量单位表修改比例的字段类型
+-- 给系统参数表增加金额审核启用标记
+-- 给单据增加来源字段
+-- --------------------------------------------------------
+alter table jsh_unit change ratio ratio decimal(24,3) DEFAULT NULL COMMENT '比例';
+alter table jsh_unit change ratio_two ratio_two decimal(24,3) DEFAULT NULL COMMENT '比例2';
+alter table jsh_unit change ratio_three ratio_three decimal(24,3) DEFAULT NULL COMMENT '比例3';
+alter table jsh_system_config add amount_approval_flag varchar(1) DEFAULT '0' COMMENT '金额审核启用标记,0未启用,1启用' after multi_bill_type;
+alter table jsh_depot_head add source varchar(1) DEFAULT '0' COMMENT '单据来源,0-pc,1-手机' after purchase_status;
+alter table jsh_account_head add source varchar(1) DEFAULT '0' COMMENT '单据来源,0-pc,1-手机' after status;
+
+-- --------------------------------------------------------
+-- 时间 2023年03月16日
+-- by jishenghua
+-- 将系统参数表的金额审核启用标记改为强审核标记
+-- 增加零售统计菜单
+-- --------------------------------------------------------
+alter table jsh_system_config change amount_approval_flag force_approval_flag varchar(1) DEFAULT '0' COMMENT '强审核启用标记,0未启用,1启用';
+insert into `jsh_function` (`number`, `name`, `parent_number`, `url`, `component`, `state`, `sort`, `enabled`, `type`, `push_btn`, `icon`, `delete_flag`) VALUES ('030105', '零售统计', '0301', '/report/retail_out_report', '/report/RetailOutReport', b'0', '0615', b'1', '电脑版', '', 'profile', '0');
+
+-- --------------------------------------------------------
+-- 时间 2023年03月08日
+-- by jishenghua
+-- 给系统参数表增加更新单价启用标记
+-- --------------------------------------------------------
+alter table jsh_system_config add update_unit_price_flag varchar(1) DEFAULT '1' COMMENT '更新单价启用标记,0未启用,1启用' after force_approval_flag;
+
+-- --------------------------------------------------------
+-- 时间 2023年05月10日
+-- by jishenghua
+-- 给系统参数表增加超出关联单据启用标记
+-- --------------------------------------------------------
+alter table jsh_system_config add over_link_bill_flag varchar(1) DEFAULT '0' COMMENT '超出关联单据启用标记,0未启用,1启用' after update_unit_price_flag;
+
+-- --------------------------------------------------------
+-- 时间 2023年05月19日
+-- by jishenghua
+-- 给商品主表增加仓位货架
+-- --------------------------------------------------------
+alter table jsh_material add position varchar(100) DEFAULT NULL COMMENT '仓位货架' after enable_batch_number;
+
+-- --------------------------------------------------------
+-- 时间 2023年05月28日
+-- by jishenghua
+-- 给用户表增加微信绑定字段
+-- 给平台表增加微信登录的相关信息
+-- --------------------------------------------------------
+alter table jsh_user add weixin_open_id varchar(100) DEFAULT NULL COMMENT '微信绑定' after remark;
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('weixinUrl', '微信url', '');
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('weixinAppid', '微信appid', '');
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('weixinSecret', '微信secret', '');
+
+-- --------------------------------------------------------
+-- 时间 2023年06月05日
+-- by jishenghua
+-- 给平台表增加阿里云OSS的相关信息
+-- --------------------------------------------------------
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('aliOss_endpoint', '阿里OSS-endpoint', '');
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('aliOss_accessKeyId', '阿里OSS-accessKeyId', '');
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('aliOss_accessKeySecret', '阿里OSS-accessKeySecret', '');
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('aliOss_bucketName', '阿里OSS-bucketName', '');
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('aliOss_linkUrl', '阿里OSS-linkUrl', '');
+
+-- --------------------------------------------------------
+-- 时间 2023年06月21日
+-- by jishenghua
+-- 给商家表增加操作员字段,并给该字段赋默认值
+-- --------------------------------------------------------
+alter table jsh_supplier add creator bigint(20) DEFAULT NULL COMMENT '操作员' after sort;
+update jsh_supplier set creator=tenant_id;
+
+-- --------------------------------------------------------
+-- 时间 2023年08月15日
+-- by jishenghua
+-- 给平台配置表增加单据Excel地址
+-- --------------------------------------------------------
+INSERT INTO `jsh_platform_config` (`platform_key`, `platform_key_info`, `platform_value`) VALUES ('bill_excel_url', '单据Excel地址', '');
+
+-- --------------------------------------------------------
+-- 时间 2023年10月10日
+-- by jishenghua
+-- 更新功能菜单里面的按钮参数(执行完之后记得要给'租户'角色重新勾选按钮)
+-- --------------------------------------------------------
+update jsh_function set push_btn='1,2,3,7' where push_btn='1,2,7';
+update jsh_function set push_btn='1,3' where number in ('01020101','01020102','01020103','010102');
+
+-- --------------------------------------------------------
+-- 时间 2023年11月1日
+-- by jishenghua
+-- 将经手人里面的业务员改为销售员
+-- --------------------------------------------------------
+update jsh_person set type='销售员' where type='业务员';
+
+-- --------------------------------------------------------
+-- 时间 2023年12月01日
+-- by jishenghua
+-- 给系统参数表增加出入库管理启用标记,开启后,采购入库、采购退货、销售出库、销售退货单据都会经过出入库流程,适合有独立仓库的场景。
+-- --------------------------------------------------------
+alter table jsh_system_config add in_out_manage_flag varchar(1) DEFAULT '0' COMMENT '出入库管理启用标记,0未启用,1启用' after over_link_bill_flag;
+
+-- --------------------------------------------------------
+-- 时间 2024年4月8日
+-- by jishenghua
+-- 给序列号表里面增加入库单价字段
+-- --------------------------------------------------------
+alter table jsh_serial_number add in_price decimal(24,6) DEFAULT NULL COMMENT '入库单价' after is_sell;
+
+-- --------------------------------------------------------
+-- 时间 2024年4月19日
+-- by jishenghua
+-- 给功能表增加请购单的菜单
+-- 给角色勾选请购单的菜单
+-- --------------------------------------------------------
+INSERT INTO jsh_function
+(`number`, `name`, `parent_number`, `url`, `component`, `state`, `sort`, `enabled`, `type`, `push_btn`, `icon`, `delete_flag`)
+VALUES ('050203', '请购单', '0502', '/bill/purchase_apply', '/bill/PurchaseApplyList', b'0', '0330', b'1', '电脑版', '1,2,3,7', 'profile', '0');
+
+-- --------------------------------------------------------
+-- 时间 2024年4月22日
+-- by jishenghua
+-- 给单据主表里面增加关联请购单字段
+-- --------------------------------------------------------
+alter table jsh_depot_head add link_apply varchar(50) DEFAULT NULL COMMENT '关联请购单' after link_number;
+
+-- --------------------------------------------------------
+-- 时间 2024年5月4日
+-- by jishenghua
+-- 给明细表的备注修改长度
+-- --------------------------------------------------------
+alter table jsh_depot_item change remark remark varchar(500) DEFAULT NULL COMMENT '备注';
+alter table jsh_account_item change remark remark varchar(500) DEFAULT NULL COMMENT '备注';
+
+-- --------------------------------------------------------
+-- 时间 2024年5月5日
+-- by jishenghua
+-- 给系统参数表增加多账户启用标记,开启后,采购订单、采购入库等单据可以进行多账户选择,升级的时候最好给老的租户进行批量设置为启用
+-- --------------------------------------------------------
+alter table jsh_system_config add multi_account_flag varchar(1) DEFAULT '0' COMMENT '多账户启用标记,0未启用,1启用' after in_out_manage_flag;
+update jsh_system_config set multi_account_flag='1' where multi_account_flag='0';
+
+-- --------------------------------------------------------
+-- 时间 2024年5月21日
+-- by jishenghua
+-- 给系统参数表增加移动平均价标记,默认关闭,开启之后将通过移动平均来计算成本价
+-- 给实时库存表增加当前单价字段
+-- --------------------------------------------------------
+alter table jsh_system_config add move_avg_price_flag varchar(1) DEFAULT '0' COMMENT '移动平均价启用标记,0未启用,1启用' after multi_account_flag;
+alter table jsh_material_current_stock add current_unit_price decimal(24,6) DEFAULT NULL COMMENT '当前单价' after current_number;
+
+-- --------------------------------------------------------
+-- 时间 2024年8月21日
+-- by jishenghua
+-- 给系统参数表增加先审核后打印启用标记,启用后,零售、采购、销售等单据,都需要先审核之后才能进行打印
+-- --------------------------------------------------------
+alter table jsh_system_config add audit_print_flag varchar(1) DEFAULT '0' COMMENT '先审核后打印启用标记,0未启用,1启用' after move_avg_price_flag;
+
+-- --------------------------------------------------------
+-- 时间 2024年9月27日
+-- by jishenghua
+-- 给商品表增加品牌、助记码字段
+-- --------------------------------------------------------
+alter table jsh_material add brand varchar(100) DEFAULT NULL COMMENT '品牌' after standard;
+alter table jsh_material add mnemonic varchar(100) DEFAULT NULL COMMENT '助记码' after brand;
+
+-- --------------------------------------------------------
+-- 时间 2024年12月08日
+-- by jishenghua
+-- 给用户表增加删除字段、修改状态表的备注
+-- 给租户表增加删除字段
+-- --------------------------------------------------------
+alter table jsh_user add delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除' after tenant_id;
+alter table jsh_user change Status status tinyint(4) DEFAULT '0' COMMENT '状态,0正常,2封禁';
+update jsh_user set delete_flag='1' where status=1;
+alter table jsh_tenant add delete_flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除' after remark;
+
+-- --------------------------------------------------------
+-- 时间 2024年12月17日
+-- by jishenghua
+-- 更新菜单:把计量单位更新为多单位
+-- --------------------------------------------------------
+update jsh_function set name='多单位' where number='010103';
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..937cab6
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.jsh</groupId>
+	<artifactId>jshERP-boot</artifactId>
+	<version>3.0-SNAPSHOT</version>
+	<packaging>jar</packaging>
+
+	<name>jshERP-boot</name>
+	<description>云游管理系统</description>
+
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.0.0.RELEASE</version>
+	</parent>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.gitee.starblues</groupId>
+			<artifactId>springboot-plugin-framework</artifactId>
+			<version>2.2.1-RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>com.gitee.starblues</groupId>
+			<artifactId>springboot-plugin-framework-extension-mybatis</artifactId>
+			<version>2.2.1-RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>1.2.83</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.30</version>
+		</dependency>
+		<!--http-->
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.5.2</version>
+		</dependency>
+		<dependency>
+			<groupId>net.sourceforge.jexcelapi</groupId>
+			<artifactId>jxl</artifactId>
+			<version>2.6.12</version>
+		</dependency>
+		<!-- lombok -->
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>1.18.12</version>
+		</dependency>
+		<!-- 日志 -->
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-to-slf4j</artifactId>
+			<version>2.15.0</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jul-to-slf4j</artifactId>
+			<version>1.7.25</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.baomidou</groupId>
+			<artifactId>mybatis-plus-boot-starter</artifactId>
+			<version>3.0.7.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-redis</artifactId>
+			<version>1.4.1.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+			<version>2.7.0</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.github.xiaoymin</groupId>
+			<artifactId>swagger-bootstrap-ui</artifactId>
+			<version>1.9.6</version>
+		</dependency>
+		<dependency>
+			<groupId>com.aliyun.oss</groupId>
+			<artifactId>aliyun-sdk-oss</artifactId>
+			<version>3.10.1</version>
+		</dependency>
+		<dependency>
+			<groupId>com.itextpdf</groupId>
+			<artifactId>itextpdf</artifactId>
+			<version>5.5.13.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>1.3.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.belerweb</groupId>
+			<artifactId>pinyin4j</artifactId>
+			<version>2.5.1</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<finalName>jshERP</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<version>2.0.3.RELEASE</version>
+				<executions>
+					<execution>
+						<id>build-info</id>
+						<phase>generate-sources</phase>
+						<goals>
+							<goal>build-info</goal>
+						</goals>
+					</execution>
+					<execution>
+						<id>repackage</id>
+						<phase>package</phase>
+						<goals>
+							<goal>repackage</goal>
+						</goals>
+						<configuration>
+							<mainClass>com.jsh.erp.ErpApplication</mainClass>
+							<layout>JAR</layout>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.5.1</version>
+				<executions>
+					<execution>
+						<id>make-zip</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<configuration>
+							<descriptors>
+								<descriptor>src/main/assembly/assembly.xml</descriptor>
+							</descriptors>
+							<outputDirectory>./dist</outputDirectory>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.mybatis.generator</groupId>
+				<artifactId>mybatis-generator-maven-plugin</artifactId>
+				<version>1.4.0</version>
+				<configuration>
+					<configurationFile>${basedir}/src/test/resources/generatorConfig.xml</configurationFile>
+					<verbose>true</verbose>
+					<overwrite>true</overwrite>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.7.0</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/src/main/assembly/assembly.xml b/src/main/assembly/assembly.xml
new file mode 100644
index 0000000..1478080
--- /dev/null
+++ b/src/main/assembly/assembly.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<assembly
+        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
+        http://maven.apache.org/xsd/assembly-1.1.0.xsd
+http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 ">
+
+    <id>bin</id>
+
+    <formats>
+        <format>zip</format>
+    </formats>
+
+    <includeBaseDirectory>true</includeBaseDirectory>
+
+    <fileSets>
+        <fileSet>
+            <directory>${project.basedir}/target</directory>
+            <includes>
+                <include>*.jar</include>
+            </includes>
+            <outputDirectory>/lib</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/src/main/resources</directory>
+            <includes>
+                <include>*.properties</include>
+                <include>*.yml</include>
+                <include>*.yaml</include>
+                <include>*.xml</include>
+            </includes>
+            <outputDirectory>/config</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/src/main/bin</directory>
+            <outputDirectory>/bin</outputDirectory>
+            <includes>
+                <include>run-manage.sh</include>
+            </includes>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/src/main/bin/</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>start.bat</include>
+                <include>restart.sh</include>
+                <include>start.sh</include>
+                <include>stop.sh</include>
+                <include>status.sh</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>docs</directory>
+            <outputDirectory>/docs</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>${project.basedir}</directory>
+            <includes>
+                <include>*.md</include>
+                <include>*.txt</include>
+            </includes>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/src/main/bin/restart.sh b/src/main/bin/restart.sh
new file mode 100644
index 0000000..70c0be1
--- /dev/null
+++ b/src/main/bin/restart.sh
@@ -0,0 +1 @@
+./bin/run-manage.sh restart
\ No newline at end of file
diff --git a/src/main/bin/run-manage.sh b/src/main/bin/run-manage.sh
new file mode 100644
index 0000000..45d493d
--- /dev/null
+++ b/src/main/bin/run-manage.sh
@@ -0,0 +1,131 @@
+SERVER_NAME=jshERP
+readonly APP_HOME=${FILE_PATH:-$(dirname $(cd `dirname $0`; pwd))}
+#readonly JAVA_HOME=""
+readonly CONFIG_HOME="$APP_HOME/config/"
+readonly LIB_HOME="$APP_HOME/lib"
+readonly LOGS_HOME="$APP_HOME/logs"
+readonly PID_FILE="$LOGS_HOME/application.pid"
+readonly APP_MAIN_CLASS="jshERP.jar"
+readonly LOG_CONFIG="$CONFIG_HOME/logback-spring.xml"
+readonly JAVA_RUN="-Dlogs.home=$LOGS_HOME -Dlogging.config=$LOG_CONFIG -Dspring.config.location=file:$CONFIG_HOME -Dspring.pid.file=$PID_FILE -Dspring.pid.fail-on-write-error=true"
+readonly JAVA_OPTS="-server -Xms128m -Xmx320m -XX:PermSize=128M -XX:MaxPermSize=256M $JAVA_RUN"
+readonly JAVA="java"
+PID=0
+if [ ! -x "$LOGS_HOME" ]
+then
+  mkdir $LOGS_HOME
+fi
+chmod +x -R "$JAVA_HOME/bin/"
+functions="/etc/functions.sh"
+if test -f $functions ; then
+  . $functions
+else
+  success()
+  {
+    echo " SUCCESS! $@"
+  }
+  failure()
+  {
+    echo " ERROR! $@"
+  }
+  warning()
+  {
+    echo "WARNING! $@"
+  }
+fi
+function checkpid() {
+   PID=$(ps -ef | grep $APP_MAIN_CLASS | grep -v 'grep' | awk '{print int($2)}')
+    if [[ -n "$PID" ]]
+    then
+      return 0
+    else
+      return 1
+    fi
+}
+function start() {
+   checkpid
+   if [[ $? -eq 0 ]]
+   then
+      warning "[$APP_MAIN_CLASS]: already started! (PID=$PID)"
+   else
+      echo -n "[$APP_MAIN_CLASS]: Starting ..."
+      JAVA_CMD="nohup $JAVA $JAVA_OPTS -jar $LIB_HOME/$APP_MAIN_CLASS > /dev/null 2>&1 &"
+      # echo "Exec cmmand : $JAVA_CMD"
+      sh -c "$JAVA_CMD"
+      sleep 3
+      checkpid
+      if [[ $? -eq 0 ]]
+      then
+         success "(PID=$PID) "
+      else
+         failure " "
+      fi
+   fi
+}
+function stop() {
+   checkpid
+   if [[ $? -eq 0 ]];
+   then
+      echo -n "[$APP_MAIN_CLASS]: Shutting down ...(PID=$PID) "
+      kill -9 $PID
+      if [[ $? -eq 0 ]];
+      then
+	     echo 0 > $PID_FILE
+         success " "
+      else
+         failure " "
+      fi
+   else
+      warning "[$APP_MAIN_CLASS]: is not running ..."
+   fi
+}
+function status() {
+   checkpid
+   if [[ $? -eq 0 ]]
+   then
+      success "[$APP_MAIN_CLASS]: is running! (PID=$PID)"
+      return 0
+   else
+      failure "[$APP_MAIN_CLASS]: is not running"
+      return 1
+   fi
+}
+function info() {
+   echo "System Information:"
+   echo 
+   echo "****************************"
+   echo `head -n 1 /etc/issue`
+   echo `uname -a`
+   echo
+   echo "JAVA_HOME=$JAVA_HOME"
+   echo 
+   echo "JAVA Environment Information:"
+   echo `$JAVA -version`
+   echo
+   echo "APP_HOME=$APP_HOME"
+   echo "APP_MAIN_CLASS=$APP_MAIN_CLASS"
+   echo 
+   echo "****************************"
+}
+case "$1" in
+   'start')
+      start
+      ;;
+   'stop')
+     stop
+     ;;
+   'restart')
+     stop
+     start
+     ;;
+   'status')
+     status
+     ;;
+   'info')
+     info
+     ;;
+    *)
+     echo "Usage: $0 {help|start|stop|restart|status|info}"
+     ;;
+esac
+exit 0
\ No newline at end of file
diff --git a/src/main/bin/start.bat b/src/main/bin/start.bat
new file mode 100644
index 0000000..37b8bb5
--- /dev/null
+++ b/src/main/bin/start.bat
@@ -0,0 +1,6 @@
+@echo off
+
+title jshERP
+
+java -Xms1000m -Xmx2000m -jar .\lib\jshERP.jar
+pause over
\ No newline at end of file
diff --git a/src/main/bin/start.sh b/src/main/bin/start.sh
new file mode 100644
index 0000000..d0bf067
--- /dev/null
+++ b/src/main/bin/start.sh
@@ -0,0 +1 @@
+./bin/run-manage.sh start
\ No newline at end of file
diff --git a/src/main/bin/status.sh b/src/main/bin/status.sh
new file mode 100644
index 0000000..46d6537
--- /dev/null
+++ b/src/main/bin/status.sh
@@ -0,0 +1 @@
+./bin/run-manage.sh status
\ No newline at end of file
diff --git a/src/main/bin/stop.sh b/src/main/bin/stop.sh
new file mode 100644
index 0000000..8f3414e
--- /dev/null
+++ b/src/main/bin/stop.sh
@@ -0,0 +1 @@
+./bin/run-manage.sh stop
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/ErpApplication.java b/src/main/java/com/jsh/erp/ErpApplication.java
new file mode 100644
index 0000000..ff44e1c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/ErpApplication.java
@@ -0,0 +1,28 @@
+package com.jsh.erp;
+
+import com.jsh.erp.utils.ComputerInfo;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+import java.io.IOException;
+
+@SpringBootApplication
+@MapperScan("com.jsh.erp.datasource.mappers")
+@ServletComponentScan
+@EnableScheduling
+public class ErpApplication{
+    public static void main(String[] args) throws IOException {
+        ConfigurableApplicationContext context = SpringApplication.run(ErpApplication.class, args);
+        Environment environment = context.getBean(Environment.class);
+        System.out.println("启动成功,后端服务API地址:http://" + ComputerInfo.getIpAddr() + ":"
+                + environment.getProperty("server.port") + "/jshERP-boot/doc.html");
+        System.out.println("您还需启动前端服务,启动命令:yarn run serve 或 npm run serve,测试用户:jsh,密码:123456");
+    }
+}
diff --git a/src/main/java/com/jsh/erp/config/PluginBeanConfig.java b/src/main/java/com/jsh/erp/config/PluginBeanConfig.java
new file mode 100644
index 0000000..301b1bf
--- /dev/null
+++ b/src/main/java/com/jsh/erp/config/PluginBeanConfig.java
@@ -0,0 +1,24 @@
+package com.jsh.erp.config;
+
+import com.gitee.starblues.extension.mybatis.SpringBootMybatisExtension;
+import com.gitee.starblues.integration.application.AutoPluginApplication;
+import com.gitee.starblues.integration.application.PluginApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: jishenghua
+ * @Version: 1.0
+ * @Create Date Time: 2019-05-30 15:53
+ * @Update Date Time:
+ * @see
+ */
+@Configuration
+public class PluginBeanConfig {
+    @Bean
+    public PluginApplication pluginApplication(){
+        PluginApplication pluginApplication = new AutoPluginApplication();
+        pluginApplication.addExtension(new SpringBootMybatisExtension());
+        return pluginApplication;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/config/PluginConfiguration.java b/src/main/java/com/jsh/erp/config/PluginConfiguration.java
new file mode 100644
index 0000000..4c3bf46
--- /dev/null
+++ b/src/main/java/com/jsh/erp/config/PluginConfiguration.java
@@ -0,0 +1,104 @@
+package com.jsh.erp.config;
+
+import com.gitee.starblues.integration.DefaultIntegrationConfiguration;
+import org.pf4j.RuntimeMode;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * @Description:
+ * @Author: jishenghua
+ * @Version: 1.0
+ * @Create Date Time: 2019-05-25 12:36
+ * @Update Date Time:
+ * @see
+ */
+@Component
+@ConfigurationProperties(prefix = "plugin")
+public class PluginConfiguration extends DefaultIntegrationConfiguration {
+
+    /**
+     * 运行模式
+     *  开发环境: development、dev
+     *  生产/部署 环境: deployment、prod
+     */
+    @Value("${runMode:dev}")
+    private String runMode;
+
+    @Value("${pluginPath:plugins}")
+    private String pluginPath;
+
+    @Value("${pluginConfigFilePath:pluginConfigs}")
+    private String pluginConfigFilePath;
+
+    @Override
+    public RuntimeMode environment() {
+        return RuntimeMode.byName(runMode);
+    }
+
+    @Override
+    public String pluginPath() {
+        return pluginPath;
+    }
+
+    @Override
+    public String pluginConfigFilePath() {
+        return pluginConfigFilePath;
+    }
+
+    @Override
+    public String uploadTempPath() {
+        return "temp";
+    }
+
+    @Override
+    public String backupPath() {
+        return "backupPlugin";
+    }
+
+    @Override
+    public String pluginRestControllerPathPrefix() {
+        return "/api/plugin";
+    }
+
+    @Override
+    public boolean enablePluginIdRestControllerPathPrefix() {
+        return true;
+    }
+
+    public String getRunMode() {
+        return runMode;
+    }
+
+    public void setRunMode(String runMode) {
+        this.runMode = runMode;
+    }
+
+
+    public String getPluginPath() {
+        return pluginPath;
+    }
+
+    public void setPluginPath(String pluginPath) {
+        this.pluginPath = pluginPath;
+    }
+
+    public String getPluginConfigFilePath() {
+        return pluginConfigFilePath;
+    }
+
+    public void setPluginConfigFilePath(String pluginConfigFilePath) {
+        this.pluginConfigFilePath = pluginConfigFilePath;
+    }
+
+    @Override
+    public String toString() {
+        return "PluginArgConfiguration{" +
+                "runMode='" + runMode + '\'' +
+                ", pluginPath='" + pluginPath + '\'' +
+                ", pluginConfigFilePath='" + pluginConfigFilePath + '\'' +
+                '}';
+    }
+}
diff --git a/src/main/java/com/jsh/erp/config/Swagger2Config.java b/src/main/java/com/jsh/erp/config/Swagger2Config.java
new file mode 100644
index 0000000..95c1f1a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/config/Swagger2Config.java
@@ -0,0 +1,44 @@
+package com.jsh.erp.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * 插件集成配置
+ *
+ * @author jishenghua
+ * @version 1.0
+ */
+@Configuration
+@EnableSwagger2
+public class Swagger2Config {
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(this.apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("云游管理系统 Restful Api")
+                .description("云游管理系统接口描述")
+                .termsOfServiceUrl("http://127.0.0.1")
+                .contact(new Contact("jishenghua", "", ""))
+                .version("3.0")
+                .build();
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/config/TenantConfig.java b/src/main/java/com/jsh/erp/config/TenantConfig.java
new file mode 100644
index 0000000..d9812cb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/config/TenantConfig.java
@@ -0,0 +1,118 @@
+package com.jsh.erp.config;
+
+import com.baomidou.mybatisplus.core.parser.ISqlParser;
+import com.baomidou.mybatisplus.core.parser.ISqlParserFilter;
+import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
+import com.jsh.erp.utils.Tools;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.reflection.MetaObject;
+import org.mybatis.spring.mapper.MapperScannerConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class TenantConfig {
+
+    @Bean
+    public PaginationInterceptor paginationInterceptor(HttpServletRequest request) {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        List<ISqlParser> sqlParserList = new ArrayList<>();
+        TenantSqlParser tenantSqlParser = new TenantSqlParser();
+        tenantSqlParser.setTenantHandler(new TenantHandler() {
+            @Override
+            public Expression getTenantId() {
+                String token = request.getHeader("X-Access-Token");
+                Long tenantId = Tools.getTenantIdByToken(token);
+                if (tenantId!=0L) {
+                    return new LongValue(tenantId);
+                } else {
+                    //超管
+                    return null;
+                }
+            }
+
+            @Override
+            public String getTenantIdColumn() {
+                return "tenant_id";
+            }
+
+            @Override
+            public boolean doTableFilter(String tableName) {
+                //获取开启状态
+                Boolean res = true;
+                String token = request.getHeader("X-Access-Token");
+                Long tenantId = Tools.getTenantIdByToken(token);
+                if (tenantId!=0L) {
+                    // 这里可以判断是否过滤表
+                    if ("jsh_material_property".equals(tableName) || "jsh_sequence".equals(tableName)
+                            || "jsh_function".equals(tableName) || "jsh_platform_config".equals(tableName)
+                            || "jsh_tenant".equals(tableName)) {
+                        res = true;
+                    } else {
+                        res = false;
+                    }
+                }
+                return res;
+            }
+        });
+
+        sqlParserList.add(tenantSqlParser);
+        paginationInterceptor.setSqlParserList(sqlParserList);
+        paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
+            @Override
+            public boolean doFilter(MetaObject metaObject) {
+                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
+                // 过滤自定义查询此时无租户信息约束出现
+                if ("com.jsh.erp.datasource.mappers.UserMapperEx.getUserByWeixinOpenId".equals(ms.getId())) {
+                    return true;
+                } else if ("com.jsh.erp.datasource.mappers.UserMapperEx.updateUserWithWeixinOpenId".equals(ms.getId())) {
+                    return true;
+                } else if ("com.jsh.erp.datasource.mappers.UserMapperEx.getUserListByUserNameOrLoginName".equals(ms.getId())) {
+                    return true;
+                } else if ("com.jsh.erp.datasource.mappers.UserMapperEx.disableUserByLimit".equals(ms.getId())) {
+                    return true;
+                } else if ("com.jsh.erp.datasource.mappers.RoleMapperEx.getRoleWithoutTenant".equals(ms.getId())) {
+                    return true;
+                } else if ("com.jsh.erp.datasource.mappers.LogMapperEx.insertLogWithUserId".equals(ms.getId())) {
+                    return true;
+                } else if ("com.jsh.erp.datasource.mappers.UserBusinessMapperEx.getBasicDataByKeyIdAndType".equals(ms.getId())) {
+                    return true;
+                }
+                return false;
+            }
+        });
+        return paginationInterceptor;
+    }
+
+    /**
+     * 相当于顶部的:
+     * {@code @MapperScan("com.jsh.erp.datasource.mappers*")}
+     * 这里可以扩展,比如使用配置文件来配置扫描Mapper的路径
+     */
+    @Bean
+    public MapperScannerConfigurer mapperScannerConfigurer() {
+        MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
+        scannerConfigurer.setBasePackage("com.jsh.erp.datasource.mappers*");
+        return scannerConfigurer;
+    }
+
+    /**
+     * 性能分析拦截器,不建议生产使用
+     */
+//    @Bean
+//    public PerformanceInterceptor performanceInterceptor(){
+//        return new PerformanceInterceptor();
+//    }
+
+
+}
diff --git a/src/main/java/com/jsh/erp/constants/BusinessConstants.java b/src/main/java/com/jsh/erp/constants/BusinessConstants.java
new file mode 100644
index 0000000..08dc19f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/constants/BusinessConstants.java
@@ -0,0 +1,230 @@
+package com.jsh.erp.constants;
+
+/**
+ * @ClassName:BusinessConstants
+ * @Description 业务字典类
+ * @Author qiankunpingtai
+ * @Date 2019-3-6 17:58
+ * @Version 1.0
+ **/
+public class BusinessConstants {
+
+    /**
+     * 默认的日期格式
+     */
+    public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 一天的初始时间
+     */
+    public static final String DAY_FIRST_TIME = " 00:00:00";
+    /**
+     * 一天的结束时间
+     */
+    public static final String DAY_LAST_TIME = " 23:59:59";
+    /**
+     * 默认的分页起始页页码
+     */
+    public static final Integer DEFAULT_PAGINATION_PAGE_NUMBER = 1;
+    /**
+     * 无数据时列表返回的默认数据条数
+     */
+    public static final Long DEFAULT_LIST_NULL_NUMBER = 0L;
+    /**
+     * 默认的分页条数
+     */
+    public static final Integer DEFAULT_PAGINATION_PAGE_SIZE = 10;
+    /**
+     * 单据主表出入库类型 type 入库 出库 其它
+     * depothead
+     * */
+    public static final String DEPOTHEAD_TYPE_IN = "入库";
+    public static final String DEPOTHEAD_TYPE_OUT = "出库";
+    public static final String DEPOTHEAD_TYPE_OTHER = "其它";
+    /**
+     * 付款类型 payType //现付/预付款
+     * */
+    public static final String PAY_TYPE_PREPAID = "预付款";
+    public static final String PAY_TYPE_BY_CASH = "现付";
+    /**
+     * 删除标记 deleteFlag  '0'未删除 '1'已删除
+     * */
+    public static final String DELETE_FLAG_DELETED = "1";
+    public static final String DELETE_FLAG_EXISTS = "0";
+    /**
+     * 是否卖出 isSell  '0'未卖出 '1'已卖出
+     * */
+    public static final String IS_SELL_SELLED = "1";
+    public static final String IS_SELL_HOLD = "0";
+    /**
+     * 商品是否开启序列号标识enableSerialNumber  '0'未启用 '1'启用
+     * */
+    public static final String ENABLE_SERIAL_NUMBER_ENABLED = "1";
+    public static final String ENABLE_SERIAL_NUMBER_NOT_ENABLED = "0";
+    /**
+     * 商品是否开启批号标识enableBatchNumber  '0'未启用 '1'启用
+     * */
+    public static final String ENABLE_BATCH_NUMBER_ENABLED = "1";
+    public static final String ENABLE_BATCH_NUMBER_NOT_ENABLED = "0";
+    /**
+     * 单据状态 billsStatus '0'未审核 '1'审核 '2'完成采购|销售 '3'部分采购|销售
+     * */
+    public static final String BILLS_STATUS_UN_AUDIT = "0";
+    public static final String BILLS_STATUS_AUDIT = "1";
+    public static final String BILLS_STATUS_SKIPED = "2";
+    public static final String BILLS_STATUS_SKIPING = "3";
+    /**
+     * 单据-采购状态 purchaseStatus '0'未采购、'2'完成采购、'3'部分采购
+     * */
+    public static final String PURCHASE_STATUS_UN_AUDIT = "0";
+    public static final String PURCHASE_STATUS_SKIPED = "2";
+    public static final String PURCHASE_STATUS_SKIPING = "3";
+    /**
+     * 出入库分类
+     * 请购单、采购、采购退货、其它、零售、销售、调拨、盘点复盘等
+     * */
+    public static final String SUB_TYPE_PURCHASE_APPLY = "请购单";
+    public static final String SUB_TYPE_PURCHASE_ORDER = "采购订单";
+    public static final String SUB_TYPE_PURCHASE = "采购";
+    public static final String SUB_TYPE_PURCHASE_RETURN = "采购退货";
+    public static final String SUB_TYPE_OTHER = "其它";
+    public static final String SUB_TYPE_RETAIL = "零售";
+    public static final String SUB_TYPE_RETAIL_RETURN = "零售退货";
+    public static final String SUB_TYPE_SALES_ORDER = "销售订单";
+    public static final String SUB_TYPE_SALES = "销售";
+    public static final String SUB_TYPE_SALES_RETURN = "销售退货";
+    public static final String SUB_TYPE_TRANSFER = "调拨";
+    public static final String SUB_TYPE_CHECK_ENTER = "盘点录入";
+    public static final String SUB_TYPE_REPLAY = "盘点复盘";
+    public static final String SUB_TYPE_ASSEMBLE = "组装单";
+    public static final String SUB_TYPE_DISASSEMBLE = "拆卸单";
+    /**
+     * 生产类型分类
+     * 生产入库
+     * */
+    public static final String BILL_TYPE_PRODUCE_IN = "生产入库";
+    /**
+     * 财务单据分类
+     * 收款、付款、转账
+     * */
+    public static final String TYPE_MONEY_IN = "收款";
+    public static final String TYPE_MONEY_OUT = "付款";
+    public static final String TYPE_GIRO = "转账";
+    /**
+     * 批量插入sql时最大的数据条数
+     * */
+    public static final int BATCH_INSERT_MAX_NUMBER = 500;
+    /**
+     * sequence名称
+     * */
+    //sequence返回字符串的最小长度
+    public static final Long SEQ_TO_STRING_MIN_LENGTH = 10000000000L;
+    //sequence长度小于基准长度时前追加基础值
+    public static final String SEQ_TO_STRING_LESS_INSERT = "0";
+    //单据编号
+    public static final String DEPOT_NUMBER_SEQ = "depot_number_seq";
+    /**
+     * 商品类别根目录id
+     * */
+    /**
+     * create by: qiankunpingtai
+     * create time: 2019/3/14 11:41
+     * description:
+     * 为了使用户可以自己建初始目录,设定根目录的父级目录id为-1
+     *
+     */
+    public static final Long MATERIAL_CATEGORY_ROOT_PARENT_ID = -1L;
+    /**
+     * 商品类别状态
+     * 0系统默认,1启用,2删除
+     * */
+    public static final String MATERIAL_CATEGORY_STATUS_DEFAULT = "0";
+    public static final String MATERIAL_CATEGORY_STATUS_ENABLE = "1";
+    public static final String MATERIAL_CATEGORY_STATUS_DELETE = "2";
+    /**
+     * 机构状态
+     *  1未营业、2正常营业、3暂停营业、4终止营业,5已除名
+     * */
+    public static final String ORGANIZATION_STCD_NOT_OPEN = "1";
+    public static final String ORGANIZATION_STCD_OPEN = "2";
+    public static final String ORGANIZATION_STCD_BUSINESS_SUSPENDED = "3";
+    public static final String ORGANIZATION_STCD_BUSINESS_TERMINATED = "4";
+    public static final String ORGANIZATION_STCD_REMOVED = "5";
+    /**
+     * 根机构父级编号
+     * 根机父级构编号默认为-1
+     * */
+    public static final String ORGANIZATION_ROOT_PARENT_NO = "-1";
+    /**
+     * 新增用户默认密码
+     * */
+    public static final String USER_DEFAULT_PASSWORD = "123456";
+    /**
+     * 用户是否系统自带
+     * 0、非系统自带,1系统自带
+     * */
+    public static final byte USER_NOT_SYSTEM = 0;
+    public static final byte USER_IS_SYSTEM = 1;
+    /**
+     * 用户是否为管理者
+     * 0、管理者,1员工
+     * */
+    public static final byte USER_IS_MANAGER = 0;
+    public static final byte USER_NOT_MANAGER = 1;
+    /**
+     * 用户状态
+     * 0:正常,2封禁
+     * */
+    public static final byte USER_STATUS_NORMAL = 0;
+    public static final byte USER_STATUS_BANNED = 2;
+    /**
+     * 日志操作
+     * 新增、修改、删除、登录、导入
+     * */
+    public static final String LOG_OPERATION_TYPE_ADD = "新增";
+    public static final String LOG_OPERATION_TYPE_BATCH_ADD = "批量新增";
+    public static final String LOG_OPERATION_TYPE_EDIT = "修改";
+    public static final String LOG_OPERATION_TYPE_DELETE = "删除";
+    public static final String LOG_OPERATION_TYPE_LOGIN = "登录";
+    public static final String LOG_OPERATION_TYPE_IMPORT = "导入";
+    public static final String LOG_OPERATION_TYPE_ENABLED = "更新状态";
+
+    /**
+     * 数据数量单位
+     * 条
+     * */
+    public static final String LOG_DATA_UNIT = "条";
+
+    /**
+     * 删除类型
+     * 1正常删除
+     * 2强制删除
+     * */
+    public static final String DELETE_TYPE_NORMAL = "1";
+    public static final String DELETE_TYPE_FORCE = "2";
+
+    /**
+     * 默认管理员账号
+     */
+    public static final String DEFAULT_MANAGER = "admin";
+
+    public static final String ROLE_TYPE_PRIVATE = "个人数据";
+
+    public static final String ROLE_TYPE_THIS_ORG = "本机构数据";
+
+    public static final String ROLE_TYPE_PUBLIC = "全部数据";
+
+    /**
+     * redis相关
+     * */
+    //session的生命周期,秒
+    public static final Long MAX_SESSION_IN_SECONDS=60*60*24*3L;
+
+    /**
+     * 验证码 redis key
+     */
+    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
+    /**
+     * 验证码有效期(分钟)
+     */
+    public static final Integer CAPTCHA_EXPIRATION = 2;
+}
diff --git a/src/main/java/com/jsh/erp/constants/ExceptionConstants.java b/src/main/java/com/jsh/erp/constants/ExceptionConstants.java
new file mode 100644
index 0000000..e6f8267
--- /dev/null
+++ b/src/main/java/com/jsh/erp/constants/ExceptionConstants.java
@@ -0,0 +1,581 @@
+package com.jsh.erp.constants;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class ExceptionConstants {
+    /**
+     * code 格式 type+五位数字,例如3500000
+     * ResourceInfo(value = "inOutItem", type = 35)
+     *
+     * */
+
+    public static final String GLOBAL_RETURNS_CODE = "code";
+    public static final String GLOBAL_RETURNS_MESSAGE = "msg";
+    public static final String GLOBAL_RETURNS_DATA = "data";
+
+    /**
+     * 正常返回/操作成功
+     **/
+    public static final int SERVICE_SUCCESS_CODE = 200;
+    public static final String SERVICE_SUCCESS_MSG = "操作成功";
+    /**
+     * 数据查询异常
+     */
+    public static final int DATA_READ_FAIL_CODE = 300;
+    public static final String DATA_READ_FAIL_MSG = "数据查询异常";
+    /**
+     * 数据写入异常
+     */
+    public static final int DATA_WRITE_FAIL_CODE = 301;
+    public static final String DATA_WRITE_FAIL_MSG = "数据写入异常";
+
+    /**
+     * 系统运行时未知错误
+     **/
+    public static final int SERVICE_SYSTEM_ERROR_CODE = 500;
+    public static final String SERVICE_SYSTEM_ERROR_MSG = "未知异常";
+    /**
+     * 检测到存在依赖数据,是否强制删除?
+     **/
+    public static final int DELETE_FORCE_CONFIRM_CODE = 601;
+    public static final String DELETE_FORCE_CONFIRM_MSG = "检测到存在依赖数据,不能删除!";
+    /**
+     * 用户信息
+     * type = 5
+     * */
+    //添加用户信息失败
+    public static final int USER_ADD_FAILED_CODE = 500000;
+    public static final String USER_ADD_FAILED_MSG = "添加用户信息失败";
+    //删除用户信息失败
+    public static final int USER_DELETE_FAILED_CODE = 500001;
+    public static final String USER_DELETE_FAILED_MSG = "删除用户信息失败";
+    //修改用户信息失败
+    public static final int USER_EDIT_FAILED_CODE = 500002;
+    public static final String USER_EDIT_FAILED_MSG = "修改用户信息失败";
+    //登录名已存在
+    public static final int USER_LOGIN_NAME_ALREADY_EXISTS_CODE = 500003;
+    public static final String USER_LOGIN_NAME_ALREADY_EXISTS_MSG = "登录名在本系统已存在";
+    //用户录入数量超出限制
+    public static final int USER_OVER_LIMIT_FAILED_CODE = 500004;
+    public static final String USER_OVER_LIMIT_FAILED_MSG = "用户录入数量超出限制,请联系平台管理员";
+    //此用户名限制使用
+    public static final int USER_NAME_LIMIT_USE_CODE = 500005;
+    public static final String USER_NAME_LIMIT_USE_MSG = "此用户名限制使用";
+    //启用的用户数量超出限制
+    public static final int USER_ENABLE_OVER_LIMIT_FAILED_CODE = 500006;
+    public static final String USER_ENABLE_OVER_LIMIT_FAILED_MSG = "启用的用户数量超出限制,请联系平台管理员";
+    //租户不能被删除
+    public static final int USER_LIMIT_TENANT_DELETE_CODE = 500008;
+    public static final String USER_LIMIT_TENANT_DELETE_MSG = "抱歉,租户不能被删除";
+    //当前机构已经存在经理
+    public static final int USER_LEADER_IS_EXIST_CODE = 500009;
+    public static final String USER_LEADER_IS_EXIST_MSG = "抱歉,当前机构已经存在经理";
+    //验证码错误
+    public static final int USER_JCAPTCHA_ERROR_CODE = 500010;
+    public static final String USER_JCAPTCHA_ERROR_MSG = "验证码错误";
+    //验证码已失效
+    public static final int USER_JCAPTCHA_EXPIRE_CODE = 500011;
+    public static final String USER_JCAPTCHA_EXPIRE_MSG = "验证码已失效";
+    //验证码不能为空
+    public static final int USER_JCAPTCHA_EMPTY_CODE = 500012;
+    public static final String USER_JCAPTCHA_EMPTY_MSG = "验证码不能为空";
+
+    /**
+     * 角色信息
+     * type = 10
+     * */
+    //添加角色信息失败
+    public static final int ROLE_ADD_FAILED_CODE = 1000000;
+    public static final String ROLE_ADD_FAILED_MSG = "添加角色信息失败";
+    //删除角色信息失败
+    public static final int ROLE_DELETE_FAILED_CODE = 1000001;
+    public static final String ROLE_DELETE_FAILED_MSG = "删除角色信息失败";
+    //修改角色信息失败
+    public static final int ROLE_EDIT_FAILED_CODE = 1000002;
+    public static final String ROLE_EDIT_FAILED_MSG = "修改角色信息失败";
+    /**
+     * 应用信息
+     * type = 15
+     * */
+    //添加角色信息失败
+    public static final int APP_ADD_FAILED_CODE = 1500000;
+    public static final String APP_ADD_FAILED_MSG = "添加应用信息失败";
+    //删除角色信息失败
+    public static final int APP_DELETE_FAILED_CODE = 1500001;
+    public static final String APP_DELETE_FAILED_MSG = "删除应用信息失败";
+    //修改角色信息失败
+    public static final int APP_EDIT_FAILED_CODE = 1500002;
+    public static final String APP_EDIT_FAILED_MSG = "修改应用信息失败";
+    /**
+     *  仓库信息
+     * type = 20
+     * */
+    //添加仓库信息失败
+    public static final int DEPOT_ADD_FAILED_CODE = 2000000;
+    public static final String DEPOT_ADD_FAILED_MSG = "添加仓库信息失败";
+    //删除仓库信息失败
+    public static final int DEPOT_DELETE_FAILED_CODE = 2000001;
+    public static final String DEPOT_DELETE_FAILED_MSG = "删除仓库信息失败";
+    //修改仓库信息失败
+    public static final int DEPOT_EDIT_FAILED_CODE = 2000002;
+    public static final String DEPOT_EDIT_FAILED_MSG = "修改仓库信息失败";
+
+    /**
+     * 功能模块信息
+     * type = 30
+     * */
+    //添加角色信息失败
+    public static final int FUNCTIONS_ADD_FAILED_CODE = 3000000;
+    public static final String FUNCTIONS_ADD_FAILED_MSG = "添加功能模块信息失败";
+    //删除角色信息失败
+    public static final int FUNCTIONS_DELETE_FAILED_CODE = 3000001;
+    public static final String FUNCTIONS_DELETE_FAILED_MSG = "删除功能模块信息失败";
+    //修改角色信息失败
+    public static final int FUNCTIONS_EDIT_FAILED_CODE = 3000002;
+    public static final String FUNCTIONS_EDIT_FAILED_MSG = "修改功能模块信息失败";
+    /**
+     * 收支项目信息
+     * type = 35
+     * */
+    //添加收支项目信息失败
+    public static final int IN_OUT_ITEM_ADD_FAILED_CODE = 3500000;
+    public static final String IN_OUT_ITEM_ADD_FAILED_MSG = "添加收支项目信息失败";
+    //删除收支项目信息失败
+    public static final int IN_OUT_ITEM_DELETE_FAILED_CODE = 3500001;
+    public static final String IN_OUT_ITEM_DELETE_FAILED_MSG = "删除收支项目信息失败";
+    //修改收支项目信息失败
+    public static final int IN_OUT_ITEM_EDIT_FAILED_CODE = 3500002;
+    public static final String IN_OUT_ITEM_EDIT_FAILED_MSG = "修改收支项目信息失败";
+    /**
+     *  多单位信息
+     * type = 40
+     * */
+    //添加多单位信息失败
+    public static final int UNIT_ADD_FAILED_CODE = 4000000;
+    public static final String UNIT_ADD_FAILED_MSG = "添加多单位信息失败";
+    //删除多单位信息失败
+    public static final int UNIT_DELETE_FAILED_CODE = 4000001;
+    public static final String UNIT_DELETE_FAILED_MSG = "删除多单位信息失败";
+    //修改多单位信息失败
+    public static final int UNIT_EDIT_FAILED_CODE = 4000002;
+    public static final String UNIT_EDIT_FAILED_MSG = "修改多单位信息失败";
+    /**
+     *  经手人信息
+     * type = 45
+     * */
+    //添加经手人信息失败
+    public static final int PERSON_ADD_FAILED_CODE = 4500000;
+    public static final String PERSON_ADD_FAILED_MSG = "添加经手人信息失败";
+    //删除经手人信息失败
+    public static final int PERSON_DELETE_FAILED_CODE = 4500001;
+    public static final String PERSON_DELETE_FAILED_MSG = "删除经手人信息失败";
+    //修改经手人信息失败
+    public static final int PERSON_EDIT_FAILED_CODE = 4500002;
+    public static final String PERSON_EDIT_FAILED_MSG = "修改经手人信息失败";
+    /**
+     * 用户角色模块关系信息
+     * type = 50
+     * */
+    //添加用户角色模块关系信息失败
+    public static final int USER_BUSINESS_ADD_FAILED_CODE = 5000000;
+    public static final String USER_BUSINESS_ADD_FAILED_MSG = "添加用户角色模块关系信息失败";
+    //删除用户角色模块关系信息失败
+    public static final int USER_BUSINESS_DELETE_FAILED_CODE = 5000001;
+    public static final String USER_BUSINESS_DELETE_FAILED_MSG = "删除用户角色模块关系信息失败";
+    //修改用户角色模块关系信息失败
+    public static final int USER_BUSINESS_EDIT_FAILED_CODE = 5000002;
+    public static final String USER_BUSINESS_EDIT_FAILED_MSG = "修改用户角色模块关系信息失败";
+    /**
+     *  系统参数信息
+     * type = 55
+     * */
+    //添加系统参数信息失败
+    public static final int SYSTEM_CONFIG_ADD_FAILED_CODE = 5500000;
+    public static final String SYSTEM_CONFIG_ADD_FAILED_MSG = "添加系统参数信息失败";
+    //删除系统参数信息失败
+    public static final int SYSTEM_CONFIG_DELETE_FAILED_CODE = 5500001;
+    public static final String SYSTEM_CONFIG_DELETE_FAILED_MSG = "删除系统参数信息失败";
+    //修改系统参数信息失败
+    public static final int SYSTEM_CONFIG_EDIT_FAILED_CODE = 5500002;
+    public static final String SYSTEM_CONFIG_EDIT_FAILED_MSG = "修改系统参数信息失败";
+    /**
+     * 商品扩展信息
+     * type = 60
+     * */
+    //添加商品扩展信息失败
+    public static final int MATERIAL_PROPERTY_ADD_FAILED_CODE = 6000000;
+    public static final String MATERIAL_PROPERTY_ADD_FAILED_MSG = "添加商品扩展信息失败";
+    //删除商品扩展信息失败
+    public static final int MATERIAL_PROPERTY_DELETE_FAILED_CODE = 6000001;
+    public static final String MATERIAL_PROPERTY_DELETE_FAILED_MSG = "删除商品扩展信息失败";
+    //修改商品扩展信息失败
+    public static final int MATERIAL_PROPERTY_EDIT_FAILED_CODE = 6000002;
+    public static final String MATERIAL_PROPERTY_EDIT_FAILED_MSG = "修改商品扩展信息失败";
+    /**
+     *  账户信息
+     * type = 65
+     * */
+    //添加账户信息失败
+    public static final int ACCOUNT_ADD_FAILED_CODE = 6500000;
+    public static final String ACCOUNT_ADD_FAILED_MSG = "添加账户信息失败";
+    //删除账户信息失败
+    public static final int ACCOUNT_DELETE_FAILED_CODE = 6500001;
+    public static final String ACCOUNT_DELETE_FAILED_MSG = "删除账户信息失败";
+    //修改账户信息失败
+    public static final int ACCOUNT_EDIT_FAILED_CODE = 6500002;
+    public static final String ACCOUNT_EDIT_FAILED_MSG = "修改账户信息失败";
+    /**
+     *  供应商信息
+     * type = 70
+     * */
+    //添加供应商信息失败
+    public static final int SUPPLIER_ADD_FAILED_CODE = 7000000;
+    public static final String SUPPLIER_ADD_FAILED_MSG = "添加供应商信息失败";
+    //删除供应商信息失败
+    public static final int SUPPLIER_DELETE_FAILED_CODE = 7000001;
+    public static final String SUPPLIER_DELETE_FAILED_MSG = "删除供应商信息失败";
+    //修改供应商信息失败
+    public static final int SUPPLIER_EDIT_FAILED_CODE = 7000002;
+    public static final String SUPPLIER_EDIT_FAILED_MSG = "修改供应商信息失败";
+    /**
+     * 商品类别信息
+     * type = 75
+     * */
+    //添加商品类别信息失败
+    public static final int MATERIAL_CATEGORY_ADD_FAILED_CODE = 7500000;
+    public static final String MATERIAL_CATEGORY_ADD_FAILED_MSG = "添加商品类别信息失败";
+    //删除商品类别信息失败
+    public static final int MATERIAL_CATEGORY_DELETE_FAILED_CODE = 7500001;
+    public static final String MATERIAL_CATEGORY_DELETE_FAILED_MSG = "删除商品类别信息失败";
+    //修改商品类别信息失败
+    public static final int MATERIAL_CATEGORY_EDIT_FAILED_CODE = 7500002;
+    public static final String MATERIAL_CATEGORY_EDIT_FAILED_MSG = "修改商品类别信息失败";
+    //商品类别编号已存在
+    public static final int MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_CODE = 7500003;
+    public static final String MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_MSG = "商品类别编号已存在";
+    //根类别不支持修改
+    public static final int MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_EDIT_CODE = 7500004;
+    public static final String MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_EDIT_MSG = "根类别不支持修改";
+    //根类别不支持删除
+    public static final int MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_DELETE_CODE = 7500005;
+    public static final String MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_DELETE_MSG = "根类别不支持删除";
+    //该类别存在下级不允许删除
+    public static final int MATERIAL_CATEGORY_CHILD_NOT_SUPPORT_DELETE_CODE = 7500006;
+    public static final String MATERIAL_CATEGORY_CHILD_NOT_SUPPORT_DELETE_MSG = "该类别存在下级不允许删除";
+    /**
+     * 商品信息
+     * type = 80
+     * */
+    //商品信息不存在
+    public static final int MATERIAL_NOT_EXISTS_CODE = 8000000;
+    public static final String MATERIAL_NOT_EXISTS_MSG = "商品信息不存在";
+    //商品信息不唯一
+    public static final int MATERIAL_NOT_ONLY_CODE = 8000001;
+    public static final String MATERIAL_NOT_ONLY_MSG = "商品信息不唯一";
+    //该商品未开启序列号
+    public static final int MATERIAL_NOT_ENABLE_SERIAL_NUMBER_CODE = 8000002;
+    public static final String MATERIAL_NOT_ENABLE_SERIAL_NUMBER_MSG = "该商品未开启序列号功能";
+    //商品的序列号不能为空
+    public static final int MATERIAL_SERIAL_NUMBERE_EMPTY_CODE = 8000003;
+    public static final String MATERIAL_SERIAL_NUMBERE_EMPTY_MSG = "抱歉,商品条码:%s的序列号不能为空";
+    //商品库存不足
+    public static final int MATERIAL_STOCK_NOT_ENOUGH_CODE = 8000004;
+    public static final String MATERIAL_STOCK_NOT_ENOUGH_MSG = "商品:%s库存不足";
+    //商品条码重复
+    public static final int MATERIAL_BARCODE_EXISTS_CODE = 8000005;
+    public static final String MATERIAL_BARCODE_EXISTS_MSG = "商品条码:%s重复";
+    //商品-单位匹配不上
+    public static final int MATERIAL_UNIT_MATE_CODE = 8000006;
+    public static final String MATERIAL_UNIT_MATE_MSG = "抱歉,商品条码:%s的单位匹配不上,请完善多单位信息!";
+    //商品条码长度应该为4到40位
+    public static final int MATERIAL_BARCODE_LENGTH_ERROR_CODE = 8000007;
+    public static final String MATERIAL_BARCODE_LENGTH_ERROR_MSG = "商品条码:%s的长度应该为4到40位";
+    //序列号和批号只能有一项
+    public static final int MATERIAL_ENABLE_MUST_ONE_CODE = 8000008;
+    public static final String MATERIAL_ENABLE_MUST_ONE_MSG = "抱歉,商品条码:%s的序列号和批号不能同时填1";
+    //抱歉,文件扩展名必须为xls
+    public static final int MATERIAL_EXTENSION_ERROR_CODE = 8000009;
+    public static final String MATERIAL_EXTENSION_ERROR_MSG = "抱歉,文件扩展名必须为xls";
+    //名称为空
+    public static final int MATERIAL_NAME_EMPTY_CODE = 8000010;
+    public static final String MATERIAL_NAME_EMPTY_MSG = "第%s行名称为空";
+    //基本单位为空
+    public static final int MATERIAL_UNIT_EMPTY_CODE = 8000011;
+    public static final String MATERIAL_UNIT_EMPTY_MSG = "第%s行基本单位为空";
+    //状态格式错误
+    public static final int MATERIAL_ENABLED_ERROR_CODE = 8000012;
+    public static final String MATERIAL_ENABLED_ERROR_MSG = "第%s行状态格式错误";
+    //单次导入超出1000条
+    public static final int MATERIAL_IMPORT_OVER_LIMIT_CODE = 8000013;
+    public static final String MATERIAL_IMPORT_OVER_LIMIT_MSG = "抱歉,单次导入不能超出1000条";
+    //基础重量格式错误
+    public static final int MATERIAL_WEIGHT_NOT_DECIMAL_CODE = 8000014;
+    public static final String MATERIAL_WEIGHT_NOT_DECIMAL_MSG = "第%s行基础重量格式错误";
+    //保质期格式错误
+    public static final int MATERIAL_EXPIRY_NUM_NOT_INTEGER_CODE = 8000015;
+    public static final String MATERIAL_EXPIRY_NUM_NOT_INTEGER_MSG = "第%s行保质期格式错误";
+    //比例格式错误
+    public static final int MATERIAL_RATIO_NOT_INTEGER_CODE = 8000016;
+    public static final String MATERIAL_RATIO_NOT_INTEGER_MSG = "第%s行比例格式错误";
+    //组装拆卸单不能选择批号或序列号商品
+    public static final int MATERIAL_ASSEMBLE_SELECT_ERROR_CODE = 80000017;
+    public static final String MATERIAL_ASSEMBLE_SELECT_ERROR_MSG = "抱歉,组装拆卸单不能选择批号或序列号商品:%s";
+    //调拨单不能选择批号或序列号商品
+    public static final int MATERIAL_TRANSFER_SELECT_ERROR_CODE = 80000018;
+    public static final String MATERIAL_TRANSFER_SELECT_ERROR_MSG = "抱歉,调拨单不能选择批号或序列号商品:%s,建议走其它入库和出库单";
+    //盘点业务不能选择批号或序列号商品
+    public static final int MATERIAL_STOCK_CHECK_ERROR_CODE = 80000019;
+    public static final String MATERIAL_STOCK_CHECK_ERROR_MSG = "抱歉,盘点业务不能选择批号或序列号商品:%s,建议走其它入库和出库单";
+    //EXCEL中存在重复的商品
+    public static final int MATERIAL_EXCEL_IMPORT_EXIST_CODE = 80000020;
+    public static final String MATERIAL_EXCEL_IMPORT_EXIST_MSG = "抱歉,EXCEL中存在重复的商品,具体信息为:%s";
+    //EXCEL中存在重复的条码
+    public static final int MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_CODE = 80000021;
+    public static final String MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_MSG = "抱歉,EXCEL中存在重复的条码,具体条码为:%s";
+    //名称长度超出
+    public static final int MATERIAL_NAME_OVER_CODE = 8000022;
+    public static final String MATERIAL_NAME_OVER_MSG = "第%s行名称长度超出100个字符";
+    //规格长度超出
+    public static final int MATERIAL_STANDARD_OVER_CODE = 8000023;
+    public static final String MATERIAL_STANDARD_OVER_MSG = "第%s行规格长度超出100个字符";
+    //型号长度超出
+    public static final int MATERIAL_MODEL_OVER_CODE = 8000024;
+    public static final String MATERIAL_MODEL_OVER_MSG = "第%s行型号长度超出100个字符";
+    //多属性商品不能输入库存,建议进行盘点录入
+    public static final int MATERIAL_SKU_BEGIN_STOCK_FAILED_CODE = 8000025;
+    public static final String MATERIAL_SKU_BEGIN_STOCK_FAILED_MSG = "多属性商品%s不能输入库存,建议进行盘点录入";
+    //商品条码不存在,请重新选择
+    public static final int MATERIAL_BARCODE_IS_NOT_EXIST_CODE = 8000026;
+    public static final String MATERIAL_BARCODE_IS_NOT_EXIST_MSG = "商品条码%s不存在,请重新选择";
+    //基本条码为空
+    public static final int MATERIAL_BARCODE_EMPTY_CODE = 8000027;
+    public static final String MATERIAL_BARCODE_EMPTY_MSG = "第%s行基本条码为空";
+    //EXCEL中有副条码在系统中已存在(除自身商品之外)
+    public static final int MATERIAL_EXCEL_IMPORT_MANY_BARCODE_EXIST_CODE = 80000028;
+    public static final String MATERIAL_EXCEL_IMPORT_MANY_BARCODE_EXIST_MSG = "抱歉,EXCEL中有副条码在系统中已存在,具体副条码为:%s";
+
+    /**
+     *  单据信息
+     * type = 85
+     * */
+    //添加单据信息失败
+    public static final int DEPOT_HEAD_ADD_FAILED_CODE = 8500000;
+    public static final String DEPOT_HEAD_ADD_FAILED_MSG = "添加单据信息失败";
+    //删除单据信息失败
+    public static final int DEPOT_HEAD_DELETE_FAILED_CODE = 8500001;
+    public static final String DEPOT_HEAD_DELETE_FAILED_MSG = "删除单据信息失败";
+    //修改单据信息失败
+    public static final int DEPOT_HEAD_EDIT_FAILED_CODE = 8500002;
+    public static final String DEPOT_HEAD_EDIT_FAILED_MSG = "修改单据信息失败";
+    //单据录入-仓库不能为空
+    public static final int DEPOT_HEAD_DEPOT_FAILED_CODE = 8500004;
+    public static final String DEPOT_HEAD_DEPOT_FAILED_MSG = "仓库不能为空";
+    //单据录入-调入仓库不能为空
+    public static final int DEPOT_HEAD_ANOTHER_DEPOT_FAILED_CODE = 8500005;
+    public static final String DEPOT_HEAD_ANOTHER_DEPOT_FAILED_MSG = "调入仓库不能为空";
+    //单据录入-明细不能为空
+    public static final int DEPOT_HEAD_ROW_FAILED_CODE = 8500006;
+    public static final String DEPOT_HEAD_ROW_FAILED_MSG = "单据明细不能为空";
+    //单据录入-账户不能为空
+    public static final int DEPOT_HEAD_ACCOUNT_FAILED_CODE = 8500007;
+    public static final String DEPOT_HEAD_ACCOUNT_FAILED_MSG = "结算账户不能为空";
+    //单据录入-请修改多账户的结算金额
+    public static final int DEPOT_HEAD_MANY_ACCOUNT_FAILED_CODE = 8500008;
+    public static final String DEPOT_HEAD_MANY_ACCOUNT_FAILED_MSG = "请修改多账户的结算金额";
+    //单据录入-调入仓库与原仓库不能重复
+    public static final int DEPOT_HEAD_ANOTHER_DEPOT_EQUAL_FAILED_CODE = 8500010;
+    public static final String DEPOT_HEAD_ANOTHER_DEPOT_EQUAL_FAILED_MSG = "调入仓库与原仓库不能重复";
+    //单据删除-只有未审核的单据才能删除,请先进行反审核
+    public static final int DEPOT_HEAD_UN_AUDIT_DELETE_FAILED_CODE = 8500011;
+    public static final String DEPOT_HEAD_UN_AUDIT_DELETE_FAILED_MSG = "抱歉,只有未审核的单据才能删除,请先进行反审核";
+    //单据审核-只有未审核的单据才能审核
+    public static final int DEPOT_HEAD_UN_AUDIT_TO_AUDIT_FAILED_CODE = 8500012;
+    public static final String DEPOT_HEAD_UN_AUDIT_TO_AUDIT_FAILED_MSG = "抱歉,只有未审核的单据才能审核";
+    //单据反审核-只有已审核的单据才能反审核
+    public static final int DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_CODE = 8500013;
+    public static final String DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_MSG = "抱歉,只有已审核的单据才能反审核";
+    //单据录入-商品条码XXX的数量需要修改下
+    public static final int DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_CODE = 85000014;
+    public static final String DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_MSG = "商品条码%s的数量需要修改下";
+    //单据录入-商品的批号不能为空
+    public static final int DEPOT_HEAD_BATCH_NUMBERE_EMPTY_CODE = 8500015;
+    public static final String DEPOT_HEAD_BATCH_NUMBERE_EMPTY_MSG = "抱歉,商品条码:%s的批号不能为空";
+    //单据录入-会员预付款余额不足
+    public static final int DEPOT_HEAD_MEMBER_PAY_LACK_CODE = 8500016;
+    public static final String DEPOT_HEAD_MEMBER_PAY_LACK_MSG = "抱歉,会员预付款余额不足";
+    //单据录入-累计订金超出原订单中的订金
+    public static final int DEPOT_HEAD_DEPOSIT_OVER_PRE_CODE = 8500017;
+    public static final String DEPOT_HEAD_DEPOSIT_OVER_PRE_MSG = "抱歉,累计订金超出原订单中的订金";
+    //单据录入-商品条码XXX的单价低于最低售价
+    public static final int DEPOT_HEAD_UNIT_PRICE_LOW_CODE = 8500018;
+    public static final String DEPOT_HEAD_UNIT_PRICE_LOW_MSG = "商品条码%s的单价低于最低售价";
+    //单据录入-单据明细中必须要有组合件和普通子件
+    public static final int DEPOT_HEAD_CHECK_ASSEMBLE_EMPTY_CODE = 8500020;
+    public static final String DEPOT_HEAD_CHECK_ASSEMBLE_EMPTY_MSG = "抱歉,单据明细中必须要有组合件和普通子件";
+    //单据录入-商品条码XXX的数量与序列号不一致
+    public static final int DEPOT_HEAD_SN_NUMBERE_FAILED_CODE = 8500021;
+    public static final String DEPOT_HEAD_SN_NUMBERE_FAILED_MSG = "抱歉,商品条码:%s的数量与序列号不一致";
+    //单据录入-单据编号已经存在
+    public static final int DEPOT_HEAD_BILL_NUMBER_EXIST_CODE = 8500022;
+    public static final String DEPOT_HEAD_BILL_NUMBER_EXIST_MSG = "抱歉,单据编号已经存在";
+    //单据录入-单据当前状态下不能修改
+    public static final int DEPOT_HEAD_BILL_CANNOT_EDIT_CODE = 8500023;
+    public static final String DEPOT_HEAD_BILL_CANNOT_EDIT_MSG = "抱歉,单据当前状态下不能修改";
+    //单据删除-单据中的序列号已经出库,不能删除
+    public static final int DEPOT_HEAD_SERIAL_IS_SELL_CODE = 8500024;
+    public static final String DEPOT_HEAD_SERIAL_IS_SELL_MSG = "抱歉,单据%s的序列号已经出库,不能删除";
+    //单据录入-单据附件不能超过规定数量
+    public static final int DEPOT_HEAD_FILE_NUM_LIMIT_CODE = 8500025;
+    public static final String DEPOT_HEAD_FILE_NUM_LIMIT_MSG = "抱歉,单据附件不能超过%s份";
+    //单据录入-完成采购的单据不能进行反审核
+    public static final int DEPOT_HEAD_PURCHASE_STATUS_TWO_CODE = 8500026;
+    public static final String DEPOT_HEAD_PURCHASE_STATUS_TWO_MSG = "抱歉,完成采购的单据不能进行反审核";
+    //单据录入-部分采购的单据不能进行反审核
+    public static final int DEPOT_HEAD_PURCHASE_STATUS_THREE_CODE = 8500027;
+    public static final String DEPOT_HEAD_PURCHASE_STATUS_THREE_MSG = "抱歉,部分采购的单据不能进行反审核";
+    //单据录入-单据中存在部分状态,需要到新增界面关联单据
+    public static final int DEPOT_ITEM_EXIST_PARTIALLY_STATUS_FAILED_CODE = 8500028;
+    public static final String DEPOT_ITEM_EXIST_PARTIALLY_STATUS_FAILED_MSG = "抱歉,单据:%s是部分%s状态,需要到新增界面关联单据";
+    //单据录入-关联请购单号和关联订单号不能同时录入
+    public static final int DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_CODE = 8500029;
+    public static final String DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_MSG = "抱歉,关联请购单号和关联订单号不能同时录入";
+    //单据录入-单据最新状态不能进行批量操作
+    public static final int DEPOT_ITEM_EXIST_NEW_STATUS_FAILED_CODE = 8500030;
+    public static final String DEPOT_ITEM_EXIST_NEW_STATUS_FAILED_MSG = "抱歉,单据:%s最新状态不能进行批量操作";
+
+    /**
+     *  单据明细信息
+     * type = 90
+     * */
+    //添加单据明细信息失败
+    public static final int DEPOT_ITEM_ADD_FAILED_CODE = 9000000;
+    public static final String DEPOT_ITEM_ADD_FAILED_MSG = "添加单据明细信息失败";
+    //删除单据明细信息失败
+    public static final int DEPOT_ITEM_DELETE_FAILED_CODE = 9000001;
+    public static final String DEPOT_ITEM_DELETE_FAILED_MSG = "删除单据明细信息失败";
+    //修改单据明细信息失败
+    public static final int DEPOT_ITEM_EDIT_FAILED_CODE = 9000002;
+    public static final String DEPOT_ITEM_EDIT_FAILED_MSG = "修改单据明细信息失败";
+    //单据明细-明细中商品不存在
+    public static final int DEPOT_ITEM_BARCODE_IS_NOT_EXIST_CODE = 9000003;
+    public static final String DEPOT_ITEM_BARCODE_IS_NOT_EXIST_MSG = "抱歉,商品条码:%s在商品管理中不存在";
+    //单据明细-明细中仓库不存在
+    public static final int DEPOT_ITEM_DEPOTNAME_IS_NOT_EXIST_CODE = 9000004;
+    public static final String DEPOT_ITEM_DEPOTNAME_IS_NOT_EXIST_MSG = "抱歉,仓库:%s在基础资料-仓库信息中不存在";
+    //单据明细-单据中存在序列号,需要到新增界面关联单据
+    public static final int DEPOT_ITEM_EXIST_SERIAL_NUMBER_FAILED_CODE = 9000005;
+    public static final String DEPOT_ITEM_EXIST_SERIAL_NUMBER_FAILED_MSG = "抱歉,单据:%s里面存在序列号,需要到新增界面关联单据";
+    //单据明细-单据中存在批号,需要到新增界面关联单据
+    public static final int DEPOT_ITEM_EXIST_BATCH_NUMBER_FAILED_CODE = 9000006;
+    public static final String DEPOT_ITEM_EXIST_BATCH_NUMBER_FAILED_MSG = "抱歉,单据:%s里面存在批号,需要到新增界面关联单据";
+    //原关联单据已被修改,请重新关联
+    public static final int DEPOT_ITEM_PRE_BILL_IS_CHANGE_CODE = 9000007;
+    public static final String DEPOT_ITEM_PRE_BILL_IS_CHANGE_MSG = "抱歉,原关联单据已被修改,请重新关联";
+
+    /**
+     *  财务信息
+     * type = 95
+     * */
+    //添加财务信息失败
+    public static final int ACCOUNT_HEAD_ADD_FAILED_CODE = 9500000;
+    public static final String ACCOUNT_HEAD_ADD_FAILED_MSG = "添加财务信息失败";
+    //删除财务信息失败
+    public static final int ACCOUNT_HEAD_DELETE_FAILED_CODE = 9500001;
+    public static final String ACCOUNT_HEAD_DELETE_FAILED_MSG = "删除财务信息失败";
+    //修改财务信息失败
+    public static final int ACCOUNT_HEAD_EDIT_FAILED_CODE = 9500002;
+    public static final String ACCOUNT_HEAD_EDIT_FAILED_MSG = "修改财务信息失败";
+    //单据录入-明细不能为空
+    public static final int ACCOUNT_HEAD_ROW_FAILED_CODE = 9500003;
+    public static final String ACCOUNT_HEAD_ROW_FAILED_MSG = "单据明细不能为空";
+    //单据删除-只有未审核的单据才能删除,请先进行反审核
+    public static final int ACCOUNT_HEAD_UN_AUDIT_DELETE_FAILED_CODE = 9500004;
+    public static final String ACCOUNT_HEAD_UN_AUDIT_DELETE_FAILED_MSG = "抱歉,只有未审核的单据才能删除,请先进行反审核";
+    //财务信息录入-单据编号已经存在
+    public static final int ACCOUNT_HEAD_BILL_NO_EXIST_CODE = 9500005;
+    public static final String ACCOUNT_HEAD_BILL_NO_EXIST_MSG = "抱歉,单据编号已经存在";
+    //财务信息录入-付款账户和明细中的账户重复
+    public static final int ACCOUNT_HEAD_ACCOUNT_REPEAT_CODE = 9500006;
+    public static final String ACCOUNT_HEAD_ACCOUNT_REPEAT_MSG = "抱歉,付款账户:%s和明细中的账户重复";
+    /**
+     *  财务明细信息
+     * type = 100
+     * */
+    //添加财务明细信息失败
+    public static final int ACCOUNT_ITEM_ADD_FAILED_CODE = 10000000;
+    public static final String ACCOUNT_ITEM_ADD_FAILED_MSG = "添加财务明细信息失败";
+    //删除财务明细信息失败
+    public static final int ACCOUNT_ITEM_DELETE_FAILED_CODE = 10000001;
+    public static final String ACCOUNT_ITEM_DELETE_FAILED_MSG = "删除财务明细信息失败";
+    //修改财务明细信息失败
+    public static final int ACCOUNT_ITEM_EDIT_FAILED_CODE = 10000002;
+    public static final String ACCOUNT_ITEM_EDIT_FAILED_MSG = "修改财务明细信息失败";
+    /**
+     * 序列号
+     * type = 105
+     * */
+    /**序列号已存在*/
+    public static final int SERIAL_NUMBERE_ALREADY_EXISTS_CODE = 10500000;
+    public static final String SERIAL_NUMBERE_ALREADY_EXISTS_MSG = "序列号:%s已存在";
+    /**序列号不存在或者已经出库*/
+    public static final int SERIAL_NUMBERE_NOT_EXISTS_CODE = 10500001;
+    public static final String SERIAL_NUMBERE_NOT_EXISTS_MSG = "序列号:%s不存在或者已经出库";
+    /**
+     * 机构信息
+     * type = 110
+     * */
+    //添加机构信息失败
+    public static final int ORGANIZATION_ADD_FAILED_CODE = 11000000;
+    public static final String ORGANIZATION_ADD_FAILED_MSG = "添加机构信息失败";
+    //删除机构信息失败
+    public static final int ORGANIZATION_DELETE_FAILED_CODE = 11000001;
+    public static final String ORGANIZATION_DELETE_FAILED_MSG = "删除机构信息失败";
+    //修改机构信息失败
+    public static final int ORGANIZATION_EDIT_FAILED_CODE = 11000002;
+    public static final String ORGANIZATION_EDIT_FAILED_MSG = "修改机构信息失败";
+    //机构编号已存在
+    public static final int ORGANIZATION_NO_ALREADY_EXISTS_CODE = 11000003;
+    public static final String ORGANIZATION_NO_ALREADY_EXISTS_MSG = "机构编号已存在";
+    //根机构不允许删除
+    public static final int ORGANIZATION_ROOT_NOT_ALLOWED_DELETE_CODE = 11000004;
+    public static final String ORGANIZATION_ROOT_NOT_ALLOWED_DELETE_MSG = "根机构不允许删除";
+    //根机构不允许修改
+    public static final int ORGANIZATION_ROOT_NOT_ALLOWED_EDIT_CODE = 11000005;
+    public static final String ORGANIZATION_ROOT_NOT_ALLOWED_EDIT_MSG = "根机构不允许修改";
+    //该机构存在下级不允许删除
+    public static final int ORGANIZATION_CHILD_NOT_ALLOWED_DELETE_CODE = 11000006;
+    public static final String ORGANIZATION_CHILD_NOT_ALLOWED_DELETE_MSG = "该机构存在下级不允许删除";
+    /**
+     * 机构用户关联关系
+     * type = 115
+     * */
+    //添加机构用户关联关系失败
+    public static final int ORGA_USER_REL_ADD_FAILED_CODE = 11500000;
+    public static final String ORGA_USER_REL_ADD_FAILED_MSG = "添加机构用户关联关系失败";
+    //删除机构用户关联关系失败
+    public static final int ORGA_USER_REL_DELETE_FAILED_CODE = 11500001;
+    public static final String ORGA_USER_REL_DELETE_FAILED_MSG = "删除机构用户关联关系失败";
+    //修改机构用户关联关系失败
+    public static final int ORGA_USER_REL_EDIT_FAILED_CODE = 11500002;
+    public static final String ORGA_USER_REL_EDIT_FAILED_MSG = "修改机构用户关联关系失败";
+
+    //进销存统计,如果有权限的仓库数量太多则提示要选择仓库
+    public static final int REPORT_TWO_MANY_DEPOT_FAILED_CODE = 510;
+    public static final String REPORT_TWO_MANY_DEPOT_FAILED_MSG = "请选择仓库,再进行查询";
+
+    //演示用户禁止操作
+    public static final int SYSTEM_CONFIG_TEST_USER_CODE = -1;
+    public static final String SYSTEM_CONFIG_TEST_USER_MSG = "演示用户禁止操作";
+
+
+    /**
+     * 标准正常返回/操作成功返回
+     * @return
+     */
+    public static JSONObject standardSuccess () {
+        JSONObject success = new JSONObject();
+        success.put(GLOBAL_RETURNS_CODE, SERVICE_SUCCESS_CODE);
+        success.put(GLOBAL_RETURNS_MESSAGE, SERVICE_SUCCESS_MSG);
+        return success;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/AccountController.java b/src/main/java/com/jsh/erp/controller/AccountController.java
new file mode 100644
index 0000000..f9433e8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/AccountController.java
@@ -0,0 +1,244 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.Account;
+import com.jsh.erp.datasource.vo.AccountVo4InOutList;
+import com.jsh.erp.datasource.vo.AccountVo4List;
+import com.jsh.erp.service.account.AccountService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import com.jsh.erp.utils.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author jishenghua 75271*8920
+ */
+@RestController
+@RequestMapping(value = "/account")
+@Api(tags = {"账户管理"})
+public class AccountController {
+    private Logger logger = LoggerFactory.getLogger(AccountController.class);
+
+    @Resource
+    private AccountService accountService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    /**
+     * 查找结算账户信息-下拉框
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findBySelect")
+    @ApiOperation(value = "查找结算账户信息-下拉框")
+    public String findBySelect(HttpServletRequest request) throws Exception {
+        String res = null;
+        try {
+            List<Account> dataList = accountService.findBySelect();
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (Account account : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("Id", account.getId());
+                    //结算账户名称
+                    item.put("AccountName", account.getName());
+                    dataArray.add(item);
+                }
+            }
+            res = dataArray.toJSONString();
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取所有结算账户
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getAccount")
+    @ApiOperation(value = "获取所有结算账户")
+    public BaseResponseInfo getAccount(HttpServletRequest request) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<Account> accountList = accountService.getAccount();
+            map.put("accountList", accountList);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 账户流水信息
+     * @param currentPage
+     * @param pageSize
+     * @param accountId
+     * @param initialAmount
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findAccountInOutList")
+    @ApiOperation(value = "账户流水信息")
+    public BaseResponseInfo findAccountInOutList(@RequestParam("currentPage") Integer currentPage,
+                                                 @RequestParam("pageSize") Integer pageSize,
+                                                 @RequestParam("accountId") Long accountId,
+                                                 @RequestParam("initialAmount") BigDecimal initialAmount,
+                                                 @RequestParam(value = "number",required = false) String number,
+                                                 @RequestParam(value = "beginTime",required = false) String beginTime,
+                                                 @RequestParam(value = "endTime",required = false) String endTime,
+                                                 HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            List<AccountVo4InOutList> dataList = accountService.findAccountInOutList(accountId, StringUtil.toNull(number),
+                    beginTime, endTime, forceFlag, (currentPage-1)*pageSize, pageSize);
+            int total = accountService.findAccountInOutListCount(accountId, StringUtil.toNull(number),
+                    beginTime, endTime, forceFlag);
+            map.put("total", total);
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (AccountVo4InOutList aEx : dataList) {
+                    String type = aEx.getType().replace("其它", "");
+                    aEx.setType(type);
+                    String operTime = aEx.getOperTime();
+                    BigDecimal balance = accountService.getAccountSum(accountId, null, operTime, forceFlag)
+                            .add(accountService.getAccountSumByHead(accountId, null, operTime, forceFlag))
+                            .add(accountService.getAccountSumByDetail(accountId, null, operTime, forceFlag))
+                            .add(accountService.getManyAccountSum(accountId, null, operTime, forceFlag)).add(initialAmount);
+                    aEx.setBalance(balance);
+                    aEx.setAccountId(accountId);
+                    dataArray.add(aEx);
+                }
+            }
+            map.put("rows", dataArray);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 更新默认账户
+     * @param object
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/updateIsDefault")
+    @ApiOperation(value = "更新默认账户")
+    public String updateIsDefault(@RequestBody JSONObject object,
+                                       HttpServletRequest request) throws Exception{
+        Long accountId = object.getLong("id");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = accountService.updateIsDefault(accountId);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 获取带余额的报表
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/listWithBalance")
+    @ApiOperation(value = "获取带余额的报表")
+    public BaseResponseInfo listWithBalance(@RequestParam("name") String name,
+                                            @RequestParam("serialNo") String serialNo,
+                                            @RequestParam("currentPage") Integer currentPage,
+                                            @RequestParam("pageSize") Integer pageSize,
+                                            HttpServletRequest request) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> map = new HashMap<>();
+            List<AccountVo4List> list = accountService.listWithBalance(StringUtil.toNull(name), StringUtil.toNull(serialNo), (currentPage-1)*pageSize, pageSize);
+            Long count = accountService.listWithBalanceCount(StringUtil.toNull(name), StringUtil.toNull(serialNo));
+            map.put("rows", list);
+            map.put("total", count);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 结算账户的统计
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getStatistics")
+    @ApiOperation(value = "结算账户的统计")
+    public BaseResponseInfo getStatistics(@RequestParam("name") String name,
+                                          @RequestParam("serialNo") String serialNo,
+                                          HttpServletRequest request) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> map = accountService.getStatistics(StringUtil.toNull(name), StringUtil.toNull(serialNo));
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = accountService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/AccountHeadController.java b/src/main/java/com/jsh/erp/controller/AccountHeadController.java
new file mode 100644
index 0000000..30d368d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/AccountHeadController.java
@@ -0,0 +1,142 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.AccountHead;
+import com.jsh.erp.datasource.entities.AccountHeadVo4Body;
+import com.jsh.erp.datasource.entities.AccountHeadVo4ListEx;
+import com.jsh.erp.service.accountHead.AccountHeadService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author jishenghua 752*718*920
+ */
+@RestController
+@RequestMapping(value = "/accountHead")
+@Api(tags = {"财务管理"})
+public class AccountHeadController {
+    private Logger logger = LoggerFactory.getLogger(AccountHeadController.class);
+
+    @Resource
+    private AccountHeadService accountHeadService;
+
+    /**
+     * 批量设置状态-审核或者反审核
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态-审核或者反审核")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request) throws Exception{
+        Map<String, Object> objectMap = new HashMap<>();
+        String status = jsonObject.getString("status");
+        String ids = jsonObject.getString("ids");
+        int res = accountHeadService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 新增财务主表及财务子表信息
+     * @param body
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/addAccountHeadAndDetail")
+    @ApiOperation(value = "新增财务主表及财务子表信息")
+    public Object addAccountHeadAndDetail(@RequestBody AccountHeadVo4Body body, HttpServletRequest request) throws  Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        String beanJson = body.getInfo();
+        String rows = body.getRows();
+        accountHeadService.addAccountHeadAndDetail(beanJson,rows, request);
+        return result;
+    }
+
+    /**
+     * 更新财务主表及财务子表信息
+     * @param body
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PutMapping(value = "/updateAccountHeadAndDetail")
+    @ApiOperation(value = "更新财务主表及财务子表信息")
+    public Object updateAccountHeadAndDetail(@RequestBody AccountHeadVo4Body body, HttpServletRequest request) throws Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        String beanJson = body.getInfo();
+        String rows = body.getRows();
+        accountHeadService.updateAccountHeadAndDetail(beanJson,rows,request);
+        return result;
+    }
+
+    /**
+     * 根据编号查询单据信息
+     * @param billNo
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getDetailByNumber")
+    @ApiOperation(value = "根据编号查询单据信息")
+    public BaseResponseInfo getDetailByNumber(@RequestParam("billNo") String billNo,
+                                              HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        AccountHeadVo4ListEx ahl = new AccountHeadVo4ListEx();
+        try {
+            List<AccountHeadVo4ListEx> list = accountHeadService.getDetailByNumber(billNo);
+            if(list.size()>0) {
+                ahl = list.get(0);
+            }
+            res.code = 200;
+            res.data = ahl;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据出入库单据id查询收付款单号
+     * @param billId
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getFinancialBillNoByBillId")
+    @ApiOperation(value = "根据编号查询单据信息")
+    public BaseResponseInfo getFinancialBillNoByBillId(@RequestParam("billId") Long billId,
+                                              HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<AccountHead> list = accountHeadService.getFinancialBillNoByBillId(billId);
+            res.code = 200;
+            res.data = list;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/AccountItemController.java b/src/main/java/com/jsh/erp/controller/AccountItemController.java
new file mode 100644
index 0000000..6d8f669
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/AccountItemController.java
@@ -0,0 +1,95 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.vo.AccountItemVo4List;
+import com.jsh.erp.service.accountHead.AccountHeadService;
+import com.jsh.erp.service.accountItem.AccountItemService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author ji sheng hua 752*718*920
+ */
+@RestController
+@RequestMapping(value = "/accountItem")
+@Api(tags = {"财务明细"})
+public class AccountItemController {
+    private Logger logger = LoggerFactory.getLogger(AccountItemController.class);
+
+    @Resource
+    private AccountItemService accountItemService;
+
+    @Resource
+    private AccountHeadService accountHeadService;
+
+    @GetMapping(value = "/getDetailList")
+    @ApiOperation(value = "明细列表")
+    public BaseResponseInfo getDetailList(@RequestParam("headerId") Long headerId,
+                                          HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String type = null;
+            List<AccountItemVo4List> dataList = new ArrayList<>();
+            if(headerId != 0) {
+                dataList = accountItemService.getDetailList(headerId);
+                type = accountHeadService.getAccountHead(headerId).getType();
+            }
+            JSONObject outer = new JSONObject();
+            outer.put("total", dataList.size());
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (AccountItemVo4List ai : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("accountId", ai.getAccountId());
+                    item.put("accountName", ai.getAccountName());
+                    item.put("inOutItemId", ai.getInOutItemId());
+                    item.put("inOutItemName", ai.getInOutItemName());
+                    if(StringUtil.isNotEmpty(ai.getBillNumber())) {
+                        item.put("billNumber", ai.getBillNumber());
+                    } else {
+                        item.put("billNumber", "QiChu");
+                    }
+                    item.put("needDebt", ai.getNeedDebt());
+                    item.put("finishDebt", ai.getFinishDebt());
+                    BigDecimal eachAmount = ai.getEachAmount();
+                    if(BusinessConstants.TYPE_MONEY_IN.equals(type)) {
+                        item.put("eachAmount", eachAmount);
+                    } else if(BusinessConstants.TYPE_MONEY_OUT.equals(type)) {
+                        item.put("eachAmount", BigDecimal.ZERO.subtract(eachAmount));
+                    } else {
+                        item.put("eachAmount", (eachAmount.compareTo(BigDecimal.ZERO))==-1 ? BigDecimal.ZERO.subtract(eachAmount): eachAmount);
+                    }
+                    item.put("remark", ai.getRemark());
+                    dataArray.add(item);
+                }
+            }
+            outer.put("rows", dataArray);
+            res.code = 200;
+            res.data = outer;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/DepotController.java b/src/main/java/com/jsh/erp/controller/DepotController.java
new file mode 100644
index 0000000..97ea6a7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/DepotController.java
@@ -0,0 +1,226 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.Depot;
+import com.jsh.erp.datasource.entities.DepotEx;
+import com.jsh.erp.datasource.entities.MaterialCurrentStock;
+import com.jsh.erp.datasource.entities.MaterialInitialStock;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.material.MaterialService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.DataAccessException;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji sheng hua 752*718*920
+ */
+@RestController
+@RequestMapping(value = "/depot")
+@Api(tags = {"仓库管理"})
+public class DepotController {
+    private Logger logger = LoggerFactory.getLogger(DepotController.class);
+
+    @Resource
+    private DepotService depotService;
+
+    @Resource
+    private UserBusinessService userBusinessService;
+
+    @Resource
+    private MaterialService materialService;
+
+    /**
+     * 仓库列表
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getAllList")
+    @ApiOperation(value = "仓库列表")
+    public BaseResponseInfo getAllList(HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<Depot> depotList = depotService.getAllList();
+            res.code = 200;
+            res.data = depotList;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 用户对应仓库显示
+     * @param type
+     * @param keyId
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findUserDepot")
+    @ApiOperation(value = "用户对应仓库显示")
+    public JSONArray findUserDepot(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId,
+                                 HttpServletRequest request) throws Exception{
+        JSONArray arr = new JSONArray();
+        try {
+            //获取权限信息
+            String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, keyId);
+            List<Depot> dataList = depotService.findUserDepot();
+            //开始拼接json数据
+            JSONObject outer = new JSONObject();
+            outer.put("id", 0);
+            outer.put("key", 0);
+            outer.put("value", 0);
+            outer.put("title", "仓库列表");
+            outer.put("attributes", "仓库列表");
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (Depot depot : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", depot.getId());
+                    item.put("key", depot.getId());
+                    item.put("value", depot.getId());
+                    item.put("title", depot.getName());
+                    item.put("attributes", depot.getName());
+                    Boolean flag = ubValue.contains("[" + depot.getId().toString() + "]");
+                    if (flag) {
+                        item.put("checked", true);
+                    }
+                    dataArray.add(item);
+                }
+            }
+            outer.put("children", dataArray);
+            arr.add(outer);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    /**
+     * 获取当前用户拥有权限的仓库列表
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/findDepotByCurrentUser")
+    @ApiOperation(value = "获取当前用户拥有权限的仓库列表")
+    public BaseResponseInfo findDepotByCurrentUser(HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            JSONArray arr = depotService.findDepotByCurrentUser();
+            res.code = 200;
+            res.data = arr;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 更新默认仓库
+     * @param object
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/updateIsDefault")
+    @ApiOperation(value = "更新默认仓库")
+    public String updateIsDefault(@RequestBody JSONObject object,
+                                       HttpServletRequest request) throws Exception{
+        Long depotId = object.getLong("id");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = depotService.updateIsDefault(depotId);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 仓库列表-带库存
+     * @param mId
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getAllListWithStock")
+    @ApiOperation(value = "仓库列表-带库存")
+    public BaseResponseInfo getAllList(@RequestParam("mId") Long mId,
+                                       HttpServletRequest request) {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<Depot> list = depotService.getAllList();
+            List<DepotEx> depotList = new ArrayList<DepotEx>();
+            for(Depot depot: list) {
+                DepotEx de = new DepotEx();
+                if(mId!=0) {
+                    BigDecimal initStock = materialService.getInitStock(mId, depot.getId());
+                    BigDecimal currentStock = materialService.getCurrentStockByMaterialIdAndDepotId(mId, depot.getId());
+                    de.setInitStock(initStock);
+                    de.setCurrentStock(currentStock);
+                    MaterialInitialStock materialInitialStock = materialService.getSafeStock(mId, depot.getId());
+                    de.setLowSafeStock(materialInitialStock.getLowSafeStock());
+                    de.setHighSafeStock(materialInitialStock.getHighSafeStock());
+                } else {
+                    de.setInitStock(BigDecimal.ZERO);
+                    de.setCurrentStock(BigDecimal.ZERO);
+                }
+                de.setId(depot.getId());
+                de.setName(depot.getName());
+                depotList.add(de);
+            }
+            res.code = 200;
+            res.data = depotList;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = depotService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/DepotHeadController.java b/src/main/java/com/jsh/erp/controller/DepotHeadController.java
new file mode 100644
index 0000000..00bedf7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/DepotHeadController.java
@@ -0,0 +1,697 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.DepotHead;
+import com.jsh.erp.datasource.entities.DepotHeadVo4Body;
+import com.jsh.erp.datasource.vo.DepotHeadVo4InDetail;
+import com.jsh.erp.datasource.vo.DepotHeadVo4InOutMCount;
+import com.jsh.erp.datasource.vo.DepotHeadVo4List;
+import com.jsh.erp.datasource.vo.DepotHeadVo4StatementAccount;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.material.MaterialService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji-sheng-hua 752*718*920
+ */
+@RestController
+@RequestMapping(value = "/depotHead")
+@Api(tags = {"单据管理"})
+public class DepotHeadController {
+    private Logger logger = LoggerFactory.getLogger(DepotHeadController.class);
+
+    @Resource
+    private DepotHeadService depotHeadService;
+
+    @Resource
+    private DepotService depotService;
+
+    @Resource
+    private MaterialService materialService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Resource
+    private UserService userService;
+
+    /**
+     * 批量设置状态-审核或者反审核
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态-审核或者反审核")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request) throws Exception{
+        Map<String, Object> objectMap = new HashMap<>();
+        String status = jsonObject.getString("status");
+        String ids = jsonObject.getString("ids");
+        int res = depotHeadService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 入库出库明细接口
+     * @param currentPage
+     * @param pageSize
+     * @param oId
+     * @param number
+     * @param materialParam
+     * @param depotId
+     * @param beginTime
+     * @param endTime
+     * @param type
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findInOutDetail")
+    @ApiOperation(value = "入库出库明细接口")
+    public BaseResponseInfo findInOutDetail(@RequestParam("currentPage") Integer currentPage,
+                                            @RequestParam("pageSize") Integer pageSize,
+                                            @RequestParam(value = "organId", required = false) Integer oId,
+                                            @RequestParam("number") String number,
+                                            @RequestParam("materialParam") String materialParam,
+                                            @RequestParam(value = "depotId", required = false) Long depotId,
+                                            @RequestParam("beginTime") String beginTime,
+                                            @RequestParam("endTime") String endTime,
+                                            @RequestParam("type") String type,
+                                            @RequestParam(value = "creator", required = false) Long creator,
+                                            @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                            @RequestParam(value = "organizationId", required = false) Long organizationId,
+                                            @RequestParam("remark") String remark,
+                                            @RequestParam(value = "column", required = false, defaultValue = "createTime") String column,
+                                            @RequestParam(value = "order", required = false, defaultValue = "desc") String order,
+                                            HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<Long> depotList = new ArrayList<>();
+            if(depotId != null) {
+                depotList.add(depotId);
+            } else {
+                //未选择仓库时默认为当前用户有权限的仓库
+                JSONArray depotArr = depotService.findDepotByCurrentUser();
+                for(Object obj: depotArr) {
+                    JSONObject object = JSONObject.parseObject(obj.toString());
+                    depotList.add(object.getLong("id"));
+                }
+            }
+            List<DepotHeadVo4InDetail> resList = new ArrayList<DepotHeadVo4InDetail>();
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = depotHeadService.getCreatorArrayByOrg(organizationId);
+            }
+            String subType = "出库".equals(type)? "销售" : "";
+            String [] organArray = depotHeadService.getOrganArray(subType, "");
+            List<Long> categoryList = new ArrayList<>();
+            if(categoryId != null){
+                categoryList = materialService.getListByParentId(categoryId);
+            }
+            beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+            List<DepotHeadVo4InDetail> list = depotHeadService.findInOutDetail(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
+                    StringUtil.toNull(materialParam), depotList, oId, StringUtil.toNull(number), creator, remark,
+                    StringUtil.safeSqlParse(column), StringUtil.safeSqlParse(order), (currentPage-1)*pageSize, pageSize);
+            int total = depotHeadService.findInOutDetailCount(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
+                    StringUtil.toNull(materialParam), depotList, oId, StringUtil.toNull(number), creator, remark);
+            map.put("total", total);
+            //存放数据json数组
+            if (null != list) {
+                resList.addAll(list);
+            }
+            map.put("rows", resList);
+            DepotHeadVo4InDetail statistic = depotHeadService.findInOutDetailStatistic(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
+                    StringUtil.toNull(materialParam), depotList, oId, StringUtil.toNull(number), creator, remark);
+            map.put("operNumberTotal", statistic.getOperNumber());
+            map.put("allPriceTotal", statistic.getAllPrice());
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 入库出库汇总接口
+     * @param currentPage
+     * @param pageSize
+     * @param oId
+     * @param materialParam
+     * @param depotId
+     * @param beginTime
+     * @param endTime
+     * @param type
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findInOutMaterialCount")
+    @ApiOperation(value = "入库出库汇总接口")
+    public BaseResponseInfo findInOutMaterialCount(@RequestParam("currentPage") Integer currentPage,
+                                                   @RequestParam("pageSize") Integer pageSize,
+                                                   @RequestParam(value = "organId", required = false) Integer oId,
+                                                   @RequestParam("materialParam") String materialParam,
+                                                   @RequestParam(value = "depotId", required = false) Long depotId,
+                                                   @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                                   @RequestParam(value = "organizationId", required = false) Long organizationId,
+                                                   @RequestParam("beginTime") String beginTime,
+                                                   @RequestParam("endTime") String endTime,
+                                                   @RequestParam("type") String type,
+                                                   @RequestParam(value = "column", required = false, defaultValue = "createTime") String column,
+                                                   @RequestParam(value = "order", required = false, defaultValue = "desc") String order,
+                                                   HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<Long> depotList = new ArrayList<>();
+            if(depotId != null) {
+                depotList.add(depotId);
+            } else {
+                //未选择仓库时默认为当前用户有权限的仓库
+                JSONArray depotArr = depotService.findDepotByCurrentUser();
+                for(Object obj: depotArr) {
+                    JSONObject object = JSONObject.parseObject(obj.toString());
+                    depotList.add(object.getLong("id"));
+                }
+            }
+            List<Long> categoryList = new ArrayList<>();
+            if(categoryId != null){
+                categoryList = materialService.getListByParentId(categoryId);
+            }
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+            List<DepotHeadVo4InOutMCount> list = depotHeadService.findInOutMaterialCount(beginTime, endTime, type, categoryList, forceFlag, inOutManageFlag,
+                    StringUtil.toNull(materialParam), depotList, organizationId, oId, StringUtil.safeSqlParse(column), StringUtil.safeSqlParse(order),
+                    (currentPage-1)*pageSize, pageSize);
+            int total = depotHeadService.findInOutMaterialCountTotal(beginTime, endTime, type, categoryList, forceFlag, inOutManageFlag,
+                    StringUtil.toNull(materialParam), depotList, organizationId, oId);
+            map.put("total", total);
+            map.put("rows", list);
+            DepotHeadVo4InOutMCount statistic = depotHeadService.findInOutMaterialCountStatistic(beginTime, endTime, type, categoryList, forceFlag, inOutManageFlag,
+                    StringUtil.toNull(materialParam), depotList, organizationId, oId);
+            map.put("numSumTotal", statistic.getNumSum());
+            map.put("priceSumTotal", statistic.getPriceSum());
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 调拨明细统计
+     * @param currentPage
+     * @param pageSize
+     * @param number
+     * @param materialParam
+     * @param depotIdF  调出仓库
+     * @param depotId  调入仓库
+     * @param beginTime
+     * @param endTime
+     * @param subType
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findAllocationDetail")
+    @ApiOperation(value = "调拨明细统计")
+    public BaseResponseInfo findallocationDetail(@RequestParam("currentPage") Integer currentPage,
+                                                 @RequestParam("pageSize") Integer pageSize,
+                                                 @RequestParam("number") String number,
+                                                 @RequestParam("materialParam") String materialParam,
+                                                 @RequestParam(value = "depotId", required = false) Long depotId,
+                                                 @RequestParam(value = "depotIdF", required = false) Long depotIdF,
+                                                 @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                                 @RequestParam(value = "organizationId", required = false) Long organizationId,
+                                                 @RequestParam("beginTime") String beginTime,
+                                                 @RequestParam("endTime") String endTime,
+                                                 @RequestParam("subType") String subType,
+                                                 @RequestParam("remark") String remark,
+                                                 @RequestParam(value = "column", required = false, defaultValue = "createTime") String column,
+                                                 @RequestParam(value = "order", required = false, defaultValue = "desc") String order,
+                                                 HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<Long> depotList = new ArrayList<>();
+            List<Long> depotFList = new ArrayList<>();
+            if(depotId != null) {
+                depotList.add(depotId);
+            } else {
+                //未选择仓库时默认为当前用户有权限的仓库
+                JSONArray depotArr = depotService.findDepotByCurrentUser();
+                for(Object obj: depotArr) {
+                    JSONObject object = JSONObject.parseObject(obj.toString());
+                    depotList.add(object.getLong("id"));
+                }
+            }
+            if(depotIdF != null) {
+                depotFList.add(depotIdF);
+            } else {
+                //未选择仓库时默认为当前用户有权限的仓库
+                JSONArray depotArr = depotService.findDepotByCurrentUser();
+                for(Object obj: depotArr) {
+                    JSONObject object = JSONObject.parseObject(obj.toString());
+                    depotFList.add(object.getLong("id"));
+                }
+            }
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = depotHeadService.getCreatorArrayByOrg(organizationId);
+            }
+            List<Long> categoryList = new ArrayList<>();
+            if(categoryId != null){
+                categoryList = materialService.getListByParentId(categoryId);
+            }
+            beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            List<DepotHeadVo4InDetail> list = depotHeadService.findAllocationDetail(beginTime, endTime, subType, StringUtil.toNull(number),
+                    creatorArray, categoryList, forceFlag, StringUtil.toNull(materialParam), depotList, depotFList, remark,
+                    StringUtil.safeSqlParse(column), StringUtil.safeSqlParse(order), (currentPage-1)*pageSize, pageSize);
+            int total = depotHeadService.findAllocationDetailCount(beginTime, endTime, subType, StringUtil.toNull(number),
+                    creatorArray, categoryList, forceFlag, StringUtil.toNull(materialParam), depotList, depotFList, remark);
+            map.put("rows", list);
+            map.put("total", total);
+            DepotHeadVo4InDetail statistic = depotHeadService.findAllocationStatistic(beginTime, endTime, subType, StringUtil.toNull(number),
+                    creatorArray, categoryList, forceFlag, StringUtil.toNull(materialParam), depotList, depotFList, remark);
+            map.put("operNumberTotal", statistic.getOperNumber());
+            map.put("allPriceTotal", statistic.getAllPrice());
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 对账单接口
+     * @param currentPage
+     * @param pageSize
+     * @param beginTime
+     * @param endTime
+     * @param organId
+     * @param hasDebt 1-有欠款 0-无欠款
+     * @param supplierType
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getStatementAccount")
+    @ApiOperation(value = "对账单接口")
+    public BaseResponseInfo getStatementAccount(@RequestParam("currentPage") Integer currentPage,
+                                                 @RequestParam("pageSize") Integer pageSize,
+                                                 @RequestParam("beginTime") String beginTime,
+                                                 @RequestParam("endTime") String endTime,
+                                                 @RequestParam(value = "organId", required = false) Integer organId,
+                                                 @RequestParam(value = "hasDebt", required = false) Integer hasDebt,
+                                                 @RequestParam("supplierType") String supplierType,
+                                                 HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            String type = "";
+            String subType = "";
+            String typeBack = "";
+            String subTypeBack = "";
+            String billType = "";
+            if (("供应商").equals(supplierType)) {
+                type = "入库";
+                subType = "采购";
+                typeBack = "出库";
+                subTypeBack = "采购退货";
+                billType = "付款";
+            } else if (("客户").equals(supplierType)) {
+                type = "出库";
+                subType = "销售";
+                typeBack = "入库";
+                subTypeBack = "销售退货";
+                billType = "收款";
+            }
+            String [] organArray = depotHeadService.getOrganArray(subType, "");
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            List<DepotHeadVo4StatementAccount> list = depotHeadService.getStatementAccount(beginTime, endTime, organId, organArray,
+                    hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType, (currentPage-1)*pageSize, pageSize);
+            int total = depotHeadService.getStatementAccountCount(beginTime, endTime, organId, organArray,
+                    hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType);
+            for(DepotHeadVo4StatementAccount item: list) {
+                //期初 = 起始期初金额+上期欠款金额-上期退货的欠款金额-上期收付款
+                BigDecimal preNeed = item.getBeginNeed().add(item.getPreDebtMoney()).subtract(item.getPreReturnDebtMoney()).subtract(item.getPreBackMoney());
+                item.setPreNeed(preNeed);
+                //实际欠款 = 本期欠款-本期退货的欠款金额
+                BigDecimal realDebtMoney = item.getDebtMoney().subtract(item.getReturnDebtMoney());
+                item.setDebtMoney(realDebtMoney);
+                //期末 = 期初+实际欠款-本期收款
+                BigDecimal allNeedGet = preNeed.add(realDebtMoney).subtract(item.getBackMoney());
+                item.setAllNeed(allNeedGet);
+            }
+            map.put("rows", list);
+            map.put("total", total);
+            List<DepotHeadVo4StatementAccount> totalPayList = depotHeadService.getStatementAccountTotalPay(beginTime, endTime, organId, organArray,
+                    hasDebt, supplierType, type, subType, typeBack, subTypeBack, billType);
+            if(totalPayList.size()>0) {
+                DepotHeadVo4StatementAccount totalPayItem = totalPayList.get(0);
+                BigDecimal firstMoney = BigDecimal.ZERO;
+                BigDecimal lastMoney = BigDecimal.ZERO;
+                if(totalPayItem!=null) {
+                    //期初 = 起始期初金额+上期欠款金额-上期退货的欠款金额-上期收付款
+                    firstMoney = totalPayItem.getBeginNeed().add(totalPayItem.getPreDebtMoney()).subtract(totalPayItem.getPreReturnDebtMoney()).subtract(totalPayItem.getPreBackMoney());
+                    //期末 = 期初+本期欠款-本期退货的欠款金额-本期收款
+                    lastMoney = firstMoney.add(totalPayItem.getDebtMoney()).subtract(totalPayItem.getReturnDebtMoney()).subtract(totalPayItem.getBackMoney());
+                }
+                map.put("firstMoney", firstMoney); //期初
+                map.put("lastMoney", lastMoney);  //期末
+            }
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据编号查询单据信息
+     * @param number
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getDetailByNumber")
+    @ApiOperation(value = "根据编号查询单据信息")
+    public BaseResponseInfo getDetailByNumber(@RequestParam("number") String number,
+                                         HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        DepotHeadVo4List dhl = new DepotHeadVo4List();
+        try {
+            List<DepotHeadVo4List> list = depotHeadService.getDetailByNumber(number, request);
+            if(list.size()>0) {
+                dhl = list.get(0);
+            }
+            res.code = 200;
+            res.data = dhl;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据原单号查询关联的单据列表
+     * @param number
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getBillListByLinkNumber")
+    @ApiOperation(value = "根据原单号查询关联的单据列表")
+    public BaseResponseInfo getBillListByLinkNumber(@RequestParam("number") String number,
+                                              HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        DepotHead dh = new DepotHead();
+        try {
+            List<DepotHead> list = depotHeadService.getBillListByLinkNumber(number);
+            res.code = 200;
+            res.data = list;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 新增单据主表及单据子表信息
+     * @param body
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/addDepotHeadAndDetail")
+    @ApiOperation(value = "新增单据主表及单据子表信息")
+    public Object addDepotHeadAndDetail(@RequestBody DepotHeadVo4Body body, HttpServletRequest request) throws  Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        String beanJson = body.getInfo();
+        String rows = body.getRows();
+        depotHeadService.addDepotHeadAndDetail(beanJson, rows, request);
+        return result;
+    }
+
+    /**
+     * 更新单据主表及单据子表信息
+     * @param body
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PutMapping(value = "/updateDepotHeadAndDetail")
+    @ApiOperation(value = "更新单据主表及单据子表信息")
+    public Object updateDepotHeadAndDetail(@RequestBody DepotHeadVo4Body body, HttpServletRequest request) throws Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        String beanJson = body.getInfo();
+        String rows = body.getRows();
+        depotHeadService.updateDepotHeadAndDetail(beanJson,rows,request);
+        return result;
+    }
+
+    /**
+     * 统计今日采购额、昨日采购额、本月采购额、今年采购额|销售额|零售额
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getBuyAndSaleStatistics")
+    @ApiOperation(value = "统计今日采购额、昨日采购额、本月采购额、今年采购额|销售额|零售额")
+    public BaseResponseInfo getBuyAndSaleStatistics(HttpServletRequest request) {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> map = new HashMap<>();
+            String loginName = userService.getCurrentUser().getLoginName();
+            if(!"admin".equals(loginName)) {
+                String today = Tools.getNow() + BusinessConstants.DAY_FIRST_TIME;
+                String monthFirstDay = Tools.firstDayOfMonth(Tools.getCurrentMonth()) + BusinessConstants.DAY_FIRST_TIME;
+                String yesterdayBegin = Tools.getYesterday() + BusinessConstants.DAY_FIRST_TIME;
+                String yesterdayEnd = Tools.getYesterday() + BusinessConstants.DAY_LAST_TIME;
+                String yearBegin = Tools.getYearBegin() + BusinessConstants.DAY_FIRST_TIME;
+                String yearEnd = Tools.getYearEnd() + BusinessConstants.DAY_LAST_TIME;
+                map = depotHeadService.getBuyAndSaleStatistics(today, monthFirstDay, yesterdayBegin, yesterdayEnd, yearBegin, yearEnd, request);
+            }
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据当前用户获取操作员数组,用于控制当前用户的数据权限,限制可以看到的单据范围
+     * 注意:该接口提供给部分插件使用,勿删
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getCreatorByCurrentUser")
+    @ApiOperation(value = "根据当前用户获取操作员数组")
+    public BaseResponseInfo getCreatorByCurrentUser(HttpServletRequest request) {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String creator = depotHeadService.getCreatorByCurrentUser();
+            res.code = 200;
+            res.data = creator;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 查询存在欠款的单据
+     * @param search
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/debtList")
+    @ApiOperation(value = "查询存在欠款的单据")
+    public String debtList(@RequestParam(value = Constants.SEARCH, required = false) String search,
+                           @RequestParam("currentPage") Integer currentPage,
+                           @RequestParam("pageSize") Integer pageSize,
+                           HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        String organIdStr = StringUtil.getInfo(search, "organId");
+        Long organId = Long.parseLong(organIdStr);
+        String materialParam = StringUtil.getInfo(search, "materialParam");
+        String number = StringUtil.getInfo(search, "number");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        String status = StringUtil.getInfo(search, "status");
+        List<DepotHeadVo4List> list = depotHeadService.debtList(organId, materialParam, number, beginTime, endTime,
+                status, (currentPage-1)*pageSize, pageSize);
+        int total = depotHeadService.debtListCount(organId, materialParam, number, beginTime, endTime, status);
+        if (list != null) {
+            objectMap.put("rows", list);
+            objectMap.put("total", total);
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            objectMap.put("rows", new ArrayList<>());
+            objectMap.put("total", 0);
+            return returnJson(objectMap, "查找不到数据", ErpInfo.OK.code);
+        }
+    }
+
+    /**
+     * 导出存在欠款的单据
+     * @param organId
+     * @param materialParam
+     * @param number
+     * @param type
+     * @param subType
+     * @param beginTime
+     * @param endTime
+     * @param status
+     * @param mpList
+     * @param request
+     * @param response
+     * @throws Exception
+     */
+    @GetMapping(value = "/debtExport")
+    @ApiOperation(value = "导出存在欠款的单据")
+    public void debtExport(@RequestParam(value = "organId", required = false) Long organId,
+                           @RequestParam(value = "materialParam", required = false) String materialParam,
+                           @RequestParam(value = "number", required = false) String number,
+                           @RequestParam(value = "type", required = false) String type,
+                           @RequestParam(value = "subType", required = false) String subType,
+                           @RequestParam(value = "beginTime", required = false) String beginTime,
+                           @RequestParam(value = "endTime", required = false) String endTime,
+                           @RequestParam(value = "status", required = false) String status,
+                           @RequestParam(value = "mpList", required = false) String mpList,
+                           HttpServletRequest request, HttpServletResponse response)throws Exception {
+        try {
+            depotHeadService.debtExport(organId, materialParam, number, type, subType, beginTime, endTime,
+                    status, mpList, request, response);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 查询等待入库或出库的单据
+     * @param search
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/waitBillList")
+    @ApiOperation(value = "查询等待入库或出库的单据")
+    public String waitBillList(@RequestParam(value = Constants.SEARCH, required = false) String search,
+                           @RequestParam("currentPage") Integer currentPage,
+                           @RequestParam("pageSize") Integer pageSize,
+                           HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        String number = StringUtil.getInfo(search, "number");
+        String materialParam = StringUtil.getInfo(search, "materialParam");
+        String type = StringUtil.getInfo(search, "type");
+        String subType = StringUtil.getInfo(search, "subType");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        String status = StringUtil.getInfo(search, "status");
+        List<DepotHeadVo4List> list = depotHeadService.waitBillList(number, materialParam, type, subType, beginTime, endTime,
+                status, (currentPage-1)*pageSize, pageSize);
+        long total = depotHeadService.waitBillCount(number, materialParam, type, subType, beginTime, endTime, status);
+        if (list != null) {
+            objectMap.put("rows", list);
+            objectMap.put("total", total);
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            objectMap.put("rows", new ArrayList<>());
+            objectMap.put("total", 0);
+            return returnJson(objectMap, "查找不到数据", ErpInfo.OK.code);
+        }
+    }
+
+    /**
+     * 查询等待入库或出库的单据数量
+     * @param search
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/waitBillCount")
+    @ApiOperation(value = "查询等待入库或出库的单据数量")
+    public String waitBillCount(@RequestParam(value = Constants.SEARCH, required = false) String search,
+                               HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        String number = StringUtil.getInfo(search, "number");
+        String materialParam = StringUtil.getInfo(search, "materialParam");
+        String type = StringUtil.getInfo(search, "type");
+        String subType = StringUtil.getInfo(search, "subType");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        String status = StringUtil.getInfo(search, "status");
+        long total = depotHeadService.waitBillCount(number, materialParam, type, subType, beginTime, endTime, status);
+        objectMap.put("total", total);
+        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+    }
+
+    /**
+     * 批量新增入库或出库单据
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/batchAddDepotHeadAndDetail")
+    @ApiOperation(value = "批量新增入库或出库单据")
+    public Object batchAddDepotHeadAndDetail(@RequestBody JSONObject jsonObject,
+                                             HttpServletRequest request) throws  Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        String ids = jsonObject.getString("ids");
+        depotHeadService.batchAddDepotHeadAndDetail(ids, request);
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/DepotItemController.java b/src/main/java/com/jsh/erp/controller/DepotItemController.java
new file mode 100644
index 0000000..e3c52de
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/DepotItemController.java
@@ -0,0 +1,1232 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.vo.DepotItemStockWarningCount;
+import com.jsh.erp.datasource.vo.DepotItemVoBatchNumberList;
+import com.jsh.erp.datasource.vo.InOutPriceVo;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.depotItem.DepotItemService;
+import com.jsh.erp.service.material.MaterialService;
+import com.jsh.erp.service.role.RoleService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.unit.UnitService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import jxl.Sheet;
+import jxl.Workbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji-sheng-hua 云游管理系统
+ */
+@RestController
+@RequestMapping(value = "/depotItem")
+@Api(tags = {"单据明细"})
+public class DepotItemController {
+    private Logger logger = LoggerFactory.getLogger(DepotItemController.class);
+
+    @Resource
+    private DepotHeadService depotHeadService;
+
+    @Resource
+    private DepotItemService depotItemService;
+
+    @Resource
+    private MaterialService materialService;
+
+    @Resource
+    private UnitService unitService;
+
+    @Resource
+    private DepotService depotService;
+
+    @Resource
+    private RoleService roleService;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Value(value="${file.uploadType}")
+    private Long fileUploadType;
+
+    /**
+     * 根据仓库和商品查询单据列表
+     * @param mId
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findDetailByDepotIdsAndMaterialId")
+    @ApiOperation(value = "根据仓库和商品查询单据列表")
+    public String findDetailByDepotIdsAndMaterialId(
+            @RequestParam(value = Constants.PAGE_SIZE, required = false) Integer pageSize,
+            @RequestParam(value = Constants.CURRENT_PAGE, required = false) Integer currentPage,
+            @RequestParam(value = "depotIds",required = false) String depotIds,
+            @RequestParam(value = "sku",required = false) String sku,
+            @RequestParam(value = "batchNumber",required = false) String batchNumber,
+            @RequestParam(value = "number",required = false) String number,
+            @RequestParam(value = "beginTime",required = false) String beginTime,
+            @RequestParam(value = "endTime",required = false) String endTime,
+            @RequestParam("materialId") Long mId,
+            HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        if(StringUtil.isNotEmpty(beginTime)) {
+            beginTime = beginTime + BusinessConstants.DAY_FIRST_TIME;
+        }
+        if(StringUtil.isNotEmpty(endTime)) {
+            endTime = endTime + BusinessConstants.DAY_LAST_TIME;
+        }
+        Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+        Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+        List<DepotItemVo4DetailByTypeAndMId> list = depotItemService.findDetailByDepotIdsAndMaterialIdList(depotIds, forceFlag, inOutManageFlag, sku,
+                batchNumber, StringUtil.toNull(number), beginTime, endTime, mId, (currentPage-1)*pageSize, pageSize);
+        JSONArray dataArray = new JSONArray();
+        if (list != null) {
+            for (DepotItemVo4DetailByTypeAndMId d: list) {
+                JSONObject item = new JSONObject();
+                item.put("number", d.getNumber()); //编号
+                item.put("barCode", d.getBarCode()); //条码
+                item.put("materialName", d.getMaterialName()); //名称
+                String type = d.getType();
+                String subType = d.getSubType();
+                if(("其它").equals(type)) {
+                    item.put("type", subType); //进出类型
+                } else {
+                    item.put("type", subType + type); //进出类型
+                }
+                item.put("depotName", d.getDepotName()); //仓库名称
+                item.put("basicNumber", d.getBnum()); //数量
+                item.put("unitPrice", d.getUnitPrice()); //单价
+                item.put("allPrice", d.getAllPrice()); //金额
+                item.put("operTime", Tools.getCenternTime(d.getOtime())); //时间
+                dataArray.add(item);
+            }
+        }
+        if (list == null) {
+            objectMap.put("rows", new ArrayList<Object>());
+            objectMap.put("total", BusinessConstants.DEFAULT_LIST_NULL_NUMBER);
+            return returnJson(objectMap, "查找不到数据", ErpInfo.OK.code);
+        }
+        objectMap.put("rows", dataArray);
+        objectMap.put("total", depotItemService.findDetailByDepotIdsAndMaterialIdCount(depotIds, forceFlag, inOutManageFlag, sku,
+                batchNumber, StringUtil.toNull(number), beginTime, endTime, mId));
+        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+    }
+
+    /**
+     * 根据商品条码和仓库id查询库存数量
+     * @param depotId
+     * @param barCode
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/findStockByDepotAndBarCode")
+    @ApiOperation(value = "根据商品条码和仓库id查询库存数量")
+    public BaseResponseInfo findStockByDepotAndBarCode(
+            @RequestParam(value = "depotId",required = false) Long depotId,
+            @RequestParam("barCode") String barCode,
+            HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            BigDecimal stock = BigDecimal.ZERO;
+            List<MaterialVo4Unit> list = materialService.getMaterialByBarCode(barCode);
+            if(list!=null && list.size()>0) {
+                MaterialVo4Unit materialVo4Unit = list.get(0);
+                if(StringUtil.isNotEmpty(materialVo4Unit.getSku())){
+                    stock = depotItemService.getSkuStockByParam(depotId,materialVo4Unit.getMeId(),null,null);
+                } else {
+                    stock = depotItemService.getCurrentStockByParam(depotId, materialVo4Unit.getId());
+                    if(materialVo4Unit.getUnitId()!=null) {
+                        Unit unit = unitService.getUnit(materialVo4Unit.getUnitId());
+                        String commodityUnit = materialVo4Unit.getCommodityUnit();
+                        stock = unitService.parseStockByUnit(stock, unit, commodityUnit);
+                    }
+                }
+            }
+            map.put("stock", stock);
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 单据明细列表
+     * @param headerId
+     * @param mpList
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getDetailList")
+    @ApiOperation(value = "单据明细列表")
+    public BaseResponseInfo getDetailList(@RequestParam("headerId") Long headerId,
+                              @RequestParam("mpList") String mpList,
+                              @RequestParam(value = "linkType", required = false) String linkType,
+                              @RequestParam(value = "isReadOnly", required = false) String isReadOnly,
+                              HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Long userId = userService.getUserId(request);
+            String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+            List<DepotItemVo4WithInfoEx> dataList = new ArrayList<>();
+            String billCategory = depotHeadService.getBillCategory(depotHeadService.getDepotHead(headerId).getSubType());
+            if(headerId != 0) {
+                dataList = depotItemService.getDetailList(headerId);
+            }
+            String[] mpArr = mpList.split(",");
+            JSONObject outer = new JSONObject();
+            outer.put("total", dataList.size());
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                BigDecimal totalOperNumber = BigDecimal.ZERO;
+                BigDecimal totalAllPrice = BigDecimal.ZERO;
+                BigDecimal totalTaxMoney = BigDecimal.ZERO;
+                BigDecimal totalTaxLastMoney = BigDecimal.ZERO;
+                BigDecimal totalWeight = BigDecimal.ZERO;
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", diEx.getId());
+                    item.put("materialExtendId", diEx.getMaterialExtendId() == null ? "" : diEx.getMaterialExtendId());
+                    item.put("barCode", diEx.getBarCode());
+                    item.put("name", diEx.getMName());
+                    item.put("standard", diEx.getMStandard());
+                    item.put("model", diEx.getMModel());
+                    item.put("color", diEx.getMColor());
+                    item.put("brand", diEx.getBrand());
+                    item.put("mfrs", diEx.getMMfrs());
+                    item.put("materialOther", depotItemService.getOtherInfo(mpArr, diEx));
+                    BigDecimal stock;
+                    Unit unitInfo = materialService.findUnit(diEx.getMaterialId()); //查询多单位信息
+                    String materialUnit = diEx.getMaterialUnit();
+                    if(StringUtil.isNotEmpty(diEx.getSku())){
+                        stock = depotItemService.getSkuStockByParam(diEx.getDepotId(),diEx.getMaterialExtendId(),null,null);
+                    } else {
+                        stock = depotItemService.getCurrentStockByParam(diEx.getDepotId(),diEx.getMaterialId());
+                        if (StringUtil.isNotEmpty(unitInfo.getName())) {
+                            stock = unitService.parseStockByUnit(stock, unitInfo, materialUnit);
+                        }
+                    }
+                    item.put("stock", stock);
+                    item.put("unit", diEx.getMaterialUnit());
+                    item.put("snList", diEx.getSnList());
+                    item.put("batchNumber", diEx.getBatchNumber());
+                    item.put("expirationDate", Tools.parseDateToStr(diEx.getExpirationDate()));
+                    item.put("sku", diEx.getSku());
+                    item.put("enableSerialNumber", diEx.getEnableSerialNumber());
+                    item.put("enableBatchNumber", diEx.getEnableBatchNumber());
+                    item.put("operNumber", diEx.getOperNumber());
+                    item.put("basicNumber", diEx.getBasicNumber());
+                    item.put("preNumber", diEx.getOperNumber()); //原数量
+                    item.put("finishNumber", depotItemService.getFinishNumber(diEx.getMaterialExtendId(), diEx.getId(), diEx.getHeaderId(), unitInfo, materialUnit, linkType)); //已入库|已出库
+                    item.put("purchaseDecimal", roleService.parseBillPriceByLimit(diEx.getPurchaseDecimal(), billCategory, priceLimit, request));  //采购价
+                    if("basic".equals(linkType) || "1".equals(isReadOnly)) {
+                        //正常情况显示金额,而以销定购的情况不能显示金额
+                        item.put("unitPrice", roleService.parseBillPriceByLimit(diEx.getUnitPrice(), billCategory, priceLimit, request));
+                        item.put("taxUnitPrice", roleService.parseBillPriceByLimit(diEx.getTaxUnitPrice(), billCategory, priceLimit, request));
+                        item.put("allPrice", roleService.parseBillPriceByLimit(diEx.getAllPrice(), billCategory, priceLimit, request));
+                        item.put("taxRate", roleService.parseBillPriceByLimit(diEx.getTaxRate(), billCategory, priceLimit, request));
+                        item.put("taxMoney", roleService.parseBillPriceByLimit(diEx.getTaxMoney(), billCategory, priceLimit, request));
+                        item.put("taxLastMoney", roleService.parseBillPriceByLimit(diEx.getTaxLastMoney(), billCategory, priceLimit, request));
+                    }
+                    BigDecimal allWeight = diEx.getBasicNumber()==null||diEx.getWeight()==null?BigDecimal.ZERO:diEx.getBasicNumber().multiply(diEx.getWeight());
+                    item.put("weight", allWeight);
+                    item.put("position", diEx.getPosition());
+                    item.put("remark", diEx.getRemark());
+                    item.put("imgName", diEx.getImgName());
+                    if(fileUploadType == 2) {
+                        item.put("imgSmall", "small");
+                        item.put("imgLarge", "large");
+                    } else {
+                        item.put("imgSmall", "");
+                        item.put("imgLarge", "");
+                    }
+                    item.put("linkId", diEx.getLinkId());
+                    item.put("depotId", diEx.getDepotId() == null ? "" : diEx.getDepotId());
+                    item.put("depotName", diEx.getDepotId() == null ? "" : diEx.getDepotName());
+                    item.put("anotherDepotId", diEx.getAnotherDepotId() == null ? "" : diEx.getAnotherDepotId());
+                    item.put("anotherDepotName", diEx.getAnotherDepotId() == null ? "" : diEx.getAnotherDepotName());
+                    item.put("mType", diEx.getMaterialType());
+                    item.put("op", 1);
+                    dataArray.add(item);
+                    //合计数据汇总
+                    totalOperNumber = totalOperNumber.add(diEx.getOperNumber()==null?BigDecimal.ZERO:diEx.getOperNumber());
+                    totalAllPrice = totalAllPrice.add(diEx.getAllPrice()==null?BigDecimal.ZERO:diEx.getAllPrice());
+                    totalTaxMoney = totalTaxMoney.add(diEx.getTaxMoney()==null?BigDecimal.ZERO:diEx.getTaxMoney());
+                    totalTaxLastMoney = totalTaxLastMoney.add(diEx.getTaxLastMoney()==null?BigDecimal.ZERO:diEx.getTaxLastMoney());
+                    totalWeight = totalWeight.add(allWeight);
+                }
+                if(StringUtil.isNotEmpty(isReadOnly) && "1".equals(isReadOnly)) {
+                    JSONObject footItem = new JSONObject();
+                    footItem.put("operNumber", totalOperNumber);
+                    footItem.put("allPrice", roleService.parseBillPriceByLimit(totalAllPrice, billCategory, priceLimit, request));
+                    footItem.put("taxMoney", roleService.parseBillPriceByLimit(totalTaxMoney, billCategory, priceLimit, request));
+                    footItem.put("taxLastMoney", roleService.parseBillPriceByLimit(totalTaxLastMoney, billCategory, priceLimit, request));
+                    footItem.put("weight", totalWeight);
+                    dataArray.add(footItem);
+                }
+            }
+            outer.put("rows", dataArray);
+            res.code = 200;
+            res.data = outer;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 进销存统计-即将废弃
+     * @param currentPage
+     * @param pageSize
+     * @param depotIds
+     * @param monthTime
+     * @param materialParam
+     * @param mpList
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/findByAll")
+    @ApiOperation(value = "查找所有的明细")
+    public BaseResponseInfo findByAll(@RequestParam("currentPage") Integer currentPage,
+                                      @RequestParam("pageSize") Integer pageSize,
+                                      @RequestParam(value = "depotIds",required = false) String depotIds,
+                                      @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                      @RequestParam("monthTime") String monthTime,
+                                      @RequestParam("materialParam") String materialParam,
+                                      @RequestParam("mpList") String mpList,
+                                      HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            Boolean moveAvgPriceFlag = systemConfigService.getMoveAvgPriceFlag();
+            List<Long> categoryIdList = new ArrayList<>();
+            if(categoryId != null){
+                categoryIdList = materialService.getListByParentId(categoryId);
+            }
+            String timeA = Tools.firstDayOfMonth(monthTime) + BusinessConstants.DAY_FIRST_TIME;
+            String timeB = Tools.lastDayOfMonth(monthTime) + BusinessConstants.DAY_LAST_TIME;
+            List<Long> depotList = parseListByDepotIds(depotIds);
+            List<DepotItemVo4WithInfoEx> dataList = depotItemService.getInOutStock(StringUtil.toNull(materialParam),
+                    categoryIdList, timeB,(currentPage-1)*pageSize, pageSize);
+            String[] mpArr = mpList.split(",");
+            int total = depotItemService.getInOutStockCount(StringUtil.toNull(materialParam), categoryIdList, timeB);
+            map.put("total", total);
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    JSONObject item = new JSONObject();
+                    Long mId = diEx.getMId();
+                    item.put("barCode", diEx.getBarCode());
+                    item.put("materialName", diEx.getMName());
+                    item.put("materialModel", diEx.getMModel());
+                    item.put("materialStandard", diEx.getMStandard());
+                    //扩展信息
+                    String materialOther = depotItemService.getOtherInfo(mpArr, diEx);
+                    item.put("materialOther", materialOther);
+                    item.put("materialColor", diEx.getMColor());
+                    item.put("unitId", diEx.getUnitId());
+                    item.put("unitName", null!=diEx.getUnitId() ? diEx.getMaterialUnit()+"[多单位]" : diEx.getMaterialUnit());
+                    BigDecimal prevSum = depotItemService.getStockByParamWithDepotList(depotList,mId,null,timeA);
+                    Map<String,BigDecimal> intervalMap = depotItemService.getIntervalMapByParamWithDepotList(depotList,mId,timeA,timeB);
+                    BigDecimal inSum = intervalMap.get("inSum");
+                    BigDecimal outSum = intervalMap.get("outSum");
+                    BigDecimal thisSum = prevSum.add(inSum).subtract(outSum);
+                    item.put("prevSum", prevSum);
+                    item.put("inSum", inSum);
+                    item.put("outSum", outSum);
+                    item.put("thisSum", thisSum);
+                    //将小单位的库存换算为大单位的库存
+                    item.put("bigUnitStock", materialService.getBigUnitStock(thisSum, diEx.getUnitId()));
+                    if(moveAvgPriceFlag) {
+                        item.put("unitPrice", diEx.getCurrentUnitPrice());
+                    } else {
+                        item.put("unitPrice", diEx.getPurchaseDecimal());
+                    }
+                    if(moveAvgPriceFlag) {
+                        item.put("thisAllPrice", thisSum.multiply(diEx.getCurrentUnitPrice()));
+                    } else {
+                        item.put("thisAllPrice", thisSum.multiply(diEx.getPurchaseDecimal()));
+                    }
+                    dataArray.add(item);
+                }
+            }
+            map.put("rows", dataArray);
+            res.code = 200;
+            res.data = map;
+        } catch (BusinessRunTimeException e) {
+            res.code = e.getCode();
+            res.data = e.getData().get("message");
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 进销存统计总计金额-即将废弃
+     * @param depotIds
+     * @param monthTime
+     * @param materialParam
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/totalCountMoney")
+    @ApiOperation(value = "统计总计金额")
+    public BaseResponseInfo totalCountMoney(@RequestParam(value = "depotIds",required = false) String depotIds,
+                                            @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                            @RequestParam("monthTime") String monthTime,
+                                            @RequestParam("materialParam") String materialParam,
+                                            HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            Boolean moveAvgPriceFlag = systemConfigService.getMoveAvgPriceFlag();
+            List<Long> categoryIdList = new ArrayList<>();
+            if(categoryId != null){
+                categoryIdList = materialService.getListByParentId(categoryId);
+            }
+            String endTime = Tools.lastDayOfMonth(monthTime) + BusinessConstants.DAY_LAST_TIME;
+            List<Long> depotList = parseListByDepotIds(depotIds);
+            List<DepotItemVo4WithInfoEx> dataList = depotItemService.getInOutStock(StringUtil.toNull(materialParam),
+                    categoryIdList, endTime, null, null);
+            BigDecimal thisAllStock = BigDecimal.ZERO;
+            BigDecimal thisAllPrice = BigDecimal.ZERO;
+            if (null != dataList) {
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    Long mId = diEx.getMId();
+                    BigDecimal thisSum = depotItemService.getStockByParamWithDepotList(depotList,mId,null,endTime);
+                    thisAllStock = thisAllStock.add(thisSum);
+                    BigDecimal unitPrice = null;
+                    if(moveAvgPriceFlag) {
+                        unitPrice = diEx.getCurrentUnitPrice();
+                    } else {
+                        unitPrice = diEx.getPurchaseDecimal();
+                    }
+                    if(unitPrice == null) {
+                        unitPrice = BigDecimal.ZERO;
+                    }
+                    thisAllPrice = thisAllPrice.add(thisSum.multiply(unitPrice));
+                }
+            }
+            map.put("totalStock", thisAllStock);
+            map.put("totalCount", thisAllPrice);
+            res.code = 200;
+            res.data = map;
+        } catch (BusinessRunTimeException e) {
+            res.code = e.getCode();
+            res.data = e.getData().get("message");
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 进销存统计查询
+     * @param currentPage
+     * @param pageSize
+     * @param depotIds
+     * @param beginTime
+     * @param endTime
+     * @param materialParam
+     * @param mpList
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getInOutStock")
+    @ApiOperation(value = "进销存统计查询")
+    public BaseResponseInfo getInOutStock(@RequestParam("currentPage") Integer currentPage,
+                                      @RequestParam("pageSize") Integer pageSize,
+                                      @RequestParam(value = "depotIds",required = false) String depotIds,
+                                      @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                      @RequestParam("beginTime") String beginTime,
+                                      @RequestParam("endTime") String endTime,
+                                      @RequestParam("materialParam") String materialParam,
+                                      @RequestParam("mpList") String mpList,
+                                      HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            Boolean moveAvgPriceFlag = systemConfigService.getMoveAvgPriceFlag();
+            List<Long> categoryIdList = new ArrayList<>();
+            if(categoryId != null){
+                categoryIdList = materialService.getListByParentId(categoryId);
+            }
+            beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            List<Long> depotList = parseListByDepotIds(depotIds);
+            List<DepotItemVo4WithInfoEx> dataList = depotItemService.getInOutStock(StringUtil.toNull(materialParam),
+                    categoryIdList, endTime,(currentPage-1)*pageSize, pageSize);
+            String[] mpArr = mpList.split(",");
+            int total = depotItemService.getInOutStockCount(StringUtil.toNull(materialParam), categoryIdList, endTime);
+            map.put("total", total);
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    JSONObject item = new JSONObject();
+                    Long mId = diEx.getMId();
+                    item.put("barCode", diEx.getBarCode());
+                    item.put("materialName", diEx.getMName());
+                    item.put("materialModel", diEx.getMModel());
+                    item.put("materialStandard", diEx.getMStandard());
+                    item.put("materialColor", diEx.getMColor());
+                    item.put("materialMfrs", diEx.getMMfrs());
+                    item.put("materialBrand", diEx.getBrand());
+                    //扩展信息
+                    String materialOther = depotItemService.getOtherInfo(mpArr, diEx);
+                    item.put("materialOther", materialOther);
+                    item.put("unitId", diEx.getUnitId());
+                    item.put("unitName", null!=diEx.getUnitId() ? diEx.getMaterialUnit()+"[多单位]" : diEx.getMaterialUnit());
+                    BigDecimal prevSum = depotItemService.getStockByParamWithDepotList(depotList,mId,null,beginTime);
+                    Map<String,BigDecimal> intervalMap = depotItemService.getIntervalMapByParamWithDepotList(depotList,mId,beginTime,endTime);
+                    BigDecimal inSum = intervalMap.get("inSum");
+                    BigDecimal outSum = intervalMap.get("outSum");
+                    BigDecimal thisSum = prevSum.add(inSum).subtract(outSum);
+                    item.put("prevSum", prevSum);
+                    item.put("inSum", inSum);
+                    item.put("outSum", outSum);
+                    item.put("thisSum", thisSum);
+                    //将小单位的库存换算为大单位的库存
+                    item.put("bigUnitStock", materialService.getBigUnitStock(thisSum, diEx.getUnitId()));
+                    if(moveAvgPriceFlag) {
+                        item.put("unitPrice", diEx.getCurrentUnitPrice());
+                    } else {
+                        item.put("unitPrice", diEx.getPurchaseDecimal());
+                    }
+                    if(moveAvgPriceFlag) {
+                        item.put("thisAllPrice", thisSum.multiply(diEx.getCurrentUnitPrice()));
+                    } else {
+                        item.put("thisAllPrice", thisSum.multiply(diEx.getPurchaseDecimal()));
+                    }
+                    dataArray.add(item);
+                }
+            }
+            map.put("rows", dataArray);
+            res.code = 200;
+            res.data = map;
+        } catch (BusinessRunTimeException e) {
+            res.code = e.getCode();
+            res.data = e.getData().get("message");
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 进销存统计总计金额
+     * @param depotIds
+     * @param endTime
+     * @param materialParam
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getInOutStockCountMoney")
+    @ApiOperation(value = "进销存统计总计金额")
+    public BaseResponseInfo getInOutStockCountMoney(@RequestParam(value = "depotIds",required = false) String depotIds,
+                                            @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                            @RequestParam("endTime") String endTime,
+                                            @RequestParam("materialParam") String materialParam,
+                                            HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            Boolean moveAvgPriceFlag = systemConfigService.getMoveAvgPriceFlag();
+            List<Long> categoryIdList = new ArrayList<>();
+            if(categoryId != null){
+                categoryIdList = materialService.getListByParentId(categoryId);
+            }
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            List<Long> depotList = parseListByDepotIds(depotIds);
+            List<DepotItemVo4WithInfoEx> dataList = depotItemService.getInOutStock(StringUtil.toNull(materialParam),
+                    categoryIdList, endTime, null, null);
+            BigDecimal thisAllStock = BigDecimal.ZERO;
+            BigDecimal thisAllPrice = BigDecimal.ZERO;
+            if (null != dataList) {
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    Long mId = diEx.getMId();
+                    BigDecimal thisSum = depotItemService.getStockByParamWithDepotList(depotList,mId,null,endTime);
+                    thisAllStock = thisAllStock.add(thisSum);
+                    BigDecimal unitPrice = null;
+                    if(moveAvgPriceFlag) {
+                        unitPrice = diEx.getCurrentUnitPrice();
+                    } else {
+                        unitPrice = diEx.getPurchaseDecimal();
+                    }
+                    if(unitPrice == null) {
+                        unitPrice = BigDecimal.ZERO;
+                    }
+                    thisAllPrice = thisAllPrice.add(thisSum.multiply(unitPrice));
+                }
+            }
+            map.put("totalStock", thisAllStock);
+            map.put("totalCount", thisAllPrice);
+            res.code = 200;
+            res.data = map;
+        } catch (BusinessRunTimeException e) {
+            res.code = e.getCode();
+            res.data = e.getData().get("message");
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    private List<Long> parseListByDepotIds(@RequestParam("depotIds") String depotIds) throws Exception {
+        List<Long> depotList = new ArrayList<>();
+        if(StringUtil.isNotEmpty(depotIds)) {
+            depotList = StringUtil.strToLongList(depotIds);
+        } else {
+            //未选择仓库时默认为当前用户有权限的仓库
+            JSONArray depotArr = depotService.findDepotByCurrentUser();
+            for(Object obj: depotArr) {
+                JSONObject object = JSONObject.parseObject(obj.toString());
+                depotList.add(object.getLong("id"));
+            }
+            //如果有权限的仓库数量太多则提示要选择仓库
+            if(depotList.size()>20) {
+                throw new BusinessRunTimeException(ExceptionConstants.REPORT_TWO_MANY_DEPOT_FAILED_CODE,
+                        ExceptionConstants.REPORT_TWO_MANY_DEPOT_FAILED_MSG);
+            }
+        }
+        return depotList;
+    }
+
+    /**
+     * 采购统计
+     * @param currentPage
+     * @param pageSize
+     * @param beginTime
+     * @param endTime
+     * @param materialParam
+     * @param mpList
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/buyIn")
+    @ApiOperation(value = "采购统计")
+    public BaseResponseInfo buyIn(@RequestParam("currentPage") Integer currentPage,
+                                  @RequestParam("pageSize") Integer pageSize,
+                                  @RequestParam("beginTime") String beginTime,
+                                  @RequestParam("endTime") String endTime,
+                                  @RequestParam(value = "organId", required = false) Long organId,
+                                  @RequestParam(value = "depotId", required = false) Long depotId,
+                                  @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                  @RequestParam(value = "organizationId", required = false) Long organizationId,
+                                  @RequestParam("materialParam") String materialParam,
+                                  @RequestParam("mpList") String mpList,
+                                  HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+        endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+        try {
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = depotHeadService.getCreatorArrayByOrg(organizationId);
+            }
+            String [] organArray = null;
+            List<Long> categoryList = new ArrayList<>();
+            if(categoryId != null){
+                categoryList = materialService.getListByParentId(categoryId);
+            }
+            List<Long> depotList = depotService.parseDepotList(depotId);
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            List<DepotItemVo4WithInfoEx> dataList = depotItemService.getListWithBuyOrSale(StringUtil.toNull(materialParam),
+                    "buy", beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag, (currentPage-1)*pageSize, pageSize);
+            String[] mpArr = mpList.split(",");
+            int total = depotItemService.getListWithBuyOrSaleCount(StringUtil.toNull(materialParam),
+                    "buy", beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            map.put("total", total);
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    JSONObject item = new JSONObject();
+                    BigDecimal InSum = depotItemService.buyOrSale("入库", "采购", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "number");
+                    BigDecimal OutSum = depotItemService.buyOrSale("出库", "采购退货", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "number");
+                    BigDecimal InSumPrice = depotItemService.buyOrSale("入库", "采购", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "price");
+                    BigDecimal OutSumPrice = depotItemService.buyOrSale("出库", "采购退货", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "price");
+                    BigDecimal InOutSumPrice = InSumPrice.subtract(OutSumPrice);
+                    item.put("barCode", diEx.getBarCode());
+                    item.put("materialName", diEx.getMName());
+                    item.put("materialModel", diEx.getMModel());
+                    item.put("materialStandard", diEx.getMStandard());
+                    //扩展信息
+                    String materialOther = depotItemService.getOtherInfo(mpArr, diEx);
+                    item.put("materialOther", materialOther);
+                    item.put("materialColor", diEx.getMColor());
+                    item.put("materialBrand", diEx.getBrand());
+                    item.put("materialMfrs", diEx.getMMfrs());
+                    item.put("materialUnit", diEx.getMaterialUnit());
+                    item.put("unitName", diEx.getUnitName());
+                    item.put("inSum", InSum);
+                    item.put("outSum", OutSum);
+                    item.put("inSumPrice", InSumPrice);
+                    item.put("outSumPrice", OutSumPrice);
+                    item.put("inOutSumPrice",InOutSumPrice);//实际采购金额
+                    dataArray.add(item);
+                }
+            }
+            BigDecimal inSumPriceTotal = depotItemService.buyOrSalePriceTotal("入库", "采购", StringUtil.toNull(materialParam),
+                    beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            BigDecimal outSumPriceTotal = depotItemService.buyOrSalePriceTotal("出库", "采购退货", StringUtil.toNull(materialParam),
+                    beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            BigDecimal realityPriceTotal = inSumPriceTotal.subtract(outSumPriceTotal);
+            map.put("rows", dataArray);
+            map.put("realityPriceTotal", realityPriceTotal);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 零售统计
+     * @param currentPage
+     * @param pageSize
+     * @param beginTime
+     * @param endTime
+     * @param materialParam
+     * @param mpList
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/retailOut")
+    @ApiOperation(value = "零售统计")
+    public BaseResponseInfo retailOut(@RequestParam("currentPage") Integer currentPage,
+                                      @RequestParam("pageSize") Integer pageSize,
+                                      @RequestParam("beginTime") String beginTime,
+                                      @RequestParam("endTime") String endTime,
+                                      @RequestParam(value = "organId", required = false) Long organId,
+                                      @RequestParam(value = "depotId", required = false) Long depotId,
+                                      @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                      @RequestParam(value = "organizationId", required = false) Long organizationId,
+                                      @RequestParam("materialParam") String materialParam,
+                                      @RequestParam("mpList") String mpList,
+                                      HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+        endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+        try {
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = depotHeadService.getCreatorArrayByOrg(organizationId);
+            }
+            String [] organArray = null;
+            List<Long> categoryList = new ArrayList<>();
+            if(categoryId != null){
+                categoryList = materialService.getListByParentId(categoryId);
+            }
+            List<Long> depotList = depotService.parseDepotList(depotId);
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            List<DepotItemVo4WithInfoEx> dataList = depotItemService.getListWithBuyOrSale(StringUtil.toNull(materialParam),
+                    "retail", beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag, (currentPage-1)*pageSize, pageSize);
+            String[] mpArr = mpList.split(",");
+            int total = depotItemService.getListWithBuyOrSaleCount(StringUtil.toNull(materialParam),
+                    "retail", beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            map.put("total", total);
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    JSONObject item = new JSONObject();
+                    BigDecimal OutSumRetail = depotItemService.buyOrSale("出库", "零售", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "number");
+                    BigDecimal InSumRetail = depotItemService.buyOrSale("入库", "零售退货", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "number");
+                    BigDecimal OutSumRetailPrice = depotItemService.buyOrSale("出库", "零售", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "price");
+                    BigDecimal InSumRetailPrice = depotItemService.buyOrSale("入库", "零售退货", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "price");
+                    BigDecimal OutInSumPrice = OutSumRetailPrice.subtract(InSumRetailPrice);
+                    item.put("barCode", diEx.getBarCode());
+                    item.put("materialName", diEx.getMName());
+                    item.put("materialModel", diEx.getMModel());
+                    item.put("materialStandard", diEx.getMStandard());
+                    //扩展信息
+                    String materialOther = depotItemService.getOtherInfo(mpArr, diEx);
+                    item.put("materialOther", materialOther);
+                    item.put("materialColor", diEx.getMColor());
+                    item.put("materialBrand", diEx.getBrand());
+                    item.put("materialMfrs", diEx.getMMfrs());
+                    item.put("materialUnit", diEx.getMaterialUnit());
+                    item.put("unitName", diEx.getUnitName());
+                    item.put("outSum", OutSumRetail);
+                    item.put("inSum", InSumRetail);
+                    item.put("outSumPrice", OutSumRetailPrice);
+                    item.put("inSumPrice", InSumRetailPrice);
+                    item.put("outInSumPrice",OutInSumPrice);//实际销售金额
+                    dataArray.add(item);
+                }
+            }
+            BigDecimal outSumPriceTotal = depotItemService.buyOrSalePriceTotal("出库", "零售", StringUtil.toNull(materialParam),
+                    beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            BigDecimal inSumPriceTotal = depotItemService.buyOrSalePriceTotal("入库", "零售退货", StringUtil.toNull(materialParam),
+                    beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            BigDecimal realityPriceTotal = outSumPriceTotal.subtract(inSumPriceTotal);
+            map.put("rows", dataArray);
+            map.put("realityPriceTotal", realityPriceTotal);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+
+    /**
+     * 销售统计
+     * @param currentPage
+     * @param pageSize
+     * @param beginTime
+     * @param endTime
+     * @param materialParam
+     * @param mpList
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/saleOut")
+    @ApiOperation(value = "销售统计")
+    public BaseResponseInfo saleOut(@RequestParam("currentPage") Integer currentPage,
+                                    @RequestParam("pageSize") Integer pageSize,
+                                    @RequestParam("beginTime") String beginTime,
+                                    @RequestParam("endTime") String endTime,
+                                    @RequestParam(value = "organId", required = false) Long organId,
+                                    @RequestParam(value = "depotId", required = false) Long depotId,
+                                    @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                    @RequestParam(value = "organizationId", required = false) Long organizationId,
+                                    @RequestParam("materialParam") String materialParam,
+                                    @RequestParam("mpList") String mpList,
+                                    HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+        endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+        try {
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = depotHeadService.getCreatorArrayByOrg(organizationId);
+            }
+            String [] organArray = depotHeadService.getOrganArray("销售", "");
+            List<Long> categoryList = new ArrayList<>();
+            if(categoryId != null){
+                categoryList = materialService.getListByParentId(categoryId);
+            }
+            List<Long> depotList = depotService.parseDepotList(depotId);
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            List<DepotItemVo4WithInfoEx> dataList = depotItemService.getListWithBuyOrSale(StringUtil.toNull(materialParam),
+                    "sale", beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag, (currentPage-1)*pageSize, pageSize);
+            String[] mpArr = mpList.split(",");
+            int total = depotItemService.getListWithBuyOrSaleCount(StringUtil.toNull(materialParam),
+                    "sale", beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            map.put("total", total);
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    JSONObject item = new JSONObject();
+                    BigDecimal OutSum = depotItemService.buyOrSale("出库", "销售", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "number");
+                    BigDecimal InSum = depotItemService.buyOrSale("入库", "销售退货", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "number");
+                    BigDecimal OutSumPrice = depotItemService.buyOrSale("出库", "销售", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "price");
+                    BigDecimal InSumPrice = depotItemService.buyOrSale("入库", "销售退货", diEx.getMId(), beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, "price");
+                    BigDecimal OutInSumPrice = OutSumPrice.subtract(InSumPrice);
+                    item.put("barCode", diEx.getBarCode());
+                    item.put("materialName", diEx.getMName());
+                    item.put("materialModel", diEx.getMModel());
+                    item.put("materialStandard", diEx.getMStandard());
+                    //扩展信息
+                    String materialOther = depotItemService.getOtherInfo(mpArr, diEx);
+                    item.put("materialOther", materialOther);
+                    item.put("materialColor", diEx.getMColor());
+                    item.put("materialBrand", diEx.getBrand());
+                    item.put("materialMfrs", diEx.getMMfrs());
+                    item.put("materialUnit", diEx.getMaterialUnit());
+                    item.put("unitName", diEx.getUnitName());
+                    item.put("outSum", OutSum);
+                    item.put("inSum", InSum);
+                    item.put("outSumPrice", OutSumPrice);
+                    item.put("inSumPrice", InSumPrice);
+                    item.put("outInSumPrice",OutInSumPrice);//实际销售金额
+                    dataArray.add(item);
+                }
+            }
+            BigDecimal outSumPriceTotal = depotItemService.buyOrSalePriceTotal("出库", "销售", StringUtil.toNull(materialParam),
+                    beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            BigDecimal inSumPriceTotal = depotItemService.buyOrSalePriceTotal("入库", "销售退货", StringUtil.toNull(materialParam),
+                    beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+            BigDecimal realityPriceTotal = outSumPriceTotal.subtract(inSumPriceTotal);
+            map.put("rows", dataArray);
+            map.put("realityPriceTotal", realityPriceTotal);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取单位
+     * @param materialUnit
+     * @param uName
+     * @return
+     */
+    public String getUName(String materialUnit, String uName) {
+        String unitName = null;
+        if(StringUtil.isNotEmpty(materialUnit)) {
+            unitName = materialUnit;
+        } else if(StringUtil.isNotEmpty(uName)) {
+            unitName = uName;
+        }
+        return unitName;
+    }
+
+    /**
+     * 库存预警报表
+     * @param currentPage
+     * @param pageSize
+     * @return
+     */
+    @GetMapping(value = "/findStockWarningCount")
+    @ApiOperation(value = "库存预警报表")
+    public BaseResponseInfo findStockWarningCount(@RequestParam("currentPage") Integer currentPage,
+                                                  @RequestParam("pageSize") Integer pageSize,
+                                                  @RequestParam("materialParam") String materialParam,
+                                                  @RequestParam(value = "depotId", required = false) Long depotId,
+                                                  @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                                  @RequestParam("mpList") String mpList)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<Long> depotList = new ArrayList<>();
+            if(depotId != null) {
+                depotList.add(depotId);
+            } else {
+                //未选择仓库时默认为当前用户有权限的仓库
+                JSONArray depotArr = depotService.findDepotByCurrentUser();
+                for(Object obj: depotArr) {
+                    JSONObject object = JSONObject.parseObject(obj.toString());
+                    depotList.add(object.getLong("id"));
+                }
+            }
+            List<Long> categoryList = new ArrayList<>();
+            if(categoryId != null){
+                categoryList = materialService.getListByParentId(categoryId);
+            }
+            String[] mpArr = mpList.split(",");
+            List<DepotItemStockWarningCount> list = depotItemService.findStockWarningCount((currentPage-1)*pageSize, pageSize, materialParam, depotList, categoryList);
+            //存放数据json数组
+            if (null != list) {
+                for (DepotItemStockWarningCount disw : list) {
+                    DepotItemVo4WithInfoEx diEx = new DepotItemVo4WithInfoEx();
+                    diEx.setMOtherField1(disw.getMOtherField1());
+                    diEx.setMOtherField2(disw.getMOtherField2());
+                    diEx.setMOtherField3(disw.getMOtherField3());
+                    disw.setMaterialOther(depotItemService.getOtherInfo(mpArr, diEx));
+                    disw.setMaterialUnit(getUName(disw.getMaterialUnit(), disw.getUnitName()));
+                    if(null!=disw.getLowSafeStock() && disw.getCurrentNumber().compareTo(disw.getLowSafeStock())<0) {
+                        disw.setLowCritical(disw.getLowSafeStock().subtract(disw.getCurrentNumber()));
+                    }
+                    if(null!=disw.getHighSafeStock() && disw.getCurrentNumber().compareTo(disw.getHighSafeStock())>0) {
+                        disw.setHighCritical(disw.getCurrentNumber().subtract(disw.getHighSafeStock()));
+                    }
+                }
+            }
+            int total = depotItemService.findStockWarningCountTotal(materialParam, depotList, categoryList);
+            map.put("total", total);
+            map.put("rows", list);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 统计采购、销售、零售的总金额
+     * @param request
+     * @param response
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/buyOrSalePrice")
+    @ApiOperation(value = "统计采购、销售、零售的总金额")
+    public BaseResponseInfo buyOrSalePrice(HttpServletRequest request,
+                                           HttpServletResponse response)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> map = new HashMap<>();
+            String loginName = userService.getCurrentUser().getLoginName();
+            if(!"admin".equals(loginName)) {
+                Long userId = userService.getUserId(request);
+                List<String> monthList = Tools.getLastMonths(6);
+                String beginTime = Tools.firstDayOfMonth(monthList.get(0)) + BusinessConstants.DAY_FIRST_TIME;
+                String endTime = Tools.getNow() + BusinessConstants.DAY_LAST_TIME;
+                List<InOutPriceVo> inOrOutPriceList = depotItemService.inOrOutPriceList(beginTime, endTime);
+                String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+                JSONArray buyPriceList = new JSONArray();
+                for (String month : monthList) {
+                    JSONObject obj = new JSONObject();
+                    BigDecimal outPrice = BigDecimal.ZERO;
+                    BigDecimal inPrice = BigDecimal.ZERO;
+                    for (InOutPriceVo item : inOrOutPriceList) {
+                        String billOperMonth = Tools.dateToStr(item.getOperTime(), "yyyy-MM");
+                        if (month.equals(billOperMonth)) {
+                            if ("入库".equals(item.getType()) && "采购".equals(item.getSubType())) {
+                                outPrice = outPrice.add(item.getDiscountLastMoney());
+                            }
+                            if ("出库".equals(item.getType()) && "采购退货".equals(item.getSubType())) {
+                                inPrice = inPrice.add(item.getDiscountLastMoney());
+                            }
+                        }
+                    }
+                    obj.put("x", month);
+                    obj.put("y", roleService.parseHomePriceByLimit(outPrice.subtract(inPrice), "buy", priceLimit, "***", request));
+                    buyPriceList.add(obj);
+                }
+                map.put("buyPriceList", buyPriceList);
+                JSONArray salePriceList = new JSONArray();
+                for (String month : monthList) {
+                    JSONObject obj = new JSONObject();
+                    BigDecimal outPrice = BigDecimal.ZERO;
+                    BigDecimal inPrice = BigDecimal.ZERO;
+                    for (InOutPriceVo item : inOrOutPriceList) {
+                        String billOperMonth = Tools.dateToStr(item.getOperTime(), "yyyy-MM");
+                        if (month.equals(billOperMonth)) {
+                            if ("出库".equals(item.getType()) && "销售".equals(item.getSubType())) {
+                                outPrice = outPrice.add(item.getDiscountLastMoney());
+                            }
+                            if ("入库".equals(item.getType()) && "销售退货".equals(item.getSubType())) {
+                                inPrice = inPrice.add(item.getDiscountLastMoney());
+                            }
+                        }
+                    }
+                    obj.put("x", month);
+                    obj.put("y", roleService.parseHomePriceByLimit(outPrice.subtract(inPrice), "sale", priceLimit, "***", request));
+                    salePriceList.add(obj);
+                }
+                map.put("salePriceList", salePriceList);
+                JSONArray retailPriceList = new JSONArray();
+                for (String month : monthList) {
+                    JSONObject obj = new JSONObject();
+                    BigDecimal outPrice = BigDecimal.ZERO;
+                    BigDecimal inPrice = BigDecimal.ZERO;
+                    for (InOutPriceVo item : inOrOutPriceList) {
+                        String billOperMonth = Tools.dateToStr(item.getOperTime(), "yyyy-MM");
+                        if (month.equals(billOperMonth)) {
+                            if ("出库".equals(item.getType()) && "零售".equals(item.getSubType())) {
+                                outPrice = outPrice.add(item.getTotalPrice().abs());
+                            }
+                            if ("入库".equals(item.getType()) && "零售退货".equals(item.getSubType())) {
+                                inPrice = inPrice.add(item.getTotalPrice().abs());
+                            }
+                        }
+                    }
+                    obj.put("x", month);
+                    obj.put("y", roleService.parseHomePriceByLimit(outPrice.subtract(inPrice), "retail", priceLimit, "***", request));
+                    retailPriceList.add(obj);
+                }
+                map.put("retailPriceList", retailPriceList);
+            }
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "统计失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取批次商品列表信息
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getBatchNumberList")
+    @ApiOperation(value = "获取批次商品列表信息")
+    public BaseResponseInfo getBatchNumberList(@RequestParam("name") String name,
+                                               @RequestParam("depotItemId") Long depotItemId,
+                                               @RequestParam("depotId") Long depotId,
+                                               @RequestParam("barCode") String barCode,
+                                               @RequestParam(value = "batchNumber", required = false) String batchNumber,
+                                               HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            String number = "";
+            if(depotItemId != null) {
+                DepotItem depotItem = depotItemService.getDepotItem(depotItemId);
+                number = depotHeadService.getDepotHead(depotItem.getHeaderId()).getNumber();
+            }
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+            List<DepotItemVoBatchNumberList> list = depotItemService.getBatchNumberList(number, name, depotId, barCode,
+                    batchNumber, forceFlag, inOutManageFlag);
+            map.put("rows", list);
+            map.put("total", list.size());
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * Excel导入明细
+     * @param file
+     * @param request
+     * @param response
+     * @return
+     */
+    @PostMapping(value = "/importItemExcel")
+    public BaseResponseInfo importItemExcel(MultipartFile file,
+                                            @RequestParam(required = false, value = "prefixNo") String prefixNo,
+                                            HttpServletRequest request, HttpServletResponse response) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> data = new HashMap<>();
+        String message = "";
+        try {
+            String barCodes = "";
+            //文件合法性校验
+            Sheet src = null;
+            try {
+                Workbook workbook = Workbook.getWorkbook(file.getInputStream());
+                src = workbook.getSheet(0);
+            } catch (Exception e) {
+                message = "导入文件不合法,请检查";
+                data.put("message", message);
+                res.code = 400;
+                res.data = data;
+            }
+            if(src.getRows()>1000) {
+                message = "导入失败,明细不能超出1000条";
+                res.code = 500;
+                data.put("message", message);
+                res.data = data;
+            } else {
+                List<Map<String, String>> detailList = new ArrayList<>();
+                for (int i = 2; i < src.getRows(); i++) {
+                    String depotName = "", barCode = "", num = "", unitPrice = "", taxRate = "", remark = "";
+                    if("QGD".equals(prefixNo)) {
+                        barCode = ExcelUtils.getContent(src, i, 0);
+                        num = ExcelUtils.getContent(src, i, 2);
+                        remark = ExcelUtils.getContent(src, i, 3);
+                    }
+                    if("CGDD".equals(prefixNo) || "XSDD".equals(prefixNo)) {
+                        barCode = ExcelUtils.getContent(src, i, 0);
+                        num = ExcelUtils.getContent(src, i, 2);
+                        unitPrice = ExcelUtils.getContent(src, i, 3);
+                        taxRate = ExcelUtils.getContent(src, i, 4);
+                        remark = ExcelUtils.getContent(src, i, 5);
+                    }
+                    if("CGRK".equals(prefixNo) || "XSCK".equals(prefixNo)) {
+                        depotName = ExcelUtils.getContent(src, i, 0);
+                        barCode = ExcelUtils.getContent(src, i, 1);
+                        num = ExcelUtils.getContent(src, i, 3);
+                        unitPrice = ExcelUtils.getContent(src, i, 4);
+                        taxRate = ExcelUtils.getContent(src, i, 5);
+                        remark = ExcelUtils.getContent(src, i, 6);
+                    }
+                    if("QTRK".equals(prefixNo) || "QTCK".equals(prefixNo)) {
+                        depotName = ExcelUtils.getContent(src, i, 0);
+                        barCode = ExcelUtils.getContent(src, i, 1);
+                        num = ExcelUtils.getContent(src, i, 3);
+                        unitPrice = ExcelUtils.getContent(src, i, 4);
+                        remark = ExcelUtils.getContent(src, i, 5);
+                    }
+                    Map<String, String> materialMap = new HashMap<>();
+                    materialMap.put("depotName", depotName);
+                    materialMap.put("barCode", barCode);
+                    materialMap.put("num", num);
+                    materialMap.put("unitPrice", unitPrice);
+                    materialMap.put("taxRate", taxRate);
+                    materialMap.put("remark", remark);
+                    detailList.add(materialMap);
+                    barCodes += "'" + barCode + "',";
+                }
+                if (StringUtil.isNotEmpty(barCodes)) {
+                    barCodes = barCodes.substring(0, barCodes.length() - 1);
+                }
+                JSONObject map = depotItemService.parseMapByExcelData(barCodes, detailList, prefixNo);
+                if (map != null) {
+                    res.code = 200;
+                } else {
+                    res.code = 500;
+                }
+                res.data = map;
+            }
+        } catch (BusinessRunTimeException e) {
+            res.code = 500;
+            data.put("message", e.getData().get("message"));
+            res.data = data;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            message = "导入失败,请检查表格内容";
+            res.code = 500;
+            data.put("message", message);
+            res.data = data;
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/FunctionController.java b/src/main/java/com/jsh/erp/controller/FunctionController.java
new file mode 100644
index 0000000..30fcdc7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/FunctionController.java
@@ -0,0 +1,280 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.Function;
+import com.jsh.erp.datasource.entities.SystemConfig;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.entities.UserBusiness;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.service.functions.FunctionService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.DataAccessException;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji-sheng-hua  jshERP
+ */
+@RestController
+@RequestMapping(value = "/function")
+@Api(tags = {"功能管理"})
+public class FunctionController {
+    private Logger logger = LoggerFactory.getLogger(FunctionController.class);
+
+    @Resource
+    private FunctionService functionService;
+
+    @Resource
+    private UserBusinessService userBusinessService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @GetMapping(value = "/checkIsNumberExist")
+    @ApiOperation(value = "检查编号是否存在")
+    public String checkIsNumberExist(@RequestParam Long id,
+                                     @RequestParam(value ="number", required = false) String number,
+                                     HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        int exist = functionService.checkIsNumberExist(id, number);
+        if(exist > 0) {
+            objectMap.put("status", true);
+        } else {
+            objectMap.put("status", false);
+        }
+        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+    }
+
+    /**
+     * 根据父编号查询菜单
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/findMenuByPNumber")
+    @ApiOperation(value = "根据父编号查询菜单")
+    public JSONArray findMenuByPNumber(@RequestBody JSONObject jsonObject,
+                              HttpServletRequest request)throws Exception {
+        String pNumber = jsonObject.getString("pNumber");
+        String userId = jsonObject.getString("userId");
+        //存放数据json数组
+        JSONArray dataArray = new JSONArray();
+        try {
+            Long roleId = 0L;
+            String fc = "";
+            List<UserBusiness> roleList = userBusinessService.getBasicData(userId, "UserRole");
+            if(roleList!=null && roleList.size()>0){
+                String value = roleList.get(0).getValue();
+                if(StringUtil.isNotEmpty(value)){
+                    String roleIdStr = value.replace("[", "").replace("]", "");
+                    roleId = Long.parseLong(roleIdStr);
+                }
+            }
+            //当前用户所拥有的功能列表,格式如:[1][2][5]
+            List<UserBusiness> funList = userBusinessService.getBasicData(roleId.toString(), "RoleFunctions");
+            if(funList!=null && funList.size()>0){
+                fc = funList.get(0).getValue();
+            }
+            //获取系统配置信息-是否开启多级审核
+            String approvalFlag = "0";
+            List<SystemConfig> list = systemConfigService.getSystemConfig();
+            if(list.size()>0) {
+                approvalFlag = list.get(0).getMultiLevelApprovalFlag();
+            }
+            List<Function> dataList = functionService.getRoleFunction(pNumber);
+            if (dataList.size() != 0) {
+                dataArray = getMenuByFunction(dataList, fc, approvalFlag);
+                //增加首页菜单项
+                JSONObject homeItem = new JSONObject();
+                homeItem.put("id", 0);
+                homeItem.put("text", "首页");
+                homeItem.put("icon", "home");
+                homeItem.put("url", "/dashboard/analysis");
+                homeItem.put("component", "/layouts/TabLayout");
+                dataArray.add(0,homeItem);
+            }
+        } catch (DataAccessException e) {
+            logger.error(">>>>>>>>>>>>>>>>>>>查找异常", e);
+        }
+        return dataArray;
+    }
+
+    public JSONArray getMenuByFunction(List<Function> dataList, String fc, String approvalFlag) throws Exception {
+        JSONArray dataArray = new JSONArray();
+        for (Function function : dataList) {
+            //如果关闭多级审核,遇到任务审核菜单直接跳过
+            if("0".equals(approvalFlag) && "/workflow".equals(function.getUrl())) {
+                continue;
+            }
+            JSONObject item = new JSONObject();
+            List<Function> newList = functionService.getRoleFunction(function.getNumber());
+            item.put("id", function.getId());
+            item.put("text", function.getName());
+            item.put("icon", function.getIcon());
+            item.put("url", function.getUrl());
+            item.put("component", function.getComponent());
+            if (newList.size()>0) {
+                JSONArray childrenArr = getMenuByFunction(newList, fc, approvalFlag);
+                if(childrenArr.size()>0) {
+                    item.put("children", childrenArr);
+                    dataArray.add(item);
+                }
+            } else {
+                if (fc.indexOf("[" + function.getId().toString() + "]") != -1) {
+                    dataArray.add(item);
+                }
+            }
+        }
+        return dataArray;
+    }
+
+    /**
+     * 角色对应功能显示
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findRoleFunction")
+    @ApiOperation(value = "角色对应功能显示")
+    public JSONArray findRoleFunction(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId,
+                                 HttpServletRequest request)throws Exception {
+        JSONArray arr = new JSONArray();
+        try {
+            List<Function> dataListFun = functionService.findRoleFunction("0");
+            //开始拼接json数据
+            JSONObject outer = new JSONObject();
+            outer.put("id", 0);
+            outer.put("key", 0);
+            outer.put("value", 0);
+            outer.put("title", "功能列表");
+            outer.put("attributes", "功能列表");
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataListFun) {
+                //根据条件从列表里面移除"系统管理"
+                List<Function> dataList = new ArrayList<>();
+                for (Function fun : dataListFun) {
+                    String token = request.getHeader("X-Access-Token");
+                    Long tenantId = Tools.getTenantIdByToken(token);
+                    if (tenantId!=0L) {
+                        if(!("系统管理").equals(fun.getName())) {
+                            dataList.add(fun);
+                        }
+                    } else {
+                        //超管
+                        dataList.add(fun);
+                    }
+                }
+                dataArray = getFunctionList(dataList, type, keyId);
+                outer.put("children", dataArray);
+            }
+            arr.add(outer);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    public JSONArray getFunctionList(List<Function> dataList, String type, String keyId) throws Exception {
+        JSONArray dataArray = new JSONArray();
+        //获取权限信息
+        String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, keyId);
+        if (null != dataList) {
+            for (Function function : dataList) {
+                JSONObject item = new JSONObject();
+                item.put("id", function.getId());
+                item.put("key", function.getId());
+                item.put("value", function.getId());
+                item.put("title", function.getName());
+                item.put("attributes", function.getName());
+                List<Function> funList = functionService.findRoleFunction(function.getNumber());
+                if(funList.size()>0) {
+                    JSONArray funArr = getFunctionList(funList, type, keyId);
+                    item.put("children", funArr);
+                    dataArray.add(item);
+                } else {
+                    Boolean flag = ubValue.contains("[" + function.getId().toString() + "]");
+                    item.put("checked", flag);
+                    dataArray.add(item);
+                }
+            }
+        }
+        return dataArray;
+    }
+
+    /**
+     * 根据id列表查找功能信息
+     * @param roleId
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findRoleFunctionsById")
+    @ApiOperation(value = "根据id列表查找功能信息")
+    public BaseResponseInfo findByIds(@RequestParam("roleId") Long roleId,
+                                      HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<UserBusiness> list = userBusinessService.getBasicData(roleId.toString(), "RoleFunctions");
+            if(null!=list && list.size()>0) {
+                //按钮
+                Map<Long,String> btnMap = new HashMap<>();
+                String btnStr = list.get(0).getBtnStr();
+                if(StringUtil.isNotEmpty(btnStr)) {
+                    JSONArray btnArr = JSONArray.parseArray(btnStr);
+                    for(Object obj: btnArr) {
+                        JSONObject btnObj = JSONObject.parseObject(obj.toString());
+                        if(btnObj.get("funId")!=null && btnObj.get("btnStr")!=null) {
+                            btnMap.put(btnObj.getLong("funId"), btnObj.getString("btnStr"));
+                        }
+                    }
+                }
+                //菜单
+                String funIds = list.get(0).getValue();
+                funIds = funIds.substring(1, funIds.length() - 1);
+                funIds = funIds.replace("][",",");
+                List<Function> dataList = functionService.findByIds(funIds);
+                JSONObject outer = new JSONObject();
+                outer.put("total", dataList.size());
+                //存放数据json数组
+                JSONArray dataArray = new JSONArray();
+                if (null != dataList) {
+                    for (Function function : dataList) {
+                        JSONObject item = new JSONObject();
+                        item.put("id", function.getId());
+                        item.put("name", function.getName());
+                        item.put("pushBtn", function.getPushBtn());
+                        item.put("btnStr", btnMap.get(function.getId()));
+                        dataArray.add(item);
+                    }
+                }
+                outer.put("rows", dataArray);
+                res.code = 200;
+                res.data = outer;
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/InOutItemController.java b/src/main/java/com/jsh/erp/controller/InOutItemController.java
new file mode 100644
index 0000000..fe83a88
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/InOutItemController.java
@@ -0,0 +1,84 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.InOutItem;
+import com.jsh.erp.service.inOutItem.InOutItemService;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author jishenghua  jshERP 2018年12月25日14:38:08
+ */
+@RestController
+@RequestMapping(value = "/inOutItem")
+@Api(tags = {"收支项目"})
+public class InOutItemController {
+    private Logger logger = LoggerFactory.getLogger(InOutItemController.class);
+
+    @Resource
+    private InOutItemService inOutItemService;
+
+    /**
+     * 查找收支项目信息-下拉框
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findBySelect")
+    @ApiOperation(value = "查找收支项目信息")
+    public String findBySelect(@RequestParam("type") String type, HttpServletRequest request) throws Exception{
+        String res = null;
+        try {
+            List<InOutItem> dataList = inOutItemService.findBySelect(type);
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (InOutItem inOutItem : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", inOutItem.getId());
+                    //收支项目名称
+                    item.put("name", inOutItem.getName());
+                    dataArray.add(item);
+                }
+            }
+            res = dataArray.toJSONString();
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = inOutItemService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/MaterialAttributeController.java b/src/main/java/com/jsh/erp/controller/MaterialAttributeController.java
new file mode 100644
index 0000000..592538d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/MaterialAttributeController.java
@@ -0,0 +1,76 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.MaterialAttribute;
+import com.jsh.erp.datasource.entities.Person;
+import com.jsh.erp.service.materialAttribute.MaterialAttributeService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author ji sheng hua jshERP
+ */
+@RestController
+@RequestMapping(value = "/materialAttribute")
+@Api(tags = {"商品属性"})
+public class MaterialAttributeController {
+    private Logger logger = LoggerFactory.getLogger(MaterialAttributeController.class);
+
+    @Resource
+    private MaterialAttributeService materialAttributeService;
+
+    /**
+     * 获取商品属性的名称列表
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getNameList")
+    @ApiOperation(value = "获取商品属性的名称列表")
+    public JSONArray getNameList(HttpServletRequest request)throws Exception {
+        JSONArray dataArray = new JSONArray();
+        try {
+            List<MaterialAttribute> materialAttributeList = materialAttributeService.getMaterialAttribute();
+            if (null != materialAttributeList) {
+                for (MaterialAttribute materialAttribute : materialAttributeList) {
+                    JSONObject item = new JSONObject();
+                    item.put("value", materialAttribute.getId().toString());
+                    item.put("name", materialAttribute.getAttributeName());
+                    dataArray.add(item);
+                }
+            }
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return dataArray;
+    }
+
+    /**
+     * 获取id查询属性的值列表
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getValueListById")
+    @ApiOperation(value = "获取id查询属性的值列表")
+    public JSONArray getValueListById(@RequestParam("id") Long id,
+                                     HttpServletRequest request)throws Exception {
+        JSONArray dataArray = new JSONArray();
+        try {
+            dataArray = materialAttributeService.getValueArrById(id);
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return dataArray;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/MaterialCategoryController.java b/src/main/java/com/jsh/erp/controller/MaterialCategoryController.java
new file mode 100644
index 0000000..f7357c0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/MaterialCategoryController.java
@@ -0,0 +1,114 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.MaterialCategory;
+import com.jsh.erp.datasource.entities.SerialNumberEx;
+import com.jsh.erp.datasource.vo.TreeNode;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.service.materialCategory.MaterialCategoryService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author ji—sheng—hua   jshERP
+ */
+@RestController
+@RequestMapping(value = "/materialCategory")
+@Api(tags = {"商品类别"})
+public class MaterialCategoryController {
+    private Logger logger = LoggerFactory.getLogger(MaterialCategoryController.class);
+
+    @Resource
+    private MaterialCategoryService materialCategoryService;
+
+    /**
+     * 获取全部商品类别
+     * @param parentId
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getAllList")
+    @ApiOperation(value = "获取全部商品类别")
+    public BaseResponseInfo getAllList(@RequestParam("parentId") Long parentId, HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<MaterialCategory> materialCategoryList = materialCategoryService.getAllList(parentId);
+            res.code = 200;
+            res.data = materialCategoryList;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据id来查询商品名称
+     * @param id
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findById")
+    @ApiOperation(value = "根据id来查询商品名称")
+    public BaseResponseInfo findById(@RequestParam("id") Long id, HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<MaterialCategory> dataList = materialCategoryService.findById(id);
+            JSONObject outer = new JSONObject();
+            if (null != dataList) {
+                for (MaterialCategory mc : dataList) {
+                    outer.put("id", mc.getId());
+                    outer.put("name", mc.getName());
+                    outer.put("parentId", mc.getParentId());
+                    List<MaterialCategory> dataParentList = materialCategoryService.findById(mc.getParentId());
+                    if(dataParentList!=null&&dataParentList.size()>0){
+                        outer.put("parentName", dataParentList.get(0).getName());
+                    }
+                    outer.put("sort", mc.getSort());
+                    outer.put("serialNo", mc.getSerialNo());
+                    outer.put("remark", mc.getRemark());
+                }
+            }
+            res.code = 200;
+            res.data = outer;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+    /**
+     * 获取商品类别树数据
+     * @Param:
+     * @return com.alibaba.fastjson.JSONArray
+     */
+    @RequestMapping(value = "/getMaterialCategoryTree")
+    @ApiOperation(value = "获取商品类别树数据")
+    public JSONArray getMaterialCategoryTree(@RequestParam("id") Long id) throws Exception{
+       JSONArray arr=new JSONArray();
+       List<TreeNode> materialCategoryTree = materialCategoryService.getMaterialCategoryTree(id);
+       if(materialCategoryTree!=null&&materialCategoryTree.size()>0){
+           for(TreeNode node:materialCategoryTree){
+               String str=JSON.toJSONString(node);
+               JSONObject obj=JSON.parseObject(str);
+               arr.add(obj) ;
+           }
+       }
+        return arr;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/MaterialController.java b/src/main/java/com/jsh/erp/controller/MaterialController.java
new file mode 100644
index 0000000..df123b1
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/MaterialController.java
@@ -0,0 +1,737 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.MaterialExtend;
+import com.jsh.erp.datasource.entities.MaterialVo4Unit;
+import com.jsh.erp.datasource.entities.Unit;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.depotItem.DepotItemService;
+import com.jsh.erp.service.material.MaterialService;
+import com.jsh.erp.service.role.RoleService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.unit.UnitService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import com.jsh.erp.utils.PinYinUtil;
+import com.jsh.erp.utils.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji|sheng|hua jshERP
+ */
+@RestController
+@RequestMapping(value = "/material")
+@Api(tags = {"商品管理"})
+public class MaterialController {
+    private Logger logger = LoggerFactory.getLogger(MaterialController.class);
+
+    @Resource
+    private MaterialService materialService;
+
+    @Resource
+    private DepotItemService depotItemService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Resource
+    private UnitService unitService;
+
+    @Resource
+    private DepotService depotService;
+
+    @Resource
+    private RoleService roleService;
+
+    @Resource
+    private UserService userService;
+
+    @Value(value="${file.uploadType}")
+    private Long fileUploadType;
+
+    /**
+     * 检查商品是否存在
+     * @param id
+     * @param name
+     * @param model
+     * @param color
+     * @param standard
+     * @param mfrs
+     * @param otherField1
+     * @param otherField2
+     * @param otherField3
+     * @param unit
+     * @param unitId
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/checkIsExist")
+    @ApiOperation(value = "检查商品是否存在")
+    public String checkIsExist(@RequestParam("id") Long id, @RequestParam("name") String name,
+                               @RequestParam("model") String model, @RequestParam("color") String color,
+                               @RequestParam("standard") String standard, @RequestParam("mfrs") String mfrs,
+                               @RequestParam("otherField1") String otherField1, @RequestParam("otherField2") String otherField2,
+                               @RequestParam("otherField3") String otherField3, @RequestParam("unit") String unit,@RequestParam("unitId") Long unitId,
+                               HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        int exist = materialService.checkIsExist(id, name, StringUtil.toNull(model), StringUtil.toNull(color),
+                StringUtil.toNull(standard), StringUtil.toNull(mfrs), StringUtil.toNull(otherField1),
+                StringUtil.toNull(otherField2), StringUtil.toNull(otherField3), StringUtil.toNull(unit), unitId);
+        if(exist > 0) {
+            objectMap.put("status", true);
+        } else {
+            objectMap.put("status", false);
+        }
+        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态-启用或者禁用")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = materialService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 根据id来查询商品名称
+     * @param id
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findById")
+    @ApiOperation(value = "根据id来查询商品名称")
+    public BaseResponseInfo findById(@RequestParam("id") Long id, HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<MaterialVo4Unit> list = materialService.findById(id);
+            res.code = 200;
+            res.data = list;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据meId来查询商品名称
+     * @param meId
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findByIdWithBarCode")
+    @ApiOperation(value = "根据meId来查询商品名称")
+    public BaseResponseInfo findByIdWithBarCode(@RequestParam("meId") Long meId,
+                                                @RequestParam("mpList") String mpList,
+                                                HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String[] mpArr = mpList.split(",");
+            MaterialVo4Unit mu = new MaterialVo4Unit();
+            List<MaterialVo4Unit> list = materialService.findByIdWithBarCode(meId);
+            if(list!=null && list.size()>0) {
+                mu = list.get(0);
+                mu.setMaterialOther(materialService.getMaterialOtherByParam(mpArr, mu));
+            }
+            res.code = 200;
+            res.data = mu;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据关键词查找商品信息-条码、名称、规格、型号
+     * @param q
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getMaterialByParam")
+    @ApiOperation(value = "根据关键词查找商品信息")
+    public BaseResponseInfo getMaterialByParam(@RequestParam("q") String q,
+                                   HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            JSONArray arr = materialService.getMaterialByParam(q);
+            res.code = 200;
+            res.data = arr;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 查找商品信息-下拉框
+     * @param mpList
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findBySelect")
+    @ApiOperation(value = "查找商品信息")
+    public JSONObject findBySelect(@RequestParam(value = "categoryId", required = false) Long categoryId,
+                                  @RequestParam(value = "q", required = false) String q,
+                                  @RequestParam(value = "standardOrModel", required = false) String standardOrModel,
+                                  @RequestParam(value = "mpList", required = false) String mpList,
+                                  @RequestParam(value = "depotId", required = false) Long depotId,
+                                  @RequestParam(value = "color", required = false) String color,
+                                  @RequestParam(value = "brand", required = false) String brand,
+                                  @RequestParam(value = "mfrs", required = false) String mfrs,
+                                  @RequestParam(value = "enableSerialNumber", required = false) String enableSerialNumber,
+                                  @RequestParam(value = "enableBatchNumber", required = false) String enableBatchNumber,
+                                  @RequestParam("page") Integer currentPage,
+                                  @RequestParam("rows") Integer pageSize,
+                                  HttpServletRequest request) throws Exception{
+        JSONObject object = new JSONObject();
+        try {
+            String[] mpArr = new String[]{};
+            if(StringUtil.isNotEmpty(mpList)){
+                mpArr= mpList.split(",");
+            }
+            List<MaterialVo4Unit> dataList = materialService.findBySelectWithBarCode(categoryId, q, StringUtil.toNull(standardOrModel),
+                    StringUtil.toNull(color), StringUtil.toNull(brand), StringUtil.toNull(mfrs), enableSerialNumber, enableBatchNumber,
+                    (currentPage-1)*pageSize, pageSize);
+            int total = materialService.findBySelectWithBarCodeCount(categoryId, q, StringUtil.toNull(standardOrModel),
+                    StringUtil.toNull(color), StringUtil.toNull(brand), StringUtil.toNull(mfrs), enableSerialNumber, enableBatchNumber);
+            object.put("total", total);
+            JSONArray dataArray = new JSONArray();
+            //存放数据json数组
+            if (null != dataList) {
+                for (MaterialVo4Unit material : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", material.getMeId()); //商品扩展表的id
+                    String ratioStr = ""; //比例
+                    Unit unit = new Unit();
+                    if (material.getUnitId() == null) {
+                        ratioStr = "";
+                    } else {
+                        unit = unitService.getUnit(material.getUnitId());
+                        //拼接副单位的比例
+                        String commodityUnit = material.getCommodityUnit();
+                        if(commodityUnit.equals(unit.getBasicUnit())) {
+                            ratioStr = "[基本]";
+                        }
+                        if(commodityUnit.equals(unit.getOtherUnit()) && unit.getRatio()!=null) {
+                            ratioStr = "[" + unit.getRatio().stripTrailingZeros().toPlainString() + unit.getBasicUnit() + "]";
+                        }
+                        if(commodityUnit.equals(unit.getOtherUnitTwo()) && unit.getRatioTwo()!=null) {
+                            ratioStr = "[" + unit.getRatioTwo().stripTrailingZeros().toPlainString() + unit.getBasicUnit() + "]";
+                        }
+                        if(commodityUnit.equals(unit.getOtherUnitThree()) && unit.getRatioThree()!=null) {
+                            ratioStr = "[" + unit.getRatioThree().stripTrailingZeros().toPlainString() + unit.getBasicUnit() + "]";
+                        }
+                    }
+                    item.put("mBarCode", material.getmBarCode());
+                    item.put("name", material.getName());
+                    item.put("mnemonic", material.getMnemonic());
+                    item.put("categoryName", material.getCategoryName());
+                    item.put("standard", material.getStandard());
+                    item.put("model", material.getModel());
+                    item.put("color", material.getColor());
+                    item.put("brand", material.getBrand());
+                    item.put("mfrs", material.getMfrs());
+                    item.put("unit", material.getCommodityUnit() + ratioStr);
+                    item.put("sku", material.getSku());
+                    item.put("enableSerialNumber", material.getEnableSerialNumber());
+                    item.put("enableBatchNumber", material.getEnableBatchNumber());
+                    BigDecimal stock;
+                    if(StringUtil.isNotEmpty(material.getSku())){
+                        stock = depotItemService.getSkuStockByParam(depotId,material.getMeId(),null,null);
+                    } else {
+                        stock = depotItemService.getCurrentStockByParam(depotId, material.getId());
+                        if (material.getUnitId()!=null){
+                            String commodityUnit = material.getCommodityUnit();
+                            stock = unitService.parseStockByUnit(stock, unit, commodityUnit);
+                        }
+                    }
+                    item.put("stock", stock);
+                    item.put("expand", materialService.getMaterialOtherByParam(mpArr, material));
+                    item.put("imgName", material.getImgName());
+                    if(fileUploadType == 2) {
+                        item.put("imgSmall", "small");
+                        item.put("imgLarge", "large");
+                    } else {
+                        item.put("imgSmall", "");
+                        item.put("imgLarge", "");
+                    }
+                    dataArray.add(item);
+                }
+            }
+            object.put("rows", dataArray);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return object;
+    }
+
+    /**
+     * 根据商品id查找商品信息
+     * @param meId
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getMaterialByMeId")
+    @ApiOperation(value = "根据商品id查找商品信息")
+    public JSONObject getMaterialByMeId(@RequestParam(value = "meId", required = false) Long meId,
+                                        @RequestParam("mpList") String mpList,
+                                        HttpServletRequest request) throws Exception{
+        JSONObject item = new JSONObject();
+        try {
+            String[] mpArr = mpList.split(",");
+            List<MaterialVo4Unit> materialList = materialService.getMaterialByMeId(meId);
+            if(materialList!=null && materialList.size()!=1) {
+                return item;
+            } else if(materialList.size() == 1) {
+                MaterialVo4Unit material = materialList.get(0);
+                item.put("Id", material.getMeId()); //商品扩展表的id
+                String ratio; //比例
+                if (material.getUnitId() == null || material.getUnitId().equals("")) {
+                    ratio = "";
+                } else {
+                    ratio = material.getUnitName();
+                    ratio = ratio.substring(ratio.indexOf("("));
+                }
+                //名称/型号/扩展信息/包装
+                String MaterialName = "";
+                MaterialName = MaterialName + material.getmBarCode() + "_" + material.getName()
+                        + ((material.getStandard() == null || material.getStandard().equals("")) ? "" : "(" + material.getStandard() + ")");
+                String expand = materialService.getMaterialOtherByParam(mpArr, material); //扩展信息
+                MaterialName = MaterialName + expand + ((material.getUnit() == null || material.getUnit().equals("")) ? "" : "(" + material.getUnit() + ")") + ratio;
+                item.put("MaterialName", MaterialName);
+                item.put("name", material.getName());
+                item.put("expand", expand);
+                item.put("model", material.getModel());
+                item.put("standard", material.getStandard());
+                item.put("unit", material.getUnit() + ratio);
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return item;
+    }
+
+    /**
+     * 生成excel表格
+     * @param categoryId
+     * @param materialParam
+     * @param color
+     * @param weight
+     * @param expiryNum
+     * @param enabled
+     * @param enableSerialNumber
+     * @param enableBatchNumber
+     * @param remark
+     * @param mpList
+     * @param request
+     * @param response
+     */
+    @GetMapping(value = "/exportExcel")
+    @ApiOperation(value = "生成excel表格")
+    public void exportExcel(@RequestParam(value = "categoryId", required = false) String categoryId,
+                            @RequestParam(value = "materialParam", required = false) String materialParam,
+                            @RequestParam(value = "color", required = false) String color,
+                            @RequestParam(value = "materialOther", required = false) String materialOther,
+                            @RequestParam(value = "weight", required = false) String weight,
+                            @RequestParam(value = "expiryNum", required = false) String expiryNum,
+                            @RequestParam(value = "enabled", required = false) String enabled,
+                            @RequestParam(value = "enableSerialNumber", required = false) String enableSerialNumber,
+                            @RequestParam(value = "enableBatchNumber", required = false) String enableBatchNumber,
+                            @RequestParam(value = "remark", required = false) String remark,
+                            @RequestParam(value = "mpList", required = false) String mpList,
+                            HttpServletRequest request, HttpServletResponse response) {
+        try {
+            materialService.exportExcel(StringUtil.toNull(categoryId), StringUtil.toNull(materialParam), StringUtil.toNull(color),
+                    StringUtil.toNull(materialOther), StringUtil.toNull(weight),
+                    StringUtil.toNull(expiryNum), StringUtil.toNull(enabled), StringUtil.toNull(enableSerialNumber),
+                    StringUtil.toNull(enableBatchNumber), StringUtil.toNull(remark), response);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * excel表格导入产品(含初始库存)
+     * @param file
+     * @param request
+     * @param response
+     * @return
+     */
+    @PostMapping(value = "/importExcel")
+    @ApiOperation(value = "excel表格导入产品")
+    public BaseResponseInfo importExcel(MultipartFile file,
+                            HttpServletRequest request, HttpServletResponse response) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            res = materialService.importExcel(file, request);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return res;
+    }
+
+    /**
+     * 获取商品序列号
+     * @param q
+     * @param currentPage
+     * @param pageSize
+     * @param request
+     * @param response
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getMaterialEnableSerialNumberList")
+    @ApiOperation(value = "获取商品序列号")
+    public JSONObject getMaterialEnableSerialNumberList(
+                                @RequestParam(value = "q", required = false) String q,
+                                @RequestParam("page") Integer currentPage,
+                                @RequestParam("rows") Integer pageSize,
+                                HttpServletRequest request,
+                                HttpServletResponse response)throws Exception {
+        JSONObject object= new JSONObject();
+        try {
+            List<MaterialVo4Unit> list = materialService.getMaterialEnableSerialNumberList(q, (currentPage-1)*pageSize, pageSize);
+            Long count = materialService.getMaterialEnableSerialNumberCount(q);
+            object.put("rows", list);
+            object.put("total", count);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return object;
+    }
+
+    /**
+     * 获取最大条码
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getMaxBarCode")
+    @ApiOperation(value = "获取最大条码")
+    public BaseResponseInfo getMaxBarCode() throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        String barCode = materialService.getMaxBarCode();
+        map.put("barCode", barCode);
+        res.code = 200;
+        res.data = map;
+        return res;
+    }
+
+    /**
+     * 商品名称模糊匹配
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getMaterialNameList")
+    @ApiOperation(value = "商品名称模糊匹配")
+    public JSONArray getMaterialNameList() throws Exception {
+        JSONArray arr = new JSONArray();
+        try {
+            List<String> list = materialService.getMaterialNameList();
+            for (String s : list) {
+                JSONObject item = new JSONObject();
+                item.put("value", s);
+                item.put("text", s);
+                arr.add(item);
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    /**
+     * 根据条码查询商品信息
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getMaterialByBarCode")
+    @ApiOperation(value = "根据条码查询商品信息")
+    public BaseResponseInfo getMaterialByBarCode(@RequestParam("barCode") String barCode,
+                                          @RequestParam(value = "organId", required = false) Long organId,
+                                          @RequestParam(value = "depotId", required = false) Long depotId,
+                                          @RequestParam("mpList") String mpList,
+                                          @RequestParam(required = false, value = "prefixNo") String prefixNo,
+                                          HttpServletRequest request) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Long userId = userService.getUserId(request);
+            String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+            String[] mpArr = mpList.split(",");
+            //支持序列号查询,先根据序列号查询条码,如果查不到就直接查条码
+            MaterialExtend materialExtend = materialService.getMaterialExtendBySerialNumber(barCode);
+            if(materialExtend!=null && StringUtil.isNotEmpty(materialExtend.getBarCode())) {
+                barCode = materialExtend.getBarCode();
+            }
+            List<MaterialVo4Unit> list = materialService.getMaterialByBarCode(barCode);
+            if(list!=null && list.size()>0) {
+                for(MaterialVo4Unit mvo: list) {
+                    mvo.setMaterialOther(materialService.getMaterialOtherByParam(mpArr, mvo));
+                    if ("LSCK".equals(prefixNo) || "LSTH".equals(prefixNo)) {
+                        //零售价
+                        mvo.setBillPrice(mvo.getCommodityDecimal());
+                    } else if ("CGDD".equals(prefixNo) || "CGRK".equals(prefixNo) || "CGTH".equals(prefixNo)) {
+                        //采购价
+                        mvo.setBillPrice(mvo.getPurchaseDecimal());
+                    } else if("QTRK".equals(prefixNo) || "DBCK".equals(prefixNo) || "ZZD".equals(prefixNo) || "CXD".equals(prefixNo)
+                            || "PDLR".equals(prefixNo) || "PDFP".equals(prefixNo)) {
+                        //采购价-给录入界面按权限屏蔽
+                        mvo.setBillPrice(roleService.parseBillPriceByLimit(mvo.getPurchaseDecimal(), "buy", priceLimit, request));
+                    } if ("XSDD".equals(prefixNo) || "XSCK".equals(prefixNo) || "XSTH".equals(prefixNo) || "QTCK".equals(prefixNo)) {
+                        //销售价
+                        if(organId == null) {
+                            mvo.setBillPrice(mvo.getWholesaleDecimal());
+                        } else {
+                            //查询最后一单的销售价,实现不同的客户不同的销售价
+                            BigDecimal lastUnitPrice = depotItemService.getLastUnitPriceByParam(organId, mvo.getMeId(), prefixNo);
+                            mvo.setBillPrice(lastUnitPrice!=null? lastUnitPrice : mvo.getWholesaleDecimal());
+                        }
+                        //销售价-给录入界面按权限屏蔽价格
+                        if("QTCK".equals(prefixNo)) {
+                            mvo.setBillPrice(roleService.parseBillPriceByLimit(mvo.getWholesaleDecimal(), "sale", priceLimit, request));
+                        }
+                    }
+                    //仓库id
+                    if (depotId == null) {
+                        JSONArray depotArr = depotService.findDepotByCurrentUser();
+                        for (Object obj : depotArr) {
+                            JSONObject depotObj = JSONObject.parseObject(obj.toString());
+                            if (depotObj.get("isDefault") != null) {
+                                Boolean isDefault = depotObj.getBoolean("isDefault");
+                                if (isDefault) {
+                                    Long id = depotObj.getLong("id");
+                                    if (!"CGDD".equals(prefixNo) && !"XSDD".equals(prefixNo)) {
+                                        //除订单之外的单据才有仓库
+                                        mvo.setDepotId(id);
+                                    }
+                                    getStockByMaterialInfo(mvo);
+                                }
+                            }
+                        }
+                    } else {
+                        mvo.setDepotId(depotId);
+                        getStockByMaterialInfo(mvo);
+                    }
+                }
+            }
+            res.code = 200;
+            res.data = list;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据商品信息获取库存,进行赋值
+     * @param mvo
+     * @throws Exception
+     */
+    private void getStockByMaterialInfo(MaterialVo4Unit mvo) throws Exception {
+        BigDecimal stock;
+        if (StringUtil.isNotEmpty(mvo.getSku())) {
+            stock = depotItemService.getSkuStockByParam(mvo.getDepotId(), mvo.getMeId(), null, null);
+        } else {
+            stock = depotItemService.getCurrentStockByParam(mvo.getDepotId(), mvo.getId());
+            if (mvo.getUnitId() != null) {
+                Unit unit = unitService.getUnit(mvo.getUnitId());
+                String commodityUnit = mvo.getCommodityUnit();
+                stock = unitService.parseStockByUnit(stock, unit, commodityUnit);
+            }
+        }
+        mvo.setStock(stock);
+    }
+
+    /**
+     * 商品库存查询
+     * @param currentPage
+     * @param pageSize
+     * @param depotIds
+     * @param categoryId
+     * @param materialParam
+     * @param zeroStock
+     * @param column
+     * @param order
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getListWithStock")
+    @ApiOperation(value = "商品库存查询")
+    public BaseResponseInfo getListWithStock(@RequestParam("currentPage") Integer currentPage,
+                                             @RequestParam("pageSize") Integer pageSize,
+                                             @RequestParam(value = "depotIds", required = false) String depotIds,
+                                             @RequestParam(value = "categoryId", required = false) Long categoryId,
+                                             @RequestParam(value = "position", required = false) String position,
+                                             @RequestParam("materialParam") String materialParam,
+                                             @RequestParam("zeroStock") Integer zeroStock,
+                                             @RequestParam(value = "column", required = false, defaultValue = "createTime") String column,
+                                             @RequestParam(value = "order", required = false, defaultValue = "desc") String order,
+                                             HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            List<Long> idList = new ArrayList<>();
+            List<Long> depotList = new ArrayList<>();
+            if(categoryId != null){
+                idList = materialService.getListByParentId(categoryId);
+            }
+            if(StringUtil.isNotEmpty(depotIds)) {
+                depotList = StringUtil.strToLongList(depotIds);
+            } else {
+                //未选择仓库时默认为当前用户有权限的仓库
+                JSONArray depotArr = depotService.findDepotByCurrentUser();
+                for(Object obj: depotArr) {
+                    JSONObject object = JSONObject.parseObject(obj.toString());
+                    depotList.add(object.getLong("id"));
+                }
+            }
+            Boolean moveAvgPriceFlag = systemConfigService.getMoveAvgPriceFlag();
+            List<MaterialVo4Unit> dataList = materialService.getListWithStock(depotList, idList, StringUtil.toNull(position), StringUtil.toNull(materialParam),
+                    moveAvgPriceFlag, zeroStock, StringUtil.safeSqlParse(column), StringUtil.safeSqlParse(order), (currentPage-1)*pageSize, pageSize);
+            int total = materialService.getListWithStockCount(depotList, idList, StringUtil.toNull(position), StringUtil.toNull(materialParam), zeroStock);
+            MaterialVo4Unit materialVo4Unit= materialService.getTotalStockAndPrice(depotList, idList, StringUtil.toNull(position), StringUtil.toNull(materialParam));
+            map.put("total", total);
+            map.put("currentStock", materialVo4Unit.getCurrentStock()!=null?materialVo4Unit.getCurrentStock():BigDecimal.ZERO);
+            if(moveAvgPriceFlag) {
+                map.put("currentStockPrice", materialVo4Unit.getCurrentStockMovePrice()!=null?materialVo4Unit.getCurrentStockMovePrice():BigDecimal.ZERO);
+            } else {
+                map.put("currentStockPrice", materialVo4Unit.getCurrentStockPrice()!=null?materialVo4Unit.getCurrentStockPrice():BigDecimal.ZERO);
+            }
+            map.put("currentWeight", materialVo4Unit.getCurrentWeight()!=null?materialVo4Unit.getCurrentWeight():BigDecimal.ZERO);
+            map.put("rows", dataList);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 批量设置商品当前的实时库存(按每个仓库)
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/batchSetMaterialCurrentStock")
+    @ApiOperation(value = "批量设置商品当前的实时库存(按每个仓库)")
+    public String batchSetMaterialCurrentStock(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = materialService.batchSetMaterialCurrentStock(ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 批量设置商品当前的成本价
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/batchSetMaterialCurrentUnitPrice")
+    @ApiOperation(value = "批量设置商品当前的成本价")
+    public String batchSetMaterialCurrentUnitPrice(@RequestBody JSONObject jsonObject,
+                                               HttpServletRequest request)throws Exception {
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = materialService.batchSetMaterialCurrentUnitPrice(ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 批量更新商品信息
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/batchUpdate")
+    @ApiOperation(value = "批量更新商品信息")
+    public String batchUpdate(@RequestBody JSONObject jsonObject,
+                              HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = materialService.batchUpdate(jsonObject);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 转换名称为拼音
+     * @param jsonObject
+     */
+    @PostMapping(value = "/changeNameToPinYin")
+    @ApiOperation(value = "转换名称为拼音")
+    public BaseResponseInfo changeNameToPinYin(@RequestBody JSONObject jsonObject)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String name = jsonObject.getString("name");
+            res.code = 200;
+            res.data = PinYinUtil.getFirstLettersLo(name);
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/controller/MaterialExtendController.java b/src/main/java/com/jsh/erp/controller/MaterialExtendController.java
new file mode 100644
index 0000000..cc9aa65
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/MaterialExtendController.java
@@ -0,0 +1,132 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.MaterialExtend;
+import com.jsh.erp.datasource.vo.MaterialExtendVo4List;
+import com.jsh.erp.service.materialExtend.MaterialExtendService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author jijiaqing
+ */
+@RestController
+@RequestMapping(value = "/materialsExtend")
+@Api(tags = {"商品价格扩展"})
+public class MaterialExtendController {
+    private Logger logger = LoggerFactory.getLogger(MaterialExtendController.class);
+    @Resource
+    private MaterialExtendService materialExtendService;
+
+    @GetMapping(value = "/getDetailList")
+    @ApiOperation(value = "价格信息列表")
+    public BaseResponseInfo getDetailList(@RequestParam("materialId") Long materialId,
+                                          HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<MaterialExtendVo4List> dataList = new ArrayList<MaterialExtendVo4List>();
+            if(materialId!=0) {
+                dataList = materialExtendService.getDetailList(materialId);
+            }
+            JSONObject outer = new JSONObject();
+            outer.put("total", dataList.size());
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (MaterialExtendVo4List md : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", md.getId());
+                    item.put("barCode", md.getBarCode());
+                    item.put("commodityUnit", md.getCommodityUnit());
+                    if(StringUtil.isNotEmpty(md.getSku())){
+                        item.put("sku", md.getSku());
+                    }
+                    item.put("purchaseDecimal", md.getPurchaseDecimal());
+                    item.put("commodityDecimal", md.getCommodityDecimal());
+                    item.put("wholesaleDecimal", md.getWholesaleDecimal());
+                    item.put("lowDecimal", md.getLowDecimal());
+                    dataArray.add(item);
+                }
+            }
+            outer.put("rows", dataArray);
+            res.code = 200;
+            res.data = outer;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据条码查询商品信息
+     * @param barCode
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getInfoByBarCode")
+    @ApiOperation(value = "根据条码查询商品信息")
+    public BaseResponseInfo getInfoByBarCode(@RequestParam("barCode") String barCode,
+                                          HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            MaterialExtend materialExtend = materialExtendService.getInfoByBarCode(barCode);
+            res.code = 200;
+            res.data = materialExtend;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 校验条码是否存在
+     * @param id
+     * @param barCode
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/checkIsBarCodeExist")
+    @ApiOperation(value = "校验条码是否存在")
+    public BaseResponseInfo checkIsBarCodeExist(@RequestParam("id") Long id,
+                                                @RequestParam("barCode") String barCode,
+                                             HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            int exist = materialExtendService.checkIsBarCodeExist(id, barCode);
+            if(exist > 0) {
+                map.put("status", true);
+            } else {
+                map.put("status", false);
+            }
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/MaterialPropertyController.java b/src/main/java/com/jsh/erp/controller/MaterialPropertyController.java
new file mode 100644
index 0000000..7a06bad
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/MaterialPropertyController.java
@@ -0,0 +1,50 @@
+package com.jsh.erp.controller;
+
+import com.jsh.erp.datasource.entities.MaterialProperty;
+import com.jsh.erp.service.materialProperty.MaterialPropertyService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: qiankunpingtai
+ * @Date: 2019/3/29 15:24
+ */
+@RestController
+@RequestMapping(value = "/materialProperty")
+@Api(tags = {"商品扩展字段"})
+public class MaterialPropertyController {
+
+    private Logger logger = LoggerFactory.getLogger(MaterialPropertyController.class);
+
+    @Resource
+    private MaterialPropertyService materialPropertyService;
+
+    @GetMapping(value = "/getAllList")
+    @ApiOperation(value = "查询全部商品扩展字段信息")
+    public BaseResponseInfo getAllList(HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<MaterialProperty> list = materialPropertyService.getMaterialProperty();
+            res.code = 200;
+            res.data = list;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/controller/MsgController.java b/src/main/java/com/jsh/erp/controller/MsgController.java
new file mode 100644
index 0000000..469f0b3
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/MsgController.java
@@ -0,0 +1,155 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.Msg;
+import com.jsh.erp.datasource.entities.MsgEx;
+import com.jsh.erp.service.msg.MsgService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author ji sheng hua jshERP
+ */
+@RestController
+@RequestMapping(value = "/msg")
+@Api(tags = {"消息管理"})
+public class MsgController {
+    private Logger logger = LoggerFactory.getLogger(MsgController.class);
+
+    @Resource
+    private MsgService msgService;
+
+    /**
+     * 根据状态查询消息
+     * @param status
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/getMsgByStatus")
+    @ApiOperation(value = "根据状态查询消息")
+    public BaseResponseInfo getMsgByStatus(@RequestParam("status") String status,
+                                           HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<MsgEx> list = msgService.getMsgByStatus(status);
+            res.code = 200;
+            res.data = list;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 批量更新状态
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/batchUpdateStatus")
+    @ApiOperation(value = "批量更新状态")
+    public BaseResponseInfo batchUpdateStatus(@RequestBody JSONObject jsonObject,
+                                              HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String ids = jsonObject.getString("ids");
+            String status = jsonObject.getString("status");
+            msgService.batchUpdateStatus(ids, status);
+            res.code = 200;
+            res.data = "更新成功";
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据状态查询数量
+     * @param status
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/getMsgCountByStatus")
+    @ApiOperation(value = "根据状态查询数量")
+    public BaseResponseInfo getMsgCountByStatus(@RequestParam("status") String status,
+                                                HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Long> map = new HashMap<String, Long>();
+            Long count = msgService.getMsgCountByStatus(status);
+            map.put("count", count);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据类型查询数量
+     * @param type
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/getMsgCountByType")
+    @ApiOperation(value = "根据类型查询数量")
+    public BaseResponseInfo getMsgCountByType(@RequestParam("type") String type,
+                                                HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Integer> map = new HashMap<>();
+            Integer count = msgService.getMsgCountByType(type);
+            map.put("count", count);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 全部设置未已读
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/readAllMsg")
+    @ApiOperation(value = "全部设置未已读")
+    public BaseResponseInfo readAllMsg(HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            msgService.readAllMsg();
+            res.code = 200;
+            res.data = "操作成功!";
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/OrganizationController.java b/src/main/java/com/jsh/erp/controller/OrganizationController.java
new file mode 100644
index 0000000..339a7dd
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/OrganizationController.java
@@ -0,0 +1,126 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.Organization;
+import com.jsh.erp.datasource.vo.TreeNode;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.service.organization.OrganizationService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+/**
+ * create by: cjl
+ * description:
+ *
+ * create time: 2019/3/6 10:54
+ */
+@RestController
+@RequestMapping(value = "/organization")
+@Api(tags = {"机构管理"})
+public class OrganizationController {
+    private Logger logger = LoggerFactory.getLogger(OrganizationController.class);
+
+    @Resource
+    private OrganizationService organizationService;
+
+    @Resource
+    private UserService userService;
+
+    /**
+     * 根据id来查询机构信息
+     * @param id
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findById")
+    @ApiOperation(value = "根据id来查询机构信息")
+    public BaseResponseInfo findById(@RequestParam("id") Long id, HttpServletRequest request) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            List<Organization> dataList = organizationService.findById(id);
+            JSONObject outer = new JSONObject();
+            if (null != dataList) {
+                for (Organization org : dataList) {
+                    outer.put("id", org.getId());
+                    outer.put("orgAbr", org.getOrgAbr());
+                    outer.put("parentId", org.getParentId());
+                    List<Organization> dataParentList = organizationService.findByParentId(org.getParentId());
+                    if(dataParentList!=null&&dataParentList.size()>0){
+                        //父级机构名称显示简称
+                        outer.put("orgParentName", dataParentList.get(0).getOrgAbr());
+                    }
+                    outer.put("orgNo", org.getOrgNo());
+                    outer.put("sort", org.getSort());
+                    outer.put("remark", org.getRemark());
+                }
+            }
+            res.code = 200;
+            res.data = outer;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取机构树数据
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getOrganizationTree")
+    @ApiOperation(value = "获取机构树数据")
+    public JSONArray getOrganizationTree(@RequestParam("id") Long id) throws Exception{
+       JSONArray arr=new JSONArray();
+       List<TreeNode> organizationTree= organizationService.getOrganizationTree(id);
+       if(organizationTree!=null&&organizationTree.size()>0){
+           for(TreeNode node:organizationTree){
+               String str=JSON.toJSONString(node);
+               JSONObject obj=JSON.parseObject(str);
+               arr.add(obj);
+           }
+       }
+        return arr;
+    }
+
+    /**
+     * 根据用户获取全部机构树
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getAllOrganizationTreeByUser")
+    @ApiOperation(value = "根据用户获取全部机构树")
+    public JSONArray getAllOrganizationTreeByUser(HttpServletRequest request) throws Exception{
+        JSONArray arr = new JSONArray();
+        Long userId = userService.getUserId(request);
+        String roleType = userService.getRoleTypeByUserId(userId).getType();
+        if(BusinessConstants.ROLE_TYPE_PUBLIC.equals(roleType)) {
+            List<TreeNode> organizationTree = organizationService.getOrganizationTree(null);
+            if(organizationTree!=null && organizationTree.size()>0){
+                for(TreeNode node: organizationTree){
+                    String str = JSON.toJSONString(node);
+                    JSONObject obj = JSON.parseObject(str);
+                    arr.add(obj);
+                }
+            }
+        }
+        return arr;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/PersonController.java b/src/main/java/com/jsh/erp/controller/PersonController.java
new file mode 100644
index 0000000..b054d75
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/PersonController.java
@@ -0,0 +1,165 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.Person;
+import com.jsh.erp.service.person.PersonService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji|sheng|hua 云游管理系统
+ */
+@RestController
+@RequestMapping(value = "/person")
+@Api(tags = {"经手人管理"})
+public class PersonController {
+    private Logger logger = LoggerFactory.getLogger(PersonController.class);
+
+    @Resource
+    private PersonService personService;
+
+    /**
+     * 全部数据列表
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getAllList")
+    @ApiOperation(value = "全部数据列表")
+    public BaseResponseInfo getAllList(HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<Person> personList = personService.getPerson();
+            map.put("personList", personList);
+            res.code = 200;
+            res.data = personList;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据Id获取经手人信息
+     * @param personIds
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getPersonByIds")
+    @ApiOperation(value = "根据Id获取经手人信息")
+    public BaseResponseInfo getPersonByIds(@RequestParam("personIds") String personIds,
+                                           HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            Map<Long,String> personMap = personService.getPersonMap();
+            String names = personService.getPersonByMapAndIds(personMap, personIds);
+            map.put("names", names);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据类型获取经手人信息
+     * @param type
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getPersonByType")
+    @ApiOperation(value = "根据类型获取经手人信息")
+    public BaseResponseInfo getPersonByType(@RequestParam("type") String type,
+                                            HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<Person> personList = personService.getPersonByType(type);
+            map.put("personList", personList);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据类型获取经手人信息 1-销售员,2-仓管员,3-财务员
+     * @param typeNum
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getPersonByNumType")
+    @ApiOperation(value = "根据类型获取经手人信息1-销售员,2-仓管员,3-财务员")
+    public JSONArray getPersonByNumType(@RequestParam("type") String typeNum,
+                                        HttpServletRequest request)throws Exception {
+        JSONArray dataArray = new JSONArray();
+        try {
+            String type = "";
+            if (typeNum.equals("1")) {
+                type = "销售员";
+            } else if (typeNum.equals("2")) {
+                type = "仓管员";
+            } else if (typeNum.equals("3")) {
+                type = "财务员";
+            }
+            List<Person> personList = personService.getPersonByType(type);
+            if (null != personList) {
+                for (Person person : personList) {
+                    JSONObject item = new JSONObject();
+                    item.put("value", person.getId().toString());
+                    item.put("text", person.getName());
+                    dataArray.add(item);
+                }
+            }
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return dataArray;
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = personService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/PlatformConfigController.java b/src/main/java/com/jsh/erp/controller/PlatformConfigController.java
new file mode 100644
index 0000000..4d8d450
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/PlatformConfigController.java
@@ -0,0 +1,139 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.PlatformConfig;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.service.platformConfig.PlatformConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji|sheng|hua 云游管理系统 QQ7827-18920
+ */
+@RestController
+@RequestMapping(value = "/platformConfig")
+@Api(tags = {"平台参数"})
+public class PlatformConfigController {
+    private Logger logger = LoggerFactory.getLogger(PlatformConfigController.class);
+
+    @Resource
+    private PlatformConfigService platformConfigService;
+
+    /**
+     * 获取平台名称
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getPlatform/name")
+    @ApiOperation(value = "获取平台名称")
+    public String getPlatformName(HttpServletRequest request)throws Exception {
+        String res;
+        try {
+            String platformKey = "platform_name";
+            PlatformConfig platformConfig = platformConfigService.getInfoByKey(platformKey);
+            res = platformConfig.getPlatformValue();
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res = "ERP系统";
+        }
+        return res;
+    }
+
+    /**
+     * 获取官方网站地址
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getPlatform/url")
+    @ApiOperation(value = "获取官方网站地址")
+    public String getPlatformUrl(HttpServletRequest request)throws Exception {
+        String res;
+        try {
+            String platformKey = "platform_url";
+            PlatformConfig platformConfig = platformConfigService.getInfoByKey(platformKey);
+            res = platformConfig.getPlatformValue();
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res = "#";
+        }
+        return res;
+    }
+
+    /**
+     * 获取是否开启注册
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getPlatform/registerFlag")
+    @ApiOperation(value = "获取是否开启注册")
+    public String getPlatformRegisterFlag(HttpServletRequest request)throws Exception {
+        String res;
+        try {
+            String platformKey = "register_flag";
+            PlatformConfig platformConfig = platformConfigService.getInfoByKey(platformKey);
+            res = platformConfig.getPlatformValue();
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res = "#";
+        }
+        return res;
+    }
+
+    /**
+     * 根据platformKey更新platformValue
+     * @param object
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/updatePlatformConfigByKey")
+    @ApiOperation(value = "根据platformKey更新platformValue")
+    public String updatePlatformConfigByKey(@RequestBody JSONObject object,
+                                            HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        String platformKey = object.getString("platformKey");
+        String platformValue = object.getString("platformValue");
+        int res = platformConfigService.updatePlatformConfigByKey(platformKey, platformValue);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 根据platformKey查询信息
+     * @param platformKey
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getInfoByKey")
+    @ApiOperation(value = "根据platformKey查询信息")
+    public BaseResponseInfo getInfoByKey(@RequestParam("platformKey") String platformKey,
+                                            HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            PlatformConfig platformConfig = platformConfigService.getInfoByKey(platformKey);
+            res.code = 200;
+            res.data = platformConfig;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/PluginController.java b/src/main/java/com/jsh/erp/controller/PluginController.java
new file mode 100644
index 0000000..011e348
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/PluginController.java
@@ -0,0 +1,368 @@
+package com.jsh.erp.controller;
+
+import com.gitee.starblues.integration.application.PluginApplication;
+import com.gitee.starblues.integration.operator.PluginOperator;
+import com.gitee.starblues.integration.operator.module.PluginInfo;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ComputerInfo;
+import com.jsh.erp.utils.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.nio.file.Paths;
+import java.util.*;
+
+/**
+ * 插件jar 包测试功能
+ * @author jishenghua
+ * @version 1.0
+ */
+@RestController
+@RequestMapping("/plugin")
+@Api(tags = {"插件管理"})
+public class PluginController {
+    private Logger logger = LoggerFactory.getLogger(PluginController.class);
+
+    @Resource
+    private UserService userService;
+
+    private final PluginOperator pluginOperator;
+
+    @Autowired
+    public PluginController(PluginApplication pluginApplication) {
+        this.pluginOperator = pluginApplication.getPluginOperator();
+    }
+    /**
+     * 获取插件信息
+     * @return 返回插件信息
+     */
+    @GetMapping(value = "/list")
+    @ApiOperation(value = "获取插件信息")
+    public BaseResponseInfo getPluginInfo(@RequestParam(value = "name",required = false) String name,
+                                          @RequestParam("currentPage") Integer currentPage,
+                                          @RequestParam("pageSize") Integer pageSize,
+                                          HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            List<PluginInfo> resList = new ArrayList<>();
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                List<PluginInfo> list = pluginOperator.getPluginInfo();
+                if (StringUtil.isEmpty(name)) {
+                    resList = list;
+                } else {
+                    for (PluginInfo pi : list) {
+                        String desc = pi.getPluginDescriptor().getPluginDescription();
+                        if (desc.contains(name)) {
+                            resList.add(pi);
+                        }
+                    }
+                }
+            }
+            map.put("rows", resList);
+            map.put("total", resList.size());
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取插件jar文件名
+     * @return 获取插件文件名。只在生产环境显示
+     */
+    @GetMapping("/files")
+    @ApiOperation(value = "获取插件jar文件名")
+    public Set<String> getPluginFilePaths(){
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                return pluginOperator.getPluginFilePaths();
+            } else {
+                return null;
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+
+    /**
+     * 根据插件id停止插件
+     * @param id 插件id
+     * @return 返回操作结果
+     */
+    @PostMapping("/stop/{id}")
+    @ApiOperation(value = "根据插件id停止插件")
+    public BaseResponseInfo stop(@PathVariable("id") String id){
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        String message = "";
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                if (pluginOperator.stop(id)) {
+                    message = "plugin '" + id + "' stop success";
+                } else {
+                    message = "plugin '" + id + "' stop failure";
+                }
+            } else {
+                message = "power is limit";
+            }
+            map.put("message", message);
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            map.put("message", "plugin '" + id +"' stop failure. " + e.getMessage());
+            res.code = 500;
+            res.data = map;
+        }
+        return res;
+    }
+
+    /**
+     * 根据插件id启动插件
+     * @param id 插件id
+     * @return 返回操作结果
+     */
+    @PostMapping("/start/{id}")
+    @ApiOperation(value = "根据插件id启动插件")
+    public BaseResponseInfo start(@PathVariable("id") String id){
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        String message = "";
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                if (pluginOperator.start(id)) {
+                    message = "plugin '" + id + "' start success";
+                } else {
+                    message = "plugin '" + id + "' start failure";
+                }
+            } else {
+                message = "power is limit";
+            }
+            map.put("message", message);
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            map.put("message", "plugin '" + id +"' start failure. " + e.getMessage());
+            res.code = 500;
+            res.data = map;
+        }
+        return res;
+    }
+
+
+    /**
+     * 根据插件id卸载插件
+     * @param id 插件id
+     * @return 返回操作结果
+     */
+    @PostMapping("/uninstall/{id}")
+    @ApiOperation(value = "根据插件id卸载插件")
+    public BaseResponseInfo uninstall(@PathVariable("id") String id){
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        String message = "";
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                if (pluginOperator.uninstall(id, true)) {
+                    message = "plugin '" + id + "' uninstall success";
+                } else {
+                    message = "plugin '" + id + "' uninstall failure";
+                }
+            } else {
+                message = "power is limit";
+            }
+            map.put("message", message);
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            map.put("message", "plugin '" + id +"' uninstall failure. " + e.getMessage());
+            res.code = 500;
+            res.data = map;
+        }
+        return res;
+    }
+
+
+    /**
+     * 根据插件路径安装插件。该插件jar必须在服务器上存在。注意: 该操作只适用于生产环境
+     * @param path 插件路径名称
+     * @return 操作结果
+     */
+    @PostMapping("/installByPath")
+    @ApiOperation(value = "根据插件路径安装插件")
+    public String install(@RequestParam("path") String path){
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                if (pluginOperator.install(Paths.get(path))) {
+                    return "installByPath success";
+                } else {
+                    return "installByPath failure";
+                }
+            } else {
+                return "installByPath failure";
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return "installByPath failure : " + e.getMessage();
+        }
+    }
+
+
+    /**
+     * 上传并安装插件。注意: 该操作只适用于生产环境
+     * @param file 上传文件 multipartFile
+     * @return 操作结果
+     */
+    @PostMapping("/uploadInstallPluginJar")
+    @ApiOperation(value = "上传并安装插件")
+    public BaseResponseInfo install(MultipartFile file, HttpServletRequest request, HttpServletResponse response){
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                pluginOperator.uploadPluginAndStart(file);
+                res.code = 200;
+                res.data = "导入成功";
+            } else {
+                res.code = 500;
+                res.data = "抱歉,无操作权限!";
+            }
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "导入失败";
+        }
+        return res;
+    }
+
+    /**
+     * 上传插件的配置文件。注意: 该操作只适用于生产环境
+     * @param multipartFile 上传文件 multipartFile
+     * @return 操作结果
+     */
+    @PostMapping("/uploadPluginConfigFile")
+    @ApiOperation(value = "上传插件的配置文件")
+    public String uploadConfig(@RequestParam("configFile") MultipartFile multipartFile){
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                if (pluginOperator.uploadConfigFile(multipartFile)) {
+                    return "uploadConfig success";
+                } else {
+                    return "uploadConfig failure";
+                }
+            } else {
+                return "installByPath failure";
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return "uploadConfig failure : " + e.getMessage();
+        }
+    }
+
+
+    /**
+     * 备份插件。注意: 该操作只适用于生产环境
+     * @param pluginId 插件id
+     * @return 操作结果
+     */
+    @PostMapping("/back/{pluginId}")
+    @ApiOperation(value = "备份插件")
+    public String backupPlugin(@PathVariable("pluginId") String pluginId){
+        try {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                if (pluginOperator.backupPlugin(pluginId, "testBack")) {
+                    return "backupPlugin success";
+                } else {
+                    return "backupPlugin failure";
+                }
+            } else {
+                return "backupPlugin failure";
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return "backupPlugin failure : " + e.getMessage();
+        }
+    }
+
+    /**
+     * 获取加密后的mac
+     * @return
+     */
+    @GetMapping("/getMacWithSecret")
+    @ApiOperation(value = "获取加密后的mac")
+    public BaseResponseInfo getMacWithSecret(){
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String mac = ComputerInfo.getMacAddress();
+            res.code = 200;
+            res.data = DigestUtils.md5DigestAsHex(mac.getBytes());
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 根据插件标识判断是否存在
+     * @param pluginIds 多个用逗号隔开
+     * @return
+     */
+    @GetMapping("/checkByPluginId")
+    @ApiOperation(value = "根据插件标识判断是否存在")
+    public BaseResponseInfo checkByTag(@RequestParam("pluginIds") String pluginIds){
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            boolean data = false;
+            if(StringUtil.isNotEmpty(pluginIds)) {
+                String[] pluginIdList = pluginIds.split(",");
+                List<PluginInfo> list = pluginOperator.getPluginInfo();
+                for (PluginInfo pi : list) {
+                    String info = pi.getPluginDescriptor().getPluginId();
+                    for (int i = 0; i < pluginIdList.length; i++) {
+                        if (pluginIdList[i].equals(info)) {
+                            data = true;
+                        }
+                    }
+                }
+            }
+            res.code = 200;
+            res.data = data;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/ResourceController.java b/src/main/java/com/jsh/erp/controller/ResourceController.java
new file mode 100644
index 0000000..4be23f6
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/ResourceController.java
@@ -0,0 +1,152 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.service.CommonQueryManager;
+import com.jsh.erp.utils.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * by jishenghua 2018-9-12 23:58:10 云游管理系统
+ */
+@RestController
+@Api(tags = {"资源接口"})
+public class ResourceController {
+
+    @Resource
+    private CommonQueryManager configResourceManager;
+
+    @GetMapping(value = "/{apiName}/info")
+    @ApiOperation(value = "根据id获取信息")
+    public String getList(@PathVariable("apiName") String apiName,
+                          @RequestParam("id") Long id,
+                          HttpServletRequest request) throws Exception {
+        Object obj = configResourceManager.selectOne(apiName, id);
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        if(obj != null) {
+            objectMap.put("info", obj);
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    @GetMapping(value = "/{apiName}/list")
+    @ApiOperation(value = "获取信息列表")
+    public String getList(@PathVariable("apiName") String apiName,
+                        @RequestParam(value = Constants.PAGE_SIZE, required = false) Integer pageSize,
+                        @RequestParam(value = Constants.CURRENT_PAGE, required = false) Integer currentPage,
+                        @RequestParam(value = Constants.SEARCH, required = false) String search,
+                        HttpServletRequest request)throws Exception {
+        Map<String, String> parameterMap = ParamUtils.requestToMap(request);
+        parameterMap.put(Constants.SEARCH, search);
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        if (pageSize != null && pageSize <= 0) {
+            pageSize = 10;
+        }
+        String offset = ParamUtils.getPageOffset(currentPage, pageSize);
+        if (StringUtil.isNotEmpty(offset)) {
+            parameterMap.put(Constants.OFFSET, offset);
+        }
+        List<?> list = configResourceManager.select(apiName, parameterMap);
+        if (list != null) {
+            objectMap.put("total", configResourceManager.counts(apiName, parameterMap));
+            objectMap.put("rows", list);
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            objectMap.put("total", BusinessConstants.DEFAULT_LIST_NULL_NUMBER);
+            objectMap.put("rows", new ArrayList<Object>());
+            return returnJson(objectMap, "查找不到数据", ErpInfo.OK.code);
+        }
+    }
+
+    @PostMapping(value = "/{apiName}/add", produces = {"application/javascript", "application/json"})
+    @ApiOperation(value = "新增")
+    public String addResource(@PathVariable("apiName") String apiName,
+                              @RequestBody JSONObject obj, HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        int insert = configResourceManager.insert(apiName, obj, request);
+        if(insert > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else if(insert == -1) {
+            return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    @PutMapping(value = "/{apiName}/update", produces = {"application/javascript", "application/json"})
+    @ApiOperation(value = "修改")
+    public String updateResource(@PathVariable("apiName") String apiName,
+                                 @RequestBody JSONObject obj, HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        int update = configResourceManager.update(apiName, obj, request);
+        if(update > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else if(update == -1) {
+            return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    @DeleteMapping(value = "/{apiName}/delete", produces = {"application/javascript", "application/json"})
+    @ApiOperation(value = "删除")
+    public String deleteResource(@PathVariable("apiName") String apiName,
+                                 @RequestParam("id") Long id, HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        int delete = configResourceManager.delete(apiName, id, request);
+        if(delete > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else if(delete == -1) {
+            return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    @DeleteMapping(value = "/{apiName}/deleteBatch", produces = {"application/javascript", "application/json"})
+    @ApiOperation(value = "批量删除")
+    public String batchDeleteResource(@PathVariable("apiName") String apiName,
+                                      @RequestParam("ids") String ids, HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        int delete = configResourceManager.deleteBatch(apiName, ids, request);
+        if(delete > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else if(delete == -1) {
+            return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    @GetMapping(value = "/{apiName}/checkIsNameExist")
+    @ApiOperation(value = "检查名称是否存在")
+    public String checkIsNameExist(@PathVariable("apiName") String apiName,
+                                   @RequestParam Long id, @RequestParam(value ="name", required = false) String name,
+                                   HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        int exist = configResourceManager.checkIsNameExist(apiName, id, name);
+        if(exist > 0) {
+            objectMap.put("status", true);
+        } else {
+            objectMap.put("status", false);
+        }
+        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+    }
+
+
+}
diff --git a/src/main/java/com/jsh/erp/controller/RoleController.java b/src/main/java/com/jsh/erp/controller/RoleController.java
new file mode 100644
index 0000000..8ecebcb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/RoleController.java
@@ -0,0 +1,102 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.Role;
+import com.jsh.erp.service.role.RoleService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji sheng hua jshERP
+ */
+@RestController
+@RequestMapping(value = "/role")
+@Api(tags = {"角色管理"})
+public class RoleController {
+    private Logger logger = LoggerFactory.getLogger(RoleController.class);
+
+    @Resource
+    private RoleService roleService;
+
+    @Resource
+    private UserBusinessService userBusinessService;
+
+    /**
+     * 角色对应应用显示
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findUserRole")
+    @ApiOperation(value = "查询用户的角色")
+    public JSONArray findUserRole(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId,
+                                  HttpServletRequest request)throws Exception {
+        JSONArray arr = new JSONArray();
+        try {
+            //获取权限信息
+            String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, keyId);
+            List<Role> dataList = roleService.findUserRole();
+            if (null != dataList) {
+                for (Role role : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", role.getId());
+                    item.put("text", role.getName());
+                    Boolean flag = ubValue.contains("[" + role.getId().toString() + "]");
+                    if (flag) {
+                        item.put("checked", true);
+                    }
+                    arr.add(item);
+                }
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    @GetMapping(value = "/allList")
+    @ApiOperation(value = "查询全部角色列表")
+    public List<Role> allList(HttpServletRequest request)throws Exception {
+        return roleService.allList();
+    }
+
+    @GetMapping(value = "/tenantRoleList")
+    @ApiOperation(value = "查询租户角色列表")
+    public List<Role> tenantRoleList(HttpServletRequest request)throws Exception {
+        return roleService.tenantRoleList();
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = roleService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/SequenceController.java b/src/main/java/com/jsh/erp/controller/SequenceController.java
new file mode 100644
index 0000000..ffe9226
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/SequenceController.java
@@ -0,0 +1,54 @@
+package com.jsh.erp.controller;
+
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.sequence.SequenceService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author ji-sheng-hua 752*718*920
+ */
+@RestController
+@RequestMapping(value = "/sequence")
+@Api(tags = {"单据编号"})
+public class SequenceController {
+    private Logger logger = LoggerFactory.getLogger(SequenceController.class);
+
+    @Resource
+    private SequenceService sequenceService;
+
+    /**
+     * 单据编号生成接口
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/buildNumber")
+    @ApiOperation(value = "单据编号生成接口")
+    public BaseResponseInfo buildNumber(HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            String number = sequenceService.buildOnlyNumber();
+            map.put("defaultNumber", number);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/controller/SerialNumberController.java b/src/main/java/com/jsh/erp/controller/SerialNumberController.java
new file mode 100644
index 0000000..e606fa4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/SerialNumberController.java
@@ -0,0 +1,118 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.DepotItem;
+import com.jsh.erp.datasource.entities.SerialNumberEx;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.depotItem.DepotItemService;
+import com.jsh.erp.service.serialNumber.SerialNumberService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import com.jsh.erp.utils.Tools;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/1/22 10:29
+ */
+@RestController
+@RequestMapping(value = "/serialNumber")
+@Api(tags = {"序列号管理"})
+public class SerialNumberController {
+    private Logger logger = LoggerFactory.getLogger(SerialNumberController.class);
+
+    @Resource
+    private SerialNumberService serialNumberService;
+    @Resource
+    private DepotHeadService depotHeadService;
+    @Resource
+    private DepotItemService depotItemService;
+
+    /**
+     * create by: cjl
+     * description:
+     *批量添加序列号
+     * create time: 2019/1/29 15:11
+     * @Param: materialName
+     * @Param: serialNumberPrefix
+     * @Param: batAddTotal
+     * @Param: remark
+     * @return java.lang.Object
+     */
+    @PostMapping("/batAddSerialNumber")
+    @ApiOperation(value = "批量添加序列号")
+    public String batAddSerialNumber(@RequestBody JSONObject jsonObject, HttpServletRequest request)throws Exception{
+        Map<String, Object> objectMap = new HashMap<>();
+        String materialCode = jsonObject.getString("materialCode");
+        String serialNumberPrefix = jsonObject.getString("serialNumberPrefix");
+        Integer batAddTotal = jsonObject.getInteger("batAddTotal");
+        String remark = jsonObject.getString("remark");
+        int insert = serialNumberService.batAddSerialNumber(materialCode,serialNumberPrefix,batAddTotal,remark);
+        if(insert > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else if(insert == -1) {
+            return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 获取序列号商品
+     * @param name
+     * @param depotId
+     * @param barCode
+     * @param currentPage
+     * @param pageSize
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getEnableSerialNumberList")
+    @ApiOperation(value = "获取序列号商品")
+    public BaseResponseInfo getEnableSerialNumberList(@RequestParam("name") String name,
+                                                      @RequestParam("depotItemId") Long depotItemId,
+                                                      @RequestParam("depotId") Long depotId,
+                                                      @RequestParam("barCode") String barCode,
+                                                      @RequestParam("page") Integer currentPage,
+                                                      @RequestParam("rows") Integer pageSize,
+                                                      HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        Map<String, Object> map = new HashMap<>();
+        try {
+            String number = "";
+            if(depotItemId != null) {
+                DepotItem depotItem = depotItemService.getDepotItem(depotItemId);
+                number = depotHeadService.getDepotHead(depotItem.getHeaderId()).getNumber();
+            }
+            List<SerialNumberEx> list = serialNumberService.getEnableSerialNumberList(number, name, depotId, barCode, (currentPage-1)*pageSize, pageSize);
+            for(SerialNumberEx serialNumberEx: list) {
+                serialNumberEx.setCreateTimeStr(Tools.getCenternTime(serialNumberEx.getCreateTime()));
+            }
+            Long total = serialNumberService.getEnableSerialNumberCount(number, name, depotId, barCode);
+            map.put("rows", list);
+            map.put("total", total);
+            res.code = 200;
+            res.data = map;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/SupplierController.java b/src/main/java/com/jsh/erp/controller/SupplierController.java
new file mode 100644
index 0000000..c2d2289
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/SupplierController.java
@@ -0,0 +1,415 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.Supplier;
+import com.jsh.erp.service.supplier.SupplierService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import com.jsh.erp.utils.ExcelUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji|sheng|hua 云游管理系统
+ */
+@RestController
+@RequestMapping(value = "/supplier")
+@Api(tags = {"商家管理"})
+public class SupplierController {
+    private Logger logger = LoggerFactory.getLogger(SupplierController.class);
+
+    @Resource
+    private SupplierService supplierService;
+
+    @Resource
+    private UserBusinessService userBusinessService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Resource
+    private UserService userService;
+
+    @GetMapping(value = "/checkIsNameAndTypeExist")
+    @ApiOperation(value = "检查名称和类型是否存在")
+    public String checkIsNameAndTypeExist(@RequestParam Long id,
+                                          @RequestParam(value ="name", required = false) String name,
+                                          @RequestParam(value ="type") String type,
+                                          HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        int exist = supplierService.checkIsNameAndTypeExist(id, name, type);
+        if(exist > 0) {
+            objectMap.put("status", true);
+        } else {
+            objectMap.put("status", false);
+        }
+        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+    }
+
+    /**
+     * 查找客户信息-下拉框
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/findBySelect_cus")
+    @ApiOperation(value = "查找客户信息")
+    public JSONArray findBySelectCus(HttpServletRequest request) {
+        JSONArray arr = new JSONArray();
+        try {
+            String type = "UserCustomer";
+            Long userId = userService.getUserId(request);
+            //获取权限信息
+            String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, userId.toString());
+            List<Supplier> supplierList = supplierService.findBySelectCus();
+            JSONArray dataArray = new JSONArray();
+            if (null != supplierList) {
+                boolean customerFlag = systemConfigService.getCustomerFlag();
+                for (Supplier supplier : supplierList) {
+                    JSONObject item = new JSONObject();
+                    Boolean flag = ubValue.contains("[" + supplier.getId().toString() + "]");
+                    if (!customerFlag || flag) {
+                        item.put("id", supplier.getId());
+                        item.put("supplier", supplier.getSupplier()); //客户名称
+                        dataArray.add(item);
+                    }
+                }
+            }
+            arr = dataArray;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    /**
+     * 查找供应商信息-下拉框
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/findBySelect_sup")
+    @ApiOperation(value = "查找供应商信息")
+    public JSONArray findBySelectSup(HttpServletRequest request) throws Exception{
+        JSONArray arr = new JSONArray();
+        try {
+            List<Supplier> supplierList = supplierService.findBySelectSup();
+            JSONArray dataArray = new JSONArray();
+            if (null != supplierList) {
+                for (Supplier supplier : supplierList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", supplier.getId());
+                    //供应商名称
+                    item.put("supplier", supplier.getSupplier());
+                    dataArray.add(item);
+                }
+            }
+            arr = dataArray;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    /**
+     * 查找往来单位,含供应商和客户信息-下拉框
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/findBySelect_organ")
+    @ApiOperation(value = "查找往来单位,含供应商和客户信息")
+    public JSONArray findBySelectOrgan(HttpServletRequest request) throws Exception{
+        JSONArray arr = new JSONArray();
+        try {
+            JSONArray dataArray = new JSONArray();
+            //1、获取供应商信息
+            List<Supplier> supplierList = supplierService.findBySelectSup();
+            if (null != supplierList) {
+                for (Supplier supplier : supplierList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", supplier.getId());
+                    item.put("supplier", supplier.getSupplier() + "[供应商]"); //供应商名称
+                    dataArray.add(item);
+                }
+            }
+            //2、获取客户信息
+            String type = "UserCustomer";
+            Long userId = userService.getUserId(request);
+            String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, userId.toString());
+            List<Supplier> customerList = supplierService.findBySelectCus();
+            if (null != customerList) {
+                boolean customerFlag = systemConfigService.getCustomerFlag();
+                for (Supplier supplier : customerList) {
+                    JSONObject item = new JSONObject();
+                    Boolean flag = ubValue.contains("[" + supplier.getId().toString() + "]");
+                    if (!customerFlag || flag) {
+                        item.put("id", supplier.getId());
+                        item.put("supplier", supplier.getSupplier() + "[客户]"); //客户名称
+                        dataArray.add(item);
+                    }
+                }
+            }
+            arr = dataArray;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    /**
+     * 查找会员信息-下拉框
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/findBySelect_retail")
+    @ApiOperation(value = "查找会员信息")
+    public JSONArray findBySelectRetail(HttpServletRequest request)throws Exception {
+        JSONArray arr = new JSONArray();
+        try {
+            List<Supplier> supplierList = supplierService.findBySelectRetail();
+            JSONArray dataArray = new JSONArray();
+            if (null != supplierList) {
+                for (Supplier supplier : supplierList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", supplier.getId());
+                    //客户名称
+                    item.put("supplier", supplier.getSupplier());
+                    item.put("advanceIn", supplier.getAdvanceIn()); //预付款金额
+                    dataArray.add(item);
+                }
+            }
+            arr = dataArray;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = supplierService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 用户对应客户显示
+     * @param type
+     * @param keyId
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/findUserCustomer")
+    @ApiOperation(value = "用户对应客户显示")
+    public JSONArray findUserCustomer(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId,
+                                   HttpServletRequest request) throws Exception{
+        JSONArray arr = new JSONArray();
+        try {
+            //获取权限信息
+            String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, keyId);
+            List<Supplier> dataList = supplierService.findUserCustomer();
+            //开始拼接json数据
+            JSONObject outer = new JSONObject();
+            outer.put("id", 0);
+            outer.put("key", 0);
+            outer.put("value", 0);
+            outer.put("title", "客户列表");
+            outer.put("attributes", "客户列表");
+            //存放数据json数组
+            JSONArray dataArray = new JSONArray();
+            if (null != dataList) {
+                for (Supplier supplier : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", supplier.getId());
+                    item.put("key", supplier.getId());
+                    item.put("value", supplier.getId());
+                    item.put("title", supplier.getSupplier());
+                    item.put("attributes", supplier.getSupplier());
+                    Boolean flag = ubValue.contains("[" + supplier.getId().toString() + "]");
+                    if (flag) {
+                        item.put("checked", true);
+                    }
+                    dataArray.add(item);
+                }
+            }
+            outer.put("children", dataArray);
+            arr.add(outer);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return arr;
+    }
+
+    /**
+     * 根据客户或供应商查询期初、期初已收等信息
+     * @param organId
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getBeginNeedByOrganId")
+    @ApiOperation(value = "根据客户或供应商查询期初、期初已收等信息")
+    public BaseResponseInfo getBeginNeedByOrganId(@RequestParam("organId") Long organId,
+                                        HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> map = supplierService.getBeginNeedByOrganId(organId);
+            res.code = 200;
+            res.data = map;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 导入供应商
+     * @param file
+     * @param request
+     * @param response
+     * @return
+     */
+    @PostMapping(value = "/importVendor")
+    @ApiOperation(value = "导入供应商")
+    public BaseResponseInfo importVendor(MultipartFile file,
+                            HttpServletRequest request, HttpServletResponse response) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            supplierService.importVendor(file, request);
+            res.code = 200;
+            res.data = "导入成功";
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "导入失败";
+        }
+        return res;
+    }
+
+    /**
+     * 导入客户
+     * @param file
+     * @param request
+     * @param response
+     * @return
+     */
+    @PostMapping(value = "/importCustomer")
+    @ApiOperation(value = "导入客户")
+    public BaseResponseInfo importCustomer(MultipartFile file,
+                                        HttpServletRequest request, HttpServletResponse response) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            supplierService.importCustomer(file, request);
+            res.code = 200;
+            res.data = "导入成功";
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "导入失败";
+        }
+        return res;
+    }
+
+    /**
+     * 导入会员
+     * @param file
+     * @param request
+     * @param response
+     * @return
+     */
+    @PostMapping(value = "/importMember")
+    @ApiOperation(value = "导入会员")
+    public BaseResponseInfo importMember(MultipartFile file,
+                                           HttpServletRequest request, HttpServletResponse response) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            supplierService.importMember(file, request);
+            res.code = 200;
+            res.data = "导入成功";
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "导入失败";
+        }
+        return res;
+    }
+
+    /**
+     * 生成excel表格
+     * @param supplier
+     * @param type
+     * @param phonenum
+     * @param telephone
+     * @param request
+     * @param response
+     * @return
+     */
+    @GetMapping(value = "/exportExcel")
+    public void exportExcel(@RequestParam(value = "supplier", required = false) String supplier,
+                            @RequestParam("type") String type,
+                            @RequestParam(value = "phonenum", required = false) String phonenum,
+                            @RequestParam(value = "telephone", required = false) String telephone,
+                            HttpServletRequest request, HttpServletResponse response) {
+        try {
+            List<Supplier> dataList = supplierService.findByAll(supplier, type, phonenum, telephone);
+            File file = supplierService.exportExcel(dataList, type);
+            ExcelUtils.downloadExcel(file, file.getName(), response);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 批量设置会员当前的预付款
+     * @param jsonObject
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/batchSetAdvanceIn")
+    @ApiOperation(value = "批量设置会员当前的预付款")
+    public String batchSetAdvanceIn(@RequestBody JSONObject jsonObject,
+                                    HttpServletRequest request)throws Exception {
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = supplierService.batchSetAdvanceIn(ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/controller/SystemConfigController.java b/src/main/java/com/jsh/erp/controller/SystemConfigController.java
new file mode 100644
index 0000000..5c62848
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/SystemConfigController.java
@@ -0,0 +1,308 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.SystemConfig;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.FileUtils;
+import com.jsh.erp.utils.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.HandlerMapping;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+
+/**
+ * Description
+ * @Author: jishenghua
+ * @Date: 2021-3-13 0:01
+ */
+@RestController
+@RequestMapping(value = "/systemConfig")
+@Api(tags = {"系统参数"})
+public class SystemConfigController {
+    private Logger logger = LoggerFactory.getLogger(SystemConfigController.class);
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private DepotService depotService;
+
+    @Resource
+    private UserBusinessService userBusinessService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Value(value="${file.uploadType}")
+    private Long fileUploadType;
+
+    @Value(value="${file.path}")
+    private String filePath;
+
+    @Value(value="${spring.servlet.multipart.max-file-size}")
+    private Long maxFileSize;
+
+    @Value(value="${spring.servlet.multipart.max-request-size}")
+    private Long maxRequestSize;
+
+    /**
+     * 获取当前租户的配置信息
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/getCurrentInfo")
+    @ApiOperation(value = "获取当前租户的配置信息")
+    public BaseResponseInfo getCurrentInfo(HttpServletRequest request) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try{
+            List<SystemConfig> list = systemConfigService.getSystemConfig();
+            res.code = 200;
+            if(list.size()>0) {
+                res.data = list.get(0);
+            }
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取文件大小限制
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/fileSizeLimit")
+    @ApiOperation(value = "获取文件大小限制")
+    public BaseResponseInfo fileSizeLimit(HttpServletRequest request) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try{
+            Long limit = 0L;
+            if(maxFileSize<maxRequestSize) {
+                limit = maxFileSize;
+            } else {
+                limit = maxRequestSize;
+            }
+            res.code = 200;
+            res.data = limit;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 文件上传统一方法
+     * @param request
+     * @param response
+     * @return
+     */
+    @PostMapping(value = "/upload")
+    @ApiOperation(value = "文件上传统一方法")
+    public BaseResponseInfo upload(HttpServletRequest request, HttpServletResponse response) {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String savePath = "";
+            String bizPath = request.getParameter("biz");
+            if ("bill".equals(bizPath) || "financial".equals(bizPath) || "material".equals(bizPath)) {
+                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+                MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象
+                if(fileUploadType == 1) {
+                    savePath = systemConfigService.uploadLocal(file, bizPath, request);
+                } else if(fileUploadType == 2) {
+                    savePath = systemConfigService.uploadAliOss(file, bizPath, request);
+                }
+                if(StringUtil.isNotEmpty(savePath)){
+                    res.code = 200;
+                    res.data = savePath;
+                }else {
+                    res.code = 500;
+                    res.data = "上传失败!";
+                }
+            } else {
+                res.code = 505;
+                res.data = "文件分类错误!";
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "上传失败!";
+        }
+        return res;
+    }
+
+    /**
+     * 预览图片&下载文件
+     * 请求地址:http://localhost:8080/common/static/{financial/afsdfasdfasdf_1547866868179.txt}
+     *
+     * @param request
+     * @param response
+     */
+    @GetMapping(value = "/static/**")
+    @ApiOperation(value = "预览图片&下载文件")
+    public void view(HttpServletRequest request, HttpServletResponse response) {
+        // ISO-8859-1 ==> UTF-8 进行编码转换
+        String imgPath = extractPathFromPattern(request);
+        if(StringUtil.isEmpty(imgPath) || imgPath=="null"){
+            return;
+        }
+        // 其余处理略
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            imgPath = imgPath.replace("..", "");
+            if (imgPath.endsWith(",")) {
+                imgPath = imgPath.substring(0, imgPath.length() - 1);
+            }
+            String fileUrl = "";
+            if(fileUploadType == 1) {
+                fileUrl = systemConfigService.getFileUrlLocal(imgPath);
+                inputStream = new BufferedInputStream(new FileInputStream(fileUrl));
+            } else if(fileUploadType == 2) {
+                fileUrl = systemConfigService.getFileUrlAliOss(imgPath);
+                URL url = new URL(fileUrl);
+                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+                conn.setRequestMethod("GET");
+                conn.setConnectTimeout(5 * 1000);
+                inputStream = conn.getInputStream();// 通过输入流获取图片数据
+            }
+            outputStream = response.getOutputStream();
+            byte[] buf = new byte[1024];
+            int len;
+            while ((len = inputStream.read(buf)) > 0) {
+                outputStream.write(buf, 0, len);
+            }
+            response.flushBuffer();
+        } catch (IOException e) {
+            logger.error("预览文件失败" + e.getMessage());
+            response.setStatus(404);
+            logger.error(e.getMessage(), e);
+        } catch (Exception e) {
+            response.setStatus(404);
+            logger.error(e.getMessage(), e);
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    logger.error(e.getMessage(), e);
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    logger.error(e.getMessage(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * 预览缩略图&下载文件
+     * @param request
+     * @param response
+     */
+    @GetMapping(value = "/static/mini/**")
+    @ApiOperation(value = "预览缩略图&下载文件")
+    public void viewMini(HttpServletRequest request, HttpServletResponse response) {
+        // ISO-8859-1 ==> UTF-8 进行编码转换
+        String imgPath = extractPathFromPattern(request);
+        if(StringUtil.isEmpty(imgPath) || imgPath=="null"){
+            return;
+        }
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            imgPath = imgPath.replace("..", "");
+            if (imgPath.endsWith(",")) {
+                imgPath = imgPath.substring(0, imgPath.length() - 1);
+            }
+            String fileUrl = "";
+            if(fileUploadType == 1) {
+                fileUrl = systemConfigService.getFileUrlLocal(imgPath);
+                inputStream = new BufferedInputStream(new FileInputStream(fileUrl));
+            } else if(fileUploadType == 2) {
+                fileUrl = systemConfigService.getFileUrlAliOss(imgPath);
+                URL url = new URL(fileUrl);
+                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+                conn.setRequestMethod("GET");
+                conn.setConnectTimeout(5 * 1000);
+                inputStream = conn.getInputStream();// 通过输入流获取图片数据
+            }
+            int index = fileUrl.lastIndexOf(".");
+            String ext = fileUrl.substring(index + 1);
+            BufferedImage image = systemConfigService.getImageMini(inputStream, 80);
+            outputStream = response.getOutputStream();
+            ImageIO.write(image, ext, outputStream);
+            response.flushBuffer();
+        } catch (Exception e) {
+            response.setStatus(404);
+            logger.error(e.getMessage(), e);
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    logger.error(e.getMessage(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Excel导出统一接口
+     * @param response
+     */
+    @PostMapping(value = "/exportExcelByParam")
+    @ApiOperation(value = "生成excel表格")
+    public void exportExcelByParam(@RequestBody JSONObject jsonObject,
+                                   HttpServletResponse response) {
+        try {
+            String title = jsonObject.getString("title");
+            String head = jsonObject.getString("head");
+            String tip = jsonObject.getString("tip");
+            JSONArray arr = jsonObject.getJSONArray("list");
+            systemConfigService.exportExcelByParam(title, head, tip, arr, response);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     *  把指定URL后的字符串全部截断当成参数
+     *  这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题
+     * @param request
+     * @return
+     */
+    private static String extractPathFromPattern(final HttpServletRequest request) {
+        String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
+        String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
+        return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/TenantController.java b/src/main/java/com/jsh/erp/controller/TenantController.java
new file mode 100644
index 0000000..78e4b13
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/TenantController.java
@@ -0,0 +1,54 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.tenant.TenantService;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji_sheng_hua 云游管理系统
+ */
+@RestController
+@RequestMapping(value = "/tenant")
+@Api(tags = {"租户管理"})
+public class TenantController {
+    private Logger logger = LoggerFactory.getLogger(TenantController.class);
+
+    @Resource
+    private TenantService tenantService;
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = tenantService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/UnitController.java b/src/main/java/com/jsh/erp/controller/UnitController.java
new file mode 100644
index 0000000..c5cd21c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/UnitController.java
@@ -0,0 +1,79 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.Unit;
+import com.jsh.erp.service.unit.UnitService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * Description
+ *
+ * @Author: qiankunpingtai
+ * @Date: 2019/4/1 15:38
+ */
+@RestController
+@RequestMapping(value = "/unit")
+@Api(tags = {"单位管理"})
+public class UnitController {
+    private Logger logger = LoggerFactory.getLogger(UnitController.class);
+
+    @Resource
+    private UnitService unitService;
+
+    /**
+     * 单位列表
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getAllList")
+    @ApiOperation(value = "单位列表")
+    public BaseResponseInfo getAllList(HttpServletRequest request) throws Exception{
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<Unit> unitList = unitService.getUnit();
+            res.code = 200;
+            res.data = unitList;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取数据失败";
+        }
+        return res;
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Boolean status = jsonObject.getBoolean("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = unitService.batchSetStatus(status, ids);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/UserBusinessController.java b/src/main/java/com/jsh/erp/controller/UserBusinessController.java
new file mode 100644
index 0000000..bfdb68c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/UserBusinessController.java
@@ -0,0 +1,109 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.datasource.entities.UserBusiness;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji_sheng_hua jshERP
+ */
+@RestController
+@RequestMapping(value = "/userBusiness")
+@Api(tags = {"用户角色模块的关系"})
+public class UserBusinessController {
+    private Logger logger = LoggerFactory.getLogger(UserBusinessController.class);
+
+    @Resource
+    private UserBusinessService userBusinessService;
+
+    /**
+     * 获取信息
+     * @param keyId
+     * @param type
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getBasicData")
+    @ApiOperation(value = "获取信息")
+    public BaseResponseInfo getBasicData(@RequestParam(value = "KeyId") String keyId,
+                                         @RequestParam(value = "Type") String type,
+                                         HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            List<UserBusiness> list = userBusinessService.getBasicData(keyId, type);
+            Map<String, List> mapData = new HashMap<String, List>();
+            mapData.put("userBusinessList", list);
+            res.code = 200;
+            res.data = mapData;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "查询权限失败";
+        }
+        return res;
+    }
+
+    /**
+     * 校验存在
+     * @param type
+     * @param keyId
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/checkIsValueExist")
+    @ApiOperation(value = "校验存在")
+    public String checkIsValueExist(@RequestParam(value ="type", required = false) String type,
+                                   @RequestParam(value ="keyId", required = false) String keyId,
+                                   HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        Long id = userBusinessService.checkIsValueExist(type, keyId);
+        objectMap.put("id", id);
+        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+    }
+
+    /**
+     * 更新角色的按钮权限
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/updateBtnStr")
+    @ApiOperation(value = "更新角色的按钮权限")
+    public BaseResponseInfo updateBtnStr(@RequestBody JSONObject jsonObject,
+                                         HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String roleId = jsonObject.getString("roleId");
+            String btnStr = jsonObject.getString("btnStr");
+            String keyId = roleId;
+            String type = "RoleFunctions";
+            int back = userBusinessService.updateBtnStr(keyId, type, btnStr);
+            if(back > 0) {
+                res.code = 200;
+                res.data = "成功";
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "更新权限失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/controller/UserController.java b/src/main/java/com/jsh/erp/controller/UserController.java
new file mode 100644
index 0000000..5bed9de
--- /dev/null
+++ b/src/main/java/com/jsh/erp/controller/UserController.java
@@ -0,0 +1,500 @@
+package com.jsh.erp.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.Tenant;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.entities.UserEx;
+import com.jsh.erp.datasource.vo.TreeNodeEx;
+import com.jsh.erp.exception.BusinessParamCheckingException;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.service.redis.RedisService;
+import com.jsh.erp.service.role.RoleService;
+import com.jsh.erp.service.tenant.TenantService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ErpInfo;
+import com.jsh.erp.utils.RandImageUtil;
+import com.jsh.erp.utils.Tools;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;
+
+/**
+ * @author ji_sheng_hua 云游管理系统
+ */
+@RestController
+@RequestMapping(value = "/user")
+@Api(tags = {"用户管理"})
+public class UserController {
+    private Logger logger = LoggerFactory.getLogger(UserController.class);
+
+    @Value("${manage.roleId}")
+    private Integer manageRoleId;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private RoleService roleService;
+
+    @Resource
+    private TenantService tenantService;
+
+    @Resource
+    private RedisService redisService;
+
+    private static String SUCCESS = "操作成功";
+    private static String ERROR = "操作失败";
+
+    @PostMapping(value = "/login")
+    @ApiOperation(value = "登录")
+    public BaseResponseInfo login(@RequestBody UserEx userParam, HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            userService.validateCaptcha(userParam.getCode(), userParam.getUuid());
+            Map<String, Object> data = userService.login(userParam.getLoginName().trim(), userParam.getPassword().trim(), request);
+            res.code = 200;
+            res.data = data;
+        } catch (BusinessRunTimeException e) {
+            throw new BusinessRunTimeException(e.getCode(), e.getMessage());
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "用户登录失败";
+        }
+        return res;
+    }
+
+    @PostMapping(value = "/weixinLogin")
+    @ApiOperation(value = "微信登录")
+    public BaseResponseInfo weixinLogin(@RequestBody JSONObject jsonObject,
+                                  HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            String weixinCode = jsonObject.getString("weixinCode");
+            User user = userService.getUserByWeixinCode(weixinCode);
+            if(user == null) {
+                res.code = 501;
+                res.data = "微信未绑定";
+            } else {
+                logger.info("微信登录:" + user.getLoginName());
+                Map<String, Object> data = userService.login(user.getLoginName().trim(), user.getPassword().trim(), request);
+                res.code = 200;
+                res.data = data;
+            }
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "用户登录失败";
+        }
+        return res;
+    }
+
+    @PostMapping(value = "/weixinBind")
+    @ApiOperation(value = "绑定微信")
+    public String weixinBind(@RequestBody JSONObject jsonObject,
+                             HttpServletRequest request)throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        String loginName = jsonObject.getString("loginName");
+        String password = jsonObject.getString("password");
+        String weixinCode = jsonObject.getString("weixinCode");
+        int res = userService.weixinBind(loginName, password, weixinCode);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    @GetMapping(value = "/getUserSession")
+    @ApiOperation(value = "获取用户信息")
+    public BaseResponseInfo getSessionUser(HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> data = new HashMap<>();
+            Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
+            User user = userService.getUser(userId);
+            user.setPassword(null);
+            data.put("user", user);
+            res.code = 200;
+            res.data = data;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取session失败";
+        }
+        return res;
+    }
+
+    @GetMapping(value = "/logout")
+    @ApiOperation(value = "退出")
+    public BaseResponseInfo logout(HttpServletRequest request, HttpServletResponse response)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            redisService.deleteObjectBySession(request,"userId");
+            redisService.deleteObjectBySession(request,"clientIp");
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "退出失败";
+        }
+        return res;
+    }
+
+    @PostMapping(value = "/resetPwd")
+    @ApiOperation(value = "重置密码")
+    public String resetPwd(@RequestBody JSONObject jsonObject,
+                                     HttpServletRequest request) throws Exception {
+        Map<String, Object> objectMap = new HashMap<>();
+        Long id = jsonObject.getLong("id");
+        String password = "123456";
+        String md5Pwd = Tools.md5Encryp(password);
+        int update = userService.resetPwd(md5Pwd, id);
+        if(update > 0) {
+            return returnJson(objectMap, SUCCESS, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ERROR, ErpInfo.ERROR.code);
+        }
+    }
+
+    @PutMapping(value = "/updatePwd")
+    @ApiOperation(value = "更新密码")
+    public String updatePwd(@RequestBody JSONObject jsonObject, HttpServletRequest request)throws Exception {
+        Integer flag = 0;
+        Map<String, Object> objectMap = new HashMap<String, Object>();
+        try {
+            String info = "";
+            Long userId = jsonObject.getLong("userId");
+            String oldpwd = jsonObject.getString("oldpassword");
+            String password = jsonObject.getString("password");
+            User user = userService.getUser(userId);
+            //必须和原始密码一致才可以更新密码
+            if (oldpwd.equalsIgnoreCase(user.getPassword())) {
+                user.setPassword(password);
+                flag = userService.updateUserByObj(user); //1-成功
+                info = "修改成功";
+            } else {
+                flag = 2; //原始密码输入错误
+                info = "原始密码输入错误";
+            }
+            objectMap.put("status", flag);
+            if(flag > 0) {
+                return returnJson(objectMap, info, ErpInfo.OK.code);
+            } else {
+                return returnJson(objectMap, ERROR, ErpInfo.ERROR.code);
+            }
+        } catch (Exception e) {
+            logger.error(">>>>>>>>>>>>>修改用户ID为 : " + jsonObject.getLong("userId") + "密码信息失败", e);
+            flag = 3;
+            objectMap.put("status", flag);
+            return returnJson(objectMap, ERROR, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 用户列表,用于用户下拉框
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getUserList")
+    @ApiOperation(value = "用户列表")
+    public JSONArray getUserList(HttpServletRequest request)throws Exception {
+        JSONArray dataArray = new JSONArray();
+        try {
+            List<User> dataList = userService.getUser(request);
+            if (null != dataList) {
+                for (User user : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", user.getId());
+                    item.put("userName", user.getUsername());
+                    dataArray.add(item);
+                }
+            }
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+        }
+        return dataArray;
+    }
+
+    /**
+     * create by: cjl
+     * description:
+     *  新增用户及机构和用户关系
+     * create time: 2019/3/8 16:06
+     * @Param: beanJson
+     * @return java.lang.Object
+     */
+    @PostMapping("/addUser")
+    @ApiOperation(value = "新增用户")
+    @ResponseBody
+    public Object addUser(@RequestBody JSONObject obj, HttpServletRequest request)throws Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        User userInfo = userService.getCurrentUser();
+        Tenant tenant = tenantService.getTenantByTenantId(userInfo.getTenantId());
+        Long count = userService.countUser(null,null);
+        if(tenant!=null) {
+            if(count>= tenant.getUserNumLimit()) {
+                throw new BusinessParamCheckingException(ExceptionConstants.USER_OVER_LIMIT_FAILED_CODE,
+                        ExceptionConstants.USER_OVER_LIMIT_FAILED_MSG);
+            } else {
+                UserEx ue= JSONObject.parseObject(obj.toJSONString(), UserEx.class);
+                userService.addUserAndOrgUserRel(ue, request);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * create by: cjl
+     * description:
+     *  修改用户及机构和用户关系
+     * create time: 2019/3/8 16:06
+     * @Param: beanJson
+     * @return java.lang.Object
+     */
+    @PutMapping("/updateUser")
+    @ApiOperation(value = "修改用户")
+    @ResponseBody
+    public Object updateUser(@RequestBody JSONObject obj, HttpServletRequest request)throws Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        UserEx ue= JSONObject.parseObject(obj.toJSONString(), UserEx.class);
+        userService.updateUserAndOrgUserRel(ue, request);
+        return result;
+    }
+
+    /**
+     * 注册用户
+     * @param ue
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/registerUser")
+    @ApiOperation(value = "注册用户")
+    public Object registerUser(@RequestBody UserEx ue,
+                               HttpServletRequest request)throws Exception{
+        JSONObject result = ExceptionConstants.standardSuccess();
+        ue.setUsername(ue.getLoginName());
+        userService.validateCaptcha(ue.getCode(), ue.getUuid());
+        userService.checkLoginName(ue); //检查登录名
+        userService.registerUser(ue,manageRoleId,request);
+        return result;
+    }
+
+    /**
+     * 获取机构用户树
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping("/getOrganizationUserTree")
+    @ApiOperation(value = "获取机构用户树")
+    public JSONArray getOrganizationUserTree()throws Exception{
+        JSONArray arr=new JSONArray();
+        List<TreeNodeEx> organizationUserTree= userService.getOrganizationUserTree();
+        if(organizationUserTree!=null&&organizationUserTree.size()>0){
+            for(TreeNodeEx node:organizationUserTree){
+                String str=JSON.toJSONString(node);
+                JSONObject obj=JSON.parseObject(str);
+                arr.add(obj) ;
+            }
+        }
+        return arr;
+    }
+
+    @GetMapping(value = "/getCurrentPriceLimit")
+    @ApiOperation(value = "查询当前用户的价格屏蔽")
+    public BaseResponseInfo getCurrentPriceLimit(HttpServletRequest request)throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> data = new HashMap<>();
+            String priceLimit = roleService.getCurrentPriceLimit(request);
+            data.put("priceLimit", priceLimit);
+            res.code = 200;
+            res.data = data;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取session失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取当前用户的角色类型
+     * @param request
+     * @return
+     */
+    @GetMapping("/getRoleTypeByCurrentUser")
+    @ApiOperation(value = "获取当前用户的角色类型")
+    public BaseResponseInfo getRoleTypeByCurrentUser(HttpServletRequest request) {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> data = new HashMap<String, Object>();
+            Long userId = userService.getUserId(request);
+            String roleType = userService.getRoleTypeByUserId(userId).getType(); //角色类型
+            data.put("roleType", roleType);
+            res.code = 200;
+            res.data = data;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取当前用户的按钮权限
+     * @param request
+     * @return
+     */
+    @GetMapping("/getUserBtnByCurrentUser")
+    @ApiOperation(value = "获取当前用户的按钮权限")
+    public BaseResponseInfo getUserBtnByCurrentUser(HttpServletRequest request) {
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> data = new HashMap<>();
+            Long userId = userService.getUserId(request);
+            String loginName = userService.getUser(userId).getLoginName();
+            JSONArray btnStrArr = userService.getBtnStrArrById(userId);
+            if(!"admin".equals(loginName)) {
+                data.put("userBtn", btnStrArr);
+            }
+            res.code = 200;
+            res.data = data;
+        } catch(Exception e){
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取随机校验码【后续会废弃】
+     * @param response
+     * @param key
+     * @return
+     */
+    @GetMapping(value = "/randomImage/{key}")
+    @ApiOperation(value = "获取随机校验码【后续会废弃】")
+    public BaseResponseInfo randomImage(HttpServletResponse response,@PathVariable String key){
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> data = new HashMap<>();
+            String codeNum = Tools.getCharAndNum(4);
+            String base64 = RandImageUtil.generate(codeNum);
+            data.put("codeNum", codeNum);
+            data.put("base64", base64);
+            res.code = 200;
+            res.data = data;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取失败";
+        }
+        return res;
+    }
+
+    /**
+     * 获取随机校验码
+     * @param response
+     * @return
+     */
+    @GetMapping(value = "/randomImage")
+    @ApiOperation(value = "获取随机校验码")
+    public BaseResponseInfo randomImage(HttpServletResponse response){
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> data = new HashMap<>();
+            String uuid = UUID.randomUUID().toString().replaceAll("-", "") + "";
+            String verifyKey = BusinessConstants.CAPTCHA_CODE_KEY + uuid;
+            String codeNum = Tools.getCharAndNum(4);
+            redisService.storageCaptchaObject(verifyKey, codeNum);
+            String base64 = RandImageUtil.generate(codeNum);
+            data.put("uuid", uuid);
+            data.put("base64", base64);
+            res.code = 200;
+            res.data = data;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取失败";
+        }
+        return res;
+    }
+
+    /**
+     * 批量设置状态-启用或者禁用
+     * @param jsonObject
+     * @param request
+     * @return
+     */
+    @PostMapping(value = "/batchSetStatus")
+    @ApiOperation(value = "批量设置状态")
+    public String batchSetStatus(@RequestBody JSONObject jsonObject,
+                                 HttpServletRequest request)throws Exception {
+        Byte status = jsonObject.getByte("status");
+        String ids = jsonObject.getString("ids");
+        Map<String, Object> objectMap = new HashMap<>();
+        int res = userService.batchSetStatus(status, ids, request);
+        if(res > 0) {
+            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
+        } else {
+            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
+        }
+    }
+
+    /**
+     * 获取当前用户的用户数量和租户信息
+     * @param request
+     * @return
+     */
+    @GetMapping(value = "/infoWithTenant")
+    @ApiOperation(value = "获取当前用户的用户数量和租户信息")
+    public BaseResponseInfo infoWithTenant(HttpServletRequest request){
+        BaseResponseInfo res = new BaseResponseInfo();
+        try {
+            Map<String, Object> data = new HashMap<>();
+            Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
+            User user = userService.getUser(userId);
+            //获取当前用户数
+            int userCurrentNum = userService.getUser(request).size();
+            Tenant tenant = tenantService.getTenantByTenantId(user.getTenantId());
+            if(tenant.getExpireTime()!=null && tenant.getExpireTime().getTime()<System.currentTimeMillis()){
+                //租户已经过期,移除token
+                redisService.deleteObjectBySession(request,"userId");
+                redisService.deleteObjectBySession(request,"clientIp");
+            }
+            data.put("type", tenant.getType()); //租户类型,0免费租户,1付费租户
+            data.put("expireTime", Tools.parseDateToStr(tenant.getExpireTime()));
+            data.put("userCurrentNum", userCurrentNum);
+            data.put("userNumLimit", tenant.getUserNumLimit());
+            data.put("tenantId", tenant.getTenantId());
+            res.code = 200;
+            res.data = data;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            res.code = 500;
+            res.data = "获取失败";
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Account.java b/src/main/java/com/jsh/erp/datasource/entities/Account.java
new file mode 100644
index 0000000..e97228a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Account.java
@@ -0,0 +1,115 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class Account {
+    private Long id;
+
+    private String name;
+
+    private String serialNo;
+
+    private BigDecimal initialAmount;
+
+    private BigDecimal currentAmount;
+
+    private String remark;
+
+    private Boolean enabled;
+
+    private String sort;
+
+    private Boolean isDefault;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getSerialNo() {
+        return serialNo;
+    }
+
+    public void setSerialNo(String serialNo) {
+        this.serialNo = serialNo == null ? null : serialNo.trim();
+    }
+
+    public BigDecimal getInitialAmount() {
+        return initialAmount;
+    }
+
+    public void setInitialAmount(BigDecimal initialAmount) {
+        this.initialAmount = initialAmount;
+    }
+
+    public BigDecimal getCurrentAmount() {
+        return currentAmount;
+    }
+
+    public void setCurrentAmount(BigDecimal currentAmount) {
+        this.currentAmount = currentAmount;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public Boolean getIsDefault() {
+        return isDefault;
+    }
+
+    public void setIsDefault(Boolean isDefault) {
+        this.isDefault = isDefault;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountExample.java b/src/main/java/com/jsh/erp/datasource/entities/AccountExample.java
new file mode 100644
index 0000000..a2a00a6
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountExample.java
@@ -0,0 +1,910 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class AccountExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public AccountExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoIsNull() {
+            addCriterion("serial_no is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoIsNotNull() {
+            addCriterion("serial_no is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoEqualTo(String value) {
+            addCriterion("serial_no =", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotEqualTo(String value) {
+            addCriterion("serial_no <>", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoGreaterThan(String value) {
+            addCriterion("serial_no >", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoGreaterThanOrEqualTo(String value) {
+            addCriterion("serial_no >=", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoLessThan(String value) {
+            addCriterion("serial_no <", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoLessThanOrEqualTo(String value) {
+            addCriterion("serial_no <=", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoLike(String value) {
+            addCriterion("serial_no like", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotLike(String value) {
+            addCriterion("serial_no not like", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoIn(List<String> values) {
+            addCriterion("serial_no in", values, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotIn(List<String> values) {
+            addCriterion("serial_no not in", values, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoBetween(String value1, String value2) {
+            addCriterion("serial_no between", value1, value2, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotBetween(String value1, String value2) {
+            addCriterion("serial_no not between", value1, value2, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountIsNull() {
+            addCriterion("initial_amount is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountIsNotNull() {
+            addCriterion("initial_amount is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountEqualTo(BigDecimal value) {
+            addCriterion("initial_amount =", value, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountNotEqualTo(BigDecimal value) {
+            addCriterion("initial_amount <>", value, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountGreaterThan(BigDecimal value) {
+            addCriterion("initial_amount >", value, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("initial_amount >=", value, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountLessThan(BigDecimal value) {
+            addCriterion("initial_amount <", value, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("initial_amount <=", value, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountIn(List<BigDecimal> values) {
+            addCriterion("initial_amount in", values, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountNotIn(List<BigDecimal> values) {
+            addCriterion("initial_amount not in", values, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("initial_amount between", value1, value2, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andInitialAmountNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("initial_amount not between", value1, value2, "initialAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountIsNull() {
+            addCriterion("current_amount is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountIsNotNull() {
+            addCriterion("current_amount is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountEqualTo(BigDecimal value) {
+            addCriterion("current_amount =", value, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountNotEqualTo(BigDecimal value) {
+            addCriterion("current_amount <>", value, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountGreaterThan(BigDecimal value) {
+            addCriterion("current_amount >", value, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("current_amount >=", value, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountLessThan(BigDecimal value) {
+            addCriterion("current_amount <", value, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("current_amount <=", value, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountIn(List<BigDecimal> values) {
+            addCriterion("current_amount in", values, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountNotIn(List<BigDecimal> values) {
+            addCriterion("current_amount not in", values, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("current_amount between", value1, value2, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentAmountNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("current_amount not between", value1, value2, "currentAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultIsNull() {
+            addCriterion("is_default is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultIsNotNull() {
+            addCriterion("is_default is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultEqualTo(Boolean value) {
+            addCriterion("is_default =", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultNotEqualTo(Boolean value) {
+            addCriterion("is_default <>", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultGreaterThan(Boolean value) {
+            addCriterion("is_default >", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("is_default >=", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultLessThan(Boolean value) {
+            addCriterion("is_default <", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultLessThanOrEqualTo(Boolean value) {
+            addCriterion("is_default <=", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultIn(List<Boolean> values) {
+            addCriterion("is_default in", values, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultNotIn(List<Boolean> values) {
+            addCriterion("is_default not in", values, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultBetween(Boolean value1, Boolean value2) {
+            addCriterion("is_default between", value1, value2, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("is_default not between", value1, value2, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountHead.java b/src/main/java/com/jsh/erp/datasource/entities/AccountHead.java
new file mode 100644
index 0000000..6513c95
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountHead.java
@@ -0,0 +1,176 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class AccountHead {
+    private Long id;
+
+    private String type;
+
+    private Long organId;
+
+    private Long handsPersonId;
+
+    private Long creator;
+
+    private BigDecimal changeAmount;
+
+    private BigDecimal discountMoney;
+
+    private BigDecimal totalPrice;
+
+    private Long accountId;
+
+    private String billNo;
+
+    private Date billTime;
+
+    private String remark;
+
+    private String fileName;
+
+    private String status;
+
+    private String source;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public Long getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Long organId) {
+        this.organId = organId;
+    }
+
+    public Long getHandsPersonId() {
+        return handsPersonId;
+    }
+
+    public void setHandsPersonId(Long handsPersonId) {
+        this.handsPersonId = handsPersonId;
+    }
+
+    public Long getCreator() {
+        return creator;
+    }
+
+    public void setCreator(Long creator) {
+        this.creator = creator;
+    }
+
+    public BigDecimal getChangeAmount() {
+        return changeAmount;
+    }
+
+    public void setChangeAmount(BigDecimal changeAmount) {
+        this.changeAmount = changeAmount;
+    }
+
+    public BigDecimal getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(BigDecimal discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public BigDecimal getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(BigDecimal totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getBillNo() {
+        return billNo;
+    }
+
+    public void setBillNo(String billNo) {
+        this.billNo = billNo == null ? null : billNo.trim();
+    }
+
+    public Date getBillTime() {
+        return billTime;
+    }
+
+    public void setBillTime(Date billTime) {
+        this.billTime = billTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName == null ? null : fileName.trim();
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status == null ? null : status.trim();
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source == null ? null : source.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountHeadExample.java b/src/main/java/com/jsh/erp/datasource/entities/AccountHeadExample.java
new file mode 100644
index 0000000..2d37bfc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountHeadExample.java
@@ -0,0 +1,1291 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class AccountHeadExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public AccountHeadExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdIsNull() {
+            addCriterion("organ_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdIsNotNull() {
+            addCriterion("organ_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdEqualTo(Long value) {
+            addCriterion("organ_id =", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdNotEqualTo(Long value) {
+            addCriterion("organ_id <>", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdGreaterThan(Long value) {
+            addCriterion("organ_id >", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("organ_id >=", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdLessThan(Long value) {
+            addCriterion("organ_id <", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdLessThanOrEqualTo(Long value) {
+            addCriterion("organ_id <=", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdIn(List<Long> values) {
+            addCriterion("organ_id in", values, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdNotIn(List<Long> values) {
+            addCriterion("organ_id not in", values, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdBetween(Long value1, Long value2) {
+            addCriterion("organ_id between", value1, value2, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdNotBetween(Long value1, Long value2) {
+            addCriterion("organ_id not between", value1, value2, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdIsNull() {
+            addCriterion("hands_person_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdIsNotNull() {
+            addCriterion("hands_person_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdEqualTo(Long value) {
+            addCriterion("hands_person_id =", value, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdNotEqualTo(Long value) {
+            addCriterion("hands_person_id <>", value, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdGreaterThan(Long value) {
+            addCriterion("hands_person_id >", value, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("hands_person_id >=", value, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdLessThan(Long value) {
+            addCriterion("hands_person_id <", value, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdLessThanOrEqualTo(Long value) {
+            addCriterion("hands_person_id <=", value, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdIn(List<Long> values) {
+            addCriterion("hands_person_id in", values, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdNotIn(List<Long> values) {
+            addCriterion("hands_person_id not in", values, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdBetween(Long value1, Long value2) {
+            addCriterion("hands_person_id between", value1, value2, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHandsPersonIdNotBetween(Long value1, Long value2) {
+            addCriterion("hands_person_id not between", value1, value2, "handsPersonId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNull() {
+            addCriterion("creator is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNotNull() {
+            addCriterion("creator is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorEqualTo(Long value) {
+            addCriterion("creator =", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotEqualTo(Long value) {
+            addCriterion("creator <>", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThan(Long value) {
+            addCriterion("creator >", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThanOrEqualTo(Long value) {
+            addCriterion("creator >=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThan(Long value) {
+            addCriterion("creator <", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThanOrEqualTo(Long value) {
+            addCriterion("creator <=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIn(List<Long> values) {
+            addCriterion("creator in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotIn(List<Long> values) {
+            addCriterion("creator not in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorBetween(Long value1, Long value2) {
+            addCriterion("creator between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotBetween(Long value1, Long value2) {
+            addCriterion("creator not between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountIsNull() {
+            addCriterion("change_amount is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountIsNotNull() {
+            addCriterion("change_amount is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountEqualTo(BigDecimal value) {
+            addCriterion("change_amount =", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountNotEqualTo(BigDecimal value) {
+            addCriterion("change_amount <>", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountGreaterThan(BigDecimal value) {
+            addCriterion("change_amount >", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("change_amount >=", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountLessThan(BigDecimal value) {
+            addCriterion("change_amount <", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("change_amount <=", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountIn(List<BigDecimal> values) {
+            addCriterion("change_amount in", values, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountNotIn(List<BigDecimal> values) {
+            addCriterion("change_amount not in", values, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("change_amount between", value1, value2, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("change_amount not between", value1, value2, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyIsNull() {
+            addCriterion("discount_money is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyIsNotNull() {
+            addCriterion("discount_money is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyEqualTo(BigDecimal value) {
+            addCriterion("discount_money =", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyNotEqualTo(BigDecimal value) {
+            addCriterion("discount_money <>", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyGreaterThan(BigDecimal value) {
+            addCriterion("discount_money >", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount_money >=", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyLessThan(BigDecimal value) {
+            addCriterion("discount_money <", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount_money <=", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyIn(List<BigDecimal> values) {
+            addCriterion("discount_money in", values, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyNotIn(List<BigDecimal> values) {
+            addCriterion("discount_money not in", values, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount_money between", value1, value2, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount_money not between", value1, value2, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceIsNull() {
+            addCriterion("total_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceIsNotNull() {
+            addCriterion("total_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceEqualTo(BigDecimal value) {
+            addCriterion("total_price =", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceNotEqualTo(BigDecimal value) {
+            addCriterion("total_price <>", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceGreaterThan(BigDecimal value) {
+            addCriterion("total_price >", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("total_price >=", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceLessThan(BigDecimal value) {
+            addCriterion("total_price <", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("total_price <=", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceIn(List<BigDecimal> values) {
+            addCriterion("total_price in", values, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceNotIn(List<BigDecimal> values) {
+            addCriterion("total_price not in", values, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("total_price between", value1, value2, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("total_price not between", value1, value2, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIsNull() {
+            addCriterion("account_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIsNotNull() {
+            addCriterion("account_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdEqualTo(Long value) {
+            addCriterion("account_id =", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotEqualTo(Long value) {
+            addCriterion("account_id <>", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdGreaterThan(Long value) {
+            addCriterion("account_id >", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("account_id >=", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdLessThan(Long value) {
+            addCriterion("account_id <", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdLessThanOrEqualTo(Long value) {
+            addCriterion("account_id <=", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIn(List<Long> values) {
+            addCriterion("account_id in", values, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotIn(List<Long> values) {
+            addCriterion("account_id not in", values, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdBetween(Long value1, Long value2) {
+            addCriterion("account_id between", value1, value2, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotBetween(Long value1, Long value2) {
+            addCriterion("account_id not between", value1, value2, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoIsNull() {
+            addCriterion("bill_no is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoIsNotNull() {
+            addCriterion("bill_no is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoEqualTo(String value) {
+            addCriterion("bill_no =", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoNotEqualTo(String value) {
+            addCriterion("bill_no <>", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoGreaterThan(String value) {
+            addCriterion("bill_no >", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoGreaterThanOrEqualTo(String value) {
+            addCriterion("bill_no >=", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoLessThan(String value) {
+            addCriterion("bill_no <", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoLessThanOrEqualTo(String value) {
+            addCriterion("bill_no <=", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoLike(String value) {
+            addCriterion("bill_no like", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoNotLike(String value) {
+            addCriterion("bill_no not like", value, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoIn(List<String> values) {
+            addCriterion("bill_no in", values, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoNotIn(List<String> values) {
+            addCriterion("bill_no not in", values, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoBetween(String value1, String value2) {
+            addCriterion("bill_no between", value1, value2, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillNoNotBetween(String value1, String value2) {
+            addCriterion("bill_no not between", value1, value2, "billNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeIsNull() {
+            addCriterion("bill_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeIsNotNull() {
+            addCriterion("bill_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeEqualTo(Date value) {
+            addCriterion("bill_time =", value, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeNotEqualTo(Date value) {
+            addCriterion("bill_time <>", value, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeGreaterThan(Date value) {
+            addCriterion("bill_time >", value, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("bill_time >=", value, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeLessThan(Date value) {
+            addCriterion("bill_time <", value, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeLessThanOrEqualTo(Date value) {
+            addCriterion("bill_time <=", value, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeIn(List<Date> values) {
+            addCriterion("bill_time in", values, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeNotIn(List<Date> values) {
+            addCriterion("bill_time not in", values, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeBetween(Date value1, Date value2) {
+            addCriterion("bill_time between", value1, value2, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTimeNotBetween(Date value1, Date value2) {
+            addCriterion("bill_time not between", value1, value2, "billTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameIsNull() {
+            addCriterion("file_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameIsNotNull() {
+            addCriterion("file_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameEqualTo(String value) {
+            addCriterion("file_name =", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotEqualTo(String value) {
+            addCriterion("file_name <>", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameGreaterThan(String value) {
+            addCriterion("file_name >", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameGreaterThanOrEqualTo(String value) {
+            addCriterion("file_name >=", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameLessThan(String value) {
+            addCriterion("file_name <", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameLessThanOrEqualTo(String value) {
+            addCriterion("file_name <=", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameLike(String value) {
+            addCriterion("file_name like", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotLike(String value) {
+            addCriterion("file_name not like", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameIn(List<String> values) {
+            addCriterion("file_name in", values, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotIn(List<String> values) {
+            addCriterion("file_name not in", values, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameBetween(String value1, String value2) {
+            addCriterion("file_name between", value1, value2, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotBetween(String value1, String value2) {
+            addCriterion("file_name not between", value1, value2, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(String value) {
+            addCriterion("status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(String value) {
+            addCriterion("status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(String value) {
+            addCriterion("status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(String value) {
+            addCriterion("status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(String value) {
+            addCriterion("status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(String value) {
+            addCriterion("status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLike(String value) {
+            addCriterion("status like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotLike(String value) {
+            addCriterion("status not like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<String> values) {
+            addCriterion("status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<String> values) {
+            addCriterion("status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(String value1, String value2) {
+            addCriterion("status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(String value1, String value2) {
+            addCriterion("status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNull() {
+            addCriterion("source is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNotNull() {
+            addCriterion("source is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceEqualTo(String value) {
+            addCriterion("source =", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotEqualTo(String value) {
+            addCriterion("source <>", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThan(String value) {
+            addCriterion("source >", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThanOrEqualTo(String value) {
+            addCriterion("source >=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThan(String value) {
+            addCriterion("source <", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThanOrEqualTo(String value) {
+            addCriterion("source <=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLike(String value) {
+            addCriterion("source like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotLike(String value) {
+            addCriterion("source not like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIn(List<String> values) {
+            addCriterion("source in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotIn(List<String> values) {
+            addCriterion("source not in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceBetween(String value1, String value2) {
+            addCriterion("source between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotBetween(String value1, String value2) {
+            addCriterion("source not between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4Body.java b/src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4Body.java
new file mode 100644
index 0000000..fd3c9b7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4Body.java
@@ -0,0 +1,34 @@
+package com.jsh.erp.datasource.entities;
+
+public class AccountHeadVo4Body {
+
+    private Long id;
+
+    private String info;
+
+    private String rows;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public void setInfo(String info) {
+        this.info = info;
+    }
+
+    public String getRows() {
+        return rows;
+    }
+
+    public void setRows(String rows) {
+        this.rows = rows;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4ListEx.java b/src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4ListEx.java
new file mode 100644
index 0000000..fdc803f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountHeadVo4ListEx.java
@@ -0,0 +1,57 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class AccountHeadVo4ListEx extends AccountHead{
+
+    private String organName;
+
+    private String handsPersonName;
+
+    private String userName;
+
+    private String accountName;
+
+    private String billTimeStr;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getHandsPersonName() {
+        return handsPersonName;
+    }
+
+    public void setHandsPersonName(String handsPersonName) {
+        this.handsPersonName = handsPersonName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public String getBillTimeStr() {
+        return billTimeStr;
+    }
+
+    public void setBillTimeStr(String billTimeStr) {
+        this.billTimeStr = billTimeStr;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountItem.java b/src/main/java/com/jsh/erp/datasource/entities/AccountItem.java
new file mode 100644
index 0000000..4dfe478
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountItem.java
@@ -0,0 +1,115 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class AccountItem {
+    private Long id;
+
+    private Long headerId;
+
+    private Long accountId;
+
+    private Long inOutItemId;
+
+    private Long billId;
+
+    private BigDecimal needDebt;
+
+    private BigDecimal finishDebt;
+
+    private BigDecimal eachAmount;
+
+    private String remark;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getHeaderId() {
+        return headerId;
+    }
+
+    public void setHeaderId(Long headerId) {
+        this.headerId = headerId;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public Long getInOutItemId() {
+        return inOutItemId;
+    }
+
+    public void setInOutItemId(Long inOutItemId) {
+        this.inOutItemId = inOutItemId;
+    }
+
+    public Long getBillId() {
+        return billId;
+    }
+
+    public void setBillId(Long billId) {
+        this.billId = billId;
+    }
+
+    public BigDecimal getNeedDebt() {
+        return needDebt;
+    }
+
+    public void setNeedDebt(BigDecimal needDebt) {
+        this.needDebt = needDebt;
+    }
+
+    public BigDecimal getFinishDebt() {
+        return finishDebt;
+    }
+
+    public void setFinishDebt(BigDecimal finishDebt) {
+        this.finishDebt = finishDebt;
+    }
+
+    public BigDecimal getEachAmount() {
+        return eachAmount;
+    }
+
+    public void setEachAmount(BigDecimal eachAmount) {
+        this.eachAmount = eachAmount;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountItemExample.java b/src/main/java/com/jsh/erp/datasource/entities/AccountItemExample.java
new file mode 100644
index 0000000..8fbc604
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountItemExample.java
@@ -0,0 +1,880 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class AccountItemExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public AccountItemExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdIsNull() {
+            addCriterion("header_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdIsNotNull() {
+            addCriterion("header_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdEqualTo(Long value) {
+            addCriterion("header_id =", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdNotEqualTo(Long value) {
+            addCriterion("header_id <>", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdGreaterThan(Long value) {
+            addCriterion("header_id >", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("header_id >=", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdLessThan(Long value) {
+            addCriterion("header_id <", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdLessThanOrEqualTo(Long value) {
+            addCriterion("header_id <=", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdIn(List<Long> values) {
+            addCriterion("header_id in", values, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdNotIn(List<Long> values) {
+            addCriterion("header_id not in", values, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdBetween(Long value1, Long value2) {
+            addCriterion("header_id between", value1, value2, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdNotBetween(Long value1, Long value2) {
+            addCriterion("header_id not between", value1, value2, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIsNull() {
+            addCriterion("account_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIsNotNull() {
+            addCriterion("account_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdEqualTo(Long value) {
+            addCriterion("account_id =", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotEqualTo(Long value) {
+            addCriterion("account_id <>", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdGreaterThan(Long value) {
+            addCriterion("account_id >", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("account_id >=", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdLessThan(Long value) {
+            addCriterion("account_id <", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdLessThanOrEqualTo(Long value) {
+            addCriterion("account_id <=", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIn(List<Long> values) {
+            addCriterion("account_id in", values, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotIn(List<Long> values) {
+            addCriterion("account_id not in", values, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdBetween(Long value1, Long value2) {
+            addCriterion("account_id between", value1, value2, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotBetween(Long value1, Long value2) {
+            addCriterion("account_id not between", value1, value2, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdIsNull() {
+            addCriterion("in_out_item_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdIsNotNull() {
+            addCriterion("in_out_item_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdEqualTo(Long value) {
+            addCriterion("in_out_item_id =", value, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdNotEqualTo(Long value) {
+            addCriterion("in_out_item_id <>", value, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdGreaterThan(Long value) {
+            addCriterion("in_out_item_id >", value, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("in_out_item_id >=", value, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdLessThan(Long value) {
+            addCriterion("in_out_item_id <", value, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdLessThanOrEqualTo(Long value) {
+            addCriterion("in_out_item_id <=", value, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdIn(List<Long> values) {
+            addCriterion("in_out_item_id in", values, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdNotIn(List<Long> values) {
+            addCriterion("in_out_item_id not in", values, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdBetween(Long value1, Long value2) {
+            addCriterion("in_out_item_id between", value1, value2, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutItemIdNotBetween(Long value1, Long value2) {
+            addCriterion("in_out_item_id not between", value1, value2, "inOutItemId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdIsNull() {
+            addCriterion("bill_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdIsNotNull() {
+            addCriterion("bill_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdEqualTo(Long value) {
+            addCriterion("bill_id =", value, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdNotEqualTo(Long value) {
+            addCriterion("bill_id <>", value, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdGreaterThan(Long value) {
+            addCriterion("bill_id >", value, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("bill_id >=", value, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdLessThan(Long value) {
+            addCriterion("bill_id <", value, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdLessThanOrEqualTo(Long value) {
+            addCriterion("bill_id <=", value, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdIn(List<Long> values) {
+            addCriterion("bill_id in", values, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdNotIn(List<Long> values) {
+            addCriterion("bill_id not in", values, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdBetween(Long value1, Long value2) {
+            addCriterion("bill_id between", value1, value2, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillIdNotBetween(Long value1, Long value2) {
+            addCriterion("bill_id not between", value1, value2, "billId");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtIsNull() {
+            addCriterion("need_debt is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtIsNotNull() {
+            addCriterion("need_debt is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtEqualTo(BigDecimal value) {
+            addCriterion("need_debt =", value, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtNotEqualTo(BigDecimal value) {
+            addCriterion("need_debt <>", value, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtGreaterThan(BigDecimal value) {
+            addCriterion("need_debt >", value, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("need_debt >=", value, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtLessThan(BigDecimal value) {
+            addCriterion("need_debt <", value, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("need_debt <=", value, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtIn(List<BigDecimal> values) {
+            addCriterion("need_debt in", values, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtNotIn(List<BigDecimal> values) {
+            addCriterion("need_debt not in", values, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("need_debt between", value1, value2, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andNeedDebtNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("need_debt not between", value1, value2, "needDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtIsNull() {
+            addCriterion("finish_debt is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtIsNotNull() {
+            addCriterion("finish_debt is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtEqualTo(BigDecimal value) {
+            addCriterion("finish_debt =", value, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtNotEqualTo(BigDecimal value) {
+            addCriterion("finish_debt <>", value, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtGreaterThan(BigDecimal value) {
+            addCriterion("finish_debt >", value, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("finish_debt >=", value, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtLessThan(BigDecimal value) {
+            addCriterion("finish_debt <", value, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("finish_debt <=", value, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtIn(List<BigDecimal> values) {
+            addCriterion("finish_debt in", values, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtNotIn(List<BigDecimal> values) {
+            addCriterion("finish_debt not in", values, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("finish_debt between", value1, value2, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andFinishDebtNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("finish_debt not between", value1, value2, "finishDebt");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountIsNull() {
+            addCriterion("each_amount is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountIsNotNull() {
+            addCriterion("each_amount is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountEqualTo(BigDecimal value) {
+            addCriterion("each_amount =", value, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountNotEqualTo(BigDecimal value) {
+            addCriterion("each_amount <>", value, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountGreaterThan(BigDecimal value) {
+            addCriterion("each_amount >", value, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("each_amount >=", value, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountLessThan(BigDecimal value) {
+            addCriterion("each_amount <", value, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("each_amount <=", value, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountIn(List<BigDecimal> values) {
+            addCriterion("each_amount in", values, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountNotIn(List<BigDecimal> values) {
+            addCriterion("each_amount not in", values, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("each_amount between", value1, value2, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andEachAmountNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("each_amount not between", value1, value2, "eachAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/AccountVo4Sum.java b/src/main/java/com/jsh/erp/datasource/entities/AccountVo4Sum.java
new file mode 100644
index 0000000..777189a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/AccountVo4Sum.java
@@ -0,0 +1,47 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class AccountVo4Sum {
+
+    private Long id;
+
+    private BigDecimal accountSum;
+
+    private BigDecimal accountSumByHead;
+
+    private BigDecimal accountSumByDetail;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public BigDecimal getAccountSum() {
+        return accountSum;
+    }
+
+    public void setAccountSum(BigDecimal accountSum) {
+        this.accountSum = accountSum;
+    }
+
+    public BigDecimal getAccountSumByHead() {
+        return accountSumByHead;
+    }
+
+    public void setAccountSumByHead(BigDecimal accountSumByHead) {
+        this.accountSumByHead = accountSumByHead;
+    }
+
+    public BigDecimal getAccountSumByDetail() {
+        return accountSumByDetail;
+    }
+
+    public void setAccountSumByDetail(BigDecimal accountSumByDetail) {
+        this.accountSumByDetail = accountSumByDetail;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Depot.java b/src/main/java/com/jsh/erp/datasource/entities/Depot.java
new file mode 100644
index 0000000..cddba08
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Depot.java
@@ -0,0 +1,135 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class Depot {
+    private Long id;
+
+    private String name;
+
+    private String address;
+
+    private BigDecimal warehousing;
+
+    private BigDecimal truckage;
+
+    private Integer type;
+
+    private String sort;
+
+    private String remark;
+
+    private Long principal;
+
+    private Boolean enabled;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    private Boolean isDefault;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address == null ? null : address.trim();
+    }
+
+    public BigDecimal getWarehousing() {
+        return warehousing;
+    }
+
+    public void setWarehousing(BigDecimal warehousing) {
+        this.warehousing = warehousing;
+    }
+
+    public BigDecimal getTruckage() {
+        return truckage;
+    }
+
+    public void setTruckage(BigDecimal truckage) {
+        this.truckage = truckage;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public Long getPrincipal() {
+        return principal;
+    }
+
+    public void setPrincipal(Long principal) {
+        this.principal = principal;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+
+    public Boolean getIsDefault() {
+        return isDefault;
+    }
+
+    public void setIsDefault(Boolean isDefault) {
+        this.isDefault = isDefault;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotEx.java b/src/main/java/com/jsh/erp/datasource/entities/DepotEx.java
new file mode 100644
index 0000000..a708061
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotEx.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.entities;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/2/25 11:40
+ */
+@Data
+public class DepotEx extends Depot{
+    //负责人名字
+    private String principalName;
+
+    private BigDecimal initStock;
+
+    private BigDecimal currentStock;
+
+    private BigDecimal lowSafeStock;
+
+    private BigDecimal highSafeStock;
+
+}
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotExample.java b/src/main/java/com/jsh/erp/datasource/entities/DepotExample.java
new file mode 100644
index 0000000..669345f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotExample.java
@@ -0,0 +1,1030 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DepotExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public DepotExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressIsNull() {
+            addCriterion("address is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressIsNotNull() {
+            addCriterion("address is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressEqualTo(String value) {
+            addCriterion("address =", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotEqualTo(String value) {
+            addCriterion("address <>", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressGreaterThan(String value) {
+            addCriterion("address >", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressGreaterThanOrEqualTo(String value) {
+            addCriterion("address >=", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressLessThan(String value) {
+            addCriterion("address <", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressLessThanOrEqualTo(String value) {
+            addCriterion("address <=", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressLike(String value) {
+            addCriterion("address like", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotLike(String value) {
+            addCriterion("address not like", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressIn(List<String> values) {
+            addCriterion("address in", values, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotIn(List<String> values) {
+            addCriterion("address not in", values, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressBetween(String value1, String value2) {
+            addCriterion("address between", value1, value2, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotBetween(String value1, String value2) {
+            addCriterion("address not between", value1, value2, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingIsNull() {
+            addCriterion("warehousing is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingIsNotNull() {
+            addCriterion("warehousing is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingEqualTo(BigDecimal value) {
+            addCriterion("warehousing =", value, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingNotEqualTo(BigDecimal value) {
+            addCriterion("warehousing <>", value, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingGreaterThan(BigDecimal value) {
+            addCriterion("warehousing >", value, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("warehousing >=", value, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingLessThan(BigDecimal value) {
+            addCriterion("warehousing <", value, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("warehousing <=", value, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingIn(List<BigDecimal> values) {
+            addCriterion("warehousing in", values, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingNotIn(List<BigDecimal> values) {
+            addCriterion("warehousing not in", values, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("warehousing between", value1, value2, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andWarehousingNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("warehousing not between", value1, value2, "warehousing");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageIsNull() {
+            addCriterion("truckage is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageIsNotNull() {
+            addCriterion("truckage is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageEqualTo(BigDecimal value) {
+            addCriterion("truckage =", value, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageNotEqualTo(BigDecimal value) {
+            addCriterion("truckage <>", value, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageGreaterThan(BigDecimal value) {
+            addCriterion("truckage >", value, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("truckage >=", value, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageLessThan(BigDecimal value) {
+            addCriterion("truckage <", value, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("truckage <=", value, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageIn(List<BigDecimal> values) {
+            addCriterion("truckage in", values, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageNotIn(List<BigDecimal> values) {
+            addCriterion("truckage not in", values, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("truckage between", value1, value2, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTruckageNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("truckage not between", value1, value2, "truckage");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(Integer value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(Integer value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(Integer value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(Integer value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(Integer value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<Integer> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<Integer> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(Integer value1, Integer value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(Integer value1, Integer value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalIsNull() {
+            addCriterion("principal is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalIsNotNull() {
+            addCriterion("principal is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalEqualTo(Long value) {
+            addCriterion("principal =", value, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalNotEqualTo(Long value) {
+            addCriterion("principal <>", value, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalGreaterThan(Long value) {
+            addCriterion("principal >", value, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalGreaterThanOrEqualTo(Long value) {
+            addCriterion("principal >=", value, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalLessThan(Long value) {
+            addCriterion("principal <", value, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalLessThanOrEqualTo(Long value) {
+            addCriterion("principal <=", value, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalIn(List<Long> values) {
+            addCriterion("principal in", values, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalNotIn(List<Long> values) {
+            addCriterion("principal not in", values, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalBetween(Long value1, Long value2) {
+            addCriterion("principal between", value1, value2, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrincipalNotBetween(Long value1, Long value2) {
+            addCriterion("principal not between", value1, value2, "principal");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_Flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_Flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_Flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_Flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_Flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_Flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_Flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_Flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_Flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_Flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_Flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_Flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_Flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_Flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultIsNull() {
+            addCriterion("is_default is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultIsNotNull() {
+            addCriterion("is_default is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultEqualTo(Boolean value) {
+            addCriterion("is_default =", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultNotEqualTo(Boolean value) {
+            addCriterion("is_default <>", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultGreaterThan(Boolean value) {
+            addCriterion("is_default >", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("is_default >=", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultLessThan(Boolean value) {
+            addCriterion("is_default <", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultLessThanOrEqualTo(Boolean value) {
+            addCriterion("is_default <=", value, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultIn(List<Boolean> values) {
+            addCriterion("is_default in", values, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultNotIn(List<Boolean> values) {
+            addCriterion("is_default not in", values, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultBetween(Boolean value1, Boolean value2) {
+            addCriterion("is_default between", value1, value2, "isDefault");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDefaultNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("is_default not between", value1, value2, "isDefault");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotHead.java b/src/main/java/com/jsh/erp/datasource/entities/DepotHead.java
new file mode 100644
index 0000000..4711cec
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotHead.java
@@ -0,0 +1,326 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DepotHead {
+    private Long id;
+
+    private String type;
+
+    private String subType;
+
+    private String defaultNumber;
+
+    private String number;
+
+    private Date createTime;
+
+    private Date operTime;
+
+    private Long organId;
+
+    private Long creator;
+
+    private Long accountId;
+
+    private BigDecimal changeAmount;
+
+    private BigDecimal backAmount;
+
+    private BigDecimal totalPrice;
+
+    private String payType;
+
+    private String billType;
+
+    private String remark;
+
+    private String fileName;
+
+    private String salesMan;
+
+    private String accountIdList;
+
+    private String accountMoneyList;
+
+    private BigDecimal discount;
+
+    private BigDecimal discountMoney;
+
+    private BigDecimal discountLastMoney;
+
+    private BigDecimal otherMoney;
+
+    private BigDecimal deposit;
+
+    private String status;
+
+    private String purchaseStatus;
+
+    private String source;
+
+    private String linkNumber;
+
+    private String linkApply;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public String getSubType() {
+        return subType;
+    }
+
+    public void setSubType(String subType) {
+        this.subType = subType == null ? null : subType.trim();
+    }
+
+    public String getDefaultNumber() {
+        return defaultNumber;
+    }
+
+    public void setDefaultNumber(String defaultNumber) {
+        this.defaultNumber = defaultNumber == null ? null : defaultNumber.trim();
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number == null ? null : number.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getOperTime() {
+        return operTime;
+    }
+
+    public void setOperTime(Date operTime) {
+        this.operTime = operTime;
+    }
+
+    public Long getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Long organId) {
+        this.organId = organId;
+    }
+
+    public Long getCreator() {
+        return creator;
+    }
+
+    public void setCreator(Long creator) {
+        this.creator = creator;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public BigDecimal getChangeAmount() {
+        return changeAmount;
+    }
+
+    public void setChangeAmount(BigDecimal changeAmount) {
+        this.changeAmount = changeAmount;
+    }
+
+    public BigDecimal getBackAmount() {
+        return backAmount;
+    }
+
+    public void setBackAmount(BigDecimal backAmount) {
+        this.backAmount = backAmount;
+    }
+
+    public BigDecimal getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(BigDecimal totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public String getPayType() {
+        return payType;
+    }
+
+    public void setPayType(String payType) {
+        this.payType = payType == null ? null : payType.trim();
+    }
+
+    public String getBillType() {
+        return billType;
+    }
+
+    public void setBillType(String billType) {
+        this.billType = billType == null ? null : billType.trim();
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName == null ? null : fileName.trim();
+    }
+
+    public String getSalesMan() {
+        return salesMan;
+    }
+
+    public void setSalesMan(String salesMan) {
+        this.salesMan = salesMan == null ? null : salesMan.trim();
+    }
+
+    public String getAccountIdList() {
+        return accountIdList;
+    }
+
+    public void setAccountIdList(String accountIdList) {
+        this.accountIdList = accountIdList == null ? null : accountIdList.trim();
+    }
+
+    public String getAccountMoneyList() {
+        return accountMoneyList;
+    }
+
+    public void setAccountMoneyList(String accountMoneyList) {
+        this.accountMoneyList = accountMoneyList == null ? null : accountMoneyList.trim();
+    }
+
+    public BigDecimal getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(BigDecimal discount) {
+        this.discount = discount;
+    }
+
+    public BigDecimal getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(BigDecimal discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public BigDecimal getDiscountLastMoney() {
+        return discountLastMoney;
+    }
+
+    public void setDiscountLastMoney(BigDecimal discountLastMoney) {
+        this.discountLastMoney = discountLastMoney;
+    }
+
+    public BigDecimal getOtherMoney() {
+        return otherMoney;
+    }
+
+    public void setOtherMoney(BigDecimal otherMoney) {
+        this.otherMoney = otherMoney;
+    }
+
+    public BigDecimal getDeposit() {
+        return deposit;
+    }
+
+    public void setDeposit(BigDecimal deposit) {
+        this.deposit = deposit;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status == null ? null : status.trim();
+    }
+
+    public String getPurchaseStatus() {
+        return purchaseStatus;
+    }
+
+    public void setPurchaseStatus(String purchaseStatus) {
+        this.purchaseStatus = purchaseStatus == null ? null : purchaseStatus.trim();
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source == null ? null : source.trim();
+    }
+
+    public String getLinkNumber() {
+        return linkNumber;
+    }
+
+    public void setLinkNumber(String linkNumber) {
+        this.linkNumber = linkNumber == null ? null : linkNumber.trim();
+    }
+
+    public String getLinkApply() {
+        return linkApply;
+    }
+
+    public void setLinkApply(String linkApply) {
+        this.linkApply = linkApply == null ? null : linkApply.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotHeadExample.java b/src/main/java/com/jsh/erp/datasource/entities/DepotHeadExample.java
new file mode 100644
index 0000000..8dcf762
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotHeadExample.java
@@ -0,0 +1,2291 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class DepotHeadExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public DepotHeadExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeIsNull() {
+            addCriterion("sub_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeIsNotNull() {
+            addCriterion("sub_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeEqualTo(String value) {
+            addCriterion("sub_type =", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeNotEqualTo(String value) {
+            addCriterion("sub_type <>", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeGreaterThan(String value) {
+            addCriterion("sub_type >", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("sub_type >=", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeLessThan(String value) {
+            addCriterion("sub_type <", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeLessThanOrEqualTo(String value) {
+            addCriterion("sub_type <=", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeLike(String value) {
+            addCriterion("sub_type like", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeNotLike(String value) {
+            addCriterion("sub_type not like", value, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeIn(List<String> values) {
+            addCriterion("sub_type in", values, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeNotIn(List<String> values) {
+            addCriterion("sub_type not in", values, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeBetween(String value1, String value2) {
+            addCriterion("sub_type between", value1, value2, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSubTypeNotBetween(String value1, String value2) {
+            addCriterion("sub_type not between", value1, value2, "subType");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberIsNull() {
+            addCriterion("default_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberIsNotNull() {
+            addCriterion("default_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberEqualTo(String value) {
+            addCriterion("default_number =", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberNotEqualTo(String value) {
+            addCriterion("default_number <>", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberGreaterThan(String value) {
+            addCriterion("default_number >", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("default_number >=", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberLessThan(String value) {
+            addCriterion("default_number <", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberLessThanOrEqualTo(String value) {
+            addCriterion("default_number <=", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberLike(String value) {
+            addCriterion("default_number like", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberNotLike(String value) {
+            addCriterion("default_number not like", value, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberIn(List<String> values) {
+            addCriterion("default_number in", values, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberNotIn(List<String> values) {
+            addCriterion("default_number not in", values, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberBetween(String value1, String value2) {
+            addCriterion("default_number between", value1, value2, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultNumberNotBetween(String value1, String value2) {
+            addCriterion("default_number not between", value1, value2, "defaultNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIsNull() {
+            addCriterion("number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIsNotNull() {
+            addCriterion("number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberEqualTo(String value) {
+            addCriterion("number =", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotEqualTo(String value) {
+            addCriterion("number <>", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberGreaterThan(String value) {
+            addCriterion("number >", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("number >=", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLessThan(String value) {
+            addCriterion("number <", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLessThanOrEqualTo(String value) {
+            addCriterion("number <=", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLike(String value) {
+            addCriterion("number like", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotLike(String value) {
+            addCriterion("number not like", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIn(List<String> values) {
+            addCriterion("number in", values, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotIn(List<String> values) {
+            addCriterion("number not in", values, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberBetween(String value1, String value2) {
+            addCriterion("number between", value1, value2, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotBetween(String value1, String value2) {
+            addCriterion("number not between", value1, value2, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeIsNull() {
+            addCriterion("oper_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeIsNotNull() {
+            addCriterion("oper_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeEqualTo(Date value) {
+            addCriterion("oper_time =", value, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeNotEqualTo(Date value) {
+            addCriterion("oper_time <>", value, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeGreaterThan(Date value) {
+            addCriterion("oper_time >", value, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("oper_time >=", value, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeLessThan(Date value) {
+            addCriterion("oper_time <", value, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeLessThanOrEqualTo(Date value) {
+            addCriterion("oper_time <=", value, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeIn(List<Date> values) {
+            addCriterion("oper_time in", values, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeNotIn(List<Date> values) {
+            addCriterion("oper_time not in", values, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeBetween(Date value1, Date value2) {
+            addCriterion("oper_time between", value1, value2, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperTimeNotBetween(Date value1, Date value2) {
+            addCriterion("oper_time not between", value1, value2, "operTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdIsNull() {
+            addCriterion("organ_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdIsNotNull() {
+            addCriterion("organ_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdEqualTo(Long value) {
+            addCriterion("organ_id =", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdNotEqualTo(Long value) {
+            addCriterion("organ_id <>", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdGreaterThan(Long value) {
+            addCriterion("organ_id >", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("organ_id >=", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdLessThan(Long value) {
+            addCriterion("organ_id <", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdLessThanOrEqualTo(Long value) {
+            addCriterion("organ_id <=", value, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdIn(List<Long> values) {
+            addCriterion("organ_id in", values, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdNotIn(List<Long> values) {
+            addCriterion("organ_id not in", values, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdBetween(Long value1, Long value2) {
+            addCriterion("organ_id between", value1, value2, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrganIdNotBetween(Long value1, Long value2) {
+            addCriterion("organ_id not between", value1, value2, "organId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNull() {
+            addCriterion("creator is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNotNull() {
+            addCriterion("creator is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorEqualTo(Long value) {
+            addCriterion("creator =", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotEqualTo(Long value) {
+            addCriterion("creator <>", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThan(Long value) {
+            addCriterion("creator >", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThanOrEqualTo(Long value) {
+            addCriterion("creator >=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThan(Long value) {
+            addCriterion("creator <", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThanOrEqualTo(Long value) {
+            addCriterion("creator <=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIn(List<Long> values) {
+            addCriterion("creator in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotIn(List<Long> values) {
+            addCriterion("creator not in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorBetween(Long value1, Long value2) {
+            addCriterion("creator between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotBetween(Long value1, Long value2) {
+            addCriterion("creator not between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIsNull() {
+            addCriterion("account_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIsNotNull() {
+            addCriterion("account_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdEqualTo(Long value) {
+            addCriterion("account_id =", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotEqualTo(Long value) {
+            addCriterion("account_id <>", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdGreaterThan(Long value) {
+            addCriterion("account_id >", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("account_id >=", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdLessThan(Long value) {
+            addCriterion("account_id <", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdLessThanOrEqualTo(Long value) {
+            addCriterion("account_id <=", value, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdIn(List<Long> values) {
+            addCriterion("account_id in", values, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotIn(List<Long> values) {
+            addCriterion("account_id not in", values, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdBetween(Long value1, Long value2) {
+            addCriterion("account_id between", value1, value2, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdNotBetween(Long value1, Long value2) {
+            addCriterion("account_id not between", value1, value2, "accountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountIsNull() {
+            addCriterion("change_amount is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountIsNotNull() {
+            addCriterion("change_amount is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountEqualTo(BigDecimal value) {
+            addCriterion("change_amount =", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountNotEqualTo(BigDecimal value) {
+            addCriterion("change_amount <>", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountGreaterThan(BigDecimal value) {
+            addCriterion("change_amount >", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("change_amount >=", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountLessThan(BigDecimal value) {
+            addCriterion("change_amount <", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("change_amount <=", value, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountIn(List<BigDecimal> values) {
+            addCriterion("change_amount in", values, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountNotIn(List<BigDecimal> values) {
+            addCriterion("change_amount not in", values, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("change_amount between", value1, value2, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andChangeAmountNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("change_amount not between", value1, value2, "changeAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountIsNull() {
+            addCriterion("back_amount is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountIsNotNull() {
+            addCriterion("back_amount is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountEqualTo(BigDecimal value) {
+            addCriterion("back_amount =", value, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountNotEqualTo(BigDecimal value) {
+            addCriterion("back_amount <>", value, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountGreaterThan(BigDecimal value) {
+            addCriterion("back_amount >", value, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("back_amount >=", value, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountLessThan(BigDecimal value) {
+            addCriterion("back_amount <", value, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("back_amount <=", value, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountIn(List<BigDecimal> values) {
+            addCriterion("back_amount in", values, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountNotIn(List<BigDecimal> values) {
+            addCriterion("back_amount not in", values, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("back_amount between", value1, value2, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackAmountNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("back_amount not between", value1, value2, "backAmount");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceIsNull() {
+            addCriterion("total_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceIsNotNull() {
+            addCriterion("total_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceEqualTo(BigDecimal value) {
+            addCriterion("total_price =", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceNotEqualTo(BigDecimal value) {
+            addCriterion("total_price <>", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceGreaterThan(BigDecimal value) {
+            addCriterion("total_price >", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("total_price >=", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceLessThan(BigDecimal value) {
+            addCriterion("total_price <", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("total_price <=", value, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceIn(List<BigDecimal> values) {
+            addCriterion("total_price in", values, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceNotIn(List<BigDecimal> values) {
+            addCriterion("total_price not in", values, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("total_price between", value1, value2, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("total_price not between", value1, value2, "totalPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeIsNull() {
+            addCriterion("pay_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeIsNotNull() {
+            addCriterion("pay_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeEqualTo(String value) {
+            addCriterion("pay_type =", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeNotEqualTo(String value) {
+            addCriterion("pay_type <>", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeGreaterThan(String value) {
+            addCriterion("pay_type >", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("pay_type >=", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeLessThan(String value) {
+            addCriterion("pay_type <", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeLessThanOrEqualTo(String value) {
+            addCriterion("pay_type <=", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeLike(String value) {
+            addCriterion("pay_type like", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeNotLike(String value) {
+            addCriterion("pay_type not like", value, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeIn(List<String> values) {
+            addCriterion("pay_type in", values, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeNotIn(List<String> values) {
+            addCriterion("pay_type not in", values, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeBetween(String value1, String value2) {
+            addCriterion("pay_type between", value1, value2, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPayTypeNotBetween(String value1, String value2) {
+            addCriterion("pay_type not between", value1, value2, "payType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeIsNull() {
+            addCriterion("bill_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeIsNotNull() {
+            addCriterion("bill_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeEqualTo(String value) {
+            addCriterion("bill_type =", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeNotEqualTo(String value) {
+            addCriterion("bill_type <>", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeGreaterThan(String value) {
+            addCriterion("bill_type >", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("bill_type >=", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeLessThan(String value) {
+            addCriterion("bill_type <", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeLessThanOrEqualTo(String value) {
+            addCriterion("bill_type <=", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeLike(String value) {
+            addCriterion("bill_type like", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeNotLike(String value) {
+            addCriterion("bill_type not like", value, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeIn(List<String> values) {
+            addCriterion("bill_type in", values, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeNotIn(List<String> values) {
+            addCriterion("bill_type not in", values, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeBetween(String value1, String value2) {
+            addCriterion("bill_type between", value1, value2, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBillTypeNotBetween(String value1, String value2) {
+            addCriterion("bill_type not between", value1, value2, "billType");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameIsNull() {
+            addCriterion("file_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameIsNotNull() {
+            addCriterion("file_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameEqualTo(String value) {
+            addCriterion("file_name =", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotEqualTo(String value) {
+            addCriterion("file_name <>", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameGreaterThan(String value) {
+            addCriterion("file_name >", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameGreaterThanOrEqualTo(String value) {
+            addCriterion("file_name >=", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameLessThan(String value) {
+            addCriterion("file_name <", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameLessThanOrEqualTo(String value) {
+            addCriterion("file_name <=", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameLike(String value) {
+            addCriterion("file_name like", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotLike(String value) {
+            addCriterion("file_name not like", value, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameIn(List<String> values) {
+            addCriterion("file_name in", values, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotIn(List<String> values) {
+            addCriterion("file_name not in", values, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameBetween(String value1, String value2) {
+            addCriterion("file_name between", value1, value2, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileNameNotBetween(String value1, String value2) {
+            addCriterion("file_name not between", value1, value2, "fileName");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManIsNull() {
+            addCriterion("sales_man is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManIsNotNull() {
+            addCriterion("sales_man is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManEqualTo(String value) {
+            addCriterion("sales_man =", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManNotEqualTo(String value) {
+            addCriterion("sales_man <>", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManGreaterThan(String value) {
+            addCriterion("sales_man >", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManGreaterThanOrEqualTo(String value) {
+            addCriterion("sales_man >=", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManLessThan(String value) {
+            addCriterion("sales_man <", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManLessThanOrEqualTo(String value) {
+            addCriterion("sales_man <=", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManLike(String value) {
+            addCriterion("sales_man like", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManNotLike(String value) {
+            addCriterion("sales_man not like", value, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManIn(List<String> values) {
+            addCriterion("sales_man in", values, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManNotIn(List<String> values) {
+            addCriterion("sales_man not in", values, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManBetween(String value1, String value2) {
+            addCriterion("sales_man between", value1, value2, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andSalesManNotBetween(String value1, String value2) {
+            addCriterion("sales_man not between", value1, value2, "salesMan");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListIsNull() {
+            addCriterion("account_id_list is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListIsNotNull() {
+            addCriterion("account_id_list is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListEqualTo(String value) {
+            addCriterion("account_id_list =", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListNotEqualTo(String value) {
+            addCriterion("account_id_list <>", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListGreaterThan(String value) {
+            addCriterion("account_id_list >", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListGreaterThanOrEqualTo(String value) {
+            addCriterion("account_id_list >=", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListLessThan(String value) {
+            addCriterion("account_id_list <", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListLessThanOrEqualTo(String value) {
+            addCriterion("account_id_list <=", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListLike(String value) {
+            addCriterion("account_id_list like", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListNotLike(String value) {
+            addCriterion("account_id_list not like", value, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListIn(List<String> values) {
+            addCriterion("account_id_list in", values, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListNotIn(List<String> values) {
+            addCriterion("account_id_list not in", values, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListBetween(String value1, String value2) {
+            addCriterion("account_id_list between", value1, value2, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountIdListNotBetween(String value1, String value2) {
+            addCriterion("account_id_list not between", value1, value2, "accountIdList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListIsNull() {
+            addCriterion("account_money_list is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListIsNotNull() {
+            addCriterion("account_money_list is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListEqualTo(String value) {
+            addCriterion("account_money_list =", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListNotEqualTo(String value) {
+            addCriterion("account_money_list <>", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListGreaterThan(String value) {
+            addCriterion("account_money_list >", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListGreaterThanOrEqualTo(String value) {
+            addCriterion("account_money_list >=", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListLessThan(String value) {
+            addCriterion("account_money_list <", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListLessThanOrEqualTo(String value) {
+            addCriterion("account_money_list <=", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListLike(String value) {
+            addCriterion("account_money_list like", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListNotLike(String value) {
+            addCriterion("account_money_list not like", value, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListIn(List<String> values) {
+            addCriterion("account_money_list in", values, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListNotIn(List<String> values) {
+            addCriterion("account_money_list not in", values, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListBetween(String value1, String value2) {
+            addCriterion("account_money_list between", value1, value2, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountMoneyListNotBetween(String value1, String value2) {
+            addCriterion("account_money_list not between", value1, value2, "accountMoneyList");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountIsNull() {
+            addCriterion("discount is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountIsNotNull() {
+            addCriterion("discount is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountEqualTo(BigDecimal value) {
+            addCriterion("discount =", value, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountNotEqualTo(BigDecimal value) {
+            addCriterion("discount <>", value, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountGreaterThan(BigDecimal value) {
+            addCriterion("discount >", value, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount >=", value, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLessThan(BigDecimal value) {
+            addCriterion("discount <", value, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount <=", value, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountIn(List<BigDecimal> values) {
+            addCriterion("discount in", values, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountNotIn(List<BigDecimal> values) {
+            addCriterion("discount not in", values, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount between", value1, value2, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount not between", value1, value2, "discount");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyIsNull() {
+            addCriterion("discount_money is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyIsNotNull() {
+            addCriterion("discount_money is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyEqualTo(BigDecimal value) {
+            addCriterion("discount_money =", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyNotEqualTo(BigDecimal value) {
+            addCriterion("discount_money <>", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyGreaterThan(BigDecimal value) {
+            addCriterion("discount_money >", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount_money >=", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyLessThan(BigDecimal value) {
+            addCriterion("discount_money <", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount_money <=", value, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyIn(List<BigDecimal> values) {
+            addCriterion("discount_money in", values, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyNotIn(List<BigDecimal> values) {
+            addCriterion("discount_money not in", values, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount_money between", value1, value2, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountMoneyNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount_money not between", value1, value2, "discountMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyIsNull() {
+            addCriterion("discount_last_money is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyIsNotNull() {
+            addCriterion("discount_last_money is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyEqualTo(BigDecimal value) {
+            addCriterion("discount_last_money =", value, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyNotEqualTo(BigDecimal value) {
+            addCriterion("discount_last_money <>", value, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyGreaterThan(BigDecimal value) {
+            addCriterion("discount_last_money >", value, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount_last_money >=", value, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyLessThan(BigDecimal value) {
+            addCriterion("discount_last_money <", value, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("discount_last_money <=", value, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyIn(List<BigDecimal> values) {
+            addCriterion("discount_last_money in", values, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyNotIn(List<BigDecimal> values) {
+            addCriterion("discount_last_money not in", values, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount_last_money between", value1, value2, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDiscountLastMoneyNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("discount_last_money not between", value1, value2, "discountLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyIsNull() {
+            addCriterion("other_money is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyIsNotNull() {
+            addCriterion("other_money is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyEqualTo(BigDecimal value) {
+            addCriterion("other_money =", value, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyNotEqualTo(BigDecimal value) {
+            addCriterion("other_money <>", value, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyGreaterThan(BigDecimal value) {
+            addCriterion("other_money >", value, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("other_money >=", value, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyLessThan(BigDecimal value) {
+            addCriterion("other_money <", value, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("other_money <=", value, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyIn(List<BigDecimal> values) {
+            addCriterion("other_money in", values, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyNotIn(List<BigDecimal> values) {
+            addCriterion("other_money not in", values, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("other_money between", value1, value2, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherMoneyNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("other_money not between", value1, value2, "otherMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositIsNull() {
+            addCriterion("deposit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositIsNotNull() {
+            addCriterion("deposit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositEqualTo(BigDecimal value) {
+            addCriterion("deposit =", value, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositNotEqualTo(BigDecimal value) {
+            addCriterion("deposit <>", value, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositGreaterThan(BigDecimal value) {
+            addCriterion("deposit >", value, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("deposit >=", value, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositLessThan(BigDecimal value) {
+            addCriterion("deposit <", value, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("deposit <=", value, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositIn(List<BigDecimal> values) {
+            addCriterion("deposit in", values, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositNotIn(List<BigDecimal> values) {
+            addCriterion("deposit not in", values, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("deposit between", value1, value2, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepositNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("deposit not between", value1, value2, "deposit");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(String value) {
+            addCriterion("status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(String value) {
+            addCriterion("status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(String value) {
+            addCriterion("status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(String value) {
+            addCriterion("status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(String value) {
+            addCriterion("status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(String value) {
+            addCriterion("status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLike(String value) {
+            addCriterion("status like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotLike(String value) {
+            addCriterion("status not like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<String> values) {
+            addCriterion("status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<String> values) {
+            addCriterion("status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(String value1, String value2) {
+            addCriterion("status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(String value1, String value2) {
+            addCriterion("status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusIsNull() {
+            addCriterion("purchase_status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusIsNotNull() {
+            addCriterion("purchase_status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusEqualTo(String value) {
+            addCriterion("purchase_status =", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusNotEqualTo(String value) {
+            addCriterion("purchase_status <>", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusGreaterThan(String value) {
+            addCriterion("purchase_status >", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusGreaterThanOrEqualTo(String value) {
+            addCriterion("purchase_status >=", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusLessThan(String value) {
+            addCriterion("purchase_status <", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusLessThanOrEqualTo(String value) {
+            addCriterion("purchase_status <=", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusLike(String value) {
+            addCriterion("purchase_status like", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusNotLike(String value) {
+            addCriterion("purchase_status not like", value, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusIn(List<String> values) {
+            addCriterion("purchase_status in", values, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusNotIn(List<String> values) {
+            addCriterion("purchase_status not in", values, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusBetween(String value1, String value2) {
+            addCriterion("purchase_status between", value1, value2, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseStatusNotBetween(String value1, String value2) {
+            addCriterion("purchase_status not between", value1, value2, "purchaseStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNull() {
+            addCriterion("source is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNotNull() {
+            addCriterion("source is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceEqualTo(String value) {
+            addCriterion("source =", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotEqualTo(String value) {
+            addCriterion("source <>", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThan(String value) {
+            addCriterion("source >", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThanOrEqualTo(String value) {
+            addCriterion("source >=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThan(String value) {
+            addCriterion("source <", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThanOrEqualTo(String value) {
+            addCriterion("source <=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLike(String value) {
+            addCriterion("source like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotLike(String value) {
+            addCriterion("source not like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIn(List<String> values) {
+            addCriterion("source in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotIn(List<String> values) {
+            addCriterion("source not in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceBetween(String value1, String value2) {
+            addCriterion("source between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotBetween(String value1, String value2) {
+            addCriterion("source not between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberIsNull() {
+            addCriterion("link_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberIsNotNull() {
+            addCriterion("link_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberEqualTo(String value) {
+            addCriterion("link_number =", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberNotEqualTo(String value) {
+            addCriterion("link_number <>", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberGreaterThan(String value) {
+            addCriterion("link_number >", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("link_number >=", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberLessThan(String value) {
+            addCriterion("link_number <", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberLessThanOrEqualTo(String value) {
+            addCriterion("link_number <=", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberLike(String value) {
+            addCriterion("link_number like", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberNotLike(String value) {
+            addCriterion("link_number not like", value, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberIn(List<String> values) {
+            addCriterion("link_number in", values, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberNotIn(List<String> values) {
+            addCriterion("link_number not in", values, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberBetween(String value1, String value2) {
+            addCriterion("link_number between", value1, value2, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkNumberNotBetween(String value1, String value2) {
+            addCriterion("link_number not between", value1, value2, "linkNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyIsNull() {
+            addCriterion("link_apply is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyIsNotNull() {
+            addCriterion("link_apply is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyEqualTo(String value) {
+            addCriterion("link_apply =", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyNotEqualTo(String value) {
+            addCriterion("link_apply <>", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyGreaterThan(String value) {
+            addCriterion("link_apply >", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyGreaterThanOrEqualTo(String value) {
+            addCriterion("link_apply >=", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyLessThan(String value) {
+            addCriterion("link_apply <", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyLessThanOrEqualTo(String value) {
+            addCriterion("link_apply <=", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyLike(String value) {
+            addCriterion("link_apply like", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyNotLike(String value) {
+            addCriterion("link_apply not like", value, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyIn(List<String> values) {
+            addCriterion("link_apply in", values, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyNotIn(List<String> values) {
+            addCriterion("link_apply not in", values, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyBetween(String value1, String value2) {
+            addCriterion("link_apply between", value1, value2, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkApplyNotBetween(String value1, String value2) {
+            addCriterion("link_apply not between", value1, value2, "linkApply");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotHeadVo4Body.java b/src/main/java/com/jsh/erp/datasource/entities/DepotHeadVo4Body.java
new file mode 100644
index 0000000..11faad8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotHeadVo4Body.java
@@ -0,0 +1,46 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class DepotHeadVo4Body {
+
+    private Long id;
+
+    private String info;
+
+    private String rows;
+
+    private BigDecimal preTotalPrice;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public void setInfo(String info) {
+        this.info = info;
+    }
+
+    public String getRows() {
+        return rows;
+    }
+
+    public void setRows(String rows) {
+        this.rows = rows;
+    }
+
+    public BigDecimal getPreTotalPrice() {
+        return preTotalPrice;
+    }
+
+    public void setPreTotalPrice(BigDecimal preTotalPrice) {
+        this.preTotalPrice = preTotalPrice;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotItem.java b/src/main/java/com/jsh/erp/datasource/entities/DepotItem.java
new file mode 100644
index 0000000..3dff437
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotItem.java
@@ -0,0 +1,256 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DepotItem {
+    private Long id;
+
+    private Long headerId;
+
+    private Long materialId;
+
+    private Long materialExtendId;
+
+    private String materialUnit;
+
+    private String sku;
+
+    private BigDecimal operNumber;
+
+    private BigDecimal basicNumber;
+
+    private BigDecimal unitPrice;
+
+    private BigDecimal purchaseUnitPrice;
+
+    private BigDecimal taxUnitPrice;
+
+    private BigDecimal allPrice;
+
+    private String remark;
+
+    private Long depotId;
+
+    private Long anotherDepotId;
+
+    private BigDecimal taxRate;
+
+    private BigDecimal taxMoney;
+
+    private BigDecimal taxLastMoney;
+
+    private String materialType;
+
+    private String snList;
+
+    private String batchNumber;
+
+    private Date expirationDate;
+
+    private Long linkId;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getHeaderId() {
+        return headerId;
+    }
+
+    public void setHeaderId(Long headerId) {
+        this.headerId = headerId;
+    }
+
+    public Long getMaterialId() {
+        return materialId;
+    }
+
+    public void setMaterialId(Long materialId) {
+        this.materialId = materialId;
+    }
+
+    public Long getMaterialExtendId() {
+        return materialExtendId;
+    }
+
+    public void setMaterialExtendId(Long materialExtendId) {
+        this.materialExtendId = materialExtendId;
+    }
+
+    public String getMaterialUnit() {
+        return materialUnit;
+    }
+
+    public void setMaterialUnit(String materialUnit) {
+        this.materialUnit = materialUnit == null ? null : materialUnit.trim();
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku == null ? null : sku.trim();
+    }
+
+    public BigDecimal getOperNumber() {
+        return operNumber;
+    }
+
+    public void setOperNumber(BigDecimal operNumber) {
+        this.operNumber = operNumber;
+    }
+
+    public BigDecimal getBasicNumber() {
+        return basicNumber;
+    }
+
+    public void setBasicNumber(BigDecimal basicNumber) {
+        this.basicNumber = basicNumber;
+    }
+
+    public BigDecimal getUnitPrice() {
+        return unitPrice;
+    }
+
+    public void setUnitPrice(BigDecimal unitPrice) {
+        this.unitPrice = unitPrice;
+    }
+
+    public BigDecimal getPurchaseUnitPrice() {
+        return purchaseUnitPrice;
+    }
+
+    public void setPurchaseUnitPrice(BigDecimal purchaseUnitPrice) {
+        this.purchaseUnitPrice = purchaseUnitPrice;
+    }
+
+    public BigDecimal getTaxUnitPrice() {
+        return taxUnitPrice;
+    }
+
+    public void setTaxUnitPrice(BigDecimal taxUnitPrice) {
+        this.taxUnitPrice = taxUnitPrice;
+    }
+
+    public BigDecimal getAllPrice() {
+        return allPrice;
+    }
+
+    public void setAllPrice(BigDecimal allPrice) {
+        this.allPrice = allPrice;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public Long getDepotId() {
+        return depotId;
+    }
+
+    public void setDepotId(Long depotId) {
+        this.depotId = depotId;
+    }
+
+    public Long getAnotherDepotId() {
+        return anotherDepotId;
+    }
+
+    public void setAnotherDepotId(Long anotherDepotId) {
+        this.anotherDepotId = anotherDepotId;
+    }
+
+    public BigDecimal getTaxRate() {
+        return taxRate;
+    }
+
+    public void setTaxRate(BigDecimal taxRate) {
+        this.taxRate = taxRate;
+    }
+
+    public BigDecimal getTaxMoney() {
+        return taxMoney;
+    }
+
+    public void setTaxMoney(BigDecimal taxMoney) {
+        this.taxMoney = taxMoney;
+    }
+
+    public BigDecimal getTaxLastMoney() {
+        return taxLastMoney;
+    }
+
+    public void setTaxLastMoney(BigDecimal taxLastMoney) {
+        this.taxLastMoney = taxLastMoney;
+    }
+
+    public String getMaterialType() {
+        return materialType;
+    }
+
+    public void setMaterialType(String materialType) {
+        this.materialType = materialType == null ? null : materialType.trim();
+    }
+
+    public String getSnList() {
+        return snList;
+    }
+
+    public void setSnList(String snList) {
+        this.snList = snList == null ? null : snList.trim();
+    }
+
+    public String getBatchNumber() {
+        return batchNumber;
+    }
+
+    public void setBatchNumber(String batchNumber) {
+        this.batchNumber = batchNumber == null ? null : batchNumber.trim();
+    }
+
+    public Date getExpirationDate() {
+        return expirationDate;
+    }
+
+    public void setExpirationDate(Date expirationDate) {
+        this.expirationDate = expirationDate;
+    }
+
+    public Long getLinkId() {
+        return linkId;
+    }
+
+    public void setLinkId(Long linkId) {
+        this.linkId = linkId;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotItemExample.java b/src/main/java/com/jsh/erp/datasource/entities/DepotItemExample.java
new file mode 100644
index 0000000..958088e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotItemExample.java
@@ -0,0 +1,1771 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class DepotItemExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public DepotItemExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdIsNull() {
+            addCriterion("header_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdIsNotNull() {
+            addCriterion("header_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdEqualTo(Long value) {
+            addCriterion("header_id =", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdNotEqualTo(Long value) {
+            addCriterion("header_id <>", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdGreaterThan(Long value) {
+            addCriterion("header_id >", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("header_id >=", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdLessThan(Long value) {
+            addCriterion("header_id <", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdLessThanOrEqualTo(Long value) {
+            addCriterion("header_id <=", value, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdIn(List<Long> values) {
+            addCriterion("header_id in", values, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdNotIn(List<Long> values) {
+            addCriterion("header_id not in", values, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdBetween(Long value1, Long value2) {
+            addCriterion("header_id between", value1, value2, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHeaderIdNotBetween(Long value1, Long value2) {
+            addCriterion("header_id not between", value1, value2, "headerId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNull() {
+            addCriterion("material_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNotNull() {
+            addCriterion("material_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdEqualTo(Long value) {
+            addCriterion("material_id =", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotEqualTo(Long value) {
+            addCriterion("material_id <>", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThan(Long value) {
+            addCriterion("material_id >", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("material_id >=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThan(Long value) {
+            addCriterion("material_id <", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThanOrEqualTo(Long value) {
+            addCriterion("material_id <=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIn(List<Long> values) {
+            addCriterion("material_id in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotIn(List<Long> values) {
+            addCriterion("material_id not in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdBetween(Long value1, Long value2) {
+            addCriterion("material_id between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotBetween(Long value1, Long value2) {
+            addCriterion("material_id not between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdIsNull() {
+            addCriterion("material_extend_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdIsNotNull() {
+            addCriterion("material_extend_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdEqualTo(Long value) {
+            addCriterion("material_extend_id =", value, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdNotEqualTo(Long value) {
+            addCriterion("material_extend_id <>", value, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdGreaterThan(Long value) {
+            addCriterion("material_extend_id >", value, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("material_extend_id >=", value, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdLessThan(Long value) {
+            addCriterion("material_extend_id <", value, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdLessThanOrEqualTo(Long value) {
+            addCriterion("material_extend_id <=", value, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdIn(List<Long> values) {
+            addCriterion("material_extend_id in", values, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdNotIn(List<Long> values) {
+            addCriterion("material_extend_id not in", values, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdBetween(Long value1, Long value2) {
+            addCriterion("material_extend_id between", value1, value2, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialExtendIdNotBetween(Long value1, Long value2) {
+            addCriterion("material_extend_id not between", value1, value2, "materialExtendId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitIsNull() {
+            addCriterion("material_unit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitIsNotNull() {
+            addCriterion("material_unit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitEqualTo(String value) {
+            addCriterion("material_unit =", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitNotEqualTo(String value) {
+            addCriterion("material_unit <>", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitGreaterThan(String value) {
+            addCriterion("material_unit >", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitGreaterThanOrEqualTo(String value) {
+            addCriterion("material_unit >=", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitLessThan(String value) {
+            addCriterion("material_unit <", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitLessThanOrEqualTo(String value) {
+            addCriterion("material_unit <=", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitLike(String value) {
+            addCriterion("material_unit like", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitNotLike(String value) {
+            addCriterion("material_unit not like", value, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitIn(List<String> values) {
+            addCriterion("material_unit in", values, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitNotIn(List<String> values) {
+            addCriterion("material_unit not in", values, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitBetween(String value1, String value2) {
+            addCriterion("material_unit between", value1, value2, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialUnitNotBetween(String value1, String value2) {
+            addCriterion("material_unit not between", value1, value2, "materialUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuIsNull() {
+            addCriterion("sku is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuIsNotNull() {
+            addCriterion("sku is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuEqualTo(String value) {
+            addCriterion("sku =", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotEqualTo(String value) {
+            addCriterion("sku <>", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuGreaterThan(String value) {
+            addCriterion("sku >", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuGreaterThanOrEqualTo(String value) {
+            addCriterion("sku >=", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuLessThan(String value) {
+            addCriterion("sku <", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuLessThanOrEqualTo(String value) {
+            addCriterion("sku <=", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuLike(String value) {
+            addCriterion("sku like", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotLike(String value) {
+            addCriterion("sku not like", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuIn(List<String> values) {
+            addCriterion("sku in", values, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotIn(List<String> values) {
+            addCriterion("sku not in", values, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuBetween(String value1, String value2) {
+            addCriterion("sku between", value1, value2, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotBetween(String value1, String value2) {
+            addCriterion("sku not between", value1, value2, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberIsNull() {
+            addCriterion("oper_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberIsNotNull() {
+            addCriterion("oper_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberEqualTo(BigDecimal value) {
+            addCriterion("oper_number =", value, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberNotEqualTo(BigDecimal value) {
+            addCriterion("oper_number <>", value, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberGreaterThan(BigDecimal value) {
+            addCriterion("oper_number >", value, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("oper_number >=", value, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberLessThan(BigDecimal value) {
+            addCriterion("oper_number <", value, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("oper_number <=", value, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberIn(List<BigDecimal> values) {
+            addCriterion("oper_number in", values, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberNotIn(List<BigDecimal> values) {
+            addCriterion("oper_number not in", values, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("oper_number between", value1, value2, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperNumberNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("oper_number not between", value1, value2, "operNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberIsNull() {
+            addCriterion("basic_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberIsNotNull() {
+            addCriterion("basic_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberEqualTo(BigDecimal value) {
+            addCriterion("basic_number =", value, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberNotEqualTo(BigDecimal value) {
+            addCriterion("basic_number <>", value, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberGreaterThan(BigDecimal value) {
+            addCriterion("basic_number >", value, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("basic_number >=", value, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberLessThan(BigDecimal value) {
+            addCriterion("basic_number <", value, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("basic_number <=", value, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberIn(List<BigDecimal> values) {
+            addCriterion("basic_number in", values, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberNotIn(List<BigDecimal> values) {
+            addCriterion("basic_number not in", values, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("basic_number between", value1, value2, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicNumberNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("basic_number not between", value1, value2, "basicNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceIsNull() {
+            addCriterion("unit_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceIsNotNull() {
+            addCriterion("unit_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceEqualTo(BigDecimal value) {
+            addCriterion("unit_price =", value, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceNotEqualTo(BigDecimal value) {
+            addCriterion("unit_price <>", value, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceGreaterThan(BigDecimal value) {
+            addCriterion("unit_price >", value, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("unit_price >=", value, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceLessThan(BigDecimal value) {
+            addCriterion("unit_price <", value, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("unit_price <=", value, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceIn(List<BigDecimal> values) {
+            addCriterion("unit_price in", values, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceNotIn(List<BigDecimal> values) {
+            addCriterion("unit_price not in", values, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("unit_price between", value1, value2, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("unit_price not between", value1, value2, "unitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceIsNull() {
+            addCriterion("purchase_unit_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceIsNotNull() {
+            addCriterion("purchase_unit_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceEqualTo(BigDecimal value) {
+            addCriterion("purchase_unit_price =", value, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceNotEqualTo(BigDecimal value) {
+            addCriterion("purchase_unit_price <>", value, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceGreaterThan(BigDecimal value) {
+            addCriterion("purchase_unit_price >", value, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("purchase_unit_price >=", value, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceLessThan(BigDecimal value) {
+            addCriterion("purchase_unit_price <", value, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("purchase_unit_price <=", value, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceIn(List<BigDecimal> values) {
+            addCriterion("purchase_unit_price in", values, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceNotIn(List<BigDecimal> values) {
+            addCriterion("purchase_unit_price not in", values, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("purchase_unit_price between", value1, value2, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseUnitPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("purchase_unit_price not between", value1, value2, "purchaseUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceIsNull() {
+            addCriterion("tax_unit_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceIsNotNull() {
+            addCriterion("tax_unit_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceEqualTo(BigDecimal value) {
+            addCriterion("tax_unit_price =", value, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceNotEqualTo(BigDecimal value) {
+            addCriterion("tax_unit_price <>", value, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceGreaterThan(BigDecimal value) {
+            addCriterion("tax_unit_price >", value, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_unit_price >=", value, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceLessThan(BigDecimal value) {
+            addCriterion("tax_unit_price <", value, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_unit_price <=", value, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceIn(List<BigDecimal> values) {
+            addCriterion("tax_unit_price in", values, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceNotIn(List<BigDecimal> values) {
+            addCriterion("tax_unit_price not in", values, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_unit_price between", value1, value2, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxUnitPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_unit_price not between", value1, value2, "taxUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceIsNull() {
+            addCriterion("all_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceIsNotNull() {
+            addCriterion("all_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceEqualTo(BigDecimal value) {
+            addCriterion("all_price =", value, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceNotEqualTo(BigDecimal value) {
+            addCriterion("all_price <>", value, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceGreaterThan(BigDecimal value) {
+            addCriterion("all_price >", value, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("all_price >=", value, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceLessThan(BigDecimal value) {
+            addCriterion("all_price <", value, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("all_price <=", value, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceIn(List<BigDecimal> values) {
+            addCriterion("all_price in", values, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceNotIn(List<BigDecimal> values) {
+            addCriterion("all_price not in", values, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("all_price between", value1, value2, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("all_price not between", value1, value2, "allPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNull() {
+            addCriterion("depot_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNotNull() {
+            addCriterion("depot_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdEqualTo(Long value) {
+            addCriterion("depot_id =", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotEqualTo(Long value) {
+            addCriterion("depot_id <>", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThan(Long value) {
+            addCriterion("depot_id >", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("depot_id >=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThan(Long value) {
+            addCriterion("depot_id <", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThanOrEqualTo(Long value) {
+            addCriterion("depot_id <=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIn(List<Long> values) {
+            addCriterion("depot_id in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotIn(List<Long> values) {
+            addCriterion("depot_id not in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdBetween(Long value1, Long value2) {
+            addCriterion("depot_id between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotBetween(Long value1, Long value2) {
+            addCriterion("depot_id not between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdIsNull() {
+            addCriterion("another_depot_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdIsNotNull() {
+            addCriterion("another_depot_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdEqualTo(Long value) {
+            addCriterion("another_depot_id =", value, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdNotEqualTo(Long value) {
+            addCriterion("another_depot_id <>", value, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdGreaterThan(Long value) {
+            addCriterion("another_depot_id >", value, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("another_depot_id >=", value, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdLessThan(Long value) {
+            addCriterion("another_depot_id <", value, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdLessThanOrEqualTo(Long value) {
+            addCriterion("another_depot_id <=", value, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdIn(List<Long> values) {
+            addCriterion("another_depot_id in", values, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdNotIn(List<Long> values) {
+            addCriterion("another_depot_id not in", values, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdBetween(Long value1, Long value2) {
+            addCriterion("another_depot_id between", value1, value2, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherDepotIdNotBetween(Long value1, Long value2) {
+            addCriterion("another_depot_id not between", value1, value2, "anotherDepotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateIsNull() {
+            addCriterion("tax_rate is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateIsNotNull() {
+            addCriterion("tax_rate is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateEqualTo(BigDecimal value) {
+            addCriterion("tax_rate =", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateNotEqualTo(BigDecimal value) {
+            addCriterion("tax_rate <>", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateGreaterThan(BigDecimal value) {
+            addCriterion("tax_rate >", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_rate >=", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateLessThan(BigDecimal value) {
+            addCriterion("tax_rate <", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_rate <=", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateIn(List<BigDecimal> values) {
+            addCriterion("tax_rate in", values, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateNotIn(List<BigDecimal> values) {
+            addCriterion("tax_rate not in", values, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_rate between", value1, value2, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_rate not between", value1, value2, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyIsNull() {
+            addCriterion("tax_money is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyIsNotNull() {
+            addCriterion("tax_money is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyEqualTo(BigDecimal value) {
+            addCriterion("tax_money =", value, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyNotEqualTo(BigDecimal value) {
+            addCriterion("tax_money <>", value, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyGreaterThan(BigDecimal value) {
+            addCriterion("tax_money >", value, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_money >=", value, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyLessThan(BigDecimal value) {
+            addCriterion("tax_money <", value, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_money <=", value, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyIn(List<BigDecimal> values) {
+            addCriterion("tax_money in", values, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyNotIn(List<BigDecimal> values) {
+            addCriterion("tax_money not in", values, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_money between", value1, value2, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxMoneyNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_money not between", value1, value2, "taxMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyIsNull() {
+            addCriterion("tax_last_money is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyIsNotNull() {
+            addCriterion("tax_last_money is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyEqualTo(BigDecimal value) {
+            addCriterion("tax_last_money =", value, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyNotEqualTo(BigDecimal value) {
+            addCriterion("tax_last_money <>", value, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyGreaterThan(BigDecimal value) {
+            addCriterion("tax_last_money >", value, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_last_money >=", value, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyLessThan(BigDecimal value) {
+            addCriterion("tax_last_money <", value, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_last_money <=", value, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyIn(List<BigDecimal> values) {
+            addCriterion("tax_last_money in", values, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyNotIn(List<BigDecimal> values) {
+            addCriterion("tax_last_money not in", values, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_last_money between", value1, value2, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxLastMoneyNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_last_money not between", value1, value2, "taxLastMoney");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeIsNull() {
+            addCriterion("material_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeIsNotNull() {
+            addCriterion("material_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeEqualTo(String value) {
+            addCriterion("material_type =", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeNotEqualTo(String value) {
+            addCriterion("material_type <>", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeGreaterThan(String value) {
+            addCriterion("material_type >", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("material_type >=", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeLessThan(String value) {
+            addCriterion("material_type <", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeLessThanOrEqualTo(String value) {
+            addCriterion("material_type <=", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeLike(String value) {
+            addCriterion("material_type like", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeNotLike(String value) {
+            addCriterion("material_type not like", value, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeIn(List<String> values) {
+            addCriterion("material_type in", values, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeNotIn(List<String> values) {
+            addCriterion("material_type not in", values, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeBetween(String value1, String value2) {
+            addCriterion("material_type between", value1, value2, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialTypeNotBetween(String value1, String value2) {
+            addCriterion("material_type not between", value1, value2, "materialType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListIsNull() {
+            addCriterion("sn_list is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListIsNotNull() {
+            addCriterion("sn_list is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListEqualTo(String value) {
+            addCriterion("sn_list =", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListNotEqualTo(String value) {
+            addCriterion("sn_list <>", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListGreaterThan(String value) {
+            addCriterion("sn_list >", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListGreaterThanOrEqualTo(String value) {
+            addCriterion("sn_list >=", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListLessThan(String value) {
+            addCriterion("sn_list <", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListLessThanOrEqualTo(String value) {
+            addCriterion("sn_list <=", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListLike(String value) {
+            addCriterion("sn_list like", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListNotLike(String value) {
+            addCriterion("sn_list not like", value, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListIn(List<String> values) {
+            addCriterion("sn_list in", values, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListNotIn(List<String> values) {
+            addCriterion("sn_list not in", values, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListBetween(String value1, String value2) {
+            addCriterion("sn_list between", value1, value2, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andSnListNotBetween(String value1, String value2) {
+            addCriterion("sn_list not between", value1, value2, "snList");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberIsNull() {
+            addCriterion("batch_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberIsNotNull() {
+            addCriterion("batch_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberEqualTo(String value) {
+            addCriterion("batch_number =", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberNotEqualTo(String value) {
+            addCriterion("batch_number <>", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberGreaterThan(String value) {
+            addCriterion("batch_number >", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("batch_number >=", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberLessThan(String value) {
+            addCriterion("batch_number <", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberLessThanOrEqualTo(String value) {
+            addCriterion("batch_number <=", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberLike(String value) {
+            addCriterion("batch_number like", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberNotLike(String value) {
+            addCriterion("batch_number not like", value, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberIn(List<String> values) {
+            addCriterion("batch_number in", values, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberNotIn(List<String> values) {
+            addCriterion("batch_number not in", values, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberBetween(String value1, String value2) {
+            addCriterion("batch_number between", value1, value2, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andBatchNumberNotBetween(String value1, String value2) {
+            addCriterion("batch_number not between", value1, value2, "batchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateIsNull() {
+            addCriterion("expiration_date is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateIsNotNull() {
+            addCriterion("expiration_date is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateEqualTo(Date value) {
+            addCriterion("expiration_date =", value, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateNotEqualTo(Date value) {
+            addCriterion("expiration_date <>", value, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateGreaterThan(Date value) {
+            addCriterion("expiration_date >", value, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateGreaterThanOrEqualTo(Date value) {
+            addCriterion("expiration_date >=", value, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateLessThan(Date value) {
+            addCriterion("expiration_date <", value, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateLessThanOrEqualTo(Date value) {
+            addCriterion("expiration_date <=", value, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateIn(List<Date> values) {
+            addCriterion("expiration_date in", values, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateNotIn(List<Date> values) {
+            addCriterion("expiration_date not in", values, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateBetween(Date value1, Date value2) {
+            addCriterion("expiration_date between", value1, value2, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpirationDateNotBetween(Date value1, Date value2) {
+            addCriterion("expiration_date not between", value1, value2, "expirationDate");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdIsNull() {
+            addCriterion("link_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdIsNotNull() {
+            addCriterion("link_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdEqualTo(Long value) {
+            addCriterion("link_id =", value, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdNotEqualTo(Long value) {
+            addCriterion("link_id <>", value, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdGreaterThan(Long value) {
+            addCriterion("link_id >", value, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("link_id >=", value, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdLessThan(Long value) {
+            addCriterion("link_id <", value, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdLessThanOrEqualTo(Long value) {
+            addCriterion("link_id <=", value, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdIn(List<Long> values) {
+            addCriterion("link_id in", values, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdNotIn(List<Long> values) {
+            addCriterion("link_id not in", values, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdBetween(Long value1, Long value2) {
+            addCriterion("link_id between", value1, value2, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLinkIdNotBetween(Long value1, Long value2) {
+            addCriterion("link_id not between", value1, value2, "linkId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4DetailByTypeAndMId.java b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4DetailByTypeAndMId.java
new file mode 100644
index 0000000..f8fd74c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4DetailByTypeAndMId.java
@@ -0,0 +1,117 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DepotItemVo4DetailByTypeAndMId {
+
+    private String number;
+
+    private String barCode;
+
+    private String materialName;
+
+    private String type;
+
+    private String subType;
+
+    private BigDecimal bnum;
+
+    private BigDecimal unitPrice;
+
+    private BigDecimal allPrice;
+
+    private String materialUnit;
+
+    private String depotName;
+
+    private Date otime;
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getSubType() {
+        return subType;
+    }
+
+    public void setSubType(String subType) {
+        this.subType = subType;
+    }
+
+    public BigDecimal getBnum() {
+        return bnum;
+    }
+
+    public void setBnum(BigDecimal bnum) {
+        this.bnum = bnum;
+    }
+
+    public BigDecimal getUnitPrice() {
+        return unitPrice;
+    }
+
+    public void setUnitPrice(BigDecimal unitPrice) {
+        this.unitPrice = unitPrice;
+    }
+
+    public BigDecimal getAllPrice() {
+        return allPrice;
+    }
+
+    public void setAllPrice(BigDecimal allPrice) {
+        this.allPrice = allPrice;
+    }
+
+    public String getMaterialUnit() {
+        return materialUnit;
+    }
+
+    public void setMaterialUnit(String materialUnit) {
+        this.materialUnit = materialUnit;
+    }
+
+    public String getDepotName() {
+        return depotName;
+    }
+
+    public void setDepotName(String depotName) {
+        this.depotName = depotName;
+    }
+
+    public Date getOtime() {
+        return otime;
+    }
+
+    public void setOtime(Date otime) {
+        this.otime = otime;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4Material.java b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4Material.java
new file mode 100644
index 0000000..4b404d4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4Material.java
@@ -0,0 +1,27 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DepotItemVo4Material extends DepotItem{
+
+    private String mname;
+
+    private String mmodel;
+
+    public String getMname() {
+        return mname;
+    }
+
+    public void setMname(String mname) {
+        this.mname = mname;
+    }
+
+    public String getMmodel() {
+        return mmodel;
+    }
+
+    public void setMmodel(String mmodel) {
+        this.mmodel = mmodel;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4MaterialAndSum.java b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4MaterialAndSum.java
new file mode 100644
index 0000000..d99c108
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4MaterialAndSum.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class DepotItemVo4MaterialAndSum {
+
+    private Long materialExtendId;
+
+    private BigDecimal operNumber;
+
+    public Long getMaterialExtendId() {
+        return materialExtendId;
+    }
+
+    public void setMaterialExtendId(Long materialExtendId) {
+        this.materialExtendId = materialExtendId;
+    }
+
+    public BigDecimal getOperNumber() {
+        return operNumber;
+    }
+
+    public void setOperNumber(BigDecimal operNumber) {
+        this.operNumber = operNumber;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4WithInfoEx.java b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4WithInfoEx.java
new file mode 100644
index 0000000..1e415ae
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/DepotItemVo4WithInfoEx.java
@@ -0,0 +1,276 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class DepotItemVo4WithInfoEx extends DepotItem{
+
+    private Long MId;
+
+    private String MName;
+
+    private String MModel;
+
+    private String MaterialUnit;
+
+    private String MColor;
+
+    private String MStandard;
+
+    private String MMfrs;
+
+    private String MOtherField1;
+
+    private String MOtherField2;
+
+    private String MOtherField3;
+
+    private String enableSerialNumber;
+
+    private String enableBatchNumber;
+
+    private String DepotName;
+
+    private String AnotherDepotName;
+
+    private Long UnitId;
+
+    private String unitName;
+
+    private Integer ratio;
+
+    private String otherUnit;
+
+    private BigDecimal presetPriceOne;
+
+    private String priceStrategy;
+
+    private BigDecimal purchaseDecimal;
+
+    private BigDecimal currentUnitPrice;
+
+    private String barCode;
+
+    private BigDecimal weight;
+
+    private String position;
+
+    private String imgName;
+
+    private String brand;
+
+    public Long getMId() {
+        return MId;
+    }
+
+    public void setMId(Long MId) {
+        this.MId = MId;
+    }
+
+    public String getMName() {
+        return MName;
+    }
+
+    public void setMName(String MName) {
+        this.MName = MName;
+    }
+
+    public String getMModel() {
+        return MModel;
+    }
+
+    public void setMModel(String MModel) {
+        this.MModel = MModel;
+    }
+
+    public String getMaterialUnit() {
+        return MaterialUnit;
+    }
+
+    public void setMaterialUnit(String materialUnit) {
+        MaterialUnit = materialUnit;
+    }
+
+    public String getMColor() {
+        return MColor;
+    }
+
+    public void setMColor(String MColor) {
+        this.MColor = MColor;
+    }
+
+    public String getMStandard() {
+        return MStandard;
+    }
+
+    public void setMStandard(String MStandard) {
+        this.MStandard = MStandard;
+    }
+
+    public String getMMfrs() {
+        return MMfrs;
+    }
+
+    public void setMMfrs(String MMfrs) {
+        this.MMfrs = MMfrs;
+    }
+
+    public String getMOtherField1() {
+        return MOtherField1;
+    }
+
+    public void setMOtherField1(String MOtherField1) {
+        this.MOtherField1 = MOtherField1;
+    }
+
+    public String getMOtherField2() {
+        return MOtherField2;
+    }
+
+    public void setMOtherField2(String MOtherField2) {
+        this.MOtherField2 = MOtherField2;
+    }
+
+    public String getMOtherField3() {
+        return MOtherField3;
+    }
+
+    public void setMOtherField3(String MOtherField3) {
+        this.MOtherField3 = MOtherField3;
+    }
+
+    public String getEnableSerialNumber() {
+        return enableSerialNumber;
+    }
+
+    public void setEnableSerialNumber(String enableSerialNumber) {
+        this.enableSerialNumber = enableSerialNumber;
+    }
+
+    public String getEnableBatchNumber() {
+        return enableBatchNumber;
+    }
+
+    public void setEnableBatchNumber(String enableBatchNumber) {
+        this.enableBatchNumber = enableBatchNumber;
+    }
+
+    public String getDepotName() {
+        return DepotName;
+    }
+
+    public void setDepotName(String depotName) {
+        DepotName = depotName;
+    }
+
+    public String getAnotherDepotName() {
+        return AnotherDepotName;
+    }
+
+    public void setAnotherDepotName(String anotherDepotName) {
+        AnotherDepotName = anotherDepotName;
+    }
+
+    public Long getUnitId() {
+        return UnitId;
+    }
+
+    public void setUnitId(Long unitId) {
+        UnitId = unitId;
+    }
+
+    public String getUnitName() {
+        return unitName;
+    }
+
+    public void setUnitName(String unitName) {
+        this.unitName = unitName;
+    }
+
+    public Integer getRatio() {
+        return ratio;
+    }
+
+    public void setRatio(Integer ratio) {
+        this.ratio = ratio;
+    }
+
+    public String getOtherUnit() {
+        return otherUnit;
+    }
+
+    public void setOtherUnit(String otherUnit) {
+        this.otherUnit = otherUnit;
+    }
+
+    public BigDecimal getPresetPriceOne() {
+        return presetPriceOne;
+    }
+
+    public void setPresetPriceOne(BigDecimal presetPriceOne) {
+        this.presetPriceOne = presetPriceOne;
+    }
+
+    public String getPriceStrategy() {
+        return priceStrategy;
+    }
+
+    public void setPriceStrategy(String priceStrategy) {
+        this.priceStrategy = priceStrategy;
+    }
+
+    public BigDecimal getPurchaseDecimal() {
+        return purchaseDecimal;
+    }
+
+    public void setPurchaseDecimal(BigDecimal purchaseDecimal) {
+        this.purchaseDecimal = purchaseDecimal;
+    }
+
+    public BigDecimal getCurrentUnitPrice() {
+        return currentUnitPrice;
+    }
+
+    public void setCurrentUnitPrice(BigDecimal currentUnitPrice) {
+        this.currentUnitPrice = currentUnitPrice;
+    }
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode;
+    }
+
+    public BigDecimal getWeight() {
+        return weight;
+    }
+
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position;
+    }
+
+    public String getImgName() {
+        return imgName;
+    }
+
+    public void setImgName(String imgName) {
+        this.imgName = imgName;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Function.java b/src/main/java/com/jsh/erp/datasource/entities/Function.java
new file mode 100644
index 0000000..9b0c67f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Function.java
@@ -0,0 +1,133 @@
+package com.jsh.erp.datasource.entities;
+
+public class Function {
+    private Long id;
+
+    private String number;
+
+    private String name;
+
+    private String parentNumber;
+
+    private String url;
+
+    private String component;
+
+    private Boolean state;
+
+    private String sort;
+
+    private Boolean enabled;
+
+    private String type;
+
+    private String pushBtn;
+
+    private String icon;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number == null ? null : number.trim();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getParentNumber() {
+        return parentNumber;
+    }
+
+    public void setParentNumber(String parentNumber) {
+        this.parentNumber = parentNumber == null ? null : parentNumber.trim();
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url == null ? null : url.trim();
+    }
+
+    public String getComponent() {
+        return component;
+    }
+
+    public void setComponent(String component) {
+        this.component = component == null ? null : component.trim();
+    }
+
+    public Boolean getState() {
+        return state;
+    }
+
+    public void setState(Boolean state) {
+        this.state = state;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public String getPushBtn() {
+        return pushBtn;
+    }
+
+    public void setPushBtn(String pushBtn) {
+        this.pushBtn = pushBtn == null ? null : pushBtn.trim();
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon == null ? null : icon.trim();
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/FunctionEx.java b/src/main/java/com/jsh/erp/datasource/entities/FunctionEx.java
new file mode 100644
index 0000000..9241f32
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/FunctionEx.java
@@ -0,0 +1,14 @@
+package com.jsh.erp.datasource.entities;
+
+public class FunctionEx extends Function {
+
+    private String parentName;
+
+    public String getParentName() {
+        return parentName;
+    }
+
+    public void setParentName(String parentName) {
+        this.parentName = parentName;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/FunctionExample.java b/src/main/java/com/jsh/erp/datasource/entities/FunctionExample.java
new file mode 100644
index 0000000..eabd768
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/FunctionExample.java
@@ -0,0 +1,1079 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FunctionExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public FunctionExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIsNull() {
+            addCriterion("number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIsNotNull() {
+            addCriterion("number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberEqualTo(String value) {
+            addCriterion("number =", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotEqualTo(String value) {
+            addCriterion("number <>", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberGreaterThan(String value) {
+            addCriterion("number >", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("number >=", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLessThan(String value) {
+            addCriterion("number <", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLessThanOrEqualTo(String value) {
+            addCriterion("number <=", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLike(String value) {
+            addCriterion("number like", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotLike(String value) {
+            addCriterion("number not like", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIn(List<String> values) {
+            addCriterion("number in", values, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotIn(List<String> values) {
+            addCriterion("number not in", values, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberBetween(String value1, String value2) {
+            addCriterion("number between", value1, value2, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotBetween(String value1, String value2) {
+            addCriterion("number not between", value1, value2, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberIsNull() {
+            addCriterion("parent_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberIsNotNull() {
+            addCriterion("parent_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberEqualTo(String value) {
+            addCriterion("parent_number =", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberNotEqualTo(String value) {
+            addCriterion("parent_number <>", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberGreaterThan(String value) {
+            addCriterion("parent_number >", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("parent_number >=", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberLessThan(String value) {
+            addCriterion("parent_number <", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberLessThanOrEqualTo(String value) {
+            addCriterion("parent_number <=", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberLike(String value) {
+            addCriterion("parent_number like", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberNotLike(String value) {
+            addCriterion("parent_number not like", value, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberIn(List<String> values) {
+            addCriterion("parent_number in", values, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberNotIn(List<String> values) {
+            addCriterion("parent_number not in", values, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberBetween(String value1, String value2) {
+            addCriterion("parent_number between", value1, value2, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentNumberNotBetween(String value1, String value2) {
+            addCriterion("parent_number not between", value1, value2, "parentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNull() {
+            addCriterion("url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNotNull() {
+            addCriterion("url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlEqualTo(String value) {
+            addCriterion("url =", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotEqualTo(String value) {
+            addCriterion("url <>", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThan(String value) {
+            addCriterion("url >", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("url >=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThan(String value) {
+            addCriterion("url <", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThanOrEqualTo(String value) {
+            addCriterion("url <=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLike(String value) {
+            addCriterion("url like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotLike(String value) {
+            addCriterion("url not like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIn(List<String> values) {
+            addCriterion("url in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotIn(List<String> values) {
+            addCriterion("url not in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlBetween(String value1, String value2) {
+            addCriterion("url between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotBetween(String value1, String value2) {
+            addCriterion("url not between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentIsNull() {
+            addCriterion("component is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentIsNotNull() {
+            addCriterion("component is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentEqualTo(String value) {
+            addCriterion("component =", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentNotEqualTo(String value) {
+            addCriterion("component <>", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentGreaterThan(String value) {
+            addCriterion("component >", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentGreaterThanOrEqualTo(String value) {
+            addCriterion("component >=", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentLessThan(String value) {
+            addCriterion("component <", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentLessThanOrEqualTo(String value) {
+            addCriterion("component <=", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentLike(String value) {
+            addCriterion("component like", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentNotLike(String value) {
+            addCriterion("component not like", value, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentIn(List<String> values) {
+            addCriterion("component in", values, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentNotIn(List<String> values) {
+            addCriterion("component not in", values, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentBetween(String value1, String value2) {
+            addCriterion("component between", value1, value2, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andComponentNotBetween(String value1, String value2) {
+            addCriterion("component not between", value1, value2, "component");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateIsNull() {
+            addCriterion("state is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateIsNotNull() {
+            addCriterion("state is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateEqualTo(Boolean value) {
+            addCriterion("state =", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateNotEqualTo(Boolean value) {
+            addCriterion("state <>", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateGreaterThan(Boolean value) {
+            addCriterion("state >", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("state >=", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateLessThan(Boolean value) {
+            addCriterion("state <", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateLessThanOrEqualTo(Boolean value) {
+            addCriterion("state <=", value, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateIn(List<Boolean> values) {
+            addCriterion("state in", values, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateNotIn(List<Boolean> values) {
+            addCriterion("state not in", values, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateBetween(Boolean value1, Boolean value2) {
+            addCriterion("state between", value1, value2, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andStateNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("state not between", value1, value2, "state");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnIsNull() {
+            addCriterion("push_btn is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnIsNotNull() {
+            addCriterion("push_btn is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnEqualTo(String value) {
+            addCriterion("push_btn =", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnNotEqualTo(String value) {
+            addCriterion("push_btn <>", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnGreaterThan(String value) {
+            addCriterion("push_btn >", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnGreaterThanOrEqualTo(String value) {
+            addCriterion("push_btn >=", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnLessThan(String value) {
+            addCriterion("push_btn <", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnLessThanOrEqualTo(String value) {
+            addCriterion("push_btn <=", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnLike(String value) {
+            addCriterion("push_btn like", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnNotLike(String value) {
+            addCriterion("push_btn not like", value, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnIn(List<String> values) {
+            addCriterion("push_btn in", values, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnNotIn(List<String> values) {
+            addCriterion("push_btn not in", values, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnBetween(String value1, String value2) {
+            addCriterion("push_btn between", value1, value2, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andPushBtnNotBetween(String value1, String value2) {
+            addCriterion("push_btn not between", value1, value2, "pushBtn");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconIsNull() {
+            addCriterion("icon is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconIsNotNull() {
+            addCriterion("icon is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconEqualTo(String value) {
+            addCriterion("icon =", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconNotEqualTo(String value) {
+            addCriterion("icon <>", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconGreaterThan(String value) {
+            addCriterion("icon >", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconGreaterThanOrEqualTo(String value) {
+            addCriterion("icon >=", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconLessThan(String value) {
+            addCriterion("icon <", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconLessThanOrEqualTo(String value) {
+            addCriterion("icon <=", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconLike(String value) {
+            addCriterion("icon like", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconNotLike(String value) {
+            addCriterion("icon not like", value, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconIn(List<String> values) {
+            addCriterion("icon in", values, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconNotIn(List<String> values) {
+            addCriterion("icon not in", values, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconBetween(String value1, String value2) {
+            addCriterion("icon between", value1, value2, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andIconNotBetween(String value1, String value2) {
+            addCriterion("icon not between", value1, value2, "icon");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/InOutItem.java b/src/main/java/com/jsh/erp/datasource/entities/InOutItem.java
new file mode 100644
index 0000000..3f63bf7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/InOutItem.java
@@ -0,0 +1,83 @@
+package com.jsh.erp.datasource.entities;
+
+public class InOutItem {
+    private Long id;
+
+    private String name;
+
+    private String type;
+
+    private String remark;
+
+    private Boolean enabled;
+
+    private String sort;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/InOutItemExample.java b/src/main/java/com/jsh/erp/datasource/entities/InOutItemExample.java
new file mode 100644
index 0000000..663e34f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/InOutItemExample.java
@@ -0,0 +1,729 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class InOutItemExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public InOutItemExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Log.java b/src/main/java/com/jsh/erp/datasource/entities/Log.java
new file mode 100644
index 0000000..2f43c17
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Log.java
@@ -0,0 +1,85 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+public class Log {
+    private Long id;
+
+    private Long userId;
+
+    private String operation;
+
+    private String clientIp;
+
+    private Date createTime;
+
+    private Byte status;
+
+    private String content;
+
+    private Long tenantId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getOperation() {
+        return operation;
+    }
+
+    public void setOperation(String operation) {
+        this.operation = operation == null ? null : operation.trim();
+    }
+
+    public String getClientIp() {
+        return clientIp;
+    }
+
+    public void setClientIp(String clientIp) {
+        this.clientIp = clientIp == null ? null : clientIp.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Byte getStatus() {
+        return status;
+    }
+
+    public void setStatus(Byte status) {
+        this.status = status;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content == null ? null : content.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/LogExample.java b/src/main/java/com/jsh/erp/datasource/entities/LogExample.java
new file mode 100644
index 0000000..12feb81
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/LogExample.java
@@ -0,0 +1,710 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class LogExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public LogExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNull() {
+            addCriterion("user_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNotNull() {
+            addCriterion("user_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdEqualTo(Long value) {
+            addCriterion("user_id =", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotEqualTo(Long value) {
+            addCriterion("user_id <>", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThan(Long value) {
+            addCriterion("user_id >", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("user_id >=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThan(Long value) {
+            addCriterion("user_id <", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThanOrEqualTo(Long value) {
+            addCriterion("user_id <=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIn(List<Long> values) {
+            addCriterion("user_id in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotIn(List<Long> values) {
+            addCriterion("user_id not in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdBetween(Long value1, Long value2) {
+            addCriterion("user_id between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotBetween(Long value1, Long value2) {
+            addCriterion("user_id not between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationIsNull() {
+            addCriterion("operation is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationIsNotNull() {
+            addCriterion("operation is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationEqualTo(String value) {
+            addCriterion("operation =", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationNotEqualTo(String value) {
+            addCriterion("operation <>", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationGreaterThan(String value) {
+            addCriterion("operation >", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationGreaterThanOrEqualTo(String value) {
+            addCriterion("operation >=", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationLessThan(String value) {
+            addCriterion("operation <", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationLessThanOrEqualTo(String value) {
+            addCriterion("operation <=", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationLike(String value) {
+            addCriterion("operation like", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationNotLike(String value) {
+            addCriterion("operation not like", value, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationIn(List<String> values) {
+            addCriterion("operation in", values, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationNotIn(List<String> values) {
+            addCriterion("operation not in", values, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationBetween(String value1, String value2) {
+            addCriterion("operation between", value1, value2, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andOperationNotBetween(String value1, String value2) {
+            addCriterion("operation not between", value1, value2, "operation");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpIsNull() {
+            addCriterion("client_ip is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpIsNotNull() {
+            addCriterion("client_ip is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpEqualTo(String value) {
+            addCriterion("client_ip =", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpNotEqualTo(String value) {
+            addCriterion("client_ip <>", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpGreaterThan(String value) {
+            addCriterion("client_ip >", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpGreaterThanOrEqualTo(String value) {
+            addCriterion("client_ip >=", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpLessThan(String value) {
+            addCriterion("client_ip <", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpLessThanOrEqualTo(String value) {
+            addCriterion("client_ip <=", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpLike(String value) {
+            addCriterion("client_ip like", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpNotLike(String value) {
+            addCriterion("client_ip not like", value, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpIn(List<String> values) {
+            addCriterion("client_ip in", values, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpNotIn(List<String> values) {
+            addCriterion("client_ip not in", values, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpBetween(String value1, String value2) {
+            addCriterion("client_ip between", value1, value2, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andClientIpNotBetween(String value1, String value2) {
+            addCriterion("client_ip not between", value1, value2, "clientIp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Byte value) {
+            addCriterion("status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Byte value) {
+            addCriterion("status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Byte value) {
+            addCriterion("status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Byte value) {
+            addCriterion("status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Byte value) {
+            addCriterion("status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Byte value) {
+            addCriterion("status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Byte> values) {
+            addCriterion("status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Byte> values) {
+            addCriterion("status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Byte value1, Byte value2) {
+            addCriterion("status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Byte value1, Byte value2) {
+            addCriterion("status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIsNull() {
+            addCriterion("content is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIsNotNull() {
+            addCriterion("content is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentEqualTo(String value) {
+            addCriterion("content =", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotEqualTo(String value) {
+            addCriterion("content <>", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentGreaterThan(String value) {
+            addCriterion("content >", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentGreaterThanOrEqualTo(String value) {
+            addCriterion("content >=", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLessThan(String value) {
+            addCriterion("content <", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLessThanOrEqualTo(String value) {
+            addCriterion("content <=", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLike(String value) {
+            addCriterion("content like", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotLike(String value) {
+            addCriterion("content not like", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIn(List<String> values) {
+            addCriterion("content in", values, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotIn(List<String> values) {
+            addCriterion("content not in", values, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentBetween(String value1, String value2) {
+            addCriterion("content between", value1, value2, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotBetween(String value1, String value2) {
+            addCriterion("content not between", value1, value2, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Material.java b/src/main/java/com/jsh/erp/datasource/entities/Material.java
new file mode 100644
index 0000000..6322946
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Material.java
@@ -0,0 +1,245 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class Material {
+    private Long id;
+
+    private Long categoryId;
+
+    private String name;
+
+    private String mfrs;
+
+    private String model;
+
+    private String standard;
+
+    private String brand;
+
+    private String mnemonic;
+
+    private String color;
+
+    private String unit;
+
+    private String remark;
+
+    private String imgName;
+
+    private Long unitId;
+
+    private Integer expiryNum;
+
+    private BigDecimal weight;
+
+    private Boolean enabled;
+
+    private String otherField1;
+
+    private String otherField2;
+
+    private String otherField3;
+
+    private String enableSerialNumber;
+
+    private String enableBatchNumber;
+
+    private String position;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getCategoryId() {
+        return categoryId;
+    }
+
+    public void setCategoryId(Long categoryId) {
+        this.categoryId = categoryId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getMfrs() {
+        return mfrs;
+    }
+
+    public void setMfrs(String mfrs) {
+        this.mfrs = mfrs == null ? null : mfrs.trim();
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model == null ? null : model.trim();
+    }
+
+    public String getStandard() {
+        return standard;
+    }
+
+    public void setStandard(String standard) {
+        this.standard = standard == null ? null : standard.trim();
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand == null ? null : brand.trim();
+    }
+
+    public String getMnemonic() {
+        return mnemonic;
+    }
+
+    public void setMnemonic(String mnemonic) {
+        this.mnemonic = mnemonic == null ? null : mnemonic.trim();
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color == null ? null : color.trim();
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit == null ? null : unit.trim();
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public String getImgName() {
+        return imgName;
+    }
+
+    public void setImgName(String imgName) {
+        this.imgName = imgName == null ? null : imgName.trim();
+    }
+
+    public Long getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(Long unitId) {
+        this.unitId = unitId;
+    }
+
+    public Integer getExpiryNum() {
+        return expiryNum;
+    }
+
+    public void setExpiryNum(Integer expiryNum) {
+        this.expiryNum = expiryNum;
+    }
+
+    public BigDecimal getWeight() {
+        return weight;
+    }
+
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getOtherField1() {
+        return otherField1;
+    }
+
+    public void setOtherField1(String otherField1) {
+        this.otherField1 = otherField1 == null ? null : otherField1.trim();
+    }
+
+    public String getOtherField2() {
+        return otherField2;
+    }
+
+    public void setOtherField2(String otherField2) {
+        this.otherField2 = otherField2 == null ? null : otherField2.trim();
+    }
+
+    public String getOtherField3() {
+        return otherField3;
+    }
+
+    public void setOtherField3(String otherField3) {
+        this.otherField3 = otherField3 == null ? null : otherField3.trim();
+    }
+
+    public String getEnableSerialNumber() {
+        return enableSerialNumber;
+    }
+
+    public void setEnableSerialNumber(String enableSerialNumber) {
+        this.enableSerialNumber = enableSerialNumber == null ? null : enableSerialNumber.trim();
+    }
+
+    public String getEnableBatchNumber() {
+        return enableBatchNumber;
+    }
+
+    public void setEnableBatchNumber(String enableBatchNumber) {
+        this.enableBatchNumber = enableBatchNumber == null ? null : enableBatchNumber.trim();
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position == null ? null : position.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialAttribute.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialAttribute.java
new file mode 100644
index 0000000..f7be215
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialAttribute.java
@@ -0,0 +1,53 @@
+package com.jsh.erp.datasource.entities;
+
+public class MaterialAttribute {
+    private Long id;
+
+    private String attributeName;
+
+    private String attributeValue;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAttributeName() {
+        return attributeName;
+    }
+
+    public void setAttributeName(String attributeName) {
+        this.attributeName = attributeName == null ? null : attributeName.trim();
+    }
+
+    public String getAttributeValue() {
+        return attributeValue;
+    }
+
+    public void setAttributeValue(String attributeValue) {
+        this.attributeValue = attributeValue == null ? null : attributeValue.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialAttributeExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialAttributeExample.java
new file mode 100644
index 0000000..2783a44
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialAttributeExample.java
@@ -0,0 +1,529 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MaterialAttributeExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MaterialAttributeExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameIsNull() {
+            addCriterion("attribute_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameIsNotNull() {
+            addCriterion("attribute_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameEqualTo(String value) {
+            addCriterion("attribute_name =", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameNotEqualTo(String value) {
+            addCriterion("attribute_name <>", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameGreaterThan(String value) {
+            addCriterion("attribute_name >", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameGreaterThanOrEqualTo(String value) {
+            addCriterion("attribute_name >=", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameLessThan(String value) {
+            addCriterion("attribute_name <", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameLessThanOrEqualTo(String value) {
+            addCriterion("attribute_name <=", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameLike(String value) {
+            addCriterion("attribute_name like", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameNotLike(String value) {
+            addCriterion("attribute_name not like", value, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameIn(List<String> values) {
+            addCriterion("attribute_name in", values, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameNotIn(List<String> values) {
+            addCriterion("attribute_name not in", values, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameBetween(String value1, String value2) {
+            addCriterion("attribute_name between", value1, value2, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeNameNotBetween(String value1, String value2) {
+            addCriterion("attribute_name not between", value1, value2, "attributeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueIsNull() {
+            addCriterion("attribute_value is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueIsNotNull() {
+            addCriterion("attribute_value is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueEqualTo(String value) {
+            addCriterion("attribute_value =", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueNotEqualTo(String value) {
+            addCriterion("attribute_value <>", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueGreaterThan(String value) {
+            addCriterion("attribute_value >", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueGreaterThanOrEqualTo(String value) {
+            addCriterion("attribute_value >=", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueLessThan(String value) {
+            addCriterion("attribute_value <", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueLessThanOrEqualTo(String value) {
+            addCriterion("attribute_value <=", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueLike(String value) {
+            addCriterion("attribute_value like", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueNotLike(String value) {
+            addCriterion("attribute_value not like", value, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueIn(List<String> values) {
+            addCriterion("attribute_value in", values, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueNotIn(List<String> values) {
+            addCriterion("attribute_value not in", values, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueBetween(String value1, String value2) {
+            addCriterion("attribute_value between", value1, value2, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttributeValueNotBetween(String value1, String value2) {
+            addCriterion("attribute_value not between", value1, value2, "attributeValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialCategory.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialCategory.java
new file mode 100644
index 0000000..65958f0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialCategory.java
@@ -0,0 +1,115 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+public class MaterialCategory {
+    private Long id;
+
+    private String name;
+
+    private Short categoryLevel;
+
+    private Long parentId;
+
+    private String sort;
+
+    private String serialNo;
+
+    private String remark;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public Short getCategoryLevel() {
+        return categoryLevel;
+    }
+
+    public void setCategoryLevel(Short categoryLevel) {
+        this.categoryLevel = categoryLevel;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public String getSerialNo() {
+        return serialNo;
+    }
+
+    public void setSerialNo(String serialNo) {
+        this.serialNo = serialNo == null ? null : serialNo.trim();
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialCategoryExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialCategoryExample.java
new file mode 100644
index 0000000..aa38104
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialCategoryExample.java
@@ -0,0 +1,910 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class MaterialCategoryExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MaterialCategoryExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelIsNull() {
+            addCriterion("category_level is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelIsNotNull() {
+            addCriterion("category_level is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelEqualTo(Short value) {
+            addCriterion("category_level =", value, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelNotEqualTo(Short value) {
+            addCriterion("category_level <>", value, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelGreaterThan(Short value) {
+            addCriterion("category_level >", value, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelGreaterThanOrEqualTo(Short value) {
+            addCriterion("category_level >=", value, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelLessThan(Short value) {
+            addCriterion("category_level <", value, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelLessThanOrEqualTo(Short value) {
+            addCriterion("category_level <=", value, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelIn(List<Short> values) {
+            addCriterion("category_level in", values, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelNotIn(List<Short> values) {
+            addCriterion("category_level not in", values, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelBetween(Short value1, Short value2) {
+            addCriterion("category_level between", value1, value2, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryLevelNotBetween(Short value1, Short value2) {
+            addCriterion("category_level not between", value1, value2, "categoryLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdIsNull() {
+            addCriterion("parent_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdIsNotNull() {
+            addCriterion("parent_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdEqualTo(Long value) {
+            addCriterion("parent_id =", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdNotEqualTo(Long value) {
+            addCriterion("parent_id <>", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdGreaterThan(Long value) {
+            addCriterion("parent_id >", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("parent_id >=", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdLessThan(Long value) {
+            addCriterion("parent_id <", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdLessThanOrEqualTo(Long value) {
+            addCriterion("parent_id <=", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdIn(List<Long> values) {
+            addCriterion("parent_id in", values, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdNotIn(List<Long> values) {
+            addCriterion("parent_id not in", values, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdBetween(Long value1, Long value2) {
+            addCriterion("parent_id between", value1, value2, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdNotBetween(Long value1, Long value2) {
+            addCriterion("parent_id not between", value1, value2, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoIsNull() {
+            addCriterion("serial_no is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoIsNotNull() {
+            addCriterion("serial_no is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoEqualTo(String value) {
+            addCriterion("serial_no =", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotEqualTo(String value) {
+            addCriterion("serial_no <>", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoGreaterThan(String value) {
+            addCriterion("serial_no >", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoGreaterThanOrEqualTo(String value) {
+            addCriterion("serial_no >=", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoLessThan(String value) {
+            addCriterion("serial_no <", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoLessThanOrEqualTo(String value) {
+            addCriterion("serial_no <=", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoLike(String value) {
+            addCriterion("serial_no like", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotLike(String value) {
+            addCriterion("serial_no not like", value, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoIn(List<String> values) {
+            addCriterion("serial_no in", values, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotIn(List<String> values) {
+            addCriterion("serial_no not in", values, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoBetween(String value1, String value2) {
+            addCriterion("serial_no between", value1, value2, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNoNotBetween(String value1, String value2) {
+            addCriterion("serial_no not between", value1, value2, "serialNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStock.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStock.java
new file mode 100644
index 0000000..832ab84
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStock.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class MaterialCurrentStock {
+    private Long id;
+
+    private Long materialId;
+
+    private Long depotId;
+
+    private BigDecimal currentNumber;
+
+    private BigDecimal currentUnitPrice;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getMaterialId() {
+        return materialId;
+    }
+
+    public void setMaterialId(Long materialId) {
+        this.materialId = materialId;
+    }
+
+    public Long getDepotId() {
+        return depotId;
+    }
+
+    public void setDepotId(Long depotId) {
+        this.depotId = depotId;
+    }
+
+    public BigDecimal getCurrentNumber() {
+        return currentNumber;
+    }
+
+    public void setCurrentNumber(BigDecimal currentNumber) {
+        this.currentNumber = currentNumber;
+    }
+
+    public BigDecimal getCurrentUnitPrice() {
+        return currentUnitPrice;
+    }
+
+    public void setCurrentUnitPrice(BigDecimal currentUnitPrice) {
+        this.currentUnitPrice = currentUnitPrice;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStockExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStockExample.java
new file mode 100644
index 0000000..aa2647b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStockExample.java
@@ -0,0 +1,630 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MaterialCurrentStockExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MaterialCurrentStockExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNull() {
+            addCriterion("material_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNotNull() {
+            addCriterion("material_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdEqualTo(Long value) {
+            addCriterion("material_id =", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotEqualTo(Long value) {
+            addCriterion("material_id <>", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThan(Long value) {
+            addCriterion("material_id >", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("material_id >=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThan(Long value) {
+            addCriterion("material_id <", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThanOrEqualTo(Long value) {
+            addCriterion("material_id <=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIn(List<Long> values) {
+            addCriterion("material_id in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotIn(List<Long> values) {
+            addCriterion("material_id not in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdBetween(Long value1, Long value2) {
+            addCriterion("material_id between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotBetween(Long value1, Long value2) {
+            addCriterion("material_id not between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNull() {
+            addCriterion("depot_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNotNull() {
+            addCriterion("depot_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdEqualTo(Long value) {
+            addCriterion("depot_id =", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotEqualTo(Long value) {
+            addCriterion("depot_id <>", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThan(Long value) {
+            addCriterion("depot_id >", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("depot_id >=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThan(Long value) {
+            addCriterion("depot_id <", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThanOrEqualTo(Long value) {
+            addCriterion("depot_id <=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIn(List<Long> values) {
+            addCriterion("depot_id in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotIn(List<Long> values) {
+            addCriterion("depot_id not in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdBetween(Long value1, Long value2) {
+            addCriterion("depot_id between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotBetween(Long value1, Long value2) {
+            addCriterion("depot_id not between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberIsNull() {
+            addCriterion("current_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberIsNotNull() {
+            addCriterion("current_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberEqualTo(BigDecimal value) {
+            addCriterion("current_number =", value, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberNotEqualTo(BigDecimal value) {
+            addCriterion("current_number <>", value, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberGreaterThan(BigDecimal value) {
+            addCriterion("current_number >", value, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("current_number >=", value, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberLessThan(BigDecimal value) {
+            addCriterion("current_number <", value, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("current_number <=", value, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberIn(List<BigDecimal> values) {
+            addCriterion("current_number in", values, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberNotIn(List<BigDecimal> values) {
+            addCriterion("current_number not in", values, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("current_number between", value1, value2, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentNumberNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("current_number not between", value1, value2, "currentNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceIsNull() {
+            addCriterion("current_unit_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceIsNotNull() {
+            addCriterion("current_unit_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceEqualTo(BigDecimal value) {
+            addCriterion("current_unit_price =", value, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceNotEqualTo(BigDecimal value) {
+            addCriterion("current_unit_price <>", value, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceGreaterThan(BigDecimal value) {
+            addCriterion("current_unit_price >", value, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("current_unit_price >=", value, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceLessThan(BigDecimal value) {
+            addCriterion("current_unit_price <", value, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("current_unit_price <=", value, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceIn(List<BigDecimal> values) {
+            addCriterion("current_unit_price in", values, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceNotIn(List<BigDecimal> values) {
+            addCriterion("current_unit_price not in", values, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("current_unit_price between", value1, value2, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andCurrentUnitPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("current_unit_price not between", value1, value2, "currentUnitPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java
new file mode 100644
index 0000000..38aed7e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java
@@ -0,0 +1,1810 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MaterialExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MaterialExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdIsNull() {
+            addCriterion("category_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdIsNotNull() {
+            addCriterion("category_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdEqualTo(Long value) {
+            addCriterion("category_id =", value, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdNotEqualTo(Long value) {
+            addCriterion("category_id <>", value, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdGreaterThan(Long value) {
+            addCriterion("category_id >", value, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("category_id >=", value, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdLessThan(Long value) {
+            addCriterion("category_id <", value, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdLessThanOrEqualTo(Long value) {
+            addCriterion("category_id <=", value, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdIn(List<Long> values) {
+            addCriterion("category_id in", values, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdNotIn(List<Long> values) {
+            addCriterion("category_id not in", values, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdBetween(Long value1, Long value2) {
+            addCriterion("category_id between", value1, value2, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryIdNotBetween(Long value1, Long value2) {
+            addCriterion("category_id not between", value1, value2, "categoryId");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsIsNull() {
+            addCriterion("mfrs is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsIsNotNull() {
+            addCriterion("mfrs is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsEqualTo(String value) {
+            addCriterion("mfrs =", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsNotEqualTo(String value) {
+            addCriterion("mfrs <>", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsGreaterThan(String value) {
+            addCriterion("mfrs >", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsGreaterThanOrEqualTo(String value) {
+            addCriterion("mfrs >=", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsLessThan(String value) {
+            addCriterion("mfrs <", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsLessThanOrEqualTo(String value) {
+            addCriterion("mfrs <=", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsLike(String value) {
+            addCriterion("mfrs like", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsNotLike(String value) {
+            addCriterion("mfrs not like", value, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsIn(List<String> values) {
+            addCriterion("mfrs in", values, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsNotIn(List<String> values) {
+            addCriterion("mfrs not in", values, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsBetween(String value1, String value2) {
+            addCriterion("mfrs between", value1, value2, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andMfrsNotBetween(String value1, String value2) {
+            addCriterion("mfrs not between", value1, value2, "mfrs");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelIsNull() {
+            addCriterion("model is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelIsNotNull() {
+            addCriterion("model is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelEqualTo(String value) {
+            addCriterion("model =", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelNotEqualTo(String value) {
+            addCriterion("model <>", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelGreaterThan(String value) {
+            addCriterion("model >", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelGreaterThanOrEqualTo(String value) {
+            addCriterion("model >=", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelLessThan(String value) {
+            addCriterion("model <", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelLessThanOrEqualTo(String value) {
+            addCriterion("model <=", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelLike(String value) {
+            addCriterion("model like", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelNotLike(String value) {
+            addCriterion("model not like", value, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelIn(List<String> values) {
+            addCriterion("model in", values, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelNotIn(List<String> values) {
+            addCriterion("model not in", values, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelBetween(String value1, String value2) {
+            addCriterion("model between", value1, value2, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andModelNotBetween(String value1, String value2) {
+            addCriterion("model not between", value1, value2, "model");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardIsNull() {
+            addCriterion("standard is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardIsNotNull() {
+            addCriterion("standard is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardEqualTo(String value) {
+            addCriterion("standard =", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardNotEqualTo(String value) {
+            addCriterion("standard <>", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardGreaterThan(String value) {
+            addCriterion("standard >", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardGreaterThanOrEqualTo(String value) {
+            addCriterion("standard >=", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardLessThan(String value) {
+            addCriterion("standard <", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardLessThanOrEqualTo(String value) {
+            addCriterion("standard <=", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardLike(String value) {
+            addCriterion("standard like", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardNotLike(String value) {
+            addCriterion("standard not like", value, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardIn(List<String> values) {
+            addCriterion("standard in", values, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardNotIn(List<String> values) {
+            addCriterion("standard not in", values, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardBetween(String value1, String value2) {
+            addCriterion("standard between", value1, value2, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardNotBetween(String value1, String value2) {
+            addCriterion("standard not between", value1, value2, "standard");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandIsNull() {
+            addCriterion("brand is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandIsNotNull() {
+            addCriterion("brand is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandEqualTo(String value) {
+            addCriterion("brand =", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandNotEqualTo(String value) {
+            addCriterion("brand <>", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandGreaterThan(String value) {
+            addCriterion("brand >", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandGreaterThanOrEqualTo(String value) {
+            addCriterion("brand >=", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandLessThan(String value) {
+            addCriterion("brand <", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandLessThanOrEqualTo(String value) {
+            addCriterion("brand <=", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandLike(String value) {
+            addCriterion("brand like", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandNotLike(String value) {
+            addCriterion("brand not like", value, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandIn(List<String> values) {
+            addCriterion("brand in", values, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandNotIn(List<String> values) {
+            addCriterion("brand not in", values, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandBetween(String value1, String value2) {
+            addCriterion("brand between", value1, value2, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andBrandNotBetween(String value1, String value2) {
+            addCriterion("brand not between", value1, value2, "brand");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicIsNull() {
+            addCriterion("mnemonic is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicIsNotNull() {
+            addCriterion("mnemonic is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicEqualTo(String value) {
+            addCriterion("mnemonic =", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicNotEqualTo(String value) {
+            addCriterion("mnemonic <>", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicGreaterThan(String value) {
+            addCriterion("mnemonic >", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicGreaterThanOrEqualTo(String value) {
+            addCriterion("mnemonic >=", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicLessThan(String value) {
+            addCriterion("mnemonic <", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicLessThanOrEqualTo(String value) {
+            addCriterion("mnemonic <=", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicLike(String value) {
+            addCriterion("mnemonic like", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicNotLike(String value) {
+            addCriterion("mnemonic not like", value, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicIn(List<String> values) {
+            addCriterion("mnemonic in", values, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicNotIn(List<String> values) {
+            addCriterion("mnemonic not in", values, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicBetween(String value1, String value2) {
+            addCriterion("mnemonic between", value1, value2, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andMnemonicNotBetween(String value1, String value2) {
+            addCriterion("mnemonic not between", value1, value2, "mnemonic");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorIsNull() {
+            addCriterion("color is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorIsNotNull() {
+            addCriterion("color is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorEqualTo(String value) {
+            addCriterion("color =", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorNotEqualTo(String value) {
+            addCriterion("color <>", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorGreaterThan(String value) {
+            addCriterion("color >", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorGreaterThanOrEqualTo(String value) {
+            addCriterion("color >=", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorLessThan(String value) {
+            addCriterion("color <", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorLessThanOrEqualTo(String value) {
+            addCriterion("color <=", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorLike(String value) {
+            addCriterion("color like", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorNotLike(String value) {
+            addCriterion("color not like", value, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorIn(List<String> values) {
+            addCriterion("color in", values, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorNotIn(List<String> values) {
+            addCriterion("color not in", values, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorBetween(String value1, String value2) {
+            addCriterion("color between", value1, value2, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andColorNotBetween(String value1, String value2) {
+            addCriterion("color not between", value1, value2, "color");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIsNull() {
+            addCriterion("unit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIsNotNull() {
+            addCriterion("unit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitEqualTo(String value) {
+            addCriterion("unit =", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitNotEqualTo(String value) {
+            addCriterion("unit <>", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitGreaterThan(String value) {
+            addCriterion("unit >", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitGreaterThanOrEqualTo(String value) {
+            addCriterion("unit >=", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitLessThan(String value) {
+            addCriterion("unit <", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitLessThanOrEqualTo(String value) {
+            addCriterion("unit <=", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitLike(String value) {
+            addCriterion("unit like", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitNotLike(String value) {
+            addCriterion("unit not like", value, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIn(List<String> values) {
+            addCriterion("unit in", values, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitNotIn(List<String> values) {
+            addCriterion("unit not in", values, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitBetween(String value1, String value2) {
+            addCriterion("unit between", value1, value2, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitNotBetween(String value1, String value2) {
+            addCriterion("unit not between", value1, value2, "unit");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameIsNull() {
+            addCriterion("img_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameIsNotNull() {
+            addCriterion("img_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameEqualTo(String value) {
+            addCriterion("img_name =", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameNotEqualTo(String value) {
+            addCriterion("img_name <>", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameGreaterThan(String value) {
+            addCriterion("img_name >", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameGreaterThanOrEqualTo(String value) {
+            addCriterion("img_name >=", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameLessThan(String value) {
+            addCriterion("img_name <", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameLessThanOrEqualTo(String value) {
+            addCriterion("img_name <=", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameLike(String value) {
+            addCriterion("img_name like", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameNotLike(String value) {
+            addCriterion("img_name not like", value, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameIn(List<String> values) {
+            addCriterion("img_name in", values, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameNotIn(List<String> values) {
+            addCriterion("img_name not in", values, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameBetween(String value1, String value2) {
+            addCriterion("img_name between", value1, value2, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andImgNameNotBetween(String value1, String value2) {
+            addCriterion("img_name not between", value1, value2, "imgName");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdIsNull() {
+            addCriterion("unit_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdIsNotNull() {
+            addCriterion("unit_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdEqualTo(Long value) {
+            addCriterion("unit_id =", value, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdNotEqualTo(Long value) {
+            addCriterion("unit_id <>", value, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdGreaterThan(Long value) {
+            addCriterion("unit_id >", value, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("unit_id >=", value, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdLessThan(Long value) {
+            addCriterion("unit_id <", value, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdLessThanOrEqualTo(Long value) {
+            addCriterion("unit_id <=", value, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdIn(List<Long> values) {
+            addCriterion("unit_id in", values, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdNotIn(List<Long> values) {
+            addCriterion("unit_id not in", values, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdBetween(Long value1, Long value2) {
+            addCriterion("unit_id between", value1, value2, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUnitIdNotBetween(Long value1, Long value2) {
+            addCriterion("unit_id not between", value1, value2, "unitId");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumIsNull() {
+            addCriterion("expiry_num is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumIsNotNull() {
+            addCriterion("expiry_num is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumEqualTo(Integer value) {
+            addCriterion("expiry_num =", value, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumNotEqualTo(Integer value) {
+            addCriterion("expiry_num <>", value, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumGreaterThan(Integer value) {
+            addCriterion("expiry_num >", value, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumGreaterThanOrEqualTo(Integer value) {
+            addCriterion("expiry_num >=", value, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumLessThan(Integer value) {
+            addCriterion("expiry_num <", value, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumLessThanOrEqualTo(Integer value) {
+            addCriterion("expiry_num <=", value, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumIn(List<Integer> values) {
+            addCriterion("expiry_num in", values, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumNotIn(List<Integer> values) {
+            addCriterion("expiry_num not in", values, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumBetween(Integer value1, Integer value2) {
+            addCriterion("expiry_num between", value1, value2, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpiryNumNotBetween(Integer value1, Integer value2) {
+            addCriterion("expiry_num not between", value1, value2, "expiryNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightIsNull() {
+            addCriterion("weight is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightIsNotNull() {
+            addCriterion("weight is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightEqualTo(BigDecimal value) {
+            addCriterion("weight =", value, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightNotEqualTo(BigDecimal value) {
+            addCriterion("weight <>", value, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightGreaterThan(BigDecimal value) {
+            addCriterion("weight >", value, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("weight >=", value, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightLessThan(BigDecimal value) {
+            addCriterion("weight <", value, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("weight <=", value, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightIn(List<BigDecimal> values) {
+            addCriterion("weight in", values, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightNotIn(List<BigDecimal> values) {
+            addCriterion("weight not in", values, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("weight between", value1, value2, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("weight not between", value1, value2, "weight");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1IsNull() {
+            addCriterion("other_field1 is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1IsNotNull() {
+            addCriterion("other_field1 is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1EqualTo(String value) {
+            addCriterion("other_field1 =", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1NotEqualTo(String value) {
+            addCriterion("other_field1 <>", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1GreaterThan(String value) {
+            addCriterion("other_field1 >", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1GreaterThanOrEqualTo(String value) {
+            addCriterion("other_field1 >=", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1LessThan(String value) {
+            addCriterion("other_field1 <", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1LessThanOrEqualTo(String value) {
+            addCriterion("other_field1 <=", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1Like(String value) {
+            addCriterion("other_field1 like", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1NotLike(String value) {
+            addCriterion("other_field1 not like", value, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1In(List<String> values) {
+            addCriterion("other_field1 in", values, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1NotIn(List<String> values) {
+            addCriterion("other_field1 not in", values, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1Between(String value1, String value2) {
+            addCriterion("other_field1 between", value1, value2, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField1NotBetween(String value1, String value2) {
+            addCriterion("other_field1 not between", value1, value2, "otherField1");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2IsNull() {
+            addCriterion("other_field2 is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2IsNotNull() {
+            addCriterion("other_field2 is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2EqualTo(String value) {
+            addCriterion("other_field2 =", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2NotEqualTo(String value) {
+            addCriterion("other_field2 <>", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2GreaterThan(String value) {
+            addCriterion("other_field2 >", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2GreaterThanOrEqualTo(String value) {
+            addCriterion("other_field2 >=", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2LessThan(String value) {
+            addCriterion("other_field2 <", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2LessThanOrEqualTo(String value) {
+            addCriterion("other_field2 <=", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2Like(String value) {
+            addCriterion("other_field2 like", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2NotLike(String value) {
+            addCriterion("other_field2 not like", value, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2In(List<String> values) {
+            addCriterion("other_field2 in", values, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2NotIn(List<String> values) {
+            addCriterion("other_field2 not in", values, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2Between(String value1, String value2) {
+            addCriterion("other_field2 between", value1, value2, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField2NotBetween(String value1, String value2) {
+            addCriterion("other_field2 not between", value1, value2, "otherField2");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3IsNull() {
+            addCriterion("other_field3 is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3IsNotNull() {
+            addCriterion("other_field3 is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3EqualTo(String value) {
+            addCriterion("other_field3 =", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3NotEqualTo(String value) {
+            addCriterion("other_field3 <>", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3GreaterThan(String value) {
+            addCriterion("other_field3 >", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3GreaterThanOrEqualTo(String value) {
+            addCriterion("other_field3 >=", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3LessThan(String value) {
+            addCriterion("other_field3 <", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3LessThanOrEqualTo(String value) {
+            addCriterion("other_field3 <=", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3Like(String value) {
+            addCriterion("other_field3 like", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3NotLike(String value) {
+            addCriterion("other_field3 not like", value, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3In(List<String> values) {
+            addCriterion("other_field3 in", values, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3NotIn(List<String> values) {
+            addCriterion("other_field3 not in", values, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3Between(String value1, String value2) {
+            addCriterion("other_field3 between", value1, value2, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherField3NotBetween(String value1, String value2) {
+            addCriterion("other_field3 not between", value1, value2, "otherField3");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberIsNull() {
+            addCriterion("enable_serial_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberIsNotNull() {
+            addCriterion("enable_serial_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberEqualTo(String value) {
+            addCriterion("enable_serial_number =", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberNotEqualTo(String value) {
+            addCriterion("enable_serial_number <>", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberGreaterThan(String value) {
+            addCriterion("enable_serial_number >", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("enable_serial_number >=", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberLessThan(String value) {
+            addCriterion("enable_serial_number <", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberLessThanOrEqualTo(String value) {
+            addCriterion("enable_serial_number <=", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberLike(String value) {
+            addCriterion("enable_serial_number like", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberNotLike(String value) {
+            addCriterion("enable_serial_number not like", value, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberIn(List<String> values) {
+            addCriterion("enable_serial_number in", values, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberNotIn(List<String> values) {
+            addCriterion("enable_serial_number not in", values, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberBetween(String value1, String value2) {
+            addCriterion("enable_serial_number between", value1, value2, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSerialNumberNotBetween(String value1, String value2) {
+            addCriterion("enable_serial_number not between", value1, value2, "enableSerialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberIsNull() {
+            addCriterion("enable_batch_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberIsNotNull() {
+            addCriterion("enable_batch_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberEqualTo(String value) {
+            addCriterion("enable_batch_number =", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberNotEqualTo(String value) {
+            addCriterion("enable_batch_number <>", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberGreaterThan(String value) {
+            addCriterion("enable_batch_number >", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("enable_batch_number >=", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberLessThan(String value) {
+            addCriterion("enable_batch_number <", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberLessThanOrEqualTo(String value) {
+            addCriterion("enable_batch_number <=", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberLike(String value) {
+            addCriterion("enable_batch_number like", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberNotLike(String value) {
+            addCriterion("enable_batch_number not like", value, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberIn(List<String> values) {
+            addCriterion("enable_batch_number in", values, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberNotIn(List<String> values) {
+            addCriterion("enable_batch_number not in", values, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberBetween(String value1, String value2) {
+            addCriterion("enable_batch_number between", value1, value2, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableBatchNumberNotBetween(String value1, String value2) {
+            addCriterion("enable_batch_number not between", value1, value2, "enableBatchNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionIsNull() {
+            addCriterion("position is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionIsNotNull() {
+            addCriterion("position is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionEqualTo(String value) {
+            addCriterion("position =", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotEqualTo(String value) {
+            addCriterion("position <>", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionGreaterThan(String value) {
+            addCriterion("position >", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionGreaterThanOrEqualTo(String value) {
+            addCriterion("position >=", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionLessThan(String value) {
+            addCriterion("position <", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionLessThanOrEqualTo(String value) {
+            addCriterion("position <=", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionLike(String value) {
+            addCriterion("position like", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotLike(String value) {
+            addCriterion("position not like", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionIn(List<String> values) {
+            addCriterion("position in", values, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotIn(List<String> values) {
+            addCriterion("position not in", values, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionBetween(String value1, String value2) {
+            addCriterion("position between", value1, value2, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotBetween(String value1, String value2) {
+            addCriterion("position not between", value1, value2, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialExtend.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialExtend.java
new file mode 100644
index 0000000..33dc0a2
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialExtend.java
@@ -0,0 +1,166 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class MaterialExtend {
+    private Long id;
+
+    private Long materialId;
+
+    private String barCode;
+
+    private String commodityUnit;
+
+    private String sku;
+
+    private BigDecimal purchaseDecimal;
+
+    private BigDecimal commodityDecimal;
+
+    private BigDecimal wholesaleDecimal;
+
+    private BigDecimal lowDecimal;
+
+    private String defaultFlag;
+
+    private Date createTime;
+
+    private String createSerial;
+
+    private String updateSerial;
+
+    private Long updateTime;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getMaterialId() {
+        return materialId;
+    }
+
+    public void setMaterialId(Long materialId) {
+        this.materialId = materialId;
+    }
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode == null ? null : barCode.trim();
+    }
+
+    public String getCommodityUnit() {
+        return commodityUnit;
+    }
+
+    public void setCommodityUnit(String commodityUnit) {
+        this.commodityUnit = commodityUnit == null ? null : commodityUnit.trim();
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku == null ? null : sku.trim();
+    }
+
+    public BigDecimal getPurchaseDecimal() {
+        return purchaseDecimal;
+    }
+
+    public void setPurchaseDecimal(BigDecimal purchaseDecimal) {
+        this.purchaseDecimal = purchaseDecimal;
+    }
+
+    public BigDecimal getCommodityDecimal() {
+        return commodityDecimal;
+    }
+
+    public void setCommodityDecimal(BigDecimal commodityDecimal) {
+        this.commodityDecimal = commodityDecimal;
+    }
+
+    public BigDecimal getWholesaleDecimal() {
+        return wholesaleDecimal;
+    }
+
+    public void setWholesaleDecimal(BigDecimal wholesaleDecimal) {
+        this.wholesaleDecimal = wholesaleDecimal;
+    }
+
+    public BigDecimal getLowDecimal() {
+        return lowDecimal;
+    }
+
+    public void setLowDecimal(BigDecimal lowDecimal) {
+        this.lowDecimal = lowDecimal;
+    }
+
+    public String getDefaultFlag() {
+        return defaultFlag;
+    }
+
+    public void setDefaultFlag(String defaultFlag) {
+        this.defaultFlag = defaultFlag == null ? null : defaultFlag.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getCreateSerial() {
+        return createSerial;
+    }
+
+    public void setCreateSerial(String createSerial) {
+        this.createSerial = createSerial == null ? null : createSerial.trim();
+    }
+
+    public String getUpdateSerial() {
+        return updateSerial;
+    }
+
+    public void setUpdateSerial(String updateSerial) {
+        this.updateSerial = updateSerial == null ? null : updateSerial.trim();
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialExtendExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialExtendExample.java
new file mode 100644
index 0000000..4050bad
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialExtendExample.java
@@ -0,0 +1,1231 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class MaterialExtendExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MaterialExtendExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNull() {
+            addCriterion("material_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNotNull() {
+            addCriterion("material_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdEqualTo(Long value) {
+            addCriterion("material_id =", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotEqualTo(Long value) {
+            addCriterion("material_id <>", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThan(Long value) {
+            addCriterion("material_id >", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("material_id >=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThan(Long value) {
+            addCriterion("material_id <", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThanOrEqualTo(Long value) {
+            addCriterion("material_id <=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIn(List<Long> values) {
+            addCriterion("material_id in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotIn(List<Long> values) {
+            addCriterion("material_id not in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdBetween(Long value1, Long value2) {
+            addCriterion("material_id between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotBetween(Long value1, Long value2) {
+            addCriterion("material_id not between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeIsNull() {
+            addCriterion("bar_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeIsNotNull() {
+            addCriterion("bar_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeEqualTo(String value) {
+            addCriterion("bar_code =", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeNotEqualTo(String value) {
+            addCriterion("bar_code <>", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeGreaterThan(String value) {
+            addCriterion("bar_code >", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("bar_code >=", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeLessThan(String value) {
+            addCriterion("bar_code <", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeLessThanOrEqualTo(String value) {
+            addCriterion("bar_code <=", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeLike(String value) {
+            addCriterion("bar_code like", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeNotLike(String value) {
+            addCriterion("bar_code not like", value, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeIn(List<String> values) {
+            addCriterion("bar_code in", values, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeNotIn(List<String> values) {
+            addCriterion("bar_code not in", values, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeBetween(String value1, String value2) {
+            addCriterion("bar_code between", value1, value2, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andBarCodeNotBetween(String value1, String value2) {
+            addCriterion("bar_code not between", value1, value2, "barCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitIsNull() {
+            addCriterion("commodity_unit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitIsNotNull() {
+            addCriterion("commodity_unit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitEqualTo(String value) {
+            addCriterion("commodity_unit =", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitNotEqualTo(String value) {
+            addCriterion("commodity_unit <>", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitGreaterThan(String value) {
+            addCriterion("commodity_unit >", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitGreaterThanOrEqualTo(String value) {
+            addCriterion("commodity_unit >=", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitLessThan(String value) {
+            addCriterion("commodity_unit <", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitLessThanOrEqualTo(String value) {
+            addCriterion("commodity_unit <=", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitLike(String value) {
+            addCriterion("commodity_unit like", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitNotLike(String value) {
+            addCriterion("commodity_unit not like", value, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitIn(List<String> values) {
+            addCriterion("commodity_unit in", values, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitNotIn(List<String> values) {
+            addCriterion("commodity_unit not in", values, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitBetween(String value1, String value2) {
+            addCriterion("commodity_unit between", value1, value2, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityUnitNotBetween(String value1, String value2) {
+            addCriterion("commodity_unit not between", value1, value2, "commodityUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuIsNull() {
+            addCriterion("sku is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuIsNotNull() {
+            addCriterion("sku is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuEqualTo(String value) {
+            addCriterion("sku =", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotEqualTo(String value) {
+            addCriterion("sku <>", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuGreaterThan(String value) {
+            addCriterion("sku >", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuGreaterThanOrEqualTo(String value) {
+            addCriterion("sku >=", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuLessThan(String value) {
+            addCriterion("sku <", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuLessThanOrEqualTo(String value) {
+            addCriterion("sku <=", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuLike(String value) {
+            addCriterion("sku like", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotLike(String value) {
+            addCriterion("sku not like", value, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuIn(List<String> values) {
+            addCriterion("sku in", values, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotIn(List<String> values) {
+            addCriterion("sku not in", values, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuBetween(String value1, String value2) {
+            addCriterion("sku between", value1, value2, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andSkuNotBetween(String value1, String value2) {
+            addCriterion("sku not between", value1, value2, "sku");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalIsNull() {
+            addCriterion("purchase_decimal is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalIsNotNull() {
+            addCriterion("purchase_decimal is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalEqualTo(BigDecimal value) {
+            addCriterion("purchase_decimal =", value, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalNotEqualTo(BigDecimal value) {
+            addCriterion("purchase_decimal <>", value, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalGreaterThan(BigDecimal value) {
+            addCriterion("purchase_decimal >", value, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("purchase_decimal >=", value, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalLessThan(BigDecimal value) {
+            addCriterion("purchase_decimal <", value, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("purchase_decimal <=", value, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalIn(List<BigDecimal> values) {
+            addCriterion("purchase_decimal in", values, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalNotIn(List<BigDecimal> values) {
+            addCriterion("purchase_decimal not in", values, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("purchase_decimal between", value1, value2, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseDecimalNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("purchase_decimal not between", value1, value2, "purchaseDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalIsNull() {
+            addCriterion("commodity_decimal is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalIsNotNull() {
+            addCriterion("commodity_decimal is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalEqualTo(BigDecimal value) {
+            addCriterion("commodity_decimal =", value, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalNotEqualTo(BigDecimal value) {
+            addCriterion("commodity_decimal <>", value, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalGreaterThan(BigDecimal value) {
+            addCriterion("commodity_decimal >", value, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("commodity_decimal >=", value, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalLessThan(BigDecimal value) {
+            addCriterion("commodity_decimal <", value, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("commodity_decimal <=", value, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalIn(List<BigDecimal> values) {
+            addCriterion("commodity_decimal in", values, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalNotIn(List<BigDecimal> values) {
+            addCriterion("commodity_decimal not in", values, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("commodity_decimal between", value1, value2, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andCommodityDecimalNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("commodity_decimal not between", value1, value2, "commodityDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalIsNull() {
+            addCriterion("wholesale_decimal is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalIsNotNull() {
+            addCriterion("wholesale_decimal is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalEqualTo(BigDecimal value) {
+            addCriterion("wholesale_decimal =", value, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalNotEqualTo(BigDecimal value) {
+            addCriterion("wholesale_decimal <>", value, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalGreaterThan(BigDecimal value) {
+            addCriterion("wholesale_decimal >", value, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("wholesale_decimal >=", value, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalLessThan(BigDecimal value) {
+            addCriterion("wholesale_decimal <", value, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("wholesale_decimal <=", value, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalIn(List<BigDecimal> values) {
+            addCriterion("wholesale_decimal in", values, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalNotIn(List<BigDecimal> values) {
+            addCriterion("wholesale_decimal not in", values, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("wholesale_decimal between", value1, value2, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andWholesaleDecimalNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("wholesale_decimal not between", value1, value2, "wholesaleDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalIsNull() {
+            addCriterion("low_decimal is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalIsNotNull() {
+            addCriterion("low_decimal is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalEqualTo(BigDecimal value) {
+            addCriterion("low_decimal =", value, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalNotEqualTo(BigDecimal value) {
+            addCriterion("low_decimal <>", value, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalGreaterThan(BigDecimal value) {
+            addCriterion("low_decimal >", value, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("low_decimal >=", value, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalLessThan(BigDecimal value) {
+            addCriterion("low_decimal <", value, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("low_decimal <=", value, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalIn(List<BigDecimal> values) {
+            addCriterion("low_decimal in", values, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalNotIn(List<BigDecimal> values) {
+            addCriterion("low_decimal not in", values, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("low_decimal between", value1, value2, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowDecimalNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("low_decimal not between", value1, value2, "lowDecimal");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagIsNull() {
+            addCriterion("default_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagIsNotNull() {
+            addCriterion("default_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagEqualTo(String value) {
+            addCriterion("default_flag =", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagNotEqualTo(String value) {
+            addCriterion("default_flag <>", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagGreaterThan(String value) {
+            addCriterion("default_flag >", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("default_flag >=", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagLessThan(String value) {
+            addCriterion("default_flag <", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagLessThanOrEqualTo(String value) {
+            addCriterion("default_flag <=", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagLike(String value) {
+            addCriterion("default_flag like", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagNotLike(String value) {
+            addCriterion("default_flag not like", value, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagIn(List<String> values) {
+            addCriterion("default_flag in", values, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagNotIn(List<String> values) {
+            addCriterion("default_flag not in", values, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagBetween(String value1, String value2) {
+            addCriterion("default_flag between", value1, value2, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDefaultFlagNotBetween(String value1, String value2) {
+            addCriterion("default_flag not between", value1, value2, "defaultFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialIsNull() {
+            addCriterion("create_serial is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialIsNotNull() {
+            addCriterion("create_serial is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialEqualTo(String value) {
+            addCriterion("create_serial =", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialNotEqualTo(String value) {
+            addCriterion("create_serial <>", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialGreaterThan(String value) {
+            addCriterion("create_serial >", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialGreaterThanOrEqualTo(String value) {
+            addCriterion("create_serial >=", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialLessThan(String value) {
+            addCriterion("create_serial <", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialLessThanOrEqualTo(String value) {
+            addCriterion("create_serial <=", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialLike(String value) {
+            addCriterion("create_serial like", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialNotLike(String value) {
+            addCriterion("create_serial not like", value, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialIn(List<String> values) {
+            addCriterion("create_serial in", values, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialNotIn(List<String> values) {
+            addCriterion("create_serial not in", values, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialBetween(String value1, String value2) {
+            addCriterion("create_serial between", value1, value2, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateSerialNotBetween(String value1, String value2) {
+            addCriterion("create_serial not between", value1, value2, "createSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialIsNull() {
+            addCriterion("update_serial is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialIsNotNull() {
+            addCriterion("update_serial is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialEqualTo(String value) {
+            addCriterion("update_serial =", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialNotEqualTo(String value) {
+            addCriterion("update_serial <>", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialGreaterThan(String value) {
+            addCriterion("update_serial >", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialGreaterThanOrEqualTo(String value) {
+            addCriterion("update_serial >=", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialLessThan(String value) {
+            addCriterion("update_serial <", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialLessThanOrEqualTo(String value) {
+            addCriterion("update_serial <=", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialLike(String value) {
+            addCriterion("update_serial like", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialNotLike(String value) {
+            addCriterion("update_serial not like", value, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialIn(List<String> values) {
+            addCriterion("update_serial in", values, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialNotIn(List<String> values) {
+            addCriterion("update_serial not in", values, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialBetween(String value1, String value2) {
+            addCriterion("update_serial between", value1, value2, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateSerialNotBetween(String value1, String value2) {
+            addCriterion("update_serial not between", value1, value2, "updateSerial");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Long value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Long value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Long value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Long value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Long value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Long value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Long> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Long> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Long value1, Long value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Long value1, Long value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_Flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_Flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_Flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_Flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_Flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_Flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_Flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_Flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_Flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_Flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_Flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_Flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_Flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_Flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStock.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStock.java
new file mode 100644
index 0000000..773da0a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStock.java
@@ -0,0 +1,85 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class MaterialInitialStock {
+    private Long id;
+
+    private Long materialId;
+
+    private Long depotId;
+
+    private BigDecimal number;
+
+    private BigDecimal lowSafeStock;
+
+    private BigDecimal highSafeStock;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getMaterialId() {
+        return materialId;
+    }
+
+    public void setMaterialId(Long materialId) {
+        this.materialId = materialId;
+    }
+
+    public Long getDepotId() {
+        return depotId;
+    }
+
+    public void setDepotId(Long depotId) {
+        this.depotId = depotId;
+    }
+
+    public BigDecimal getNumber() {
+        return number;
+    }
+
+    public void setNumber(BigDecimal number) {
+        this.number = number;
+    }
+
+    public BigDecimal getLowSafeStock() {
+        return lowSafeStock;
+    }
+
+    public void setLowSafeStock(BigDecimal lowSafeStock) {
+        this.lowSafeStock = lowSafeStock;
+    }
+
+    public BigDecimal getHighSafeStock() {
+        return highSafeStock;
+    }
+
+    public void setHighSafeStock(BigDecimal highSafeStock) {
+        this.highSafeStock = highSafeStock;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockExample.java
new file mode 100644
index 0000000..53d7f9a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockExample.java
@@ -0,0 +1,690 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MaterialInitialStockExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MaterialInitialStockExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNull() {
+            addCriterion("material_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNotNull() {
+            addCriterion("material_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdEqualTo(Long value) {
+            addCriterion("material_id =", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotEqualTo(Long value) {
+            addCriterion("material_id <>", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThan(Long value) {
+            addCriterion("material_id >", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("material_id >=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThan(Long value) {
+            addCriterion("material_id <", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThanOrEqualTo(Long value) {
+            addCriterion("material_id <=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIn(List<Long> values) {
+            addCriterion("material_id in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotIn(List<Long> values) {
+            addCriterion("material_id not in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdBetween(Long value1, Long value2) {
+            addCriterion("material_id between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotBetween(Long value1, Long value2) {
+            addCriterion("material_id not between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNull() {
+            addCriterion("depot_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNotNull() {
+            addCriterion("depot_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdEqualTo(Long value) {
+            addCriterion("depot_id =", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotEqualTo(Long value) {
+            addCriterion("depot_id <>", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThan(Long value) {
+            addCriterion("depot_id >", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("depot_id >=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThan(Long value) {
+            addCriterion("depot_id <", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThanOrEqualTo(Long value) {
+            addCriterion("depot_id <=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIn(List<Long> values) {
+            addCriterion("depot_id in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotIn(List<Long> values) {
+            addCriterion("depot_id not in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdBetween(Long value1, Long value2) {
+            addCriterion("depot_id between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotBetween(Long value1, Long value2) {
+            addCriterion("depot_id not between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIsNull() {
+            addCriterion("number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIsNotNull() {
+            addCriterion("number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberEqualTo(BigDecimal value) {
+            addCriterion("number =", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotEqualTo(BigDecimal value) {
+            addCriterion("number <>", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberGreaterThan(BigDecimal value) {
+            addCriterion("number >", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("number >=", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLessThan(BigDecimal value) {
+            addCriterion("number <", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("number <=", value, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberIn(List<BigDecimal> values) {
+            addCriterion("number in", values, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotIn(List<BigDecimal> values) {
+            addCriterion("number not in", values, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("number between", value1, value2, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andNumberNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("number not between", value1, value2, "number");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockIsNull() {
+            addCriterion("low_safe_stock is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockIsNotNull() {
+            addCriterion("low_safe_stock is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockEqualTo(BigDecimal value) {
+            addCriterion("low_safe_stock =", value, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockNotEqualTo(BigDecimal value) {
+            addCriterion("low_safe_stock <>", value, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockGreaterThan(BigDecimal value) {
+            addCriterion("low_safe_stock >", value, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("low_safe_stock >=", value, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockLessThan(BigDecimal value) {
+            addCriterion("low_safe_stock <", value, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("low_safe_stock <=", value, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockIn(List<BigDecimal> values) {
+            addCriterion("low_safe_stock in", values, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockNotIn(List<BigDecimal> values) {
+            addCriterion("low_safe_stock not in", values, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("low_safe_stock between", value1, value2, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andLowSafeStockNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("low_safe_stock not between", value1, value2, "lowSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockIsNull() {
+            addCriterion("high_safe_stock is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockIsNotNull() {
+            addCriterion("high_safe_stock is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockEqualTo(BigDecimal value) {
+            addCriterion("high_safe_stock =", value, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockNotEqualTo(BigDecimal value) {
+            addCriterion("high_safe_stock <>", value, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockGreaterThan(BigDecimal value) {
+            addCriterion("high_safe_stock >", value, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("high_safe_stock >=", value, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockLessThan(BigDecimal value) {
+            addCriterion("high_safe_stock <", value, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("high_safe_stock <=", value, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockIn(List<BigDecimal> values) {
+            addCriterion("high_safe_stock in", values, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockNotIn(List<BigDecimal> values) {
+            addCriterion("high_safe_stock not in", values, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("high_safe_stock between", value1, value2, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andHighSafeStockNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("high_safe_stock not between", value1, value2, "highSafeStock");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockWithMaterial.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockWithMaterial.java
new file mode 100644
index 0000000..e779e62
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStockWithMaterial.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class MaterialInitialStockWithMaterial {
+
+    private Long materialId;
+
+    private BigDecimal number;
+
+    public Long getMaterialId() {
+        return materialId;
+    }
+
+    public void setMaterialId(Long materialId) {
+        this.materialId = materialId;
+    }
+
+    public BigDecimal getNumber() {
+        return number;
+    }
+
+    public void setNumber(BigDecimal number) {
+        this.number = number;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialProperty.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialProperty.java
new file mode 100644
index 0000000..b47fc0a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialProperty.java
@@ -0,0 +1,63 @@
+package com.jsh.erp.datasource.entities;
+
+public class MaterialProperty {
+    private Long id;
+
+    private String nativeName;
+
+    private Boolean enabled;
+
+    private String sort;
+
+    private String anotherName;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getNativeName() {
+        return nativeName;
+    }
+
+    public void setNativeName(String nativeName) {
+        this.nativeName = nativeName == null ? null : nativeName.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public String getAnotherName() {
+        return anotherName;
+    }
+
+    public void setAnotherName(String anotherName) {
+        this.anotherName = anotherName == null ? null : anotherName.trim();
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialPropertyExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialPropertyExample.java
new file mode 100644
index 0000000..7aa3335
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialPropertyExample.java
@@ -0,0 +1,599 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MaterialPropertyExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MaterialPropertyExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameIsNull() {
+            addCriterion("native_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameIsNotNull() {
+            addCriterion("native_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameEqualTo(String value) {
+            addCriterion("native_name =", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameNotEqualTo(String value) {
+            addCriterion("native_name <>", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameGreaterThan(String value) {
+            addCriterion("native_name >", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameGreaterThanOrEqualTo(String value) {
+            addCriterion("native_name >=", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameLessThan(String value) {
+            addCriterion("native_name <", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameLessThanOrEqualTo(String value) {
+            addCriterion("native_name <=", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameLike(String value) {
+            addCriterion("native_name like", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameNotLike(String value) {
+            addCriterion("native_name not like", value, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameIn(List<String> values) {
+            addCriterion("native_name in", values, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameNotIn(List<String> values) {
+            addCriterion("native_name not in", values, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameBetween(String value1, String value2) {
+            addCriterion("native_name between", value1, value2, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andNativeNameNotBetween(String value1, String value2) {
+            addCriterion("native_name not between", value1, value2, "nativeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameIsNull() {
+            addCriterion("another_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameIsNotNull() {
+            addCriterion("another_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameEqualTo(String value) {
+            addCriterion("another_name =", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameNotEqualTo(String value) {
+            addCriterion("another_name <>", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameGreaterThan(String value) {
+            addCriterion("another_name >", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameGreaterThanOrEqualTo(String value) {
+            addCriterion("another_name >=", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameLessThan(String value) {
+            addCriterion("another_name <", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameLessThanOrEqualTo(String value) {
+            addCriterion("another_name <=", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameLike(String value) {
+            addCriterion("another_name like", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameNotLike(String value) {
+            addCriterion("another_name not like", value, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameIn(List<String> values) {
+            addCriterion("another_name in", values, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameNotIn(List<String> values) {
+            addCriterion("another_name not in", values, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameBetween(String value1, String value2) {
+            addCriterion("another_name between", value1, value2, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAnotherNameNotBetween(String value1, String value2) {
+            addCriterion("another_name not between", value1, value2, "anotherName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java
new file mode 100644
index 0000000..a737ebd
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java
@@ -0,0 +1,262 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class MaterialVo4Unit extends Material{
+
+    private String unitName;
+
+    private BigDecimal ratio;
+
+    private String categoryName;
+
+    private String materialOther;
+
+    private BigDecimal stock;
+
+    private BigDecimal purchaseDecimal;
+
+    private BigDecimal commodityDecimal;
+
+    private BigDecimal wholesaleDecimal;
+
+    private BigDecimal lowDecimal;
+
+    private BigDecimal billPrice;
+
+    private String mBarCode;
+
+    private String commodityUnit;
+
+    private Long meId;
+
+    private BigDecimal initialStock;
+
+    private BigDecimal currentUnitPrice;
+
+    private BigDecimal currentStock;
+
+    private BigDecimal currentStockPrice;
+
+    private BigDecimal currentStockMovePrice;
+
+    private BigDecimal currentWeight;
+
+    private String sku;
+
+    private Long depotId;
+
+    /**
+     * 换算为大单位的库存
+     */
+    private String bigUnitStock;
+
+    /**
+     * 换算为大单位的初始库存
+     */
+    private String bigUnitInitialStock;
+
+    private String imgSmall;
+
+    private String imgLarge;
+
+    public String getUnitName() {
+        return unitName;
+    }
+
+    public void setUnitName(String unitName) {
+        this.unitName = unitName;
+    }
+
+    public BigDecimal getRatio() {
+        return ratio;
+    }
+
+    public void setRatio(BigDecimal ratio) {
+        this.ratio = ratio;
+    }
+
+    public String getCategoryName() {
+        return categoryName;
+    }
+
+    public void setCategoryName(String categoryName) {
+        this.categoryName = categoryName;
+    }
+
+    public String getMaterialOther() {
+        return materialOther;
+    }
+
+    public void setMaterialOther(String materialOther) {
+        this.materialOther = materialOther;
+    }
+
+    public BigDecimal getStock() {
+        return stock;
+    }
+
+    public void setStock(BigDecimal stock) {
+        this.stock = stock;
+    }
+
+    public BigDecimal getPurchaseDecimal() {
+        return purchaseDecimal;
+    }
+
+    public void setPurchaseDecimal(BigDecimal purchaseDecimal) {
+        this.purchaseDecimal = purchaseDecimal;
+    }
+
+    public BigDecimal getCommodityDecimal() {
+        return commodityDecimal;
+    }
+
+    public void setCommodityDecimal(BigDecimal commodityDecimal) {
+        this.commodityDecimal = commodityDecimal;
+    }
+
+    public BigDecimal getWholesaleDecimal() {
+        return wholesaleDecimal;
+    }
+
+    public void setWholesaleDecimal(BigDecimal wholesaleDecimal) {
+        this.wholesaleDecimal = wholesaleDecimal;
+    }
+
+    public BigDecimal getLowDecimal() {
+        return lowDecimal;
+    }
+
+    public void setLowDecimal(BigDecimal lowDecimal) {
+        this.lowDecimal = lowDecimal;
+    }
+
+    public BigDecimal getBillPrice() {
+        return billPrice;
+    }
+
+    public void setBillPrice(BigDecimal billPrice) {
+        this.billPrice = billPrice;
+    }
+
+    public String getmBarCode() {
+        return mBarCode;
+    }
+
+    public void setmBarCode(String mBarCode) {
+        this.mBarCode = mBarCode;
+    }
+
+    public String getCommodityUnit() {
+        return commodityUnit;
+    }
+
+    public void setCommodityUnit(String commodityUnit) {
+        this.commodityUnit = commodityUnit;
+    }
+
+    public Long getMeId() {
+        return meId;
+    }
+
+    public void setMeId(Long meId) {
+        this.meId = meId;
+    }
+
+    public BigDecimal getInitialStock() {
+        return initialStock;
+    }
+
+    public void setInitialStock(BigDecimal initialStock) {
+        this.initialStock = initialStock;
+    }
+
+    public BigDecimal getCurrentUnitPrice() {
+        return currentUnitPrice;
+    }
+
+    public void setCurrentUnitPrice(BigDecimal currentUnitPrice) {
+        this.currentUnitPrice = currentUnitPrice;
+    }
+
+    public BigDecimal getCurrentStock() {
+        return currentStock;
+    }
+
+    public void setCurrentStock(BigDecimal currentStock) {
+        this.currentStock = currentStock;
+    }
+
+    public BigDecimal getCurrentStockPrice() {
+        return currentStockPrice;
+    }
+
+    public void setCurrentStockPrice(BigDecimal currentStockPrice) {
+        this.currentStockPrice = currentStockPrice;
+    }
+
+    public BigDecimal getCurrentStockMovePrice() {
+        return currentStockMovePrice;
+    }
+
+    public void setCurrentStockMovePrice(BigDecimal currentStockMovePrice) {
+        this.currentStockMovePrice = currentStockMovePrice;
+    }
+
+    public BigDecimal getCurrentWeight() {
+        return currentWeight;
+    }
+
+    public void setCurrentWeight(BigDecimal currentWeight) {
+        this.currentWeight = currentWeight;
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public Long getDepotId() {
+        return depotId;
+    }
+
+    public void setDepotId(Long depotId) {
+        this.depotId = depotId;
+    }
+
+    public String getBigUnitStock() {
+        return bigUnitStock;
+    }
+
+    public void setBigUnitStock(String bigUnitStock) {
+        this.bigUnitStock = bigUnitStock;
+    }
+
+    public String getImgSmall() {
+        return imgSmall;
+    }
+
+    public void setImgSmall(String imgSmall) {
+        this.imgSmall = imgSmall;
+    }
+
+    public String getImgLarge() {
+        return imgLarge;
+    }
+
+    public void setImgLarge(String imgLarge) {
+        this.imgLarge = imgLarge;
+    }
+
+    public String getBigUnitInitialStock() {
+        return bigUnitInitialStock;
+    }
+
+    public void setBigUnitInitialStock(String bigUnitInitialStock) {
+        this.bigUnitInitialStock = bigUnitInitialStock;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialWithInitStock.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialWithInitStock.java
new file mode 100644
index 0000000..4b30d8b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialWithInitStock.java
@@ -0,0 +1,29 @@
+package com.jsh.erp.datasource.entities;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public class MaterialWithInitStock extends Material {
+
+    private Map<Long, BigDecimal> stockMap;
+
+    private JSONObject materialExObj;
+
+    public Map<Long, BigDecimal> getStockMap() {
+        return stockMap;
+    }
+
+    public void setStockMap(Map<Long, BigDecimal> stockMap) {
+        this.stockMap = stockMap;
+    }
+
+    public JSONObject getMaterialExObj() {
+        return materialExObj;
+    }
+
+    public void setMaterialExObj(JSONObject materialExObj) {
+        this.materialExObj = materialExObj;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Msg.java b/src/main/java/com/jsh/erp/datasource/entities/Msg.java
new file mode 100644
index 0000000..d8fd0ae
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Msg.java
@@ -0,0 +1,95 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+public class Msg {
+    private Long id;
+
+    private String msgTitle;
+
+    private String msgContent;
+
+    private Date createTime;
+
+    private String type;
+
+    private Long userId;
+
+    private String status;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getMsgTitle() {
+        return msgTitle;
+    }
+
+    public void setMsgTitle(String msgTitle) {
+        this.msgTitle = msgTitle == null ? null : msgTitle.trim();
+    }
+
+    public String getMsgContent() {
+        return msgContent;
+    }
+
+    public void setMsgContent(String msgContent) {
+        this.msgContent = msgContent == null ? null : msgContent.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status == null ? null : status.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MsgEx.java b/src/main/java/com/jsh/erp/datasource/entities/MsgEx.java
new file mode 100644
index 0000000..d463c02
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MsgEx.java
@@ -0,0 +1,14 @@
+package com.jsh.erp.datasource.entities;
+
+public class MsgEx extends Msg{
+
+    private String createTimeStr;
+
+    public String getCreateTimeStr() {
+        return createTimeStr;
+    }
+
+    public void setCreateTimeStr(String createTimeStr) {
+        this.createTimeStr = createTimeStr;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/MsgExample.java b/src/main/java/com/jsh/erp/datasource/entities/MsgExample.java
new file mode 100644
index 0000000..1a5688e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/MsgExample.java
@@ -0,0 +1,790 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class MsgExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MsgExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleIsNull() {
+            addCriterion("msg_title is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleIsNotNull() {
+            addCriterion("msg_title is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleEqualTo(String value) {
+            addCriterion("msg_title =", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleNotEqualTo(String value) {
+            addCriterion("msg_title <>", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleGreaterThan(String value) {
+            addCriterion("msg_title >", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleGreaterThanOrEqualTo(String value) {
+            addCriterion("msg_title >=", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleLessThan(String value) {
+            addCriterion("msg_title <", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleLessThanOrEqualTo(String value) {
+            addCriterion("msg_title <=", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleLike(String value) {
+            addCriterion("msg_title like", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleNotLike(String value) {
+            addCriterion("msg_title not like", value, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleIn(List<String> values) {
+            addCriterion("msg_title in", values, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleNotIn(List<String> values) {
+            addCriterion("msg_title not in", values, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleBetween(String value1, String value2) {
+            addCriterion("msg_title between", value1, value2, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgTitleNotBetween(String value1, String value2) {
+            addCriterion("msg_title not between", value1, value2, "msgTitle");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentIsNull() {
+            addCriterion("msg_content is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentIsNotNull() {
+            addCriterion("msg_content is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentEqualTo(String value) {
+            addCriterion("msg_content =", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentNotEqualTo(String value) {
+            addCriterion("msg_content <>", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentGreaterThan(String value) {
+            addCriterion("msg_content >", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentGreaterThanOrEqualTo(String value) {
+            addCriterion("msg_content >=", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentLessThan(String value) {
+            addCriterion("msg_content <", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentLessThanOrEqualTo(String value) {
+            addCriterion("msg_content <=", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentLike(String value) {
+            addCriterion("msg_content like", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentNotLike(String value) {
+            addCriterion("msg_content not like", value, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentIn(List<String> values) {
+            addCriterion("msg_content in", values, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentNotIn(List<String> values) {
+            addCriterion("msg_content not in", values, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentBetween(String value1, String value2) {
+            addCriterion("msg_content between", value1, value2, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andMsgContentNotBetween(String value1, String value2) {
+            addCriterion("msg_content not between", value1, value2, "msgContent");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNull() {
+            addCriterion("user_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNotNull() {
+            addCriterion("user_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdEqualTo(Long value) {
+            addCriterion("user_id =", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotEqualTo(Long value) {
+            addCriterion("user_id <>", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThan(Long value) {
+            addCriterion("user_id >", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("user_id >=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThan(Long value) {
+            addCriterion("user_id <", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThanOrEqualTo(Long value) {
+            addCriterion("user_id <=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIn(List<Long> values) {
+            addCriterion("user_id in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotIn(List<Long> values) {
+            addCriterion("user_id not in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdBetween(Long value1, Long value2) {
+            addCriterion("user_id between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotBetween(Long value1, Long value2) {
+            addCriterion("user_id not between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(String value) {
+            addCriterion("status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(String value) {
+            addCriterion("status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(String value) {
+            addCriterion("status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(String value) {
+            addCriterion("status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(String value) {
+            addCriterion("status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(String value) {
+            addCriterion("status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLike(String value) {
+            addCriterion("status like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotLike(String value) {
+            addCriterion("status not like", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<String> values) {
+            addCriterion("status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<String> values) {
+            addCriterion("status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(String value1, String value2) {
+            addCriterion("status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(String value1, String value2) {
+            addCriterion("status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_Flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_Flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_Flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_Flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_Flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_Flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_Flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_Flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_Flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_Flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_Flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_Flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_Flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_Flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRel.java b/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRel.java
new file mode 100644
index 0000000..55a5a7f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRel.java
@@ -0,0 +1,325 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+public class OrgaUserRel {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.id
+     *
+     * @mbggenerated
+     */
+    private Long id;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.orga_id
+     *
+     * @mbggenerated
+     */
+    private Long orgaId;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.user_id
+     *
+     * @mbggenerated
+     */
+    private Long userId;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.user_blng_orga_dspl_seq
+     *
+     * @mbggenerated
+     */
+    private String userBlngOrgaDsplSeq;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.delete_flag
+     *
+     * @mbggenerated
+     */
+    private String deleteFlag;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.create_time
+     *
+     * @mbggenerated
+     */
+    private Date createTime;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.creator
+     *
+     * @mbggenerated
+     */
+    private Long creator;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.update_time
+     *
+     * @mbggenerated
+     */
+    private Date updateTime;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.updater
+     *
+     * @mbggenerated
+     */
+    private Long updater;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column jsh_orga_user_rel.tenant_id
+     *
+     * @mbggenerated
+     */
+    private Long tenantId;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.id
+     *
+     * @return the value of jsh_orga_user_rel.id
+     *
+     * @mbggenerated
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.id
+     *
+     * @param id the value for jsh_orga_user_rel.id
+     *
+     * @mbggenerated
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.orga_id
+     *
+     * @return the value of jsh_orga_user_rel.orga_id
+     *
+     * @mbggenerated
+     */
+    public Long getOrgaId() {
+        return orgaId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.orga_id
+     *
+     * @param orgaId the value for jsh_orga_user_rel.orga_id
+     *
+     * @mbggenerated
+     */
+    public void setOrgaId(Long orgaId) {
+        this.orgaId = orgaId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.user_id
+     *
+     * @return the value of jsh_orga_user_rel.user_id
+     *
+     * @mbggenerated
+     */
+    public Long getUserId() {
+        return userId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.user_id
+     *
+     * @param userId the value for jsh_orga_user_rel.user_id
+     *
+     * @mbggenerated
+     */
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.user_blng_orga_dspl_seq
+     *
+     * @return the value of jsh_orga_user_rel.user_blng_orga_dspl_seq
+     *
+     * @mbggenerated
+     */
+    public String getUserBlngOrgaDsplSeq() {
+        return userBlngOrgaDsplSeq;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.user_blng_orga_dspl_seq
+     *
+     * @param userBlngOrgaDsplSeq the value for jsh_orga_user_rel.user_blng_orga_dspl_seq
+     *
+     * @mbggenerated
+     */
+    public void setUserBlngOrgaDsplSeq(String userBlngOrgaDsplSeq) {
+        this.userBlngOrgaDsplSeq = userBlngOrgaDsplSeq == null ? null : userBlngOrgaDsplSeq.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.delete_flag
+     *
+     * @return the value of jsh_orga_user_rel.delete_flag
+     *
+     * @mbggenerated
+     */
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.delete_flag
+     *
+     * @param deleteFlag the value for jsh_orga_user_rel.delete_flag
+     *
+     * @mbggenerated
+     */
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.create_time
+     *
+     * @return the value of jsh_orga_user_rel.create_time
+     *
+     * @mbggenerated
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.create_time
+     *
+     * @param createTime the value for jsh_orga_user_rel.create_time
+     *
+     * @mbggenerated
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.creator
+     *
+     * @return the value of jsh_orga_user_rel.creator
+     *
+     * @mbggenerated
+     */
+    public Long getCreator() {
+        return creator;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.creator
+     *
+     * @param creator the value for jsh_orga_user_rel.creator
+     *
+     * @mbggenerated
+     */
+    public void setCreator(Long creator) {
+        this.creator = creator;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.update_time
+     *
+     * @return the value of jsh_orga_user_rel.update_time
+     *
+     * @mbggenerated
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.update_time
+     *
+     * @param updateTime the value for jsh_orga_user_rel.update_time
+     *
+     * @mbggenerated
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.updater
+     *
+     * @return the value of jsh_orga_user_rel.updater
+     *
+     * @mbggenerated
+     */
+    public Long getUpdater() {
+        return updater;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.updater
+     *
+     * @param updater the value for jsh_orga_user_rel.updater
+     *
+     * @mbggenerated
+     */
+    public void setUpdater(Long updater) {
+        this.updater = updater;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column jsh_orga_user_rel.tenant_id
+     *
+     * @return the value of jsh_orga_user_rel.tenant_id
+     *
+     * @mbggenerated
+     */
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column jsh_orga_user_rel.tenant_id
+     *
+     * @param tenantId the value for jsh_orga_user_rel.tenant_id
+     *
+     * @mbggenerated
+     */
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelEx.java b/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelEx.java
new file mode 100644
index 0000000..c6bdf8c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelEx.java
@@ -0,0 +1,10 @@
+package com.jsh.erp.datasource.entities;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/12 10:09
+ */
+public class OrgaUserRelEx extends OrgaUserRel {
+}
diff --git a/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelExample.java b/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelExample.java
new file mode 100644
index 0000000..abf30d9
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/OrgaUserRelExample.java
@@ -0,0 +1,923 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class OrgaUserRelExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public OrgaUserRelExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdIsNull() {
+            addCriterion("orga_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdIsNotNull() {
+            addCriterion("orga_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdEqualTo(Long value) {
+            addCriterion("orga_id =", value, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdNotEqualTo(Long value) {
+            addCriterion("orga_id <>", value, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdGreaterThan(Long value) {
+            addCriterion("orga_id >", value, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("orga_id >=", value, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdLessThan(Long value) {
+            addCriterion("orga_id <", value, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdLessThanOrEqualTo(Long value) {
+            addCriterion("orga_id <=", value, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdIn(List<Long> values) {
+            addCriterion("orga_id in", values, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdNotIn(List<Long> values) {
+            addCriterion("orga_id not in", values, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdBetween(Long value1, Long value2) {
+            addCriterion("orga_id between", value1, value2, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgaIdNotBetween(Long value1, Long value2) {
+            addCriterion("orga_id not between", value1, value2, "orgaId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNull() {
+            addCriterion("user_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNotNull() {
+            addCriterion("user_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdEqualTo(Long value) {
+            addCriterion("user_id =", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotEqualTo(Long value) {
+            addCriterion("user_id <>", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThan(Long value) {
+            addCriterion("user_id >", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("user_id >=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThan(Long value) {
+            addCriterion("user_id <", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThanOrEqualTo(Long value) {
+            addCriterion("user_id <=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIn(List<Long> values) {
+            addCriterion("user_id in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotIn(List<Long> values) {
+            addCriterion("user_id not in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdBetween(Long value1, Long value2) {
+            addCriterion("user_id between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotBetween(Long value1, Long value2) {
+            addCriterion("user_id not between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqIsNull() {
+            addCriterion("user_blng_orga_dspl_seq is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqIsNotNull() {
+            addCriterion("user_blng_orga_dspl_seq is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqEqualTo(String value) {
+            addCriterion("user_blng_orga_dspl_seq =", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqNotEqualTo(String value) {
+            addCriterion("user_blng_orga_dspl_seq <>", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqGreaterThan(String value) {
+            addCriterion("user_blng_orga_dspl_seq >", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqGreaterThanOrEqualTo(String value) {
+            addCriterion("user_blng_orga_dspl_seq >=", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqLessThan(String value) {
+            addCriterion("user_blng_orga_dspl_seq <", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqLessThanOrEqualTo(String value) {
+            addCriterion("user_blng_orga_dspl_seq <=", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqLike(String value) {
+            addCriterion("user_blng_orga_dspl_seq like", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqNotLike(String value) {
+            addCriterion("user_blng_orga_dspl_seq not like", value, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqIn(List<String> values) {
+            addCriterion("user_blng_orga_dspl_seq in", values, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqNotIn(List<String> values) {
+            addCriterion("user_blng_orga_dspl_seq not in", values, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqBetween(String value1, String value2) {
+            addCriterion("user_blng_orga_dspl_seq between", value1, value2, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserBlngOrgaDsplSeqNotBetween(String value1, String value2) {
+            addCriterion("user_blng_orga_dspl_seq not between", value1, value2, "userBlngOrgaDsplSeq");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNull() {
+            addCriterion("creator is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNotNull() {
+            addCriterion("creator is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorEqualTo(Long value) {
+            addCriterion("creator =", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotEqualTo(Long value) {
+            addCriterion("creator <>", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThan(Long value) {
+            addCriterion("creator >", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThanOrEqualTo(Long value) {
+            addCriterion("creator >=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThan(Long value) {
+            addCriterion("creator <", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThanOrEqualTo(Long value) {
+            addCriterion("creator <=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIn(List<Long> values) {
+            addCriterion("creator in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotIn(List<Long> values) {
+            addCriterion("creator not in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorBetween(Long value1, Long value2) {
+            addCriterion("creator between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotBetween(Long value1, Long value2) {
+            addCriterion("creator not between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterIsNull() {
+            addCriterion("updater is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterIsNotNull() {
+            addCriterion("updater is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterEqualTo(Long value) {
+            addCriterion("updater =", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterNotEqualTo(Long value) {
+            addCriterion("updater <>", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterGreaterThan(Long value) {
+            addCriterion("updater >", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterGreaterThanOrEqualTo(Long value) {
+            addCriterion("updater >=", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterLessThan(Long value) {
+            addCriterion("updater <", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterLessThanOrEqualTo(Long value) {
+            addCriterion("updater <=", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterIn(List<Long> values) {
+            addCriterion("updater in", values, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterNotIn(List<Long> values) {
+            addCriterion("updater not in", values, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterBetween(Long value1, Long value2) {
+            addCriterion("updater between", value1, value2, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterNotBetween(Long value1, Long value2) {
+            addCriterion("updater not between", value1, value2, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated do_not_delete_during_merge
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Organization.java b/src/main/java/com/jsh/erp/datasource/entities/Organization.java
new file mode 100644
index 0000000..3421c5d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Organization.java
@@ -0,0 +1,105 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+public class Organization {
+    private Long id;
+
+    private String orgNo;
+
+    private String orgAbr;
+
+    private Long parentId;
+
+    private String sort;
+
+    private String remark;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getOrgNo() {
+        return orgNo;
+    }
+
+    public void setOrgNo(String orgNo) {
+        this.orgNo = orgNo == null ? null : orgNo.trim();
+    }
+
+    public String getOrgAbr() {
+        return orgAbr;
+    }
+
+    public void setOrgAbr(String orgAbr) {
+        this.orgAbr = orgAbr == null ? null : orgAbr.trim();
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/OrganizationExample.java b/src/main/java/com/jsh/erp/datasource/entities/OrganizationExample.java
new file mode 100644
index 0000000..44396d9
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/OrganizationExample.java
@@ -0,0 +1,850 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class OrganizationExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public OrganizationExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoIsNull() {
+            addCriterion("org_no is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoIsNotNull() {
+            addCriterion("org_no is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoEqualTo(String value) {
+            addCriterion("org_no =", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoNotEqualTo(String value) {
+            addCriterion("org_no <>", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoGreaterThan(String value) {
+            addCriterion("org_no >", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoGreaterThanOrEqualTo(String value) {
+            addCriterion("org_no >=", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoLessThan(String value) {
+            addCriterion("org_no <", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoLessThanOrEqualTo(String value) {
+            addCriterion("org_no <=", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoLike(String value) {
+            addCriterion("org_no like", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoNotLike(String value) {
+            addCriterion("org_no not like", value, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoIn(List<String> values) {
+            addCriterion("org_no in", values, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoNotIn(List<String> values) {
+            addCriterion("org_no not in", values, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoBetween(String value1, String value2) {
+            addCriterion("org_no between", value1, value2, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgNoNotBetween(String value1, String value2) {
+            addCriterion("org_no not between", value1, value2, "orgNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrIsNull() {
+            addCriterion("org_abr is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrIsNotNull() {
+            addCriterion("org_abr is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrEqualTo(String value) {
+            addCriterion("org_abr =", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrNotEqualTo(String value) {
+            addCriterion("org_abr <>", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrGreaterThan(String value) {
+            addCriterion("org_abr >", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrGreaterThanOrEqualTo(String value) {
+            addCriterion("org_abr >=", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrLessThan(String value) {
+            addCriterion("org_abr <", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrLessThanOrEqualTo(String value) {
+            addCriterion("org_abr <=", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrLike(String value) {
+            addCriterion("org_abr like", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrNotLike(String value) {
+            addCriterion("org_abr not like", value, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrIn(List<String> values) {
+            addCriterion("org_abr in", values, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrNotIn(List<String> values) {
+            addCriterion("org_abr not in", values, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrBetween(String value1, String value2) {
+            addCriterion("org_abr between", value1, value2, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andOrgAbrNotBetween(String value1, String value2) {
+            addCriterion("org_abr not between", value1, value2, "orgAbr");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdIsNull() {
+            addCriterion("parent_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdIsNotNull() {
+            addCriterion("parent_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdEqualTo(Long value) {
+            addCriterion("parent_id =", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdNotEqualTo(Long value) {
+            addCriterion("parent_id <>", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdGreaterThan(Long value) {
+            addCriterion("parent_id >", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("parent_id >=", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdLessThan(Long value) {
+            addCriterion("parent_id <", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdLessThanOrEqualTo(Long value) {
+            addCriterion("parent_id <=", value, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdIn(List<Long> values) {
+            addCriterion("parent_id in", values, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdNotIn(List<Long> values) {
+            addCriterion("parent_id not in", values, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdBetween(Long value1, Long value2) {
+            addCriterion("parent_id between", value1, value2, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andParentIdNotBetween(Long value1, Long value2) {
+            addCriterion("parent_id not between", value1, value2, "parentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Person.java b/src/main/java/com/jsh/erp/datasource/entities/Person.java
new file mode 100644
index 0000000..9910d1a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Person.java
@@ -0,0 +1,73 @@
+package com.jsh.erp.datasource.entities;
+
+public class Person {
+    private Long id;
+
+    private String type;
+
+    private String name;
+
+    private Boolean enabled;
+
+    private String sort;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/PersonExample.java b/src/main/java/com/jsh/erp/datasource/entities/PersonExample.java
new file mode 100644
index 0000000..291f022
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/PersonExample.java
@@ -0,0 +1,659 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PersonExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public PersonExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/PlatformConfig.java b/src/main/java/com/jsh/erp/datasource/entities/PlatformConfig.java
new file mode 100644
index 0000000..b22a9d4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/PlatformConfig.java
@@ -0,0 +1,43 @@
+package com.jsh.erp.datasource.entities;
+
+public class PlatformConfig {
+    private Long id;
+
+    private String platformKey;
+
+    private String platformKeyInfo;
+
+    private String platformValue;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getPlatformKey() {
+        return platformKey;
+    }
+
+    public void setPlatformKey(String platformKey) {
+        this.platformKey = platformKey == null ? null : platformKey.trim();
+    }
+
+    public String getPlatformKeyInfo() {
+        return platformKeyInfo;
+    }
+
+    public void setPlatformKeyInfo(String platformKeyInfo) {
+        this.platformKeyInfo = platformKeyInfo == null ? null : platformKeyInfo.trim();
+    }
+
+    public String getPlatformValue() {
+        return platformValue;
+    }
+
+    public void setPlatformValue(String platformValue) {
+        this.platformValue = platformValue == null ? null : platformValue.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/PlatformConfigExample.java b/src/main/java/com/jsh/erp/datasource/entities/PlatformConfigExample.java
new file mode 100644
index 0000000..229ff95
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/PlatformConfigExample.java
@@ -0,0 +1,469 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlatformConfigExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public PlatformConfigExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyIsNull() {
+            addCriterion("platform_key is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyIsNotNull() {
+            addCriterion("platform_key is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyEqualTo(String value) {
+            addCriterion("platform_key =", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyNotEqualTo(String value) {
+            addCriterion("platform_key <>", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyGreaterThan(String value) {
+            addCriterion("platform_key >", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyGreaterThanOrEqualTo(String value) {
+            addCriterion("platform_key >=", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyLessThan(String value) {
+            addCriterion("platform_key <", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyLessThanOrEqualTo(String value) {
+            addCriterion("platform_key <=", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyLike(String value) {
+            addCriterion("platform_key like", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyNotLike(String value) {
+            addCriterion("platform_key not like", value, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyIn(List<String> values) {
+            addCriterion("platform_key in", values, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyNotIn(List<String> values) {
+            addCriterion("platform_key not in", values, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyBetween(String value1, String value2) {
+            addCriterion("platform_key between", value1, value2, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyNotBetween(String value1, String value2) {
+            addCriterion("platform_key not between", value1, value2, "platformKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoIsNull() {
+            addCriterion("platform_key_info is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoIsNotNull() {
+            addCriterion("platform_key_info is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoEqualTo(String value) {
+            addCriterion("platform_key_info =", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoNotEqualTo(String value) {
+            addCriterion("platform_key_info <>", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoGreaterThan(String value) {
+            addCriterion("platform_key_info >", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoGreaterThanOrEqualTo(String value) {
+            addCriterion("platform_key_info >=", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoLessThan(String value) {
+            addCriterion("platform_key_info <", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoLessThanOrEqualTo(String value) {
+            addCriterion("platform_key_info <=", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoLike(String value) {
+            addCriterion("platform_key_info like", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoNotLike(String value) {
+            addCriterion("platform_key_info not like", value, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoIn(List<String> values) {
+            addCriterion("platform_key_info in", values, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoNotIn(List<String> values) {
+            addCriterion("platform_key_info not in", values, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoBetween(String value1, String value2) {
+            addCriterion("platform_key_info between", value1, value2, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformKeyInfoNotBetween(String value1, String value2) {
+            addCriterion("platform_key_info not between", value1, value2, "platformKeyInfo");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueIsNull() {
+            addCriterion("platform_value is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueIsNotNull() {
+            addCriterion("platform_value is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueEqualTo(String value) {
+            addCriterion("platform_value =", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueNotEqualTo(String value) {
+            addCriterion("platform_value <>", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueGreaterThan(String value) {
+            addCriterion("platform_value >", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueGreaterThanOrEqualTo(String value) {
+            addCriterion("platform_value >=", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueLessThan(String value) {
+            addCriterion("platform_value <", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueLessThanOrEqualTo(String value) {
+            addCriterion("platform_value <=", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueLike(String value) {
+            addCriterion("platform_value like", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueNotLike(String value) {
+            addCriterion("platform_value not like", value, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueIn(List<String> values) {
+            addCriterion("platform_value in", values, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueNotIn(List<String> values) {
+            addCriterion("platform_value not in", values, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueBetween(String value1, String value2) {
+            addCriterion("platform_value between", value1, value2, "platformValue");
+            return (Criteria) this;
+        }
+
+        public Criteria andPlatformValueNotBetween(String value1, String value2) {
+            addCriterion("platform_value not between", value1, value2, "platformValue");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Role.java b/src/main/java/com/jsh/erp/datasource/entities/Role.java
new file mode 100644
index 0000000..a641525
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Role.java
@@ -0,0 +1,103 @@
+package com.jsh.erp.datasource.entities;
+
+public class Role {
+    private Long id;
+
+    private String name;
+
+    private String type;
+
+    private String priceLimit;
+
+    private String value;
+
+    private String description;
+
+    private Boolean enabled;
+
+    private String sort;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public String getPriceLimit() {
+        return priceLimit;
+    }
+
+    public void setPriceLimit(String priceLimit) {
+        this.priceLimit = priceLimit == null ? null : priceLimit.trim();
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value == null ? null : value.trim();
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description == null ? null : description.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/RoleEx.java b/src/main/java/com/jsh/erp/datasource/entities/RoleEx.java
new file mode 100644
index 0000000..a5b9fed
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/RoleEx.java
@@ -0,0 +1,14 @@
+package com.jsh.erp.datasource.entities;
+
+public class RoleEx extends Role{
+
+    private String priceLimitStr;
+
+    public String getPriceLimitStr() {
+        return priceLimitStr;
+    }
+
+    public void setPriceLimitStr(String priceLimitStr) {
+        this.priceLimitStr = priceLimitStr;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/RoleExample.java b/src/main/java/com/jsh/erp/datasource/entities/RoleExample.java
new file mode 100644
index 0000000..ec84917
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/RoleExample.java
@@ -0,0 +1,869 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RoleExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public RoleExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitIsNull() {
+            addCriterion("price_limit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitIsNotNull() {
+            addCriterion("price_limit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitEqualTo(String value) {
+            addCriterion("price_limit =", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitNotEqualTo(String value) {
+            addCriterion("price_limit <>", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitGreaterThan(String value) {
+            addCriterion("price_limit >", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitGreaterThanOrEqualTo(String value) {
+            addCriterion("price_limit >=", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitLessThan(String value) {
+            addCriterion("price_limit <", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitLessThanOrEqualTo(String value) {
+            addCriterion("price_limit <=", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitLike(String value) {
+            addCriterion("price_limit like", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitNotLike(String value) {
+            addCriterion("price_limit not like", value, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitIn(List<String> values) {
+            addCriterion("price_limit in", values, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitNotIn(List<String> values) {
+            addCriterion("price_limit not in", values, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitBetween(String value1, String value2) {
+            addCriterion("price_limit between", value1, value2, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriceLimitNotBetween(String value1, String value2) {
+            addCriterion("price_limit not between", value1, value2, "priceLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueIsNull() {
+            addCriterion("value is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueIsNotNull() {
+            addCriterion("value is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueEqualTo(String value) {
+            addCriterion("value =", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotEqualTo(String value) {
+            addCriterion("value <>", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueGreaterThan(String value) {
+            addCriterion("value >", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueGreaterThanOrEqualTo(String value) {
+            addCriterion("value >=", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueLessThan(String value) {
+            addCriterion("value <", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueLessThanOrEqualTo(String value) {
+            addCriterion("value <=", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueLike(String value) {
+            addCriterion("value like", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotLike(String value) {
+            addCriterion("value not like", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueIn(List<String> values) {
+            addCriterion("value in", values, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotIn(List<String> values) {
+            addCriterion("value not in", values, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueBetween(String value1, String value2) {
+            addCriterion("value between", value1, value2, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotBetween(String value1, String value2) {
+            addCriterion("value not between", value1, value2, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIsNull() {
+            addCriterion("description is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIsNotNull() {
+            addCriterion("description is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionEqualTo(String value) {
+            addCriterion("description =", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotEqualTo(String value) {
+            addCriterion("description <>", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionGreaterThan(String value) {
+            addCriterion("description >", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionGreaterThanOrEqualTo(String value) {
+            addCriterion("description >=", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLessThan(String value) {
+            addCriterion("description <", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLessThanOrEqualTo(String value) {
+            addCriterion("description <=", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLike(String value) {
+            addCriterion("description like", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotLike(String value) {
+            addCriterion("description not like", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIn(List<String> values) {
+            addCriterion("description in", values, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotIn(List<String> values) {
+            addCriterion("description not in", values, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionBetween(String value1, String value2) {
+            addCriterion("description between", value1, value2, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotBetween(String value1, String value2) {
+            addCriterion("description not between", value1, value2, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java b/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java
new file mode 100644
index 0000000..a5239bf
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java
@@ -0,0 +1,156 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class SerialNumber {
+    private Long id;
+
+    private Long materialId;
+
+    private Long depotId;
+
+    private String serialNumber;
+
+    private String isSell;
+
+    private BigDecimal inPrice;
+
+    private String remark;
+
+    private String deleteFlag;
+
+    private Date createTime;
+
+    private Long creator;
+
+    private Date updateTime;
+
+    private Long updater;
+
+    private String inBillNo;
+
+    private String outBillNo;
+
+    private Long tenantId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getMaterialId() {
+        return materialId;
+    }
+
+    public void setMaterialId(Long materialId) {
+        this.materialId = materialId;
+    }
+
+    public Long getDepotId() {
+        return depotId;
+    }
+
+    public void setDepotId(Long depotId) {
+        this.depotId = depotId;
+    }
+
+    public String getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(String serialNumber) {
+        this.serialNumber = serialNumber == null ? null : serialNumber.trim();
+    }
+
+    public String getIsSell() {
+        return isSell;
+    }
+
+    public void setIsSell(String isSell) {
+        this.isSell = isSell == null ? null : isSell.trim();
+    }
+
+    public BigDecimal getInPrice() {
+        return inPrice;
+    }
+
+    public void setInPrice(BigDecimal inPrice) {
+        this.inPrice = inPrice;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getCreator() {
+        return creator;
+    }
+
+    public void setCreator(Long creator) {
+        this.creator = creator;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getUpdater() {
+        return updater;
+    }
+
+    public void setUpdater(Long updater) {
+        this.updater = updater;
+    }
+
+    public String getInBillNo() {
+        return inBillNo;
+    }
+
+    public void setInBillNo(String inBillNo) {
+        this.inBillNo = inBillNo == null ? null : inBillNo.trim();
+    }
+
+    public String getOutBillNo() {
+        return outBillNo;
+    }
+
+    public void setOutBillNo(String outBillNo) {
+        this.outBillNo = outBillNo == null ? null : outBillNo.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SerialNumberEx.java b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberEx.java
new file mode 100644
index 0000000..1d3c8ce
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberEx.java
@@ -0,0 +1,110 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/1/21 17:32
+ */
+public class SerialNumberEx extends SerialNumber{
+    /**
+     * 商品条码
+     * */
+    private String materialCode;
+    /**
+     * 商品名称
+     * */
+    private String materialName;
+    /**
+     * 创建者名称
+     * */
+    private String creatorName;
+    /**
+     * 更新者名称
+     * */
+    private String updaterName;
+    /**单据编号*/
+    private String depotHeadNumber;
+    /**单据类型(出库入库)*/
+    private String depotHeadType;
+
+    private String depotName;
+
+    private String createTimeStr;
+
+    private String updateTimeStr;
+
+    public String getMaterialCode() {
+        return materialCode;
+    }
+
+    public void setMaterialCode(String materialCode) {
+        this.materialCode = materialCode;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public String getCreatorName() {
+        return creatorName;
+    }
+
+    public void setCreatorName(String creatorName) {
+        this.creatorName = creatorName;
+    }
+
+    public String getUpdaterName() {
+        return updaterName;
+    }
+
+    public void setUpdaterName(String updaterName) {
+        this.updaterName = updaterName;
+    }
+
+    public String getDepotHeadNumber() {
+        return depotHeadNumber;
+    }
+
+    public void setDepotHeadNumber(String depotHeadNumber) {
+        this.depotHeadNumber = depotHeadNumber;
+    }
+
+    public String getDepotHeadType() {
+        return depotHeadType;
+    }
+
+    public void setDepotHeadType(String depotHeadType) {
+        this.depotHeadType = depotHeadType;
+    }
+
+    public String getDepotName() {
+        return depotName;
+    }
+
+    public void setDepotName(String depotName) {
+        this.depotName = depotName;
+    }
+
+    public String getCreateTimeStr() {
+        return createTimeStr;
+    }
+
+    public void setCreateTimeStr(String createTimeStr) {
+        this.createTimeStr = createTimeStr;
+    }
+
+    public String getUpdateTimeStr() {
+        return updateTimeStr;
+    }
+
+    public void setUpdateTimeStr(String updateTimeStr) {
+        this.updateTimeStr = updateTimeStr;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java
new file mode 100644
index 0000000..1710f8c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java
@@ -0,0 +1,1161 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class SerialNumberExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public SerialNumberExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNull() {
+            addCriterion("material_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIsNotNull() {
+            addCriterion("material_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdEqualTo(Long value) {
+            addCriterion("material_id =", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotEqualTo(Long value) {
+            addCriterion("material_id <>", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThan(Long value) {
+            addCriterion("material_id >", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("material_id >=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThan(Long value) {
+            addCriterion("material_id <", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdLessThanOrEqualTo(Long value) {
+            addCriterion("material_id <=", value, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdIn(List<Long> values) {
+            addCriterion("material_id in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotIn(List<Long> values) {
+            addCriterion("material_id not in", values, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdBetween(Long value1, Long value2) {
+            addCriterion("material_id between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaterialIdNotBetween(Long value1, Long value2) {
+            addCriterion("material_id not between", value1, value2, "materialId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNull() {
+            addCriterion("depot_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIsNotNull() {
+            addCriterion("depot_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdEqualTo(Long value) {
+            addCriterion("depot_id =", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotEqualTo(Long value) {
+            addCriterion("depot_id <>", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThan(Long value) {
+            addCriterion("depot_id >", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("depot_id >=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThan(Long value) {
+            addCriterion("depot_id <", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdLessThanOrEqualTo(Long value) {
+            addCriterion("depot_id <=", value, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdIn(List<Long> values) {
+            addCriterion("depot_id in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotIn(List<Long> values) {
+            addCriterion("depot_id not in", values, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdBetween(Long value1, Long value2) {
+            addCriterion("depot_id between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotIdNotBetween(Long value1, Long value2) {
+            addCriterion("depot_id not between", value1, value2, "depotId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberIsNull() {
+            addCriterion("serial_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberIsNotNull() {
+            addCriterion("serial_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberEqualTo(String value) {
+            addCriterion("serial_number =", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberNotEqualTo(String value) {
+            addCriterion("serial_number <>", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberGreaterThan(String value) {
+            addCriterion("serial_number >", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("serial_number >=", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberLessThan(String value) {
+            addCriterion("serial_number <", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberLessThanOrEqualTo(String value) {
+            addCriterion("serial_number <=", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberLike(String value) {
+            addCriterion("serial_number like", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberNotLike(String value) {
+            addCriterion("serial_number not like", value, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberIn(List<String> values) {
+            addCriterion("serial_number in", values, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberNotIn(List<String> values) {
+            addCriterion("serial_number not in", values, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberBetween(String value1, String value2) {
+            addCriterion("serial_number between", value1, value2, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andSerialNumberNotBetween(String value1, String value2) {
+            addCriterion("serial_number not between", value1, value2, "serialNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellIsNull() {
+            addCriterion("is_sell is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellIsNotNull() {
+            addCriterion("is_sell is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellEqualTo(String value) {
+            addCriterion("is_sell =", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellNotEqualTo(String value) {
+            addCriterion("is_sell <>", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellGreaterThan(String value) {
+            addCriterion("is_sell >", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellGreaterThanOrEqualTo(String value) {
+            addCriterion("is_sell >=", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellLessThan(String value) {
+            addCriterion("is_sell <", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellLessThanOrEqualTo(String value) {
+            addCriterion("is_sell <=", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellLike(String value) {
+            addCriterion("is_sell like", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellNotLike(String value) {
+            addCriterion("is_sell not like", value, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellIn(List<String> values) {
+            addCriterion("is_sell in", values, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellNotIn(List<String> values) {
+            addCriterion("is_sell not in", values, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellBetween(String value1, String value2) {
+            addCriterion("is_sell between", value1, value2, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSellNotBetween(String value1, String value2) {
+            addCriterion("is_sell not between", value1, value2, "isSell");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceIsNull() {
+            addCriterion("in_price is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceIsNotNull() {
+            addCriterion("in_price is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceEqualTo(BigDecimal value) {
+            addCriterion("in_price =", value, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceNotEqualTo(BigDecimal value) {
+            addCriterion("in_price <>", value, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceGreaterThan(BigDecimal value) {
+            addCriterion("in_price >", value, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("in_price >=", value, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceLessThan(BigDecimal value) {
+            addCriterion("in_price <", value, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("in_price <=", value, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceIn(List<BigDecimal> values) {
+            addCriterion("in_price in", values, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceNotIn(List<BigDecimal> values) {
+            addCriterion("in_price not in", values, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("in_price between", value1, value2, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andInPriceNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("in_price not between", value1, value2, "inPrice");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNull() {
+            addCriterion("creator is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNotNull() {
+            addCriterion("creator is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorEqualTo(Long value) {
+            addCriterion("creator =", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotEqualTo(Long value) {
+            addCriterion("creator <>", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThan(Long value) {
+            addCriterion("creator >", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThanOrEqualTo(Long value) {
+            addCriterion("creator >=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThan(Long value) {
+            addCriterion("creator <", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThanOrEqualTo(Long value) {
+            addCriterion("creator <=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIn(List<Long> values) {
+            addCriterion("creator in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotIn(List<Long> values) {
+            addCriterion("creator not in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorBetween(Long value1, Long value2) {
+            addCriterion("creator between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotBetween(Long value1, Long value2) {
+            addCriterion("creator not between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterIsNull() {
+            addCriterion("updater is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterIsNotNull() {
+            addCriterion("updater is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterEqualTo(Long value) {
+            addCriterion("updater =", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterNotEqualTo(Long value) {
+            addCriterion("updater <>", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterGreaterThan(Long value) {
+            addCriterion("updater >", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterGreaterThanOrEqualTo(Long value) {
+            addCriterion("updater >=", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterLessThan(Long value) {
+            addCriterion("updater <", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterLessThanOrEqualTo(Long value) {
+            addCriterion("updater <=", value, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterIn(List<Long> values) {
+            addCriterion("updater in", values, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterNotIn(List<Long> values) {
+            addCriterion("updater not in", values, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterBetween(Long value1, Long value2) {
+            addCriterion("updater between", value1, value2, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdaterNotBetween(Long value1, Long value2) {
+            addCriterion("updater not between", value1, value2, "updater");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoIsNull() {
+            addCriterion("in_bill_no is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoIsNotNull() {
+            addCriterion("in_bill_no is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoEqualTo(String value) {
+            addCriterion("in_bill_no =", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoNotEqualTo(String value) {
+            addCriterion("in_bill_no <>", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoGreaterThan(String value) {
+            addCriterion("in_bill_no >", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoGreaterThanOrEqualTo(String value) {
+            addCriterion("in_bill_no >=", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoLessThan(String value) {
+            addCriterion("in_bill_no <", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoLessThanOrEqualTo(String value) {
+            addCriterion("in_bill_no <=", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoLike(String value) {
+            addCriterion("in_bill_no like", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoNotLike(String value) {
+            addCriterion("in_bill_no not like", value, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoIn(List<String> values) {
+            addCriterion("in_bill_no in", values, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoNotIn(List<String> values) {
+            addCriterion("in_bill_no not in", values, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoBetween(String value1, String value2) {
+            addCriterion("in_bill_no between", value1, value2, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andInBillNoNotBetween(String value1, String value2) {
+            addCriterion("in_bill_no not between", value1, value2, "inBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoIsNull() {
+            addCriterion("out_bill_no is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoIsNotNull() {
+            addCriterion("out_bill_no is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoEqualTo(String value) {
+            addCriterion("out_bill_no =", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoNotEqualTo(String value) {
+            addCriterion("out_bill_no <>", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoGreaterThan(String value) {
+            addCriterion("out_bill_no >", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoGreaterThanOrEqualTo(String value) {
+            addCriterion("out_bill_no >=", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoLessThan(String value) {
+            addCriterion("out_bill_no <", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoLessThanOrEqualTo(String value) {
+            addCriterion("out_bill_no <=", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoLike(String value) {
+            addCriterion("out_bill_no like", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoNotLike(String value) {
+            addCriterion("out_bill_no not like", value, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoIn(List<String> values) {
+            addCriterion("out_bill_no in", values, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoNotIn(List<String> values) {
+            addCriterion("out_bill_no not in", values, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoBetween(String value1, String value2) {
+            addCriterion("out_bill_no between", value1, value2, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOutBillNoNotBetween(String value1, String value2) {
+            addCriterion("out_bill_no not between", value1, value2, "outBillNo");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Supplier.java b/src/main/java/com/jsh/erp/datasource/entities/Supplier.java
new file mode 100644
index 0000000..e7054ce
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Supplier.java
@@ -0,0 +1,255 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class Supplier {
+    private Long id;
+
+    private String supplier;
+
+    private String contacts;
+
+    private String phoneNum;
+
+    private String email;
+
+    private String description;
+
+    private Byte isystem;
+
+    private String type;
+
+    private Boolean enabled;
+
+    private BigDecimal advanceIn;
+
+    private BigDecimal beginNeedGet;
+
+    private BigDecimal beginNeedPay;
+
+    private BigDecimal allNeedGet;
+
+    private BigDecimal allNeedPay;
+
+    private String fax;
+
+    private String telephone;
+
+    private String address;
+
+    private String taxNum;
+
+    private String bankName;
+
+    private String accountNumber;
+
+    private BigDecimal taxRate;
+
+    private String sort;
+
+    private Long creator;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier == null ? null : supplier.trim();
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts == null ? null : contacts.trim();
+    }
+
+    public String getPhoneNum() {
+        return phoneNum;
+    }
+
+    public void setPhoneNum(String phoneNum) {
+        this.phoneNum = phoneNum == null ? null : phoneNum.trim();
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email == null ? null : email.trim();
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description == null ? null : description.trim();
+    }
+
+    public Byte getIsystem() {
+        return isystem;
+    }
+
+    public void setIsystem(Byte isystem) {
+        this.isystem = isystem;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public BigDecimal getAdvanceIn() {
+        return advanceIn;
+    }
+
+    public void setAdvanceIn(BigDecimal advanceIn) {
+        this.advanceIn = advanceIn;
+    }
+
+    public BigDecimal getBeginNeedGet() {
+        return beginNeedGet;
+    }
+
+    public void setBeginNeedGet(BigDecimal beginNeedGet) {
+        this.beginNeedGet = beginNeedGet;
+    }
+
+    public BigDecimal getBeginNeedPay() {
+        return beginNeedPay;
+    }
+
+    public void setBeginNeedPay(BigDecimal beginNeedPay) {
+        this.beginNeedPay = beginNeedPay;
+    }
+
+    public BigDecimal getAllNeedGet() {
+        return allNeedGet;
+    }
+
+    public void setAllNeedGet(BigDecimal allNeedGet) {
+        this.allNeedGet = allNeedGet;
+    }
+
+    public BigDecimal getAllNeedPay() {
+        return allNeedPay;
+    }
+
+    public void setAllNeedPay(BigDecimal allNeedPay) {
+        this.allNeedPay = allNeedPay;
+    }
+
+    public String getFax() {
+        return fax;
+    }
+
+    public void setFax(String fax) {
+        this.fax = fax == null ? null : fax.trim();
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone == null ? null : telephone.trim();
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address == null ? null : address.trim();
+    }
+
+    public String getTaxNum() {
+        return taxNum;
+    }
+
+    public void setTaxNum(String taxNum) {
+        this.taxNum = taxNum == null ? null : taxNum.trim();
+    }
+
+    public String getBankName() {
+        return bankName;
+    }
+
+    public void setBankName(String bankName) {
+        this.bankName = bankName == null ? null : bankName.trim();
+    }
+
+    public String getAccountNumber() {
+        return accountNumber;
+    }
+
+    public void setAccountNumber(String accountNumber) {
+        this.accountNumber = accountNumber == null ? null : accountNumber.trim();
+    }
+
+    public BigDecimal getTaxRate() {
+        return taxRate;
+    }
+
+    public void setTaxRate(BigDecimal taxRate) {
+        this.taxRate = taxRate;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort == null ? null : sort.trim();
+    }
+
+    public Long getCreator() {
+        return creator;
+    }
+
+    public void setCreator(Long creator) {
+        this.creator = creator;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SupplierExample.java b/src/main/java/com/jsh/erp/datasource/entities/SupplierExample.java
new file mode 100644
index 0000000..a1967f7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SupplierExample.java
@@ -0,0 +1,1840 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SupplierExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public SupplierExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierIsNull() {
+            addCriterion("supplier is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierIsNotNull() {
+            addCriterion("supplier is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierEqualTo(String value) {
+            addCriterion("supplier =", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierNotEqualTo(String value) {
+            addCriterion("supplier <>", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierGreaterThan(String value) {
+            addCriterion("supplier >", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierGreaterThanOrEqualTo(String value) {
+            addCriterion("supplier >=", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierLessThan(String value) {
+            addCriterion("supplier <", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierLessThanOrEqualTo(String value) {
+            addCriterion("supplier <=", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierLike(String value) {
+            addCriterion("supplier like", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierNotLike(String value) {
+            addCriterion("supplier not like", value, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierIn(List<String> values) {
+            addCriterion("supplier in", values, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierNotIn(List<String> values) {
+            addCriterion("supplier not in", values, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierBetween(String value1, String value2) {
+            addCriterion("supplier between", value1, value2, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andSupplierNotBetween(String value1, String value2) {
+            addCriterion("supplier not between", value1, value2, "supplier");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsIsNull() {
+            addCriterion("contacts is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsIsNotNull() {
+            addCriterion("contacts is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsEqualTo(String value) {
+            addCriterion("contacts =", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsNotEqualTo(String value) {
+            addCriterion("contacts <>", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsGreaterThan(String value) {
+            addCriterion("contacts >", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsGreaterThanOrEqualTo(String value) {
+            addCriterion("contacts >=", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsLessThan(String value) {
+            addCriterion("contacts <", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsLessThanOrEqualTo(String value) {
+            addCriterion("contacts <=", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsLike(String value) {
+            addCriterion("contacts like", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsNotLike(String value) {
+            addCriterion("contacts not like", value, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsIn(List<String> values) {
+            addCriterion("contacts in", values, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsNotIn(List<String> values) {
+            addCriterion("contacts not in", values, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsBetween(String value1, String value2) {
+            addCriterion("contacts between", value1, value2, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andContactsNotBetween(String value1, String value2) {
+            addCriterion("contacts not between", value1, value2, "contacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumIsNull() {
+            addCriterion("phone_num is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumIsNotNull() {
+            addCriterion("phone_num is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumEqualTo(String value) {
+            addCriterion("phone_num =", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumNotEqualTo(String value) {
+            addCriterion("phone_num <>", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumGreaterThan(String value) {
+            addCriterion("phone_num >", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumGreaterThanOrEqualTo(String value) {
+            addCriterion("phone_num >=", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumLessThan(String value) {
+            addCriterion("phone_num <", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumLessThanOrEqualTo(String value) {
+            addCriterion("phone_num <=", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumLike(String value) {
+            addCriterion("phone_num like", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumNotLike(String value) {
+            addCriterion("phone_num not like", value, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumIn(List<String> values) {
+            addCriterion("phone_num in", values, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumNotIn(List<String> values) {
+            addCriterion("phone_num not in", values, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumBetween(String value1, String value2) {
+            addCriterion("phone_num between", value1, value2, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhoneNumNotBetween(String value1, String value2) {
+            addCriterion("phone_num not between", value1, value2, "phoneNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailIsNull() {
+            addCriterion("email is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailIsNotNull() {
+            addCriterion("email is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailEqualTo(String value) {
+            addCriterion("email =", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotEqualTo(String value) {
+            addCriterion("email <>", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailGreaterThan(String value) {
+            addCriterion("email >", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailGreaterThanOrEqualTo(String value) {
+            addCriterion("email >=", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailLessThan(String value) {
+            addCriterion("email <", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailLessThanOrEqualTo(String value) {
+            addCriterion("email <=", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailLike(String value) {
+            addCriterion("email like", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotLike(String value) {
+            addCriterion("email not like", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailIn(List<String> values) {
+            addCriterion("email in", values, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotIn(List<String> values) {
+            addCriterion("email not in", values, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailBetween(String value1, String value2) {
+            addCriterion("email between", value1, value2, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotBetween(String value1, String value2) {
+            addCriterion("email not between", value1, value2, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIsNull() {
+            addCriterion("description is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIsNotNull() {
+            addCriterion("description is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionEqualTo(String value) {
+            addCriterion("description =", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotEqualTo(String value) {
+            addCriterion("description <>", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionGreaterThan(String value) {
+            addCriterion("description >", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionGreaterThanOrEqualTo(String value) {
+            addCriterion("description >=", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLessThan(String value) {
+            addCriterion("description <", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLessThanOrEqualTo(String value) {
+            addCriterion("description <=", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLike(String value) {
+            addCriterion("description like", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotLike(String value) {
+            addCriterion("description not like", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIn(List<String> values) {
+            addCriterion("description in", values, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotIn(List<String> values) {
+            addCriterion("description not in", values, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionBetween(String value1, String value2) {
+            addCriterion("description between", value1, value2, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotBetween(String value1, String value2) {
+            addCriterion("description not between", value1, value2, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemIsNull() {
+            addCriterion("isystem is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemIsNotNull() {
+            addCriterion("isystem is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemEqualTo(Byte value) {
+            addCriterion("isystem =", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemNotEqualTo(Byte value) {
+            addCriterion("isystem <>", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemGreaterThan(Byte value) {
+            addCriterion("isystem >", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemGreaterThanOrEqualTo(Byte value) {
+            addCriterion("isystem >=", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemLessThan(Byte value) {
+            addCriterion("isystem <", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemLessThanOrEqualTo(Byte value) {
+            addCriterion("isystem <=", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemIn(List<Byte> values) {
+            addCriterion("isystem in", values, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemNotIn(List<Byte> values) {
+            addCriterion("isystem not in", values, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemBetween(Byte value1, Byte value2) {
+            addCriterion("isystem between", value1, value2, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemNotBetween(Byte value1, Byte value2) {
+            addCriterion("isystem not between", value1, value2, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInIsNull() {
+            addCriterion("advance_in is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInIsNotNull() {
+            addCriterion("advance_in is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInEqualTo(BigDecimal value) {
+            addCriterion("advance_in =", value, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInNotEqualTo(BigDecimal value) {
+            addCriterion("advance_in <>", value, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInGreaterThan(BigDecimal value) {
+            addCriterion("advance_in >", value, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("advance_in >=", value, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInLessThan(BigDecimal value) {
+            addCriterion("advance_in <", value, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("advance_in <=", value, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInIn(List<BigDecimal> values) {
+            addCriterion("advance_in in", values, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInNotIn(List<BigDecimal> values) {
+            addCriterion("advance_in not in", values, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("advance_in between", value1, value2, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andAdvanceInNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("advance_in not between", value1, value2, "advanceIn");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetIsNull() {
+            addCriterion("begin_need_get is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetIsNotNull() {
+            addCriterion("begin_need_get is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetEqualTo(BigDecimal value) {
+            addCriterion("begin_need_get =", value, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetNotEqualTo(BigDecimal value) {
+            addCriterion("begin_need_get <>", value, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetGreaterThan(BigDecimal value) {
+            addCriterion("begin_need_get >", value, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("begin_need_get >=", value, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetLessThan(BigDecimal value) {
+            addCriterion("begin_need_get <", value, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("begin_need_get <=", value, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetIn(List<BigDecimal> values) {
+            addCriterion("begin_need_get in", values, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetNotIn(List<BigDecimal> values) {
+            addCriterion("begin_need_get not in", values, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("begin_need_get between", value1, value2, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedGetNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("begin_need_get not between", value1, value2, "beginNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayIsNull() {
+            addCriterion("begin_need_pay is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayIsNotNull() {
+            addCriterion("begin_need_pay is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayEqualTo(BigDecimal value) {
+            addCriterion("begin_need_pay =", value, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayNotEqualTo(BigDecimal value) {
+            addCriterion("begin_need_pay <>", value, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayGreaterThan(BigDecimal value) {
+            addCriterion("begin_need_pay >", value, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("begin_need_pay >=", value, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayLessThan(BigDecimal value) {
+            addCriterion("begin_need_pay <", value, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("begin_need_pay <=", value, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayIn(List<BigDecimal> values) {
+            addCriterion("begin_need_pay in", values, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayNotIn(List<BigDecimal> values) {
+            addCriterion("begin_need_pay not in", values, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("begin_need_pay between", value1, value2, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andBeginNeedPayNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("begin_need_pay not between", value1, value2, "beginNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetIsNull() {
+            addCriterion("all_need_get is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetIsNotNull() {
+            addCriterion("all_need_get is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetEqualTo(BigDecimal value) {
+            addCriterion("all_need_get =", value, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetNotEqualTo(BigDecimal value) {
+            addCriterion("all_need_get <>", value, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetGreaterThan(BigDecimal value) {
+            addCriterion("all_need_get >", value, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("all_need_get >=", value, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetLessThan(BigDecimal value) {
+            addCriterion("all_need_get <", value, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("all_need_get <=", value, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetIn(List<BigDecimal> values) {
+            addCriterion("all_need_get in", values, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetNotIn(List<BigDecimal> values) {
+            addCriterion("all_need_get not in", values, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("all_need_get between", value1, value2, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedGetNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("all_need_get not between", value1, value2, "allNeedGet");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayIsNull() {
+            addCriterion("all_need_pay is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayIsNotNull() {
+            addCriterion("all_need_pay is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayEqualTo(BigDecimal value) {
+            addCriterion("all_need_pay =", value, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayNotEqualTo(BigDecimal value) {
+            addCriterion("all_need_pay <>", value, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayGreaterThan(BigDecimal value) {
+            addCriterion("all_need_pay >", value, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("all_need_pay >=", value, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayLessThan(BigDecimal value) {
+            addCriterion("all_need_pay <", value, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("all_need_pay <=", value, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayIn(List<BigDecimal> values) {
+            addCriterion("all_need_pay in", values, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayNotIn(List<BigDecimal> values) {
+            addCriterion("all_need_pay not in", values, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("all_need_pay between", value1, value2, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andAllNeedPayNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("all_need_pay not between", value1, value2, "allNeedPay");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxIsNull() {
+            addCriterion("fax is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxIsNotNull() {
+            addCriterion("fax is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxEqualTo(String value) {
+            addCriterion("fax =", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxNotEqualTo(String value) {
+            addCriterion("fax <>", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxGreaterThan(String value) {
+            addCriterion("fax >", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxGreaterThanOrEqualTo(String value) {
+            addCriterion("fax >=", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxLessThan(String value) {
+            addCriterion("fax <", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxLessThanOrEqualTo(String value) {
+            addCriterion("fax <=", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxLike(String value) {
+            addCriterion("fax like", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxNotLike(String value) {
+            addCriterion("fax not like", value, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxIn(List<String> values) {
+            addCriterion("fax in", values, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxNotIn(List<String> values) {
+            addCriterion("fax not in", values, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxBetween(String value1, String value2) {
+            addCriterion("fax between", value1, value2, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andFaxNotBetween(String value1, String value2) {
+            addCriterion("fax not between", value1, value2, "fax");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneIsNull() {
+            addCriterion("telephone is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneIsNotNull() {
+            addCriterion("telephone is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneEqualTo(String value) {
+            addCriterion("telephone =", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneNotEqualTo(String value) {
+            addCriterion("telephone <>", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneGreaterThan(String value) {
+            addCriterion("telephone >", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneGreaterThanOrEqualTo(String value) {
+            addCriterion("telephone >=", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneLessThan(String value) {
+            addCriterion("telephone <", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneLessThanOrEqualTo(String value) {
+            addCriterion("telephone <=", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneLike(String value) {
+            addCriterion("telephone like", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneNotLike(String value) {
+            addCriterion("telephone not like", value, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneIn(List<String> values) {
+            addCriterion("telephone in", values, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneNotIn(List<String> values) {
+            addCriterion("telephone not in", values, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneBetween(String value1, String value2) {
+            addCriterion("telephone between", value1, value2, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andTelephoneNotBetween(String value1, String value2) {
+            addCriterion("telephone not between", value1, value2, "telephone");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressIsNull() {
+            addCriterion("address is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressIsNotNull() {
+            addCriterion("address is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressEqualTo(String value) {
+            addCriterion("address =", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotEqualTo(String value) {
+            addCriterion("address <>", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressGreaterThan(String value) {
+            addCriterion("address >", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressGreaterThanOrEqualTo(String value) {
+            addCriterion("address >=", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressLessThan(String value) {
+            addCriterion("address <", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressLessThanOrEqualTo(String value) {
+            addCriterion("address <=", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressLike(String value) {
+            addCriterion("address like", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotLike(String value) {
+            addCriterion("address not like", value, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressIn(List<String> values) {
+            addCriterion("address in", values, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotIn(List<String> values) {
+            addCriterion("address not in", values, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressBetween(String value1, String value2) {
+            addCriterion("address between", value1, value2, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andAddressNotBetween(String value1, String value2) {
+            addCriterion("address not between", value1, value2, "address");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumIsNull() {
+            addCriterion("tax_num is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumIsNotNull() {
+            addCriterion("tax_num is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumEqualTo(String value) {
+            addCriterion("tax_num =", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumNotEqualTo(String value) {
+            addCriterion("tax_num <>", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumGreaterThan(String value) {
+            addCriterion("tax_num >", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumGreaterThanOrEqualTo(String value) {
+            addCriterion("tax_num >=", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumLessThan(String value) {
+            addCriterion("tax_num <", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumLessThanOrEqualTo(String value) {
+            addCriterion("tax_num <=", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumLike(String value) {
+            addCriterion("tax_num like", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumNotLike(String value) {
+            addCriterion("tax_num not like", value, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumIn(List<String> values) {
+            addCriterion("tax_num in", values, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumNotIn(List<String> values) {
+            addCriterion("tax_num not in", values, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumBetween(String value1, String value2) {
+            addCriterion("tax_num between", value1, value2, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxNumNotBetween(String value1, String value2) {
+            addCriterion("tax_num not between", value1, value2, "taxNum");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameIsNull() {
+            addCriterion("bank_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameIsNotNull() {
+            addCriterion("bank_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameEqualTo(String value) {
+            addCriterion("bank_name =", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameNotEqualTo(String value) {
+            addCriterion("bank_name <>", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameGreaterThan(String value) {
+            addCriterion("bank_name >", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameGreaterThanOrEqualTo(String value) {
+            addCriterion("bank_name >=", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameLessThan(String value) {
+            addCriterion("bank_name <", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameLessThanOrEqualTo(String value) {
+            addCriterion("bank_name <=", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameLike(String value) {
+            addCriterion("bank_name like", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameNotLike(String value) {
+            addCriterion("bank_name not like", value, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameIn(List<String> values) {
+            addCriterion("bank_name in", values, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameNotIn(List<String> values) {
+            addCriterion("bank_name not in", values, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameBetween(String value1, String value2) {
+            addCriterion("bank_name between", value1, value2, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBankNameNotBetween(String value1, String value2) {
+            addCriterion("bank_name not between", value1, value2, "bankName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberIsNull() {
+            addCriterion("account_number is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberIsNotNull() {
+            addCriterion("account_number is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberEqualTo(String value) {
+            addCriterion("account_number =", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberNotEqualTo(String value) {
+            addCriterion("account_number <>", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberGreaterThan(String value) {
+            addCriterion("account_number >", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberGreaterThanOrEqualTo(String value) {
+            addCriterion("account_number >=", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberLessThan(String value) {
+            addCriterion("account_number <", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberLessThanOrEqualTo(String value) {
+            addCriterion("account_number <=", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberLike(String value) {
+            addCriterion("account_number like", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberNotLike(String value) {
+            addCriterion("account_number not like", value, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberIn(List<String> values) {
+            addCriterion("account_number in", values, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberNotIn(List<String> values) {
+            addCriterion("account_number not in", values, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberBetween(String value1, String value2) {
+            addCriterion("account_number between", value1, value2, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andAccountNumberNotBetween(String value1, String value2) {
+            addCriterion("account_number not between", value1, value2, "accountNumber");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateIsNull() {
+            addCriterion("tax_rate is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateIsNotNull() {
+            addCriterion("tax_rate is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateEqualTo(BigDecimal value) {
+            addCriterion("tax_rate =", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateNotEqualTo(BigDecimal value) {
+            addCriterion("tax_rate <>", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateGreaterThan(BigDecimal value) {
+            addCriterion("tax_rate >", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_rate >=", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateLessThan(BigDecimal value) {
+            addCriterion("tax_rate <", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("tax_rate <=", value, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateIn(List<BigDecimal> values) {
+            addCriterion("tax_rate in", values, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateNotIn(List<BigDecimal> values) {
+            addCriterion("tax_rate not in", values, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_rate between", value1, value2, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaxRateNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("tax_rate not between", value1, value2, "taxRate");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNull() {
+            addCriterion("sort is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIsNotNull() {
+            addCriterion("sort is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortEqualTo(String value) {
+            addCriterion("sort =", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotEqualTo(String value) {
+            addCriterion("sort <>", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThan(String value) {
+            addCriterion("sort >", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortGreaterThanOrEqualTo(String value) {
+            addCriterion("sort >=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThan(String value) {
+            addCriterion("sort <", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLessThanOrEqualTo(String value) {
+            addCriterion("sort <=", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortLike(String value) {
+            addCriterion("sort like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotLike(String value) {
+            addCriterion("sort not like", value, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortIn(List<String> values) {
+            addCriterion("sort in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotIn(List<String> values) {
+            addCriterion("sort not in", values, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortBetween(String value1, String value2) {
+            addCriterion("sort between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andSortNotBetween(String value1, String value2) {
+            addCriterion("sort not between", value1, value2, "sort");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNull() {
+            addCriterion("creator is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIsNotNull() {
+            addCriterion("creator is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorEqualTo(Long value) {
+            addCriterion("creator =", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotEqualTo(Long value) {
+            addCriterion("creator <>", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThan(Long value) {
+            addCriterion("creator >", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorGreaterThanOrEqualTo(Long value) {
+            addCriterion("creator >=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThan(Long value) {
+            addCriterion("creator <", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorLessThanOrEqualTo(Long value) {
+            addCriterion("creator <=", value, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorIn(List<Long> values) {
+            addCriterion("creator in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotIn(List<Long> values) {
+            addCriterion("creator not in", values, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorBetween(Long value1, Long value2) {
+            addCriterion("creator between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatorNotBetween(Long value1, Long value2) {
+            addCriterion("creator not between", value1, value2, "creator");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SysLoginModel.java b/src/main/java/com/jsh/erp/datasource/entities/SysLoginModel.java
new file mode 100644
index 0000000..6d5bb7a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SysLoginModel.java
@@ -0,0 +1,55 @@
+package com.jsh.erp.datasource.entities;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 登录表单
+ *
+ * @Author scott
+ * @since  2019-01-18
+ */
+@ApiModel(value="登录对象", description="登录对象")
+public class SysLoginModel {
+	@ApiModelProperty(value = "账号")
+    private String username;
+	@ApiModelProperty(value = "密码")
+    private String password;
+	@ApiModelProperty(value = "验证码")
+    private String captcha;
+	@ApiModelProperty(value = "验证码key")
+    private String checkKey;
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getCaptcha() {
+        return captcha;
+    }
+
+    public void setCaptcha(String captcha) {
+        this.captcha = captcha;
+    }
+
+	public String getCheckKey() {
+		return checkKey;
+	}
+
+	public void setCheckKey(String checkKey) {
+		this.checkKey = checkKey;
+	}
+    
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SystemConfig.java b/src/main/java/com/jsh/erp/datasource/entities/SystemConfig.java
new file mode 100644
index 0000000..2128b79
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SystemConfig.java
@@ -0,0 +1,233 @@
+package com.jsh.erp.datasource.entities;
+
+public class SystemConfig {
+    private Long id;
+
+    private String companyName;
+
+    private String companyContacts;
+
+    private String companyAddress;
+
+    private String companyTel;
+
+    private String companyFax;
+
+    private String companyPostCode;
+
+    private String saleAgreement;
+
+    private String depotFlag;
+
+    private String customerFlag;
+
+    private String minusStockFlag;
+
+    private String purchaseBySaleFlag;
+
+    private String multiLevelApprovalFlag;
+
+    private String multiBillType;
+
+    private String forceApprovalFlag;
+
+    private String updateUnitPriceFlag;
+
+    private String overLinkBillFlag;
+
+    private String inOutManageFlag;
+
+    private String multiAccountFlag;
+
+    private String moveAvgPriceFlag;
+
+    private String auditPrintFlag;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    public void setCompanyName(String companyName) {
+        this.companyName = companyName == null ? null : companyName.trim();
+    }
+
+    public String getCompanyContacts() {
+        return companyContacts;
+    }
+
+    public void setCompanyContacts(String companyContacts) {
+        this.companyContacts = companyContacts == null ? null : companyContacts.trim();
+    }
+
+    public String getCompanyAddress() {
+        return companyAddress;
+    }
+
+    public void setCompanyAddress(String companyAddress) {
+        this.companyAddress = companyAddress == null ? null : companyAddress.trim();
+    }
+
+    public String getCompanyTel() {
+        return companyTel;
+    }
+
+    public void setCompanyTel(String companyTel) {
+        this.companyTel = companyTel == null ? null : companyTel.trim();
+    }
+
+    public String getCompanyFax() {
+        return companyFax;
+    }
+
+    public void setCompanyFax(String companyFax) {
+        this.companyFax = companyFax == null ? null : companyFax.trim();
+    }
+
+    public String getCompanyPostCode() {
+        return companyPostCode;
+    }
+
+    public void setCompanyPostCode(String companyPostCode) {
+        this.companyPostCode = companyPostCode == null ? null : companyPostCode.trim();
+    }
+
+    public String getSaleAgreement() {
+        return saleAgreement;
+    }
+
+    public void setSaleAgreement(String saleAgreement) {
+        this.saleAgreement = saleAgreement == null ? null : saleAgreement.trim();
+    }
+
+    public String getDepotFlag() {
+        return depotFlag;
+    }
+
+    public void setDepotFlag(String depotFlag) {
+        this.depotFlag = depotFlag == null ? null : depotFlag.trim();
+    }
+
+    public String getCustomerFlag() {
+        return customerFlag;
+    }
+
+    public void setCustomerFlag(String customerFlag) {
+        this.customerFlag = customerFlag == null ? null : customerFlag.trim();
+    }
+
+    public String getMinusStockFlag() {
+        return minusStockFlag;
+    }
+
+    public void setMinusStockFlag(String minusStockFlag) {
+        this.minusStockFlag = minusStockFlag == null ? null : minusStockFlag.trim();
+    }
+
+    public String getPurchaseBySaleFlag() {
+        return purchaseBySaleFlag;
+    }
+
+    public void setPurchaseBySaleFlag(String purchaseBySaleFlag) {
+        this.purchaseBySaleFlag = purchaseBySaleFlag == null ? null : purchaseBySaleFlag.trim();
+    }
+
+    public String getMultiLevelApprovalFlag() {
+        return multiLevelApprovalFlag;
+    }
+
+    public void setMultiLevelApprovalFlag(String multiLevelApprovalFlag) {
+        this.multiLevelApprovalFlag = multiLevelApprovalFlag == null ? null : multiLevelApprovalFlag.trim();
+    }
+
+    public String getMultiBillType() {
+        return multiBillType;
+    }
+
+    public void setMultiBillType(String multiBillType) {
+        this.multiBillType = multiBillType == null ? null : multiBillType.trim();
+    }
+
+    public String getForceApprovalFlag() {
+        return forceApprovalFlag;
+    }
+
+    public void setForceApprovalFlag(String forceApprovalFlag) {
+        this.forceApprovalFlag = forceApprovalFlag == null ? null : forceApprovalFlag.trim();
+    }
+
+    public String getUpdateUnitPriceFlag() {
+        return updateUnitPriceFlag;
+    }
+
+    public void setUpdateUnitPriceFlag(String updateUnitPriceFlag) {
+        this.updateUnitPriceFlag = updateUnitPriceFlag == null ? null : updateUnitPriceFlag.trim();
+    }
+
+    public String getOverLinkBillFlag() {
+        return overLinkBillFlag;
+    }
+
+    public void setOverLinkBillFlag(String overLinkBillFlag) {
+        this.overLinkBillFlag = overLinkBillFlag == null ? null : overLinkBillFlag.trim();
+    }
+
+    public String getInOutManageFlag() {
+        return inOutManageFlag;
+    }
+
+    public void setInOutManageFlag(String inOutManageFlag) {
+        this.inOutManageFlag = inOutManageFlag == null ? null : inOutManageFlag.trim();
+    }
+
+    public String getMultiAccountFlag() {
+        return multiAccountFlag;
+    }
+
+    public void setMultiAccountFlag(String multiAccountFlag) {
+        this.multiAccountFlag = multiAccountFlag == null ? null : multiAccountFlag.trim();
+    }
+
+    public String getMoveAvgPriceFlag() {
+        return moveAvgPriceFlag;
+    }
+
+    public void setMoveAvgPriceFlag(String moveAvgPriceFlag) {
+        this.moveAvgPriceFlag = moveAvgPriceFlag == null ? null : moveAvgPriceFlag.trim();
+    }
+
+    public String getAuditPrintFlag() {
+        return auditPrintFlag;
+    }
+
+    public void setAuditPrintFlag(String auditPrintFlag) {
+        this.auditPrintFlag = auditPrintFlag == null ? null : auditPrintFlag.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/SystemConfigExample.java b/src/main/java/com/jsh/erp/datasource/entities/SystemConfigExample.java
new file mode 100644
index 0000000..a60b803
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/SystemConfigExample.java
@@ -0,0 +1,1789 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SystemConfigExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public SystemConfigExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameIsNull() {
+            addCriterion("company_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameIsNotNull() {
+            addCriterion("company_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameEqualTo(String value) {
+            addCriterion("company_name =", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameNotEqualTo(String value) {
+            addCriterion("company_name <>", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameGreaterThan(String value) {
+            addCriterion("company_name >", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameGreaterThanOrEqualTo(String value) {
+            addCriterion("company_name >=", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameLessThan(String value) {
+            addCriterion("company_name <", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameLessThanOrEqualTo(String value) {
+            addCriterion("company_name <=", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameLike(String value) {
+            addCriterion("company_name like", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameNotLike(String value) {
+            addCriterion("company_name not like", value, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameIn(List<String> values) {
+            addCriterion("company_name in", values, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameNotIn(List<String> values) {
+            addCriterion("company_name not in", values, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameBetween(String value1, String value2) {
+            addCriterion("company_name between", value1, value2, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyNameNotBetween(String value1, String value2) {
+            addCriterion("company_name not between", value1, value2, "companyName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsIsNull() {
+            addCriterion("company_contacts is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsIsNotNull() {
+            addCriterion("company_contacts is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsEqualTo(String value) {
+            addCriterion("company_contacts =", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsNotEqualTo(String value) {
+            addCriterion("company_contacts <>", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsGreaterThan(String value) {
+            addCriterion("company_contacts >", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsGreaterThanOrEqualTo(String value) {
+            addCriterion("company_contacts >=", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsLessThan(String value) {
+            addCriterion("company_contacts <", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsLessThanOrEqualTo(String value) {
+            addCriterion("company_contacts <=", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsLike(String value) {
+            addCriterion("company_contacts like", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsNotLike(String value) {
+            addCriterion("company_contacts not like", value, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsIn(List<String> values) {
+            addCriterion("company_contacts in", values, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsNotIn(List<String> values) {
+            addCriterion("company_contacts not in", values, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsBetween(String value1, String value2) {
+            addCriterion("company_contacts between", value1, value2, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyContactsNotBetween(String value1, String value2) {
+            addCriterion("company_contacts not between", value1, value2, "companyContacts");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressIsNull() {
+            addCriterion("company_address is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressIsNotNull() {
+            addCriterion("company_address is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressEqualTo(String value) {
+            addCriterion("company_address =", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressNotEqualTo(String value) {
+            addCriterion("company_address <>", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressGreaterThan(String value) {
+            addCriterion("company_address >", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressGreaterThanOrEqualTo(String value) {
+            addCriterion("company_address >=", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressLessThan(String value) {
+            addCriterion("company_address <", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressLessThanOrEqualTo(String value) {
+            addCriterion("company_address <=", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressLike(String value) {
+            addCriterion("company_address like", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressNotLike(String value) {
+            addCriterion("company_address not like", value, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressIn(List<String> values) {
+            addCriterion("company_address in", values, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressNotIn(List<String> values) {
+            addCriterion("company_address not in", values, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressBetween(String value1, String value2) {
+            addCriterion("company_address between", value1, value2, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyAddressNotBetween(String value1, String value2) {
+            addCriterion("company_address not between", value1, value2, "companyAddress");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelIsNull() {
+            addCriterion("company_tel is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelIsNotNull() {
+            addCriterion("company_tel is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelEqualTo(String value) {
+            addCriterion("company_tel =", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelNotEqualTo(String value) {
+            addCriterion("company_tel <>", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelGreaterThan(String value) {
+            addCriterion("company_tel >", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelGreaterThanOrEqualTo(String value) {
+            addCriterion("company_tel >=", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelLessThan(String value) {
+            addCriterion("company_tel <", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelLessThanOrEqualTo(String value) {
+            addCriterion("company_tel <=", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelLike(String value) {
+            addCriterion("company_tel like", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelNotLike(String value) {
+            addCriterion("company_tel not like", value, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelIn(List<String> values) {
+            addCriterion("company_tel in", values, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelNotIn(List<String> values) {
+            addCriterion("company_tel not in", values, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelBetween(String value1, String value2) {
+            addCriterion("company_tel between", value1, value2, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyTelNotBetween(String value1, String value2) {
+            addCriterion("company_tel not between", value1, value2, "companyTel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxIsNull() {
+            addCriterion("company_fax is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxIsNotNull() {
+            addCriterion("company_fax is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxEqualTo(String value) {
+            addCriterion("company_fax =", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxNotEqualTo(String value) {
+            addCriterion("company_fax <>", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxGreaterThan(String value) {
+            addCriterion("company_fax >", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxGreaterThanOrEqualTo(String value) {
+            addCriterion("company_fax >=", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxLessThan(String value) {
+            addCriterion("company_fax <", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxLessThanOrEqualTo(String value) {
+            addCriterion("company_fax <=", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxLike(String value) {
+            addCriterion("company_fax like", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxNotLike(String value) {
+            addCriterion("company_fax not like", value, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxIn(List<String> values) {
+            addCriterion("company_fax in", values, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxNotIn(List<String> values) {
+            addCriterion("company_fax not in", values, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxBetween(String value1, String value2) {
+            addCriterion("company_fax between", value1, value2, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyFaxNotBetween(String value1, String value2) {
+            addCriterion("company_fax not between", value1, value2, "companyFax");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeIsNull() {
+            addCriterion("company_post_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeIsNotNull() {
+            addCriterion("company_post_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeEqualTo(String value) {
+            addCriterion("company_post_code =", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeNotEqualTo(String value) {
+            addCriterion("company_post_code <>", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeGreaterThan(String value) {
+            addCriterion("company_post_code >", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("company_post_code >=", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeLessThan(String value) {
+            addCriterion("company_post_code <", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeLessThanOrEqualTo(String value) {
+            addCriterion("company_post_code <=", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeLike(String value) {
+            addCriterion("company_post_code like", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeNotLike(String value) {
+            addCriterion("company_post_code not like", value, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeIn(List<String> values) {
+            addCriterion("company_post_code in", values, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeNotIn(List<String> values) {
+            addCriterion("company_post_code not in", values, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeBetween(String value1, String value2) {
+            addCriterion("company_post_code between", value1, value2, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andCompanyPostCodeNotBetween(String value1, String value2) {
+            addCriterion("company_post_code not between", value1, value2, "companyPostCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementIsNull() {
+            addCriterion("sale_agreement is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementIsNotNull() {
+            addCriterion("sale_agreement is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementEqualTo(String value) {
+            addCriterion("sale_agreement =", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementNotEqualTo(String value) {
+            addCriterion("sale_agreement <>", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementGreaterThan(String value) {
+            addCriterion("sale_agreement >", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementGreaterThanOrEqualTo(String value) {
+            addCriterion("sale_agreement >=", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementLessThan(String value) {
+            addCriterion("sale_agreement <", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementLessThanOrEqualTo(String value) {
+            addCriterion("sale_agreement <=", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementLike(String value) {
+            addCriterion("sale_agreement like", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementNotLike(String value) {
+            addCriterion("sale_agreement not like", value, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementIn(List<String> values) {
+            addCriterion("sale_agreement in", values, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementNotIn(List<String> values) {
+            addCriterion("sale_agreement not in", values, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementBetween(String value1, String value2) {
+            addCriterion("sale_agreement between", value1, value2, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andSaleAgreementNotBetween(String value1, String value2) {
+            addCriterion("sale_agreement not between", value1, value2, "saleAgreement");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagIsNull() {
+            addCriterion("depot_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagIsNotNull() {
+            addCriterion("depot_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagEqualTo(String value) {
+            addCriterion("depot_flag =", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagNotEqualTo(String value) {
+            addCriterion("depot_flag <>", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagGreaterThan(String value) {
+            addCriterion("depot_flag >", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("depot_flag >=", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagLessThan(String value) {
+            addCriterion("depot_flag <", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagLessThanOrEqualTo(String value) {
+            addCriterion("depot_flag <=", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagLike(String value) {
+            addCriterion("depot_flag like", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagNotLike(String value) {
+            addCriterion("depot_flag not like", value, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagIn(List<String> values) {
+            addCriterion("depot_flag in", values, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagNotIn(List<String> values) {
+            addCriterion("depot_flag not in", values, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagBetween(String value1, String value2) {
+            addCriterion("depot_flag between", value1, value2, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepotFlagNotBetween(String value1, String value2) {
+            addCriterion("depot_flag not between", value1, value2, "depotFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagIsNull() {
+            addCriterion("customer_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagIsNotNull() {
+            addCriterion("customer_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagEqualTo(String value) {
+            addCriterion("customer_flag =", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagNotEqualTo(String value) {
+            addCriterion("customer_flag <>", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagGreaterThan(String value) {
+            addCriterion("customer_flag >", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("customer_flag >=", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagLessThan(String value) {
+            addCriterion("customer_flag <", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagLessThanOrEqualTo(String value) {
+            addCriterion("customer_flag <=", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagLike(String value) {
+            addCriterion("customer_flag like", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagNotLike(String value) {
+            addCriterion("customer_flag not like", value, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagIn(List<String> values) {
+            addCriterion("customer_flag in", values, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagNotIn(List<String> values) {
+            addCriterion("customer_flag not in", values, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagBetween(String value1, String value2) {
+            addCriterion("customer_flag between", value1, value2, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCustomerFlagNotBetween(String value1, String value2) {
+            addCriterion("customer_flag not between", value1, value2, "customerFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagIsNull() {
+            addCriterion("minus_stock_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagIsNotNull() {
+            addCriterion("minus_stock_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagEqualTo(String value) {
+            addCriterion("minus_stock_flag =", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagNotEqualTo(String value) {
+            addCriterion("minus_stock_flag <>", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagGreaterThan(String value) {
+            addCriterion("minus_stock_flag >", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("minus_stock_flag >=", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagLessThan(String value) {
+            addCriterion("minus_stock_flag <", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagLessThanOrEqualTo(String value) {
+            addCriterion("minus_stock_flag <=", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagLike(String value) {
+            addCriterion("minus_stock_flag like", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagNotLike(String value) {
+            addCriterion("minus_stock_flag not like", value, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagIn(List<String> values) {
+            addCriterion("minus_stock_flag in", values, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagNotIn(List<String> values) {
+            addCriterion("minus_stock_flag not in", values, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagBetween(String value1, String value2) {
+            addCriterion("minus_stock_flag between", value1, value2, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinusStockFlagNotBetween(String value1, String value2) {
+            addCriterion("minus_stock_flag not between", value1, value2, "minusStockFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagIsNull() {
+            addCriterion("purchase_by_sale_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagIsNotNull() {
+            addCriterion("purchase_by_sale_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagEqualTo(String value) {
+            addCriterion("purchase_by_sale_flag =", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagNotEqualTo(String value) {
+            addCriterion("purchase_by_sale_flag <>", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagGreaterThan(String value) {
+            addCriterion("purchase_by_sale_flag >", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("purchase_by_sale_flag >=", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagLessThan(String value) {
+            addCriterion("purchase_by_sale_flag <", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagLessThanOrEqualTo(String value) {
+            addCriterion("purchase_by_sale_flag <=", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagLike(String value) {
+            addCriterion("purchase_by_sale_flag like", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagNotLike(String value) {
+            addCriterion("purchase_by_sale_flag not like", value, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagIn(List<String> values) {
+            addCriterion("purchase_by_sale_flag in", values, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagNotIn(List<String> values) {
+            addCriterion("purchase_by_sale_flag not in", values, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagBetween(String value1, String value2) {
+            addCriterion("purchase_by_sale_flag between", value1, value2, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPurchaseBySaleFlagNotBetween(String value1, String value2) {
+            addCriterion("purchase_by_sale_flag not between", value1, value2, "purchaseBySaleFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagIsNull() {
+            addCriterion("multi_level_approval_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagIsNotNull() {
+            addCriterion("multi_level_approval_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagEqualTo(String value) {
+            addCriterion("multi_level_approval_flag =", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagNotEqualTo(String value) {
+            addCriterion("multi_level_approval_flag <>", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagGreaterThan(String value) {
+            addCriterion("multi_level_approval_flag >", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("multi_level_approval_flag >=", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagLessThan(String value) {
+            addCriterion("multi_level_approval_flag <", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagLessThanOrEqualTo(String value) {
+            addCriterion("multi_level_approval_flag <=", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagLike(String value) {
+            addCriterion("multi_level_approval_flag like", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagNotLike(String value) {
+            addCriterion("multi_level_approval_flag not like", value, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagIn(List<String> values) {
+            addCriterion("multi_level_approval_flag in", values, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagNotIn(List<String> values) {
+            addCriterion("multi_level_approval_flag not in", values, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagBetween(String value1, String value2) {
+            addCriterion("multi_level_approval_flag between", value1, value2, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiLevelApprovalFlagNotBetween(String value1, String value2) {
+            addCriterion("multi_level_approval_flag not between", value1, value2, "multiLevelApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeIsNull() {
+            addCriterion("multi_bill_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeIsNotNull() {
+            addCriterion("multi_bill_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeEqualTo(String value) {
+            addCriterion("multi_bill_type =", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeNotEqualTo(String value) {
+            addCriterion("multi_bill_type <>", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeGreaterThan(String value) {
+            addCriterion("multi_bill_type >", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("multi_bill_type >=", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeLessThan(String value) {
+            addCriterion("multi_bill_type <", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeLessThanOrEqualTo(String value) {
+            addCriterion("multi_bill_type <=", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeLike(String value) {
+            addCriterion("multi_bill_type like", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeNotLike(String value) {
+            addCriterion("multi_bill_type not like", value, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeIn(List<String> values) {
+            addCriterion("multi_bill_type in", values, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeNotIn(List<String> values) {
+            addCriterion("multi_bill_type not in", values, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeBetween(String value1, String value2) {
+            addCriterion("multi_bill_type between", value1, value2, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiBillTypeNotBetween(String value1, String value2) {
+            addCriterion("multi_bill_type not between", value1, value2, "multiBillType");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagIsNull() {
+            addCriterion("force_approval_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagIsNotNull() {
+            addCriterion("force_approval_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagEqualTo(String value) {
+            addCriterion("force_approval_flag =", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagNotEqualTo(String value) {
+            addCriterion("force_approval_flag <>", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagGreaterThan(String value) {
+            addCriterion("force_approval_flag >", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("force_approval_flag >=", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagLessThan(String value) {
+            addCriterion("force_approval_flag <", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagLessThanOrEqualTo(String value) {
+            addCriterion("force_approval_flag <=", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagLike(String value) {
+            addCriterion("force_approval_flag like", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagNotLike(String value) {
+            addCriterion("force_approval_flag not like", value, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagIn(List<String> values) {
+            addCriterion("force_approval_flag in", values, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagNotIn(List<String> values) {
+            addCriterion("force_approval_flag not in", values, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagBetween(String value1, String value2) {
+            addCriterion("force_approval_flag between", value1, value2, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andForceApprovalFlagNotBetween(String value1, String value2) {
+            addCriterion("force_approval_flag not between", value1, value2, "forceApprovalFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagIsNull() {
+            addCriterion("update_unit_price_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagIsNotNull() {
+            addCriterion("update_unit_price_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagEqualTo(String value) {
+            addCriterion("update_unit_price_flag =", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagNotEqualTo(String value) {
+            addCriterion("update_unit_price_flag <>", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagGreaterThan(String value) {
+            addCriterion("update_unit_price_flag >", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("update_unit_price_flag >=", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagLessThan(String value) {
+            addCriterion("update_unit_price_flag <", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagLessThanOrEqualTo(String value) {
+            addCriterion("update_unit_price_flag <=", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagLike(String value) {
+            addCriterion("update_unit_price_flag like", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagNotLike(String value) {
+            addCriterion("update_unit_price_flag not like", value, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagIn(List<String> values) {
+            addCriterion("update_unit_price_flag in", values, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagNotIn(List<String> values) {
+            addCriterion("update_unit_price_flag not in", values, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagBetween(String value1, String value2) {
+            addCriterion("update_unit_price_flag between", value1, value2, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateUnitPriceFlagNotBetween(String value1, String value2) {
+            addCriterion("update_unit_price_flag not between", value1, value2, "updateUnitPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagIsNull() {
+            addCriterion("over_link_bill_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagIsNotNull() {
+            addCriterion("over_link_bill_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagEqualTo(String value) {
+            addCriterion("over_link_bill_flag =", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagNotEqualTo(String value) {
+            addCriterion("over_link_bill_flag <>", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagGreaterThan(String value) {
+            addCriterion("over_link_bill_flag >", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("over_link_bill_flag >=", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagLessThan(String value) {
+            addCriterion("over_link_bill_flag <", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagLessThanOrEqualTo(String value) {
+            addCriterion("over_link_bill_flag <=", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagLike(String value) {
+            addCriterion("over_link_bill_flag like", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagNotLike(String value) {
+            addCriterion("over_link_bill_flag not like", value, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagIn(List<String> values) {
+            addCriterion("over_link_bill_flag in", values, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagNotIn(List<String> values) {
+            addCriterion("over_link_bill_flag not in", values, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagBetween(String value1, String value2) {
+            addCriterion("over_link_bill_flag between", value1, value2, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andOverLinkBillFlagNotBetween(String value1, String value2) {
+            addCriterion("over_link_bill_flag not between", value1, value2, "overLinkBillFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagIsNull() {
+            addCriterion("in_out_manage_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagIsNotNull() {
+            addCriterion("in_out_manage_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagEqualTo(String value) {
+            addCriterion("in_out_manage_flag =", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagNotEqualTo(String value) {
+            addCriterion("in_out_manage_flag <>", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagGreaterThan(String value) {
+            addCriterion("in_out_manage_flag >", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("in_out_manage_flag >=", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagLessThan(String value) {
+            addCriterion("in_out_manage_flag <", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagLessThanOrEqualTo(String value) {
+            addCriterion("in_out_manage_flag <=", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagLike(String value) {
+            addCriterion("in_out_manage_flag like", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagNotLike(String value) {
+            addCriterion("in_out_manage_flag not like", value, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagIn(List<String> values) {
+            addCriterion("in_out_manage_flag in", values, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagNotIn(List<String> values) {
+            addCriterion("in_out_manage_flag not in", values, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagBetween(String value1, String value2) {
+            addCriterion("in_out_manage_flag between", value1, value2, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInOutManageFlagNotBetween(String value1, String value2) {
+            addCriterion("in_out_manage_flag not between", value1, value2, "inOutManageFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagIsNull() {
+            addCriterion("multi_account_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagIsNotNull() {
+            addCriterion("multi_account_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagEqualTo(String value) {
+            addCriterion("multi_account_flag =", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagNotEqualTo(String value) {
+            addCriterion("multi_account_flag <>", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagGreaterThan(String value) {
+            addCriterion("multi_account_flag >", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("multi_account_flag >=", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagLessThan(String value) {
+            addCriterion("multi_account_flag <", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagLessThanOrEqualTo(String value) {
+            addCriterion("multi_account_flag <=", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagLike(String value) {
+            addCriterion("multi_account_flag like", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagNotLike(String value) {
+            addCriterion("multi_account_flag not like", value, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagIn(List<String> values) {
+            addCriterion("multi_account_flag in", values, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagNotIn(List<String> values) {
+            addCriterion("multi_account_flag not in", values, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagBetween(String value1, String value2) {
+            addCriterion("multi_account_flag between", value1, value2, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMultiAccountFlagNotBetween(String value1, String value2) {
+            addCriterion("multi_account_flag not between", value1, value2, "multiAccountFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagIsNull() {
+            addCriterion("move_avg_price_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagIsNotNull() {
+            addCriterion("move_avg_price_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagEqualTo(String value) {
+            addCriterion("move_avg_price_flag =", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagNotEqualTo(String value) {
+            addCriterion("move_avg_price_flag <>", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagGreaterThan(String value) {
+            addCriterion("move_avg_price_flag >", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("move_avg_price_flag >=", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagLessThan(String value) {
+            addCriterion("move_avg_price_flag <", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagLessThanOrEqualTo(String value) {
+            addCriterion("move_avg_price_flag <=", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagLike(String value) {
+            addCriterion("move_avg_price_flag like", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagNotLike(String value) {
+            addCriterion("move_avg_price_flag not like", value, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagIn(List<String> values) {
+            addCriterion("move_avg_price_flag in", values, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagNotIn(List<String> values) {
+            addCriterion("move_avg_price_flag not in", values, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagBetween(String value1, String value2) {
+            addCriterion("move_avg_price_flag between", value1, value2, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMoveAvgPriceFlagNotBetween(String value1, String value2) {
+            addCriterion("move_avg_price_flag not between", value1, value2, "moveAvgPriceFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagIsNull() {
+            addCriterion("audit_print_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagIsNotNull() {
+            addCriterion("audit_print_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagEqualTo(String value) {
+            addCriterion("audit_print_flag =", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagNotEqualTo(String value) {
+            addCriterion("audit_print_flag <>", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagGreaterThan(String value) {
+            addCriterion("audit_print_flag >", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("audit_print_flag >=", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagLessThan(String value) {
+            addCriterion("audit_print_flag <", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagLessThanOrEqualTo(String value) {
+            addCriterion("audit_print_flag <=", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagLike(String value) {
+            addCriterion("audit_print_flag like", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagNotLike(String value) {
+            addCriterion("audit_print_flag not like", value, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagIn(List<String> values) {
+            addCriterion("audit_print_flag in", values, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagNotIn(List<String> values) {
+            addCriterion("audit_print_flag not in", values, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagBetween(String value1, String value2) {
+            addCriterion("audit_print_flag between", value1, value2, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAuditPrintFlagNotBetween(String value1, String value2) {
+            addCriterion("audit_print_flag not between", value1, value2, "auditPrintFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Tenant.java b/src/main/java/com/jsh/erp/datasource/entities/Tenant.java
new file mode 100644
index 0000000..eac2f3d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Tenant.java
@@ -0,0 +1,105 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+public class Tenant {
+    private Long id;
+
+    private Long tenantId;
+
+    private String loginName;
+
+    private Integer userNumLimit;
+
+    private String type;
+
+    private Boolean enabled;
+
+    private Date createTime;
+
+    private Date expireTime;
+
+    private String remark;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName == null ? null : loginName.trim();
+    }
+
+    public Integer getUserNumLimit() {
+        return userNumLimit;
+    }
+
+    public void setUserNumLimit(Integer userNumLimit) {
+        this.userNumLimit = userNumLimit;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Date expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/TenantEx.java b/src/main/java/com/jsh/erp/datasource/entities/TenantEx.java
new file mode 100644
index 0000000..6f4de19
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/TenantEx.java
@@ -0,0 +1,54 @@
+package com.jsh.erp.datasource.entities;
+
+public class TenantEx extends Tenant{
+
+    private String createTimeStr;
+
+    private String expireTimeStr;
+
+    private Integer userCount;
+
+    private Long roleId;
+
+    private String roleName;
+
+    public String getCreateTimeStr() {
+        return createTimeStr;
+    }
+
+    public void setCreateTimeStr(String createTimeStr) {
+        this.createTimeStr = createTimeStr;
+    }
+
+    public String getExpireTimeStr() {
+        return expireTimeStr;
+    }
+
+    public void setExpireTimeStr(String expireTimeStr) {
+        this.expireTimeStr = expireTimeStr;
+    }
+
+    public Integer getUserCount() {
+        return userCount;
+    }
+
+    public void setUserCount(Integer userCount) {
+        this.userCount = userCount;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/TenantExample.java b/src/main/java/com/jsh/erp/datasource/entities/TenantExample.java
new file mode 100644
index 0000000..b9d0a50
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/TenantExample.java
@@ -0,0 +1,840 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class TenantExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public TenantExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameIsNull() {
+            addCriterion("login_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameIsNotNull() {
+            addCriterion("login_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameEqualTo(String value) {
+            addCriterion("login_name =", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotEqualTo(String value) {
+            addCriterion("login_name <>", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameGreaterThan(String value) {
+            addCriterion("login_name >", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameGreaterThanOrEqualTo(String value) {
+            addCriterion("login_name >=", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameLessThan(String value) {
+            addCriterion("login_name <", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameLessThanOrEqualTo(String value) {
+            addCriterion("login_name <=", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameLike(String value) {
+            addCriterion("login_name like", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotLike(String value) {
+            addCriterion("login_name not like", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameIn(List<String> values) {
+            addCriterion("login_name in", values, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotIn(List<String> values) {
+            addCriterion("login_name not in", values, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameBetween(String value1, String value2) {
+            addCriterion("login_name between", value1, value2, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotBetween(String value1, String value2) {
+            addCriterion("login_name not between", value1, value2, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitIsNull() {
+            addCriterion("user_num_limit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitIsNotNull() {
+            addCriterion("user_num_limit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitEqualTo(Integer value) {
+            addCriterion("user_num_limit =", value, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitNotEqualTo(Integer value) {
+            addCriterion("user_num_limit <>", value, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitGreaterThan(Integer value) {
+            addCriterion("user_num_limit >", value, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitGreaterThanOrEqualTo(Integer value) {
+            addCriterion("user_num_limit >=", value, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitLessThan(Integer value) {
+            addCriterion("user_num_limit <", value, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitLessThanOrEqualTo(Integer value) {
+            addCriterion("user_num_limit <=", value, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitIn(List<Integer> values) {
+            addCriterion("user_num_limit in", values, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitNotIn(List<Integer> values) {
+            addCriterion("user_num_limit not in", values, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitBetween(Integer value1, Integer value2) {
+            addCriterion("user_num_limit between", value1, value2, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserNumLimitNotBetween(Integer value1, Integer value2) {
+            addCriterion("user_num_limit not between", value1, value2, "userNumLimit");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeIsNull() {
+            addCriterion("expire_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeIsNotNull() {
+            addCriterion("expire_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeEqualTo(Date value) {
+            addCriterion("expire_time =", value, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeNotEqualTo(Date value) {
+            addCriterion("expire_time <>", value, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeGreaterThan(Date value) {
+            addCriterion("expire_time >", value, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("expire_time >=", value, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeLessThan(Date value) {
+            addCriterion("expire_time <", value, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeLessThanOrEqualTo(Date value) {
+            addCriterion("expire_time <=", value, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeIn(List<Date> values) {
+            addCriterion("expire_time in", values, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeNotIn(List<Date> values) {
+            addCriterion("expire_time not in", values, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeBetween(Date value1, Date value2) {
+            addCriterion("expire_time between", value1, value2, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andExpireTimeNotBetween(Date value1, Date value2) {
+            addCriterion("expire_time not between", value1, value2, "expireTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/Unit.java b/src/main/java/com/jsh/erp/datasource/entities/Unit.java
new file mode 100644
index 0000000..5c80143
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/Unit.java
@@ -0,0 +1,125 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+
+public class Unit {
+    private Long id;
+
+    private String name;
+
+    private String basicUnit;
+
+    private String otherUnit;
+
+    private String otherUnitTwo;
+
+    private String otherUnitThree;
+
+    private BigDecimal ratio;
+
+    private BigDecimal ratioTwo;
+
+    private BigDecimal ratioThree;
+
+    private Boolean enabled;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getBasicUnit() {
+        return basicUnit;
+    }
+
+    public void setBasicUnit(String basicUnit) {
+        this.basicUnit = basicUnit == null ? null : basicUnit.trim();
+    }
+
+    public String getOtherUnit() {
+        return otherUnit;
+    }
+
+    public void setOtherUnit(String otherUnit) {
+        this.otherUnit = otherUnit == null ? null : otherUnit.trim();
+    }
+
+    public String getOtherUnitTwo() {
+        return otherUnitTwo;
+    }
+
+    public void setOtherUnitTwo(String otherUnitTwo) {
+        this.otherUnitTwo = otherUnitTwo == null ? null : otherUnitTwo.trim();
+    }
+
+    public String getOtherUnitThree() {
+        return otherUnitThree;
+    }
+
+    public void setOtherUnitThree(String otherUnitThree) {
+        this.otherUnitThree = otherUnitThree == null ? null : otherUnitThree.trim();
+    }
+
+    public BigDecimal getRatio() {
+        return ratio;
+    }
+
+    public void setRatio(BigDecimal ratio) {
+        this.ratio = ratio;
+    }
+
+    public BigDecimal getRatioTwo() {
+        return ratioTwo;
+    }
+
+    public void setRatioTwo(BigDecimal ratioTwo) {
+        this.ratioTwo = ratioTwo;
+    }
+
+    public BigDecimal getRatioThree() {
+        return ratioThree;
+    }
+
+    public void setRatioThree(BigDecimal ratioThree) {
+        this.ratioThree = ratioThree;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/UnitExample.java b/src/main/java/com/jsh/erp/datasource/entities/UnitExample.java
new file mode 100644
index 0000000..b45c053
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/UnitExample.java
@@ -0,0 +1,980 @@
+package com.jsh.erp.datasource.entities;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class UnitExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public UnitExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitIsNull() {
+            addCriterion("basic_unit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitIsNotNull() {
+            addCriterion("basic_unit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitEqualTo(String value) {
+            addCriterion("basic_unit =", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitNotEqualTo(String value) {
+            addCriterion("basic_unit <>", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitGreaterThan(String value) {
+            addCriterion("basic_unit >", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitGreaterThanOrEqualTo(String value) {
+            addCriterion("basic_unit >=", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitLessThan(String value) {
+            addCriterion("basic_unit <", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitLessThanOrEqualTo(String value) {
+            addCriterion("basic_unit <=", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitLike(String value) {
+            addCriterion("basic_unit like", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitNotLike(String value) {
+            addCriterion("basic_unit not like", value, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitIn(List<String> values) {
+            addCriterion("basic_unit in", values, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitNotIn(List<String> values) {
+            addCriterion("basic_unit not in", values, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitBetween(String value1, String value2) {
+            addCriterion("basic_unit between", value1, value2, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andBasicUnitNotBetween(String value1, String value2) {
+            addCriterion("basic_unit not between", value1, value2, "basicUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitIsNull() {
+            addCriterion("other_unit is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitIsNotNull() {
+            addCriterion("other_unit is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitEqualTo(String value) {
+            addCriterion("other_unit =", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitNotEqualTo(String value) {
+            addCriterion("other_unit <>", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitGreaterThan(String value) {
+            addCriterion("other_unit >", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitGreaterThanOrEqualTo(String value) {
+            addCriterion("other_unit >=", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitLessThan(String value) {
+            addCriterion("other_unit <", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitLessThanOrEqualTo(String value) {
+            addCriterion("other_unit <=", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitLike(String value) {
+            addCriterion("other_unit like", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitNotLike(String value) {
+            addCriterion("other_unit not like", value, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitIn(List<String> values) {
+            addCriterion("other_unit in", values, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitNotIn(List<String> values) {
+            addCriterion("other_unit not in", values, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitBetween(String value1, String value2) {
+            addCriterion("other_unit between", value1, value2, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitNotBetween(String value1, String value2) {
+            addCriterion("other_unit not between", value1, value2, "otherUnit");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoIsNull() {
+            addCriterion("other_unit_two is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoIsNotNull() {
+            addCriterion("other_unit_two is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoEqualTo(String value) {
+            addCriterion("other_unit_two =", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoNotEqualTo(String value) {
+            addCriterion("other_unit_two <>", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoGreaterThan(String value) {
+            addCriterion("other_unit_two >", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoGreaterThanOrEqualTo(String value) {
+            addCriterion("other_unit_two >=", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoLessThan(String value) {
+            addCriterion("other_unit_two <", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoLessThanOrEqualTo(String value) {
+            addCriterion("other_unit_two <=", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoLike(String value) {
+            addCriterion("other_unit_two like", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoNotLike(String value) {
+            addCriterion("other_unit_two not like", value, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoIn(List<String> values) {
+            addCriterion("other_unit_two in", values, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoNotIn(List<String> values) {
+            addCriterion("other_unit_two not in", values, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoBetween(String value1, String value2) {
+            addCriterion("other_unit_two between", value1, value2, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitTwoNotBetween(String value1, String value2) {
+            addCriterion("other_unit_two not between", value1, value2, "otherUnitTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeIsNull() {
+            addCriterion("other_unit_three is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeIsNotNull() {
+            addCriterion("other_unit_three is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeEqualTo(String value) {
+            addCriterion("other_unit_three =", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeNotEqualTo(String value) {
+            addCriterion("other_unit_three <>", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeGreaterThan(String value) {
+            addCriterion("other_unit_three >", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeGreaterThanOrEqualTo(String value) {
+            addCriterion("other_unit_three >=", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeLessThan(String value) {
+            addCriterion("other_unit_three <", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeLessThanOrEqualTo(String value) {
+            addCriterion("other_unit_three <=", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeLike(String value) {
+            addCriterion("other_unit_three like", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeNotLike(String value) {
+            addCriterion("other_unit_three not like", value, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeIn(List<String> values) {
+            addCriterion("other_unit_three in", values, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeNotIn(List<String> values) {
+            addCriterion("other_unit_three not in", values, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeBetween(String value1, String value2) {
+            addCriterion("other_unit_three between", value1, value2, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andOtherUnitThreeNotBetween(String value1, String value2) {
+            addCriterion("other_unit_three not between", value1, value2, "otherUnitThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioIsNull() {
+            addCriterion("ratio is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioIsNotNull() {
+            addCriterion("ratio is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioEqualTo(BigDecimal value) {
+            addCriterion("ratio =", value, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioNotEqualTo(BigDecimal value) {
+            addCriterion("ratio <>", value, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioGreaterThan(BigDecimal value) {
+            addCriterion("ratio >", value, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("ratio >=", value, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioLessThan(BigDecimal value) {
+            addCriterion("ratio <", value, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("ratio <=", value, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioIn(List<BigDecimal> values) {
+            addCriterion("ratio in", values, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioNotIn(List<BigDecimal> values) {
+            addCriterion("ratio not in", values, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("ratio between", value1, value2, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("ratio not between", value1, value2, "ratio");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoIsNull() {
+            addCriterion("ratio_two is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoIsNotNull() {
+            addCriterion("ratio_two is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoEqualTo(BigDecimal value) {
+            addCriterion("ratio_two =", value, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoNotEqualTo(BigDecimal value) {
+            addCriterion("ratio_two <>", value, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoGreaterThan(BigDecimal value) {
+            addCriterion("ratio_two >", value, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("ratio_two >=", value, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoLessThan(BigDecimal value) {
+            addCriterion("ratio_two <", value, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("ratio_two <=", value, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoIn(List<BigDecimal> values) {
+            addCriterion("ratio_two in", values, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoNotIn(List<BigDecimal> values) {
+            addCriterion("ratio_two not in", values, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("ratio_two between", value1, value2, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioTwoNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("ratio_two not between", value1, value2, "ratioTwo");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeIsNull() {
+            addCriterion("ratio_three is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeIsNotNull() {
+            addCriterion("ratio_three is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeEqualTo(BigDecimal value) {
+            addCriterion("ratio_three =", value, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeNotEqualTo(BigDecimal value) {
+            addCriterion("ratio_three <>", value, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeGreaterThan(BigDecimal value) {
+            addCriterion("ratio_three >", value, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeGreaterThanOrEqualTo(BigDecimal value) {
+            addCriterion("ratio_three >=", value, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeLessThan(BigDecimal value) {
+            addCriterion("ratio_three <", value, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeLessThanOrEqualTo(BigDecimal value) {
+            addCriterion("ratio_three <=", value, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeIn(List<BigDecimal> values) {
+            addCriterion("ratio_three in", values, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeNotIn(List<BigDecimal> values) {
+            addCriterion("ratio_three not in", values, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("ratio_three between", value1, value2, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andRatioThreeNotBetween(BigDecimal value1, BigDecimal value2) {
+            addCriterion("ratio_three not between", value1, value2, "ratioThree");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Boolean value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Boolean value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Boolean value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Boolean value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Boolean value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Boolean value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Boolean> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Boolean> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Boolean value1, Boolean value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/User.java b/src/main/java/com/jsh/erp/datasource/entities/User.java
new file mode 100644
index 0000000..a69090f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/User.java
@@ -0,0 +1,173 @@
+package com.jsh.erp.datasource.entities;
+
+public class User {
+    private Long id;
+
+    private String username;
+
+    private String loginName;
+
+    private String password;
+
+    private String leaderFlag;
+
+    private String position;
+
+    private String department;
+
+    private String email;
+
+    private String phonenum;
+
+    private Byte ismanager;
+
+    private Byte isystem;
+
+    private Byte status;
+
+    private String description;
+
+    private String remark;
+
+    private String weixinOpenId;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username == null ? null : username.trim();
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName == null ? null : loginName.trim();
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password == null ? null : password.trim();
+    }
+
+    public String getLeaderFlag() {
+        return leaderFlag;
+    }
+
+    public void setLeaderFlag(String leaderFlag) {
+        this.leaderFlag = leaderFlag == null ? null : leaderFlag.trim();
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position == null ? null : position.trim();
+    }
+
+    public String getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(String department) {
+        this.department = department == null ? null : department.trim();
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email == null ? null : email.trim();
+    }
+
+    public String getPhonenum() {
+        return phonenum;
+    }
+
+    public void setPhonenum(String phonenum) {
+        this.phonenum = phonenum == null ? null : phonenum.trim();
+    }
+
+    public Byte getIsmanager() {
+        return ismanager;
+    }
+
+    public void setIsmanager(Byte ismanager) {
+        this.ismanager = ismanager;
+    }
+
+    public Byte getIsystem() {
+        return isystem;
+    }
+
+    public void setIsystem(Byte isystem) {
+        this.isystem = isystem;
+    }
+
+    public Byte getStatus() {
+        return status;
+    }
+
+    public void setStatus(Byte status) {
+        this.status = status;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description == null ? null : description.trim();
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark == null ? null : remark.trim();
+    }
+
+    public String getWeixinOpenId() {
+        return weixinOpenId;
+    }
+
+    public void setWeixinOpenId(String weixinOpenId) {
+        this.weixinOpenId = weixinOpenId == null ? null : weixinOpenId.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/UserBusiness.java b/src/main/java/com/jsh/erp/datasource/entities/UserBusiness.java
new file mode 100644
index 0000000..bab98c9
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/UserBusiness.java
@@ -0,0 +1,73 @@
+package com.jsh.erp.datasource.entities;
+
+public class UserBusiness {
+    private Long id;
+
+    private String type;
+
+    private String keyId;
+
+    private String value;
+
+    private String btnStr;
+
+    private Long tenantId;
+
+    private String deleteFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    public String getKeyId() {
+        return keyId;
+    }
+
+    public void setKeyId(String keyId) {
+        this.keyId = keyId == null ? null : keyId.trim();
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value == null ? null : value.trim();
+    }
+
+    public String getBtnStr() {
+        return btnStr;
+    }
+
+    public void setBtnStr(String btnStr) {
+        this.btnStr = btnStr == null ? null : btnStr.trim();
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(String deleteFlag) {
+        this.deleteFlag = deleteFlag == null ? null : deleteFlag.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/UserBusinessExample.java b/src/main/java/com/jsh/erp/datasource/entities/UserBusinessExample.java
new file mode 100644
index 0000000..da62521
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/UserBusinessExample.java
@@ -0,0 +1,669 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class UserBusinessExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public UserBusinessExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdIsNull() {
+            addCriterion("key_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdIsNotNull() {
+            addCriterion("key_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdEqualTo(String value) {
+            addCriterion("key_id =", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdNotEqualTo(String value) {
+            addCriterion("key_id <>", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdGreaterThan(String value) {
+            addCriterion("key_id >", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdGreaterThanOrEqualTo(String value) {
+            addCriterion("key_id >=", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdLessThan(String value) {
+            addCriterion("key_id <", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdLessThanOrEqualTo(String value) {
+            addCriterion("key_id <=", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdLike(String value) {
+            addCriterion("key_id like", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdNotLike(String value) {
+            addCriterion("key_id not like", value, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdIn(List<String> values) {
+            addCriterion("key_id in", values, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdNotIn(List<String> values) {
+            addCriterion("key_id not in", values, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdBetween(String value1, String value2) {
+            addCriterion("key_id between", value1, value2, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andKeyIdNotBetween(String value1, String value2) {
+            addCriterion("key_id not between", value1, value2, "keyId");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueIsNull() {
+            addCriterion("value is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueIsNotNull() {
+            addCriterion("value is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueEqualTo(String value) {
+            addCriterion("value =", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotEqualTo(String value) {
+            addCriterion("value <>", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueGreaterThan(String value) {
+            addCriterion("value >", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueGreaterThanOrEqualTo(String value) {
+            addCriterion("value >=", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueLessThan(String value) {
+            addCriterion("value <", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueLessThanOrEqualTo(String value) {
+            addCriterion("value <=", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueLike(String value) {
+            addCriterion("value like", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotLike(String value) {
+            addCriterion("value not like", value, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueIn(List<String> values) {
+            addCriterion("value in", values, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotIn(List<String> values) {
+            addCriterion("value not in", values, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueBetween(String value1, String value2) {
+            addCriterion("value between", value1, value2, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andValueNotBetween(String value1, String value2) {
+            addCriterion("value not between", value1, value2, "value");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrIsNull() {
+            addCriterion("btn_str is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrIsNotNull() {
+            addCriterion("btn_str is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrEqualTo(String value) {
+            addCriterion("btn_str =", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrNotEqualTo(String value) {
+            addCriterion("btn_str <>", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrGreaterThan(String value) {
+            addCriterion("btn_str >", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrGreaterThanOrEqualTo(String value) {
+            addCriterion("btn_str >=", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrLessThan(String value) {
+            addCriterion("btn_str <", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrLessThanOrEqualTo(String value) {
+            addCriterion("btn_str <=", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrLike(String value) {
+            addCriterion("btn_str like", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrNotLike(String value) {
+            addCriterion("btn_str not like", value, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrIn(List<String> values) {
+            addCriterion("btn_str in", values, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrNotIn(List<String> values) {
+            addCriterion("btn_str not in", values, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrBetween(String value1, String value2) {
+            addCriterion("btn_str between", value1, value2, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andBtnStrNotBetween(String value1, String value2) {
+            addCriterion("btn_str not between", value1, value2, "btnStr");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/entities/UserEx.java b/src/main/java/com/jsh/erp/datasource/entities/UserEx.java
new file mode 100644
index 0000000..d3e00e3
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/UserEx.java
@@ -0,0 +1,138 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/8 15:12
+ */
+public class UserEx extends User{
+    //机构简称
+    private String orgAbr;
+    //机构id
+    private Long orgaId;
+    //用户在部门中排序
+    private String userBlngOrgaDsplSeq;
+    //机构用户关联关系id
+    private Long orgaUserRelId;
+
+    private Long roleId;
+
+    private String roleName;
+
+    private String userType;
+
+    private Integer userNumLimit;
+
+    private String expireTime;
+
+    private String leaderFlagStr;
+
+    /**
+     * 验证码
+     */
+    private String code;
+
+    /**
+     * 唯一标识
+     */
+    private String uuid;
+
+    public String getOrgAbr() {
+        return orgAbr;
+    }
+
+    public void setOrgAbr(String orgAbr) {
+        this.orgAbr = orgAbr;
+    }
+
+    public Long getOrgaId() {
+        return orgaId;
+    }
+
+    public void setOrgaId(Long orgaId) {
+        this.orgaId = orgaId;
+    }
+
+    public String getUserBlngOrgaDsplSeq() {
+        return userBlngOrgaDsplSeq;
+    }
+
+    public void setUserBlngOrgaDsplSeq(String userBlngOrgaDsplSeq) {
+        this.userBlngOrgaDsplSeq = userBlngOrgaDsplSeq;
+    }
+
+    public Long getOrgaUserRelId() {
+        return orgaUserRelId;
+    }
+
+    public void setOrgaUserRelId(Long orgaUserRelId) {
+        this.orgaUserRelId = orgaUserRelId;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public Integer getUserNumLimit() {
+        return userNumLimit;
+    }
+
+    public void setUserNumLimit(Integer userNumLimit) {
+        this.userNumLimit = userNumLimit;
+    }
+
+    public String getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(String expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public String getLeaderFlagStr() {
+        return leaderFlagStr;
+    }
+
+    public void setLeaderFlagStr(String leaderFlagStr) {
+        this.leaderFlagStr = leaderFlagStr;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/entities/UserExample.java b/src/main/java/com/jsh/erp/datasource/entities/UserExample.java
new file mode 100644
index 0000000..e146eb5
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/entities/UserExample.java
@@ -0,0 +1,1339 @@
+package com.jsh.erp.datasource.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class UserExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public UserExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameIsNull() {
+            addCriterion("username is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameIsNotNull() {
+            addCriterion("username is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameEqualTo(String value) {
+            addCriterion("username =", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameNotEqualTo(String value) {
+            addCriterion("username <>", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameGreaterThan(String value) {
+            addCriterion("username >", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameGreaterThanOrEqualTo(String value) {
+            addCriterion("username >=", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameLessThan(String value) {
+            addCriterion("username <", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameLessThanOrEqualTo(String value) {
+            addCriterion("username <=", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameLike(String value) {
+            addCriterion("username like", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameNotLike(String value) {
+            addCriterion("username not like", value, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameIn(List<String> values) {
+            addCriterion("username in", values, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameNotIn(List<String> values) {
+            addCriterion("username not in", values, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameBetween(String value1, String value2) {
+            addCriterion("username between", value1, value2, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andUsernameNotBetween(String value1, String value2) {
+            addCriterion("username not between", value1, value2, "username");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameIsNull() {
+            addCriterion("login_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameIsNotNull() {
+            addCriterion("login_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameEqualTo(String value) {
+            addCriterion("login_name =", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotEqualTo(String value) {
+            addCriterion("login_name <>", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameGreaterThan(String value) {
+            addCriterion("login_name >", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameGreaterThanOrEqualTo(String value) {
+            addCriterion("login_name >=", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameLessThan(String value) {
+            addCriterion("login_name <", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameLessThanOrEqualTo(String value) {
+            addCriterion("login_name <=", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameLike(String value) {
+            addCriterion("login_name like", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotLike(String value) {
+            addCriterion("login_name not like", value, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameIn(List<String> values) {
+            addCriterion("login_name in", values, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotIn(List<String> values) {
+            addCriterion("login_name not in", values, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameBetween(String value1, String value2) {
+            addCriterion("login_name between", value1, value2, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andLoginNameNotBetween(String value1, String value2) {
+            addCriterion("login_name not between", value1, value2, "loginName");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordIsNull() {
+            addCriterion("password is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordIsNotNull() {
+            addCriterion("password is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordEqualTo(String value) {
+            addCriterion("password =", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordNotEqualTo(String value) {
+            addCriterion("password <>", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordGreaterThan(String value) {
+            addCriterion("password >", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordGreaterThanOrEqualTo(String value) {
+            addCriterion("password >=", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordLessThan(String value) {
+            addCriterion("password <", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordLessThanOrEqualTo(String value) {
+            addCriterion("password <=", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordLike(String value) {
+            addCriterion("password like", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordNotLike(String value) {
+            addCriterion("password not like", value, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordIn(List<String> values) {
+            addCriterion("password in", values, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordNotIn(List<String> values) {
+            addCriterion("password not in", values, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordBetween(String value1, String value2) {
+            addCriterion("password between", value1, value2, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andPasswordNotBetween(String value1, String value2) {
+            addCriterion("password not between", value1, value2, "password");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagIsNull() {
+            addCriterion("leader_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagIsNotNull() {
+            addCriterion("leader_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagEqualTo(String value) {
+            addCriterion("leader_flag =", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagNotEqualTo(String value) {
+            addCriterion("leader_flag <>", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagGreaterThan(String value) {
+            addCriterion("leader_flag >", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("leader_flag >=", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagLessThan(String value) {
+            addCriterion("leader_flag <", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagLessThanOrEqualTo(String value) {
+            addCriterion("leader_flag <=", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagLike(String value) {
+            addCriterion("leader_flag like", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagNotLike(String value) {
+            addCriterion("leader_flag not like", value, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagIn(List<String> values) {
+            addCriterion("leader_flag in", values, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagNotIn(List<String> values) {
+            addCriterion("leader_flag not in", values, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagBetween(String value1, String value2) {
+            addCriterion("leader_flag between", value1, value2, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andLeaderFlagNotBetween(String value1, String value2) {
+            addCriterion("leader_flag not between", value1, value2, "leaderFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionIsNull() {
+            addCriterion("position is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionIsNotNull() {
+            addCriterion("position is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionEqualTo(String value) {
+            addCriterion("position =", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotEqualTo(String value) {
+            addCriterion("position <>", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionGreaterThan(String value) {
+            addCriterion("position >", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionGreaterThanOrEqualTo(String value) {
+            addCriterion("position >=", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionLessThan(String value) {
+            addCriterion("position <", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionLessThanOrEqualTo(String value) {
+            addCriterion("position <=", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionLike(String value) {
+            addCriterion("position like", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotLike(String value) {
+            addCriterion("position not like", value, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionIn(List<String> values) {
+            addCriterion("position in", values, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotIn(List<String> values) {
+            addCriterion("position not in", values, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionBetween(String value1, String value2) {
+            addCriterion("position between", value1, value2, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andPositionNotBetween(String value1, String value2) {
+            addCriterion("position not between", value1, value2, "position");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentIsNull() {
+            addCriterion("department is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentIsNotNull() {
+            addCriterion("department is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentEqualTo(String value) {
+            addCriterion("department =", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentNotEqualTo(String value) {
+            addCriterion("department <>", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentGreaterThan(String value) {
+            addCriterion("department >", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentGreaterThanOrEqualTo(String value) {
+            addCriterion("department >=", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentLessThan(String value) {
+            addCriterion("department <", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentLessThanOrEqualTo(String value) {
+            addCriterion("department <=", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentLike(String value) {
+            addCriterion("department like", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentNotLike(String value) {
+            addCriterion("department not like", value, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentIn(List<String> values) {
+            addCriterion("department in", values, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentNotIn(List<String> values) {
+            addCriterion("department not in", values, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentBetween(String value1, String value2) {
+            addCriterion("department between", value1, value2, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andDepartmentNotBetween(String value1, String value2) {
+            addCriterion("department not between", value1, value2, "department");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailIsNull() {
+            addCriterion("email is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailIsNotNull() {
+            addCriterion("email is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailEqualTo(String value) {
+            addCriterion("email =", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotEqualTo(String value) {
+            addCriterion("email <>", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailGreaterThan(String value) {
+            addCriterion("email >", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailGreaterThanOrEqualTo(String value) {
+            addCriterion("email >=", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailLessThan(String value) {
+            addCriterion("email <", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailLessThanOrEqualTo(String value) {
+            addCriterion("email <=", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailLike(String value) {
+            addCriterion("email like", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotLike(String value) {
+            addCriterion("email not like", value, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailIn(List<String> values) {
+            addCriterion("email in", values, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotIn(List<String> values) {
+            addCriterion("email not in", values, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailBetween(String value1, String value2) {
+            addCriterion("email between", value1, value2, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmailNotBetween(String value1, String value2) {
+            addCriterion("email not between", value1, value2, "email");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumIsNull() {
+            addCriterion("phonenum is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumIsNotNull() {
+            addCriterion("phonenum is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumEqualTo(String value) {
+            addCriterion("phonenum =", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumNotEqualTo(String value) {
+            addCriterion("phonenum <>", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumGreaterThan(String value) {
+            addCriterion("phonenum >", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumGreaterThanOrEqualTo(String value) {
+            addCriterion("phonenum >=", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumLessThan(String value) {
+            addCriterion("phonenum <", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumLessThanOrEqualTo(String value) {
+            addCriterion("phonenum <=", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumLike(String value) {
+            addCriterion("phonenum like", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumNotLike(String value) {
+            addCriterion("phonenum not like", value, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumIn(List<String> values) {
+            addCriterion("phonenum in", values, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumNotIn(List<String> values) {
+            addCriterion("phonenum not in", values, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumBetween(String value1, String value2) {
+            addCriterion("phonenum between", value1, value2, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andPhonenumNotBetween(String value1, String value2) {
+            addCriterion("phonenum not between", value1, value2, "phonenum");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerIsNull() {
+            addCriterion("ismanager is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerIsNotNull() {
+            addCriterion("ismanager is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerEqualTo(Byte value) {
+            addCriterion("ismanager =", value, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerNotEqualTo(Byte value) {
+            addCriterion("ismanager <>", value, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerGreaterThan(Byte value) {
+            addCriterion("ismanager >", value, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerGreaterThanOrEqualTo(Byte value) {
+            addCriterion("ismanager >=", value, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerLessThan(Byte value) {
+            addCriterion("ismanager <", value, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerLessThanOrEqualTo(Byte value) {
+            addCriterion("ismanager <=", value, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerIn(List<Byte> values) {
+            addCriterion("ismanager in", values, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerNotIn(List<Byte> values) {
+            addCriterion("ismanager not in", values, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerBetween(Byte value1, Byte value2) {
+            addCriterion("ismanager between", value1, value2, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsmanagerNotBetween(Byte value1, Byte value2) {
+            addCriterion("ismanager not between", value1, value2, "ismanager");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemIsNull() {
+            addCriterion("isystem is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemIsNotNull() {
+            addCriterion("isystem is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemEqualTo(Byte value) {
+            addCriterion("isystem =", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemNotEqualTo(Byte value) {
+            addCriterion("isystem <>", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemGreaterThan(Byte value) {
+            addCriterion("isystem >", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemGreaterThanOrEqualTo(Byte value) {
+            addCriterion("isystem >=", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemLessThan(Byte value) {
+            addCriterion("isystem <", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemLessThanOrEqualTo(Byte value) {
+            addCriterion("isystem <=", value, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemIn(List<Byte> values) {
+            addCriterion("isystem in", values, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemNotIn(List<Byte> values) {
+            addCriterion("isystem not in", values, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemBetween(Byte value1, Byte value2) {
+            addCriterion("isystem between", value1, value2, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsystemNotBetween(Byte value1, Byte value2) {
+            addCriterion("isystem not between", value1, value2, "isystem");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Byte value) {
+            addCriterion("status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Byte value) {
+            addCriterion("status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Byte value) {
+            addCriterion("status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Byte value) {
+            addCriterion("status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Byte value) {
+            addCriterion("status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Byte value) {
+            addCriterion("status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Byte> values) {
+            addCriterion("status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Byte> values) {
+            addCriterion("status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Byte value1, Byte value2) {
+            addCriterion("status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Byte value1, Byte value2) {
+            addCriterion("status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIsNull() {
+            addCriterion("description is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIsNotNull() {
+            addCriterion("description is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionEqualTo(String value) {
+            addCriterion("description =", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotEqualTo(String value) {
+            addCriterion("description <>", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionGreaterThan(String value) {
+            addCriterion("description >", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionGreaterThanOrEqualTo(String value) {
+            addCriterion("description >=", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLessThan(String value) {
+            addCriterion("description <", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLessThanOrEqualTo(String value) {
+            addCriterion("description <=", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionLike(String value) {
+            addCriterion("description like", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotLike(String value) {
+            addCriterion("description not like", value, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionIn(List<String> values) {
+            addCriterion("description in", values, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotIn(List<String> values) {
+            addCriterion("description not in", values, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionBetween(String value1, String value2) {
+            addCriterion("description between", value1, value2, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescriptionNotBetween(String value1, String value2) {
+            addCriterion("description not between", value1, value2, "description");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNull() {
+            addCriterion("remark is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIsNotNull() {
+            addCriterion("remark is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkEqualTo(String value) {
+            addCriterion("remark =", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotEqualTo(String value) {
+            addCriterion("remark <>", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThan(String value) {
+            addCriterion("remark >", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkGreaterThanOrEqualTo(String value) {
+            addCriterion("remark >=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThan(String value) {
+            addCriterion("remark <", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLessThanOrEqualTo(String value) {
+            addCriterion("remark <=", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkLike(String value) {
+            addCriterion("remark like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotLike(String value) {
+            addCriterion("remark not like", value, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkIn(List<String> values) {
+            addCriterion("remark in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotIn(List<String> values) {
+            addCriterion("remark not in", values, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkBetween(String value1, String value2) {
+            addCriterion("remark between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarkNotBetween(String value1, String value2) {
+            addCriterion("remark not between", value1, value2, "remark");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdIsNull() {
+            addCriterion("weixin_open_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdIsNotNull() {
+            addCriterion("weixin_open_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdEqualTo(String value) {
+            addCriterion("weixin_open_id =", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdNotEqualTo(String value) {
+            addCriterion("weixin_open_id <>", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdGreaterThan(String value) {
+            addCriterion("weixin_open_id >", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdGreaterThanOrEqualTo(String value) {
+            addCriterion("weixin_open_id >=", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdLessThan(String value) {
+            addCriterion("weixin_open_id <", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdLessThanOrEqualTo(String value) {
+            addCriterion("weixin_open_id <=", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdLike(String value) {
+            addCriterion("weixin_open_id like", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdNotLike(String value) {
+            addCriterion("weixin_open_id not like", value, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdIn(List<String> values) {
+            addCriterion("weixin_open_id in", values, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdNotIn(List<String> values) {
+            addCriterion("weixin_open_id not in", values, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdBetween(String value1, String value2) {
+            addCriterion("weixin_open_id between", value1, value2, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeixinOpenIdNotBetween(String value1, String value2) {
+            addCriterion("weixin_open_id not between", value1, value2, "weixinOpenId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNull() {
+            addCriterion("tenant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIsNotNull() {
+            addCriterion("tenant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdEqualTo(Long value) {
+            addCriterion("tenant_id =", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotEqualTo(Long value) {
+            addCriterion("tenant_id <>", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThan(Long value) {
+            addCriterion("tenant_id >", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("tenant_id >=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThan(Long value) {
+            addCriterion("tenant_id <", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdLessThanOrEqualTo(Long value) {
+            addCriterion("tenant_id <=", value, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdIn(List<Long> values) {
+            addCriterion("tenant_id in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotIn(List<Long> values) {
+            addCriterion("tenant_id not in", values, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdBetween(Long value1, Long value2) {
+            addCriterion("tenant_id between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTenantIdNotBetween(Long value1, Long value2) {
+            addCriterion("tenant_id not between", value1, value2, "tenantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNull() {
+            addCriterion("delete_flag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIsNotNull() {
+            addCriterion("delete_flag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagEqualTo(String value) {
+            addCriterion("delete_flag =", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotEqualTo(String value) {
+            addCriterion("delete_flag <>", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThan(String value) {
+            addCriterion("delete_flag >", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) {
+            addCriterion("delete_flag >=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThan(String value) {
+            addCriterion("delete_flag <", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLessThanOrEqualTo(String value) {
+            addCriterion("delete_flag <=", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagLike(String value) {
+            addCriterion("delete_flag like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotLike(String value) {
+            addCriterion("delete_flag not like", value, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagIn(List<String> values) {
+            addCriterion("delete_flag in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotIn(List<String> values) {
+            addCriterion("delete_flag not in", values, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagBetween(String value1, String value2) {
+            addCriterion("delete_flag between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDeleteFlagNotBetween(String value1, String value2) {
+            addCriterion("delete_flag not between", value1, value2, "deleteFlag");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapper.java
new file mode 100644
index 0000000..6db0b79
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.AccountHead;
+import com.jsh.erp.datasource.entities.AccountHeadExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface AccountHeadMapper {
+    long countByExample(AccountHeadExample example);
+
+    int deleteByExample(AccountHeadExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(AccountHead record);
+
+    int insertSelective(AccountHead record);
+
+    List<AccountHead> selectByExample(AccountHeadExample example);
+
+    AccountHead selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") AccountHead record, @Param("example") AccountHeadExample example);
+
+    int updateByExample(@Param("record") AccountHead record, @Param("example") AccountHeadExample example);
+
+    int updateByPrimaryKeySelective(AccountHead record);
+
+    int updateByPrimaryKey(AccountHead record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapperEx.java
new file mode 100644
index 0000000..de5106e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/AccountHeadMapperEx.java
@@ -0,0 +1,64 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.AccountHead;
+import com.jsh.erp.datasource.entities.AccountHeadExample;
+import com.jsh.erp.datasource.entities.AccountHeadVo4ListEx;
+import com.jsh.erp.datasource.entities.AccountItem;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public interface AccountHeadMapperEx {
+
+    List<AccountHeadVo4ListEx> selectByConditionAccountHead(
+            @Param("type") String type,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("billNo") String billNo,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("organId") Long organId,
+            @Param("creator") Long creator,
+            @Param("handsPersonId") Long handsPersonId,
+            @Param("accountId") Long accountId,
+            @Param("status") String status,
+            @Param("remark") String remark,
+            @Param("number") String number,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByAccountHead(
+            @Param("type") String type,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("billNo") String billNo,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("organId") Long organId,
+            @Param("creator") Long creator,
+            @Param("handsPersonId") Long handsPersonId,
+            @Param("accountId") Long accountId,
+            @Param("status") String status,
+            @Param("remark") String remark,
+            @Param("number") String number);
+
+    List<AccountHeadVo4ListEx> getDetailByNumber(
+            @Param("billNo") String billNo);
+
+    int batchDeleteAccountHeadByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String[] ids);
+
+    List<AccountHead> getAccountHeadListByAccountIds(@Param("accountIds") String[] accountIds);
+
+    List<AccountHead> getAccountHeadListByOrganIds(@Param("organIds") String[] organIds);
+
+    List<AccountHead> getAccountHeadListByHandsPersonIds(@Param("handsPersonIds") String[] handsPersonIds);
+
+    List<AccountItem> getFinancialBillNoByBillIdList(
+            @Param("idList") List<Long> idList);
+
+    List<AccountHead> getFinancialBillNoByBillId(
+            @Param("billId") Long billId);
+
+    BigDecimal getFinancialAllPriceByOrganId(
+            @Param("organId") Long organId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapper.java
new file mode 100644
index 0000000..3593150
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.AccountItem;
+import com.jsh.erp.datasource.entities.AccountItemExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface AccountItemMapper {
+    long countByExample(AccountItemExample example);
+
+    int deleteByExample(AccountItemExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(AccountItem record);
+
+    int insertSelective(AccountItem record);
+
+    List<AccountItem> selectByExample(AccountItemExample example);
+
+    AccountItem selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") AccountItem record, @Param("example") AccountItemExample example);
+
+    int updateByExample(@Param("record") AccountItem record, @Param("example") AccountItemExample example);
+
+    int updateByPrimaryKeySelective(AccountItem record);
+
+    int updateByPrimaryKey(AccountItem record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapperEx.java
new file mode 100644
index 0000000..9aa0a7d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/AccountItemMapperEx.java
@@ -0,0 +1,42 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.AccountItem;
+import com.jsh.erp.datasource.entities.AccountItemExample;
+import com.jsh.erp.datasource.vo.AccountItemVo4List;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public interface AccountItemMapperEx {
+
+    List<AccountItem> selectByConditionAccountItem(
+            @Param("name") String name,
+            @Param("type") Integer type,
+            @Param("remark") String remark,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByAccountItem(
+            @Param("name") String name,
+            @Param("type") Integer type,
+            @Param("remark") String remark);
+
+    List<AccountItemVo4List> getDetailList(
+            @Param("headerId") Long headerId);
+
+    int batchDeleteAccountItemByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String[] ids);
+
+    List<AccountItem> getAccountItemListByAccountIds(@Param("accountIds") String[] accountIds);
+
+    List<AccountItem> getAccountItemListByHeaderIds(@Param("headerIds") String[] headerIds);
+
+    List<AccountItem> getAccountItemListByInOutItemIds(@Param("inOutItemIds") String[] inOutItemIds);
+
+    int batchDeleteAccountItemByHeadIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String[] ids);
+
+    BigDecimal getEachAmountByBillId(@Param("billId") Long billId);
+
+    BigDecimal getFinishDebtByOrganId(@Param("organId") Long organId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/AccountMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/AccountMapper.java
new file mode 100644
index 0000000..55c6017
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/AccountMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Account;
+import com.jsh.erp.datasource.entities.AccountExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface AccountMapper {
+    long countByExample(AccountExample example);
+
+    int deleteByExample(AccountExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Account record);
+
+    int insertSelective(Account record);
+
+    List<Account> selectByExample(AccountExample example);
+
+    Account selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Account record, @Param("example") AccountExample example);
+
+    int updateByExample(@Param("record") Account record, @Param("example") AccountExample example);
+
+    int updateByPrimaryKeySelective(Account record);
+
+    int updateByPrimaryKey(Account record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/AccountMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/AccountMapperEx.java
new file mode 100644
index 0000000..0d0f434
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/AccountMapperEx.java
@@ -0,0 +1,88 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Account;
+import com.jsh.erp.datasource.entities.AccountVo4Sum;
+import com.jsh.erp.datasource.entities.DepotHead;
+import com.jsh.erp.datasource.vo.AccountVo4InOutList;
+import com.jsh.erp.datasource.vo.AccountVo4List;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public interface AccountMapperEx {
+
+    List<Account> getAccountByParam(
+            @Param("name") String name,
+            @Param("serialNo") String serialNo);
+
+    List<AccountVo4List> selectByConditionAccount(
+            @Param("name") String name,
+            @Param("serialNo") String serialNo,
+            @Param("remark") String remark,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByAccount(
+            @Param("name") String name,
+            @Param("serialNo") String serialNo,
+            @Param("remark") String remark);
+
+    BigDecimal getAccountSum(
+            @Param("accountId") Long accountId,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag);
+
+    BigDecimal getAccountSumByHead(
+            @Param("accountId") Long accountId,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag);
+
+    BigDecimal getAccountSumByDetail(
+            @Param("accountId") Long accountId,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag);
+
+    List<DepotHead> getManyAccountSum(
+            @Param("accountId") Long accountId,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag);
+
+    List<AccountVo4Sum> getAccountSumByParam(
+            @Param("name") String name,
+            @Param("serialNo") String serialNo,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    List<DepotHead> getManyAccountSumByParam(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag);
+
+    List<AccountVo4InOutList> findAccountInOutList(
+            @Param("accountId") Long accountId,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int findAccountInOutListCount(
+            @Param("accountId") Long accountId,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("forceFlag") Boolean forceFlag);
+
+    int batchDeleteAccountByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java
new file mode 100644
index 0000000..efdc4d8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.DepotHead;
+import com.jsh.erp.datasource.entities.DepotHeadExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DepotHeadMapper {
+    long countByExample(DepotHeadExample example);
+
+    int deleteByExample(DepotHeadExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(DepotHead record);
+
+    int insertSelective(DepotHead record);
+
+    List<DepotHead> selectByExample(DepotHeadExample example);
+
+    DepotHead selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") DepotHead record, @Param("example") DepotHeadExample example);
+
+    int updateByExample(@Param("record") DepotHead record, @Param("example") DepotHeadExample example);
+
+    int updateByPrimaryKeySelective(DepotHead record);
+
+    int updateByPrimaryKey(DepotHead record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java
new file mode 100644
index 0000000..8e2e4f8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java
@@ -0,0 +1,325 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.DepotHead;
+import com.jsh.erp.datasource.vo.*;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/1/25 14:50
+ */
+public interface DepotHeadMapperEx {
+    List<DepotHeadVo4List> selectByConditionDepotHead(
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("hasDebt") String hasDebt,
+            @Param("statusArray") String[] statusArray,
+            @Param("purchaseStatusArray") String[] purchaseStatusArray,
+            @Param("number") String number,
+            @Param("linkApply") String linkApply,
+            @Param("linkNumber") String linkNumber,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("materialParam") String materialParam,
+            @Param("organId") Long organId,
+            @Param("organArray") String[] organArray,
+            @Param("creator") Long creator,
+            @Param("depotId") Long depotId,
+            @Param("depotArray") String[] depotArray,
+            @Param("accountId") Long accountId,
+            @Param("remark") String remark,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByDepotHead(
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("hasDebt") String hasDebt,
+            @Param("statusArray") String[] statusArray,
+            @Param("purchaseStatusArray") String[] purchaseStatusArray,
+            @Param("number") String number,
+            @Param("linkApply") String linkApply,
+            @Param("linkNumber") String linkNumber,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("materialParam") String materialParam,
+            @Param("organId") Long organId,
+            @Param("organArray") String[] organArray,
+            @Param("creator") Long creator,
+            @Param("depotId") Long depotId,
+            @Param("depotArray") String[] depotArray,
+            @Param("accountId") Long accountId,
+            @Param("remark") String remark);
+
+    List<MaterialsListVo> findMaterialsListMapByHeaderIdList(
+            @Param("idList") List<Long> idList);
+
+    List<MaterialCountVo> getMaterialCountListByHeaderIdList(
+            @Param("idList") List<Long> idList);
+
+    List<DepotHeadVo4InDetail> findInOutDetail(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("type") String type,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organArray") String[] organArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("oId") Integer oId,
+            @Param("number") String number,
+            @Param("creator") Long creator,
+            @Param("remark") String remark,
+            @Param("column") String column,
+            @Param("order") String order,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int findInOutDetailCount(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("type") String type,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organArray") String[] organArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("oId") Integer oId,
+            @Param("number") String number,
+            @Param("creator") Long creator,
+            @Param("remark") String remark);
+
+    List<DepotHeadVo4InDetail> findInOutDetailStatistic(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("type") String type,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organArray") String[] organArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("oId") Integer oId,
+            @Param("number") String number,
+            @Param("creator") Long creator,
+            @Param("remark") String remark);
+
+    List<DepotHeadVo4InOutMCount> findInOutMaterialCount(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("type") String type,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("oId") Integer oId,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organArray") String[] organArray,
+            @Param("column") String column,
+            @Param("order") String order,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int findInOutMaterialCountTotal(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("type") String type,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("oId") Integer oId,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organArray") String[] organArray);
+
+    List<DepotHeadVo4InOutMCount> findInOutMaterialCountStatistic(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("type") String type,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("oId") Integer oId,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organArray") String[] organArray);
+
+    List<DepotHeadVo4InDetail> findAllocationDetail(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("subType") String subType,
+            @Param("number") String number,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("depotFList") List<Long> depotFList,
+            @Param("remark") String remark,
+            @Param("column") String column,
+            @Param("order") String order,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int findAllocationDetailCount(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("subType") String subType,
+            @Param("number") String number,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("depotFList") List<Long> depotFList,
+            @Param("remark") String remark);
+
+    List<DepotHeadVo4InDetail> findAllocationStatistic(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("subType") String subType,
+            @Param("number") String number,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("depotFList") List<Long> depotFList,
+            @Param("remark") String remark);
+
+    List<DepotHeadVo4StatementAccount> getStatementAccount(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("organId") Integer organId,
+            @Param("organArray") String[] organArray,
+            @Param("hasDebt") Integer hasDebt,
+            @Param("supplierType") String supplierType,
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("typeBack") String typeBack,
+            @Param("subTypeBack") String subTypeBack,
+            @Param("billType") String billType,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int getStatementAccountCount(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("organId") Integer organId,
+            @Param("organArray") String[] organArray,
+            @Param("hasDebt") Integer hasDebt,
+            @Param("supplierType") String supplierType,
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("typeBack") String typeBack,
+            @Param("subTypeBack") String subTypeBack,
+            @Param("billType") String billType);
+
+    List<DepotHeadVo4StatementAccount> getStatementAccountTotalPay(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("organId") Integer organId,
+            @Param("organArray") String[] organArray,
+            @Param("hasDebt") Integer hasDebt,
+            @Param("supplierType") String supplierType,
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("typeBack") String typeBack,
+            @Param("subTypeBack") String subTypeBack,
+            @Param("billType") String billType);
+
+    List<DepotHeadVo4List> getDetailByNumber(
+            @Param("number") String number);
+
+    int batchDeleteDepotHeadByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    List<DepotHead> getDepotHeadListByAccountIds(@Param("accountIds") String[] accountIds);
+
+    List<DepotHead> getDepotHeadListByOrganIds(@Param("organIds") String[] organIds);
+
+    List<DepotHead> getDepotHeadListByCreator(@Param("creatorArray") String[] creatorArray);
+
+    List<InOutPriceVo> getBuyAndSaleStatisticsList(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("forceFlag") Boolean forceFlag);
+
+    List<DepotHeadVo4List> debtList(
+            @Param("organId") Long organId,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("status") String status,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("materialParam") String materialParam,
+            @Param("depotArray") String[] depotArray,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int debtListCount(
+            @Param("organId") Long organId,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("status") String status,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("materialParam") String materialParam,
+            @Param("depotArray") String[] depotArray);
+
+    List<FinishDepositVo> getFinishDepositByNumberList(
+            @Param("numberList") List<String> numberList);
+
+    BigDecimal getFinishDepositByNumberExceptCurrent(
+            @Param("linkNumber") String linkNumber,
+            @Param("number") String number);
+
+    void setAccountIdToNull(
+            @Param("id") Long id);
+
+    int getSerialNumberBySell(
+            @Param("number") String number);
+
+    List<DepotHeadVo4List> waitBillList(
+            @Param("type") String type,
+            @Param("subTypeArray") String[] subTypeArray,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("statusArray") String[] statusArray,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("materialParam") String materialParam,
+            @Param("depotArray") String[] depotArray,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long waitBillCount(
+            @Param("type") String type,
+            @Param("subTypeArray") String[] subTypeArray,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("statusArray") String[] statusArray,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("materialParam") String materialParam,
+            @Param("depotArray") String[] depotArray);
+
+    BigDecimal getBillAllPriceByOrganId(
+            @Param("organId") Long organId);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java
new file mode 100644
index 0000000..6911473
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.DepotItem;
+import com.jsh.erp.datasource.entities.DepotItemExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DepotItemMapper {
+    long countByExample(DepotItemExample example);
+
+    int deleteByExample(DepotItemExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(DepotItem record);
+
+    int insertSelective(DepotItem record);
+
+    List<DepotItem> selectByExample(DepotItemExample example);
+
+    DepotItem selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") DepotItem record, @Param("example") DepotItemExample example);
+
+    int updateByExample(@Param("record") DepotItem record, @Param("example") DepotItemExample example);
+
+    int updateByPrimaryKeySelective(DepotItem record);
+
+    int updateByPrimaryKey(DepotItem record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java
new file mode 100644
index 0000000..a8e79ac
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java
@@ -0,0 +1,263 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.vo.DepotItemStockWarningCount;
+import com.jsh.erp.datasource.vo.DepotItemVo4Stock;
+import com.jsh.erp.datasource.vo.DepotItemVoBatchNumberList;
+import com.jsh.erp.datasource.vo.InOutPriceVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/1/24 16:59
+ */
+public interface DepotItemMapperEx {
+    List<DepotItem> selectByConditionDepotItem(
+            @Param("name") String name,
+            @Param("type") Integer type,
+            @Param("remark") String remark,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByDepotItem(
+            @Param("name") String name,
+            @Param("type") Integer type,
+            @Param("remark") String remark);
+
+    List<DepotItemVo4DetailByTypeAndMId> findDetailByDepotIdsAndMaterialIdList(
+            @Param("depotIdArray") Long[] depotIdArray,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("sku") String sku,
+            @Param("batchNumber") String batchNumber,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("mId") Long mId,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long findDetailByDepotIdsAndMaterialIdCount(
+            @Param("depotIdArray") Long[] depotIdArray,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("sku") String sku,
+            @Param("batchNumber") String batchNumber,
+            @Param("number") String number,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("mId") Long mId);
+
+    List<DepotItemVo4WithInfoEx> getDetailList(
+            @Param("headerId") Long headerId);
+
+    List<DepotItemVo4WithInfoEx> getBillDetailListByIds(
+            @Param("idList") List<Long> idList);
+
+    List<DepotItemVo4WithInfoEx> getInOutStock(
+            @Param("materialParam") String materialParam,
+            @Param("categoryIdList") List<Long> categoryIdList,
+            @Param("endTime") String endTime,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int getInOutStockCount(
+            @Param("materialParam") String materialParam,
+            @Param("categoryIdList") List<Long> categoryIdList,
+            @Param("endTime") String endTime);
+
+    List<DepotItemVo4WithInfoEx> getListWithBuyOrSale(
+            @Param("materialParam") String materialParam,
+            @Param("billType") String billType,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organId") Long organId,
+            @Param("organArray") String[] organArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("depotList") List<Long> depotList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int getListWithBuyOrSaleCount(
+            @Param("materialParam") String materialParam,
+            @Param("billType") String billType,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organId") Long organId,
+            @Param("organArray") String[] organArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("depotList") List<Long> depotList,
+            @Param("forceFlag") Boolean forceFlag);
+
+    BigDecimal buyOrSaleNumber(
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("MId") Long MId,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organId") Long organId,
+            @Param("organArray") String [] organArray,
+            @Param("depotList") List<Long> depotList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("sumType") String sumType);
+
+    BigDecimal buyOrSalePrice(
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("MId") Long MId,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organId") Long organId,
+            @Param("organArray") String [] organArray,
+            @Param("depotList") List<Long> depotList,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("sumType") String sumType);
+
+    BigDecimal buyOrSalePriceTotal(
+            @Param("type") String type,
+            @Param("subType") String subType,
+            @Param("materialParam") String materialParam,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("organId") Long organId,
+            @Param("organArray") String [] organArray,
+            @Param("categoryList") List<Long> categoryList,
+            @Param("depotList") List<Long> depotList,
+            @Param("forceFlag") Boolean forceFlag);
+
+    List<InOutPriceVo> inOrOutPriceList(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("forceFlag") Boolean forceFlag);
+
+    BigDecimal getSkuStockCheckSumByDepotList(
+            @Param("depotList") List<Long> depotList,
+            @Param("meId") Long meId,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime);
+
+    BigDecimal getStockCheckSumByDepotList(
+            @Param("depotList") List<Long> depotList,
+            @Param("mId") Long mId,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime);
+
+    DepotItemVo4Stock getSkuStockByParamWithDepotList(
+            @Param("depotList") List<Long> depotList,
+            @Param("meId") Long meId,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime);
+
+    DepotItemVo4Stock getStockByParamWithDepotList(
+            @Param("depotList") List<Long> depotList,
+            @Param("mId") Long mId,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime);
+
+    /**
+     * 通过单据主表id查询所有单据子表数据
+     * @param depotheadId
+     * @param enableSerialNumber
+     * @return
+     */
+     List<DepotItem> findDepotItemListBydepotheadId(@Param("depotheadId")Long depotheadId,
+                                                    @Param("enableSerialNumber")String enableSerialNumber);
+     /**
+      * 根据单据主表id删除单据子表数据
+      * */
+     int batchDeleteDepotItemByDepotHeadIds(@Param("depotheadIds")Long []depotHeadIds);
+
+    int batchDeleteDepotItemByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    List<DepotItem> getDepotItemListListByDepotIds(@Param("depotIds") String[] depotIds);
+
+    List<DepotItem> getDepotItemListListByMaterialIds(@Param("materialIds") String[] materialIds);
+
+    List<DepotItemStockWarningCount> findStockWarningCount(
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows,
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("categoryList") List<Long> categoryList);
+
+    int findStockWarningCountTotal(
+            @Param("materialParam") String materialParam,
+            @Param("depotList") List<Long> depotList,
+            @Param("categoryList") List<Long> categoryList);
+
+    BigDecimal getFinishNumber(
+            @Param("meId") Long meId,
+            @Param("linkId") Long linkId,
+            @Param("linkStr") String linkStr,
+            @Param("noType") String noType,
+            @Param("goToType") String goToType);
+
+    BigDecimal getRealFinishNumber(
+            @Param("meId") Long meId,
+            @Param("linkId") Long linkId,
+            @Param("linkStr") String linkStr,
+            @Param("linkType") String linkType,
+            @Param("currentHeaderId") Long currentHeaderId,
+            @Param("goToType") String goToType);
+
+    List<DepotItemVoBatchNumberList> getBatchNumberList(
+            @Param("number") String number,
+            @Param("name") String name,
+            @Param("depotId") Long depotId,
+            @Param("barCode") String barCode,
+            @Param("batchNumber") String batchNumber,
+            @Param("forceFlag") Boolean forceFlag,
+            @Param("inOutManageFlag") Boolean inOutManageFlag);
+
+    Long getCountByMaterialAndDepot(
+            @Param("mId") Long mId,
+            @Param("depotId") Long depotId);
+
+    List<DepotItemVo4MaterialAndSum> getLinkBillDetailMaterialSum(
+            @Param("linkStr") String linkStr);
+
+    List<DepotItemVo4MaterialAndSum> getBatchBillDetailMaterialSum(
+            @Param("linkStr") String linkStr,
+            @Param("linkType") String linkType,
+            @Param("type") String type);
+
+    Long getCountByMaterialAndBatchNumber(
+            @Param("meId") Long meId,
+            @Param("batchNumber") String batchNumber);
+
+    List<DepotItem> getDepotItemByBatchNumber(
+            @Param("materialExtendId") Long materialExtendId,
+            @Param("batchNumber") String batchNumber);
+
+    List<MaterialVo4Unit> getBillItemByParam(
+            @Param("barCodes") String barCodes);
+
+    BigDecimal getCurrentStockByParam(
+            @Param("depotId") Long depotId,
+            @Param("mId") Long mId);
+
+    BigDecimal getLastUnitPriceByParam(
+            @Param("organId") Long organId,
+            @Param("meId") Long meId,
+            @Param("type") String type,
+            @Param("subType") String subType);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotMapper.java
new file mode 100644
index 0000000..6372e96
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Depot;
+import com.jsh.erp.datasource.entities.DepotExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DepotMapper {
+    long countByExample(DepotExample example);
+
+    int deleteByExample(DepotExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Depot record);
+
+    int insertSelective(Depot record);
+
+    List<Depot> selectByExample(DepotExample example);
+
+    Depot selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Depot record, @Param("example") DepotExample example);
+
+    int updateByExample(@Param("record") Depot record, @Param("example") DepotExample example);
+
+    int updateByPrimaryKeySelective(Depot record);
+
+    int updateByPrimaryKey(Depot record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotMapperEx.java
new file mode 100644
index 0000000..61b18fc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotMapperEx.java
@@ -0,0 +1,27 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Depot;
+import com.jsh.erp.datasource.entities.DepotEx;
+import com.jsh.erp.datasource.entities.DepotExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface DepotMapperEx {
+
+    List<DepotEx> selectByConditionDepot(
+            @Param("name") String name,
+            @Param("type") Integer type,
+            @Param("remark") String remark,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByDepot(
+            @Param("name") String name,
+            @Param("type") Integer type,
+            @Param("remark") String remark);
+
+    int batchDeleteDepotByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/FunctionMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/FunctionMapper.java
new file mode 100644
index 0000000..214594a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/FunctionMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Function;
+import com.jsh.erp.datasource.entities.FunctionExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface FunctionMapper {
+    long countByExample(FunctionExample example);
+
+    int deleteByExample(FunctionExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Function record);
+
+    int insertSelective(Function record);
+
+    List<Function> selectByExample(FunctionExample example);
+
+    Function selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Function record, @Param("example") FunctionExample example);
+
+    int updateByExample(@Param("record") Function record, @Param("example") FunctionExample example);
+
+    int updateByPrimaryKeySelective(Function record);
+
+    int updateByPrimaryKey(Function record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/FunctionMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/FunctionMapperEx.java
new file mode 100644
index 0000000..bc75fd8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/FunctionMapperEx.java
@@ -0,0 +1,22 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.FunctionEx;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface FunctionMapperEx {
+
+    List<FunctionEx> selectByConditionFunction(
+            @Param("name") String name,
+            @Param("type") String type,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByFunction(
+            @Param("name") String name,
+            @Param("type") String type);
+
+    int batchDeleteFunctionByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapper.java
new file mode 100644
index 0000000..42f8c5a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.InOutItem;
+import com.jsh.erp.datasource.entities.InOutItemExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface InOutItemMapper {
+    long countByExample(InOutItemExample example);
+
+    int deleteByExample(InOutItemExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(InOutItem record);
+
+    int insertSelective(InOutItem record);
+
+    List<InOutItem> selectByExample(InOutItemExample example);
+
+    InOutItem selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") InOutItem record, @Param("example") InOutItemExample example);
+
+    int updateByExample(@Param("record") InOutItem record, @Param("example") InOutItemExample example);
+
+    int updateByPrimaryKeySelective(InOutItem record);
+
+    int updateByPrimaryKey(InOutItem record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapperEx.java
new file mode 100644
index 0000000..eec8bd0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/InOutItemMapperEx.java
@@ -0,0 +1,25 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.InOutItem;
+import com.jsh.erp.datasource.entities.InOutItemExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface InOutItemMapperEx {
+
+    List<InOutItem> selectByConditionInOutItem(
+            @Param("name") String name,
+            @Param("type") String type,
+            @Param("remark") String remark,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByInOutItem(
+            @Param("name") String name,
+            @Param("type") String type,
+            @Param("remark") String remark);
+
+    int batchDeleteInOutItemByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/LogMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/LogMapper.java
new file mode 100644
index 0000000..2eb9fe8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/LogMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Log;
+import com.jsh.erp.datasource.entities.LogExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface LogMapper {
+    long countByExample(LogExample example);
+
+    int deleteByExample(LogExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Log record);
+
+    int insertSelective(Log record);
+
+    List<Log> selectByExample(LogExample example);
+
+    Log selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Log record, @Param("example") LogExample example);
+
+    int updateByExample(@Param("record") Log record, @Param("example") LogExample example);
+
+    int updateByPrimaryKeySelective(Log record);
+
+    int updateByPrimaryKey(Log record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/LogMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/LogMapperEx.java
new file mode 100644
index 0000000..dc53219
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/LogMapperEx.java
@@ -0,0 +1,41 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Log;
+import com.jsh.erp.datasource.entities.LogExample;
+import com.jsh.erp.datasource.vo.LogVo4List;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface LogMapperEx {
+
+    List<LogVo4List> selectByConditionLog(
+            @Param("operation") String operation,
+            @Param("userInfo") String userInfo,
+            @Param("clientIp") String clientIp,
+            @Param("tenantLoginName") String tenantLoginName,
+            @Param("tenantType") String tenantType,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("content") String content,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByLog(
+            @Param("operation") String operation,
+            @Param("userInfo") String userInfo,
+            @Param("clientIp") String clientIp,
+            @Param("tenantLoginName") String tenantLoginName,
+            @Param("tenantType") String tenantType,
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("content") String content);
+
+    Long getCountByIpAndDate(
+            @Param("userId") Long userId,
+            @Param("moduleName") String moduleName,
+            @Param("clientIp") String clientIp,
+            @Param("createTime") String createTime);
+
+    int insertLogWithUserId(Log log);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapper.java
new file mode 100644
index 0000000..670ac58
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialAttribute;
+import com.jsh.erp.datasource.entities.MaterialAttributeExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MaterialAttributeMapper {
+    long countByExample(MaterialAttributeExample example);
+
+    int deleteByExample(MaterialAttributeExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(MaterialAttribute record);
+
+    int insertSelective(MaterialAttribute record);
+
+    List<MaterialAttribute> selectByExample(MaterialAttributeExample example);
+
+    MaterialAttribute selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") MaterialAttribute record, @Param("example") MaterialAttributeExample example);
+
+    int updateByExample(@Param("record") MaterialAttribute record, @Param("example") MaterialAttributeExample example);
+
+    int updateByPrimaryKeySelective(MaterialAttribute record);
+
+    int updateByPrimaryKey(MaterialAttribute record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapperEx.java
new file mode 100644
index 0000000..53ab24f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialAttributeMapperEx.java
@@ -0,0 +1,20 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialAttribute;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface MaterialAttributeMapperEx {
+
+    List<MaterialAttribute> selectByConditionMaterialAttribute(
+            @Param("attributeName") String attributeName,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByMaterialAttribute(
+            @Param("attributeField") String attributeField);
+
+    int batchDeleteMaterialAttributeByIds(
+            @Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapper.java
new file mode 100644
index 0000000..b8096dd
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialCategory;
+import com.jsh.erp.datasource.entities.MaterialCategoryExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MaterialCategoryMapper {
+    long countByExample(MaterialCategoryExample example);
+
+    int deleteByExample(MaterialCategoryExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(MaterialCategory record);
+
+    int insertSelective(MaterialCategory record);
+
+    List<MaterialCategory> selectByExample(MaterialCategoryExample example);
+
+    MaterialCategory selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") MaterialCategory record, @Param("example") MaterialCategoryExample example);
+
+    int updateByExample(@Param("record") MaterialCategory record, @Param("example") MaterialCategoryExample example);
+
+    int updateByPrimaryKeySelective(MaterialCategory record);
+
+    int updateByPrimaryKey(MaterialCategory record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapperEx.java
new file mode 100644
index 0000000..f609c4c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCategoryMapperEx.java
@@ -0,0 +1,42 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialCategory;
+import com.jsh.erp.datasource.vo.TreeNode;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/2/18 17:23
+ */
+public interface MaterialCategoryMapperEx {
+    List<MaterialCategory> selectByConditionMaterialCategory(
+            @Param("name") String name,
+            @Param("parentId") Integer parentId,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByMaterialCategory(
+            @Param("name") String name,
+            @Param("parentId") Integer parentId);
+
+    List<TreeNode> getNodeTree(@Param("currentId")Long currentId);
+    List<TreeNode> getNextNodeTree(Map<String, Object> parameterMap);
+
+    int addMaterialCategory(MaterialCategory mc);
+
+    int batchDeleteMaterialCategoryByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    int editMaterialCategory(MaterialCategory mc);
+
+    List<MaterialCategory> getMaterialCategoryBySerialNo(@Param("serialNo") String serialNo, @Param("id") Long id);
+
+    List<MaterialCategory> getMaterialCategoryListByCategoryIds(@Param("parentIds") String[] categoryIds);
+
+    List<MaterialCategory> getListByParentId(@Param("parentId") Long parentId);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapper.java
new file mode 100644
index 0000000..45efaa8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialCurrentStock;
+import com.jsh.erp.datasource.entities.MaterialCurrentStockExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MaterialCurrentStockMapper {
+    long countByExample(MaterialCurrentStockExample example);
+
+    int deleteByExample(MaterialCurrentStockExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(MaterialCurrentStock record);
+
+    int insertSelective(MaterialCurrentStock record);
+
+    List<MaterialCurrentStock> selectByExample(MaterialCurrentStockExample example);
+
+    MaterialCurrentStock selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") MaterialCurrentStock record, @Param("example") MaterialCurrentStockExample example);
+
+    int updateByExample(@Param("record") MaterialCurrentStock record, @Param("example") MaterialCurrentStockExample example);
+
+    int updateByPrimaryKeySelective(MaterialCurrentStock record);
+
+    int updateByPrimaryKey(MaterialCurrentStock record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapperEx.java
new file mode 100644
index 0000000..50f49c2
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialCurrentStockMapperEx.java
@@ -0,0 +1,23 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialCurrentStock;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface MaterialCurrentStockMapperEx {
+
+    int batchInsert(List<MaterialCurrentStock> list);
+
+    List<MaterialCurrentStock> getCurrentStockMapByIdList(
+            @Param("materialIdList") List<Long> materialIdList);
+
+    void updateUnitPriceByMId(
+            @Param("currentUnitPrice") BigDecimal currentUnitPrice,
+            @Param("materialId") Long materialId);
+
+    BigDecimal getCurrentUnitPriceByMId(@Param("materialId") Long materialId);
+
+    void batchDeleteByDepots(@Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapper.java
new file mode 100644
index 0000000..eaa8fcb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialExtend;
+import com.jsh.erp.datasource.entities.MaterialExtendExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MaterialExtendMapper {
+    long countByExample(MaterialExtendExample example);
+
+    int deleteByExample(MaterialExtendExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(MaterialExtend record);
+
+    int insertSelective(MaterialExtend record);
+
+    List<MaterialExtend> selectByExample(MaterialExtendExample example);
+
+    MaterialExtend selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") MaterialExtend record, @Param("example") MaterialExtendExample example);
+
+    int updateByExample(@Param("record") MaterialExtend record, @Param("example") MaterialExtendExample example);
+
+    int updateByPrimaryKeySelective(MaterialExtend record);
+
+    int updateByPrimaryKey(MaterialExtend record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapperEx.java
new file mode 100644
index 0000000..1362910
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapperEx.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialExtend;
+import com.jsh.erp.datasource.vo.MaterialExtendVo4List;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface MaterialExtendMapperEx {
+
+    int batchDeleteMaterialExtendByIds(@Param("ids") String ids[]);
+
+    List<MaterialExtendVo4List> getDetailList(
+            @Param("materialId") Long materialId);
+
+    Long getMaxTimeByTenantAndTime(
+            @Param("tenantId") Long tenantId,
+            @Param("lastTime") Long lastTime,
+            @Param("syncNum") Long syncNum);
+
+    List<MaterialExtend> getListByMId(@Param("ids") Long ids[]);
+
+    int batchDeleteMaterialExtendByMIds(@Param("ids") String ids[]);
+
+    int specialUpdatePrice(MaterialExtend record);
+
+    List<MaterialExtend> getBasicInfoByMid(
+            @Param("materialId") Long materialId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapper.java
new file mode 100644
index 0000000..3bcd80a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialInitialStock;
+import com.jsh.erp.datasource.entities.MaterialInitialStockExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MaterialInitialStockMapper {
+    long countByExample(MaterialInitialStockExample example);
+
+    int deleteByExample(MaterialInitialStockExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(MaterialInitialStock record);
+
+    int insertSelective(MaterialInitialStock record);
+
+    List<MaterialInitialStock> selectByExample(MaterialInitialStockExample example);
+
+    MaterialInitialStock selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") MaterialInitialStock record, @Param("example") MaterialInitialStockExample example);
+
+    int updateByExample(@Param("record") MaterialInitialStock record, @Param("example") MaterialInitialStockExample example);
+
+    int updateByPrimaryKeySelective(MaterialInitialStock record);
+
+    int updateByPrimaryKey(MaterialInitialStock record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapperEx.java
new file mode 100644
index 0000000..fa054bb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialInitialStockMapperEx.java
@@ -0,0 +1,20 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialCurrentStock;
+import com.jsh.erp.datasource.entities.MaterialInitialStock;
+import com.jsh.erp.datasource.entities.MaterialInitialStockExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface MaterialInitialStockMapperEx {
+
+    int batchInsert(List<MaterialInitialStock> list);
+
+    List<MaterialInitialStock> getInitialStockMapByIdList(
+            @Param("materialIdList") List<Long> materialIdList);
+
+    List<MaterialInitialStock> getListExceptZero();
+
+    void batchDeleteByDepots(@Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapper.java
new file mode 100644
index 0000000..abdea68
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Material;
+import com.jsh.erp.datasource.entities.MaterialExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MaterialMapper {
+    long countByExample(MaterialExample example);
+
+    int deleteByExample(MaterialExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Material record);
+
+    int insertSelective(Material record);
+
+    List<Material> selectByExample(MaterialExample example);
+
+    Material selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Material record, @Param("example") MaterialExample example);
+
+    int updateByExample(@Param("record") Material record, @Param("example") MaterialExample example);
+
+    int updateByPrimaryKeySelective(Material record);
+
+    int updateByPrimaryKey(Material record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java
new file mode 100644
index 0000000..6d4419b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java
@@ -0,0 +1,180 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.vo.MaterialVoSearch;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/1/22 14:54
+ */
+public interface MaterialMapperEx {
+
+    List<MaterialVo4Unit> selectByConditionMaterial(
+            @Param("materialParam") String materialParam,
+            @Param("standard") String standard,
+            @Param("model") String model,
+            @Param("color") String color,
+            @Param("brand") String brand,
+            @Param("mfrs") String mfrs,
+            @Param("materialOther") String materialOther,
+            @Param("weight") String weight,
+            @Param("expiryNum") String expiryNum,
+            @Param("enableSerialNumber") String enableSerialNumber,
+            @Param("enableBatchNumber") String enableBatchNumber,
+            @Param("position") String position,
+            @Param("enabled") String enabled,
+            @Param("remark") String remark,
+            @Param("idList") List<Long> idList,
+            @Param("mpList") String mpList,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByMaterial(
+            @Param("materialParam") String materialParam,
+            @Param("standard") String standard,
+            @Param("model") String model,
+            @Param("color") String color,
+            @Param("brand") String brand,
+            @Param("mfrs") String mfrs,
+            @Param("materialOther") String materialOther,
+            @Param("weight") String weight,
+            @Param("expiryNum") String expiryNum,
+            @Param("enableSerialNumber") String enableSerialNumber,
+            @Param("enableBatchNumber") String enableBatchNumber,
+            @Param("position") String position,
+            @Param("enabled") String enabled,
+            @Param("remark") String remark,
+            @Param("idList") List<Long> idList,
+            @Param("mpList") String mpList);
+
+    Long insertSelectiveEx(Material record);
+
+    List<Unit> findUnitList(@Param("mId") Long mId);
+
+    List<MaterialVo4Unit> findById(@Param("id") Long id);
+
+    List<MaterialVo4Unit> findByIdWithBarCode(@Param("meId") Long meId);
+
+    List<MaterialVoSearch> getMaterialByParam(@Param("materialParam") String materialParam);
+
+    List<MaterialVo4Unit> findBySelectWithBarCode(@Param("idList") List<Long> idList,
+                                                  @Param("q") String q,
+                                                  @Param("standardOrModel") String standardOrModel,
+                                                  @Param("color") String color,
+                                                  @Param("brand") String brand,
+                                                  @Param("mfrs") String mfrs,
+                                                  @Param("enableSerialNumber") String enableSerialNumber,
+                                                  @Param("enableBatchNumber") String enableBatchNumber,
+                                                  @Param("offset") Integer offset,
+                                                  @Param("rows") Integer rows);
+
+    int findBySelectWithBarCodeCount(@Param("idList") List<Long> idList,
+                                     @Param("q") String q,
+                                     @Param("standardOrModel") String standardOrModel,
+                                     @Param("color") String color,
+                                     @Param("brand") String brand,
+                                     @Param("mfrs") String mfrs,
+                                     @Param("enableSerialNumber") String enableSerialNumber,
+                                     @Param("enableBatchNumber") String enableBatchNumber);
+
+    List<MaterialVo4Unit> exportExcel(
+            @Param("materialParam") String materialParam,
+            @Param("color") String color,
+            @Param("materialOther") String materialOther,
+            @Param("weight") String weight,
+            @Param("expiryNum") String expiryNum,
+            @Param("enabled") String enabled,
+            @Param("enableSerialNumber") String enableSerialNumber,
+            @Param("enableBatchNumber") String enableBatchNumber,
+            @Param("remark") String remark,
+            @Param("idList") List<Long> idList);
+
+    List<MaterialExtend> getOtherMaterialList();
+
+    /**
+     * 通过商品名称查询商品信息
+     * */
+    List<Material> findByMaterialName(@Param("name") String name);
+    /**
+     * 获取开启序列号并且状态正常的商品列表
+     * */
+    List<MaterialVo4Unit> getMaterialEnableSerialNumberList(@Param("q") String q,
+                                                     @Param("offset") Integer offset,
+                                                     @Param("rows") Integer rows);
+
+    Long getMaterialEnableSerialNumberCount(@Param("q") String q);
+
+    int batchDeleteMaterialByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    List<Material> getMaterialListByCategoryIds(@Param("categoryIds") String[] categoryIds);
+
+    List<Material> getMaterialListByUnitIds(@Param("unitIds") String[] unitIds);
+
+    String getMaxBarCode();
+
+    List<MaterialVo4Unit> getMaterialByMeId(
+            @Param("meId") Long meId);
+
+    List<String> getMaterialNameList();
+
+    int setUnitIdToNull(@Param("id") Long id);
+
+    int setExpiryNumToNull(@Param("id") Long id);
+
+    List<MaterialVo4Unit> getMaterialByBarCode(@Param("barCodeArray") String [] barCodeArray);
+
+    List<MaterialVo4Unit> getMaterialByBarCodeAndWithOutMId(
+            @Param("barCodeArray") String [] barCodeArray,
+            @Param("mId") Long mId);
+
+    List<MaterialInitialStockWithMaterial> getInitialStockWithMaterial(
+            @Param("depotList") List<Long> depotList);
+
+    List<MaterialVo4Unit> getListWithStock(
+            @Param("depotList") List<Long> depotList,
+            @Param("idList") List<Long> idList,
+            @Param("position") String position,
+            @Param("materialParam") String materialParam,
+            @Param("zeroStock") Integer zeroStock,
+            @Param("column") String column,
+            @Param("order") String order,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    int getListWithStockCount(
+            @Param("depotList") List<Long> depotList,
+            @Param("idList") List<Long> idList,
+            @Param("position") String position,
+            @Param("materialParam") String materialParam,
+            @Param("zeroStock") Integer zeroStock);
+
+    MaterialVo4Unit getTotalStockAndPrice(
+            @Param("depotList") List<Long> depotList,
+            @Param("idList") List<Long> idList,
+            @Param("position") String position,
+            @Param("materialParam") String materialParam);
+
+    int checkIsExist(
+            @Param("id") Long id,
+            @Param("name") String name,
+            @Param("model") String model,
+            @Param("color") String color,
+            @Param("standard") String standard,
+            @Param("mfrs") String mfrs,
+            @Param("otherField1") String otherField1,
+            @Param("otherField2") String otherField2,
+            @Param("otherField3") String otherField3,
+            @Param("unit") String unit,
+            @Param("unitId") Long unitId);
+
+    MaterialExtend getMaterialExtendBySerialNumber(
+            @Param("serialNumber") String serialNumber);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapper.java
new file mode 100644
index 0000000..d6f51d6
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialProperty;
+import com.jsh.erp.datasource.entities.MaterialPropertyExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MaterialPropertyMapper {
+    long countByExample(MaterialPropertyExample example);
+
+    int deleteByExample(MaterialPropertyExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(MaterialProperty record);
+
+    int insertSelective(MaterialProperty record);
+
+    List<MaterialProperty> selectByExample(MaterialPropertyExample example);
+
+    MaterialProperty selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") MaterialProperty record, @Param("example") MaterialPropertyExample example);
+
+    int updateByExample(@Param("record") MaterialProperty record, @Param("example") MaterialPropertyExample example);
+
+    int updateByPrimaryKeySelective(MaterialProperty record);
+
+    int updateByPrimaryKey(MaterialProperty record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapperEx.java
new file mode 100644
index 0000000..fbba651
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialPropertyMapperEx.java
@@ -0,0 +1,20 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialProperty;
+import com.jsh.erp.datasource.entities.MaterialPropertyExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface MaterialPropertyMapperEx {
+
+    List<MaterialProperty> selectByConditionMaterialProperty(
+            @Param("name") String name,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByMaterialProperty(@Param("name") String name);
+
+    int batchDeleteMaterialPropertyByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MsgMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/MsgMapper.java
new file mode 100644
index 0000000..c41cffb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MsgMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Msg;
+import com.jsh.erp.datasource.entities.MsgExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface MsgMapper {
+    long countByExample(MsgExample example);
+
+    int deleteByExample(MsgExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Msg record);
+
+    int insertSelective(Msg record);
+
+    List<Msg> selectByExample(MsgExample example);
+
+    Msg selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Msg record, @Param("example") MsgExample example);
+
+    int updateByExample(@Param("record") Msg record, @Param("example") MsgExample example);
+
+    int updateByPrimaryKeySelective(Msg record);
+
+    int updateByPrimaryKey(Msg record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MsgMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MsgMapperEx.java
new file mode 100644
index 0000000..d5011fa
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/MsgMapperEx.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Msg;
+import com.jsh.erp.datasource.entities.MsgEx;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface MsgMapperEx {
+
+    List<MsgEx> selectByConditionMsg(
+            @Param("userId") Long userId,
+            @Param("name") String name,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByMsg(
+            @Param("userId") Long userId,
+            @Param("name") String name);
+
+    int batchDeleteMsgByIds(@Param("ids") String ids[]);
+
+    Long getMsgCountByStatus(
+            @Param("status") String status,
+            @Param("userId") Long userId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapper.java
new file mode 100644
index 0000000..bde231f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapper.java
@@ -0,0 +1,96 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.OrgaUserRel;
+import com.jsh.erp.datasource.entities.OrgaUserRelExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface OrgaUserRelMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int countByExample(OrgaUserRelExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int deleteByExample(OrgaUserRelExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int insert(OrgaUserRel record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int insertSelective(OrgaUserRel record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    List<OrgaUserRel> selectByExample(OrgaUserRelExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    OrgaUserRel selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int updateByExampleSelective(@Param("record") OrgaUserRel record, @Param("example") OrgaUserRelExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int updateByExample(@Param("record") OrgaUserRel record, @Param("example") OrgaUserRelExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int updateByPrimaryKeySelective(OrgaUserRel record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table jsh_orga_user_rel
+     *
+     * @mbggenerated
+     */
+    int updateByPrimaryKey(OrgaUserRel record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapperEx.java
new file mode 100644
index 0000000..7a2017f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/OrgaUserRelMapperEx.java
@@ -0,0 +1,14 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.OrgaUserRel; /**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/12 9:13
+ */
+public interface OrgaUserRelMapperEx {
+
+    int addOrgaUserRel(OrgaUserRel orgaUserRel);
+
+    int updateOrgaUserRel(OrgaUserRel orgaUserRel);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapper.java
new file mode 100644
index 0000000..246cf9d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Organization;
+import com.jsh.erp.datasource.entities.OrganizationExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface OrganizationMapper {
+    long countByExample(OrganizationExample example);
+
+    int deleteByExample(OrganizationExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Organization record);
+
+    int insertSelective(Organization record);
+
+    List<Organization> selectByExample(OrganizationExample example);
+
+    Organization selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Organization record, @Param("example") OrganizationExample example);
+
+    int updateByExample(@Param("record") Organization record, @Param("example") OrganizationExample example);
+
+    int updateByPrimaryKeySelective(Organization record);
+
+    int updateByPrimaryKey(Organization record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapperEx.java
new file mode 100644
index 0000000..9161ae0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/OrganizationMapperEx.java
@@ -0,0 +1,33 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.MaterialCategory;
+import com.jsh.erp.datasource.entities.Organization;
+import com.jsh.erp.datasource.vo.TreeNode;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/6 15:51
+ */
+public interface OrganizationMapperEx {
+
+
+    List<TreeNode> getNodeTree(@Param("currentId")Long currentId);
+    List<TreeNode> getNextNodeTree(Map<String, Object> parameterMap);
+
+    int addOrganization(Organization org);
+
+    List <Organization> getOrganizationByParentIds(@Param("ids") String ids[]);
+
+    int batchDeleteOrganizationByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    int editOrganization(Organization org);
+
+    List <Organization> getOrganizationRootByIds(@Param("ids") String ids[]);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/PersonMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/PersonMapper.java
new file mode 100644
index 0000000..a5ec297
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/PersonMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Person;
+import com.jsh.erp.datasource.entities.PersonExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface PersonMapper {
+    long countByExample(PersonExample example);
+
+    int deleteByExample(PersonExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Person record);
+
+    int insertSelective(Person record);
+
+    List<Person> selectByExample(PersonExample example);
+
+    Person selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Person record, @Param("example") PersonExample example);
+
+    int updateByExample(@Param("record") Person record, @Param("example") PersonExample example);
+
+    int updateByPrimaryKeySelective(Person record);
+
+    int updateByPrimaryKey(Person record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/PersonMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/PersonMapperEx.java
new file mode 100644
index 0000000..1acea47
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/PersonMapperEx.java
@@ -0,0 +1,23 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Person;
+import com.jsh.erp.datasource.entities.PersonExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface PersonMapperEx {
+
+    List<Person> selectByConditionPerson(
+            @Param("name") String name,
+            @Param("type") String type,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByPerson(
+            @Param("name") String name,
+            @Param("type") String type);
+
+    int batchDeletePersonByIds(@Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapper.java
new file mode 100644
index 0000000..9ed0c1b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.PlatformConfig;
+import com.jsh.erp.datasource.entities.PlatformConfigExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface PlatformConfigMapper {
+    long countByExample(PlatformConfigExample example);
+
+    int deleteByExample(PlatformConfigExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(PlatformConfig record);
+
+    int insertSelective(PlatformConfig record);
+
+    List<PlatformConfig> selectByExample(PlatformConfigExample example);
+
+    PlatformConfig selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") PlatformConfig record, @Param("example") PlatformConfigExample example);
+
+    int updateByExample(@Param("record") PlatformConfig record, @Param("example") PlatformConfigExample example);
+
+    int updateByPrimaryKeySelective(PlatformConfig record);
+
+    int updateByPrimaryKey(PlatformConfig record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapperEx.java
new file mode 100644
index 0000000..4130d25
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/PlatformConfigMapperEx.java
@@ -0,0 +1,19 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.PlatformConfig;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface PlatformConfigMapperEx {
+
+    List<PlatformConfig> selectByConditionPlatformConfig(
+            @Param("platformKey") String platformKey,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByPlatformConfig(
+            @Param("platformKey") String platformKey);
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/RoleMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/RoleMapper.java
new file mode 100644
index 0000000..9c87ad5
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/RoleMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Role;
+import com.jsh.erp.datasource.entities.RoleExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface RoleMapper {
+    long countByExample(RoleExample example);
+
+    int deleteByExample(RoleExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Role record);
+
+    int insertSelective(Role record);
+
+    List<Role> selectByExample(RoleExample example);
+
+    Role selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Role record, @Param("example") RoleExample example);
+
+    int updateByExample(@Param("record") Role record, @Param("example") RoleExample example);
+
+    int updateByPrimaryKeySelective(Role record);
+
+    int updateByPrimaryKey(Role record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/RoleMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/RoleMapperEx.java
new file mode 100644
index 0000000..cf4c927
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/RoleMapperEx.java
@@ -0,0 +1,27 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Role;
+import com.jsh.erp.datasource.entities.RoleEx;
+import com.jsh.erp.datasource.entities.RoleExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface RoleMapperEx {
+
+    List<RoleEx> selectByConditionRole(
+            @Param("name") String name,
+            @Param("description") String description,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByRole(
+            @Param("name") String name,
+            @Param("description") String description);
+
+    int batchDeleteRoleByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    Role getRoleWithoutTenant(
+            @Param("roleId") Long roleId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SequenceMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/SequenceMapperEx.java
new file mode 100644
index 0000000..09b34e3
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SequenceMapperEx.java
@@ -0,0 +1,13 @@
+package com.jsh.erp.datasource.mappers;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface SequenceMapperEx {
+
+    void updateBuildOnlyNumber();
+
+    /**
+     * 获得一个全局唯一的数作为订单号的追加
+     * */
+    Long getBuildOnlyNumber(@Param("seq_name") String seq_name);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java
new file mode 100644
index 0000000..58fcbb4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.SerialNumber;
+import com.jsh.erp.datasource.entities.SerialNumberExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface SerialNumberMapper {
+    long countByExample(SerialNumberExample example);
+
+    int deleteByExample(SerialNumberExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(SerialNumber record);
+
+    int insertSelective(SerialNumber record);
+
+    List<SerialNumber> selectByExample(SerialNumberExample example);
+
+    SerialNumber selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") SerialNumber record, @Param("example") SerialNumberExample example);
+
+    int updateByExample(@Param("record") SerialNumber record, @Param("example") SerialNumberExample example);
+
+    int updateByPrimaryKeySelective(SerialNumber record);
+
+    int updateByPrimaryKey(SerialNumber record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java
new file mode 100644
index 0000000..0766498
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java
@@ -0,0 +1,61 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.SerialNumber;
+import com.jsh.erp.datasource.entities.SerialNumberEx;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/1/21 17:09
+ */
+public interface SerialNumberMapperEx {
+     /**
+      * 新增序列号信息
+      * */
+    int addSerialNumber(SerialNumberEx serialNumberEx);
+    /**
+     * 修改序列号信息
+     * */
+    int updateSerialNumber(SerialNumberEx serialNumberEx);
+    /**
+     * 查询指定商品下有效的序列号数量
+     * 未删除为卖出的视为有效
+     * */
+    int findSerialNumberByMaterialId(@Param("materialId") Long materialId);
+    /**
+     * 卖出: update jsh_serial_number set is_Sell='1' ,depothead_Id='depotheadId' where 1=1 and material_Id='materialId'
+     * and is_Sell !='1' and delete_Flag !='1'  {limit 0,count}
+     * */
+    int sellSerialNumber(@Param("materialId")Long materialId, @Param("outBillNo")String outBillNo, @Param("snArray") String snArray[], @Param("updateTime") Date updateTime,@Param("updater") Long updater);
+    /**
+     * 赎回:update jsh_serial_number set is_Sell='0',depothead_Id=null  where 1=1 and material_Id='materialId'
+     *      and depothead_Id='depotheadId' and is_Sell !='0' and delete_Flag !='1' {limit 0,count}
+     * */
+    int cancelSerialNumber(@Param("materialId")Long materialId, @Param("outBillNo")String outBillNo, @Param("count")Integer count, @Param("updateTime") Date updateTime,@Param("updater") Long updater);
+    /**
+     * 批量添加序列号
+     * */
+    int batAddSerialNumber(@Param("list") List<SerialNumberEx> list);
+
+    int batchDeleteSerialNumberByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    List<SerialNumberEx> getEnableSerialNumberList(@Param("number") String number,
+                                                 @Param("name") String name,
+                                                 @Param("depotId") Long depotId,
+                                                 @Param("barCode") String barCode,
+                                                 @Param("offset") Integer offset, @Param("rows") Integer rows);
+
+    Long getEnableSerialNumberCount(@Param("number") String number,
+                                    @Param("name") String name,
+                                    @Param("depotId") Long depotId,
+                                    @Param("barCode") String barCode);
+
+    int getIsNotSellCountByParam(
+            @Param("materialId") Long materialId,
+            @Param("serialNumber") String serialNumber);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SupplierMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/SupplierMapper.java
new file mode 100644
index 0000000..d92df07
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SupplierMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Supplier;
+import com.jsh.erp.datasource.entities.SupplierExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface SupplierMapper {
+    long countByExample(SupplierExample example);
+
+    int deleteByExample(SupplierExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Supplier record);
+
+    int insertSelective(Supplier record);
+
+    List<Supplier> selectByExample(SupplierExample example);
+
+    Supplier selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Supplier record, @Param("example") SupplierExample example);
+
+    int updateByExample(@Param("record") Supplier record, @Param("example") SupplierExample example);
+
+    int updateByPrimaryKeySelective(Supplier record);
+
+    int updateByPrimaryKey(Supplier record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SupplierMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/SupplierMapperEx.java
new file mode 100644
index 0000000..9672610
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SupplierMapperEx.java
@@ -0,0 +1,39 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Supplier;
+import com.jsh.erp.datasource.entities.SupplierExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface SupplierMapperEx {
+
+    List<Supplier> selectByConditionSupplier(
+            @Param("supplier") String supplier,
+            @Param("type") String type,
+            @Param("phonenum") String phonenum,
+            @Param("telephone") String telephone,
+            @Param("creatorArray") String[] creatorArray,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsBySupplier(
+            @Param("supplier") String supplier,
+            @Param("type") String type,
+            @Param("phonenum") String phonenum,
+            @Param("telephone") String telephone,
+            @Param("creatorArray") String[] creatorArray);
+
+    List<Supplier> findByAll(
+            @Param("supplier") String supplier,
+            @Param("type") String type,
+            @Param("phonenum") String phonenum,
+            @Param("telephone") String telephone);
+
+    int batchDeleteSupplierByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    Supplier getSupplierByNameAndType(
+            @Param("supplier") String supplier,
+            @Param("type") String type);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapper.java
new file mode 100644
index 0000000..f801a1e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.SystemConfig;
+import com.jsh.erp.datasource.entities.SystemConfigExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface SystemConfigMapper {
+    long countByExample(SystemConfigExample example);
+
+    int deleteByExample(SystemConfigExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(SystemConfig record);
+
+    int insertSelective(SystemConfig record);
+
+    List<SystemConfig> selectByExample(SystemConfigExample example);
+
+    SystemConfig selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") SystemConfig record, @Param("example") SystemConfigExample example);
+
+    int updateByExample(@Param("record") SystemConfig record, @Param("example") SystemConfigExample example);
+
+    int updateByPrimaryKeySelective(SystemConfig record);
+
+    int updateByPrimaryKey(SystemConfig record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapperEx.java
new file mode 100644
index 0000000..9d8ea8e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/SystemConfigMapperEx.java
@@ -0,0 +1,21 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.SystemConfig;
+import com.jsh.erp.datasource.entities.SystemConfigExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface SystemConfigMapperEx {
+
+    List<SystemConfig> selectByConditionSystemConfig(
+            @Param("companyName") String companyName,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsBySystemConfig(
+            @Param("companyName") String companyName);
+
+    int batchDeleteSystemConfigByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/TenantMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/TenantMapper.java
new file mode 100644
index 0000000..7ed867f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/TenantMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Tenant;
+import com.jsh.erp.datasource.entities.TenantExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface TenantMapper {
+    long countByExample(TenantExample example);
+
+    int deleteByExample(TenantExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Tenant record);
+
+    int insertSelective(Tenant record);
+
+    List<Tenant> selectByExample(TenantExample example);
+
+    Tenant selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Tenant record, @Param("example") TenantExample example);
+
+    int updateByExample(@Param("record") Tenant record, @Param("example") TenantExample example);
+
+    int updateByPrimaryKeySelective(Tenant record);
+
+    int updateByPrimaryKey(Tenant record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/TenantMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/TenantMapperEx.java
new file mode 100644
index 0000000..fbb8748
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/TenantMapperEx.java
@@ -0,0 +1,24 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Tenant;
+import com.jsh.erp.datasource.entities.TenantEx;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface TenantMapperEx {
+
+    List<TenantEx> selectByConditionTenant(
+            @Param("loginName") String loginName,
+            @Param("type") String type,
+            @Param("enabled") String enabled,
+            @Param("remark") String remark,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByTenant(
+            @Param("loginName") String loginName,
+            @Param("type") String type,
+            @Param("enabled") String enabled,
+            @Param("remark") String remark);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UnitMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/UnitMapper.java
new file mode 100644
index 0000000..3b1dae6
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/UnitMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Unit;
+import com.jsh.erp.datasource.entities.UnitExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface UnitMapper {
+    long countByExample(UnitExample example);
+
+    int deleteByExample(UnitExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(Unit record);
+
+    int insertSelective(Unit record);
+
+    List<Unit> selectByExample(UnitExample example);
+
+    Unit selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") Unit record, @Param("example") UnitExample example);
+
+    int updateByExample(@Param("record") Unit record, @Param("example") UnitExample example);
+
+    int updateByPrimaryKeySelective(Unit record);
+
+    int updateByPrimaryKey(Unit record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UnitMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/UnitMapperEx.java
new file mode 100644
index 0000000..3956708
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/UnitMapperEx.java
@@ -0,0 +1,25 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.Unit;
+import com.jsh.erp.datasource.entities.UnitExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface UnitMapperEx {
+
+    List<Unit> selectByConditionUnit(
+            @Param("name") String name,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByUnit(
+            @Param("name") String name);
+
+    int batchDeleteUnitByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    void updateRatioTwoById(@Param("id") Long id);
+
+    void updateRatioThreeById(@Param("id") Long id);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapper.java
new file mode 100644
index 0000000..3138661
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.UserBusiness;
+import com.jsh.erp.datasource.entities.UserBusinessExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface UserBusinessMapper {
+    long countByExample(UserBusinessExample example);
+
+    int deleteByExample(UserBusinessExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(UserBusiness record);
+
+    int insertSelective(UserBusiness record);
+
+    List<UserBusiness> selectByExample(UserBusinessExample example);
+
+    UserBusiness selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") UserBusiness record, @Param("example") UserBusinessExample example);
+
+    int updateByExample(@Param("record") UserBusiness record, @Param("example") UserBusinessExample example);
+
+    int updateByPrimaryKeySelective(UserBusiness record);
+
+    int updateByPrimaryKey(UserBusiness record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapperEx.java
new file mode 100644
index 0000000..f01b0f7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/UserBusinessMapperEx.java
@@ -0,0 +1,24 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.UserBusiness;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: qiankunpingtai
+ * @Date: 2019/3/29 15:09
+ */
+public interface UserBusinessMapperEx {
+
+    int batchDeleteUserBusinessByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
+
+    List<UserBusiness> getBasicDataByKeyIdAndType(
+            @Param("keyId") String keyId,
+            @Param("type") String type);
+
+    void updateValueByTypeAndKeyId(@Param("type") String type, @Param("keyId") String keyId, @Param("ubValue") String ubValue);
+}
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java
new file mode 100644
index 0000000..a6b9e79
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/UserMapper.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.entities.UserExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface UserMapper {
+    long countByExample(UserExample example);
+
+    int deleteByExample(UserExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(User record);
+
+    int insertSelective(User record);
+
+    List<User> selectByExample(UserExample example);
+
+    User selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);
+
+    int updateByExample(@Param("record") User record, @Param("example") UserExample example);
+
+    int updateByPrimaryKeySelective(User record);
+
+    int updateByPrimaryKey(User record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java
new file mode 100644
index 0000000..c4e770b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java
@@ -0,0 +1,47 @@
+package com.jsh.erp.datasource.mappers;
+
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.entities.UserEx;
+import com.jsh.erp.datasource.entities.UserExample;
+import com.jsh.erp.datasource.vo.TreeNode;
+import com.jsh.erp.datasource.vo.TreeNodeEx;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface UserMapperEx {
+
+    List<UserEx> selectByConditionUser(
+            @Param("userName") String userName,
+            @Param("loginName") String loginName,
+            @Param("offset") Integer offset,
+            @Param("rows") Integer rows);
+
+    Long countsByUser(
+            @Param("userName") String userName,
+            @Param("loginName") String loginName);
+
+    List<User> getUserListByUserNameOrLoginName(@Param("userName") String userName,
+                                                @Param("loginName") String loginName);
+
+    int batDeleteOrUpdateUser(@Param("ids") String[] ids);
+
+    List<TreeNodeEx> getNodeTree();
+    List<TreeNodeEx> getNextNodeTree(Map<String, Object> parameterMap);
+
+    void disableUserByLimit(@Param("tenantId") Long tenantId);
+
+    List<User> getListByOrgaId(
+            @Param("id") Long id,
+            @Param("orgaId") Long orgaId);
+
+    User getUserByWeixinOpenId(
+            @Param("weixinOpenId") String weixinOpenId);
+
+    int updateUserWithWeixinOpenId(
+            @Param("loginName") String loginName,
+            @Param("password") String password,
+            @Param("weixinOpenId") String weixinOpenId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/AccountItemVo4List.java b/src/main/java/com/jsh/erp/datasource/vo/AccountItemVo4List.java
new file mode 100644
index 0000000..73d74b4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/AccountItemVo4List.java
@@ -0,0 +1,36 @@
+package com.jsh.erp.datasource.vo;
+
+import com.jsh.erp.datasource.entities.AccountItem;
+
+public class AccountItemVo4List extends AccountItem {
+
+    private String accountName;
+
+    private String inOutItemName;
+
+    private String billNumber;
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public String getInOutItemName() {
+        return inOutItemName;
+    }
+
+    public void setInOutItemName(String inOutItemName) {
+        this.inOutItemName = inOutItemName;
+    }
+
+    public String getBillNumber() {
+        return billNumber;
+    }
+
+    public void setBillNumber(String billNumber) {
+        this.billNumber = billNumber;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/AccountVo4InOutList.java b/src/main/java/com/jsh/erp/datasource/vo/AccountVo4InOutList.java
new file mode 100644
index 0000000..5da3dd4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/AccountVo4InOutList.java
@@ -0,0 +1,116 @@
+package com.jsh.erp.datasource.vo;
+
+import java.math.BigDecimal;
+
+public class AccountVo4InOutList {
+
+    private Long accountId;
+
+    private String number;
+
+    private String type;
+
+    private String fromType;
+
+    private String supplierName;
+
+    private BigDecimal changeAmount;
+
+    private BigDecimal balance;
+
+    private String operTime;
+
+    private String aList;
+
+    private String amList;
+
+    private Long tenantId;
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getFromType() {
+        return fromType;
+    }
+
+    public void setFromType(String fromType) {
+        this.fromType = fromType;
+    }
+
+    public String getSupplierName() {
+        return supplierName;
+    }
+
+    public void setSupplierName(String supplierName) {
+        this.supplierName = supplierName;
+    }
+
+    public BigDecimal getChangeAmount() {
+        return changeAmount;
+    }
+
+    public void setChangeAmount(BigDecimal changeAmount) {
+        this.changeAmount = changeAmount;
+    }
+
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public void setBalance(BigDecimal balance) {
+        this.balance = balance;
+    }
+
+    public String getOperTime() {
+        return operTime;
+    }
+
+    public void setOperTime(String operTime) {
+        this.operTime = operTime;
+    }
+
+    public String getaList() {
+        return aList;
+    }
+
+    public void setaList(String aList) {
+        this.aList = aList;
+    }
+
+    public String getAmList() {
+        return amList;
+    }
+
+    public void setAmList(String amList) {
+        this.amList = amList;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/AccountVo4List.java b/src/main/java/com/jsh/erp/datasource/vo/AccountVo4List.java
new file mode 100644
index 0000000..c96bf0a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/AccountVo4List.java
@@ -0,0 +1,16 @@
+package com.jsh.erp.datasource.vo;
+
+import com.jsh.erp.datasource.entities.Account;
+
+public class AccountVo4List extends Account{
+
+    private String thisMonthAmount;
+
+    public String getThisMonthAmount() {
+        return thisMonthAmount;
+    }
+
+    public void setThisMonthAmount(String thisMonthAmount) {
+        this.thisMonthAmount = thisMonthAmount;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/BillListCacheVo.java b/src/main/java/com/jsh/erp/datasource/vo/BillListCacheVo.java
new file mode 100644
index 0000000..1298dcb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/BillListCacheVo.java
@@ -0,0 +1,34 @@
+package com.jsh.erp.datasource.vo;
+
+public class BillListCacheVo {
+
+    private String number;
+    
+    private String organName;
+
+    private String operTimeStr;
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getOperTimeStr() {
+        return operTimeStr;
+    }
+
+    public void setOperTimeStr(String operTimeStr) {
+        this.operTimeStr = operTimeStr;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InDetail.java b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InDetail.java
new file mode 100644
index 0000000..1d8137c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InDetail.java
@@ -0,0 +1,228 @@
+package com.jsh.erp.datasource.vo;
+
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DepotHeadVo4InDetail {
+
+    private String number;
+
+    private String barCode;
+
+    private String mname;
+
+    private String model;
+
+    private String standard;
+
+    private String color;
+
+    private String brand;
+
+    private String mfrs;
+
+    private BigDecimal unitPrice;
+
+    private String sku;
+
+    private String mUnit;
+
+    private String newRemark;
+
+    private BigDecimal operNumber;
+
+    private BigDecimal allPrice;
+
+    private BigDecimal taxRate;
+
+    private BigDecimal taxMoney;
+
+    private BigDecimal taxLastMoney;
+
+    private String sname;
+
+    private String dname;
+
+    private String operTime;
+
+    private String newType;
+
+    private Long tenantId;
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode;
+    }
+
+    public String getMname() {
+        return mname;
+    }
+
+    public void setMname(String mname) {
+        this.mname = mname;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getStandard() {
+        return standard;
+    }
+
+    public void setStandard(String standard) {
+        this.standard = standard;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getMfrs() {
+        return mfrs;
+    }
+
+    public void setMfrs(String mfrs) {
+        this.mfrs = mfrs;
+    }
+
+    public BigDecimal getUnitPrice() {
+        return unitPrice;
+    }
+
+    public void setUnitPrice(BigDecimal unitPrice) {
+        this.unitPrice = unitPrice;
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public String getmUnit() {
+        return mUnit;
+    }
+
+    public void setmUnit(String mUnit) {
+        this.mUnit = mUnit;
+    }
+
+    public String getNewRemark() {
+        return newRemark;
+    }
+
+    public void setNewRemark(String newRemark) {
+        this.newRemark = newRemark;
+    }
+
+    public BigDecimal getOperNumber() {
+        return operNumber;
+    }
+
+    public void setOperNumber(BigDecimal operNumber) {
+        this.operNumber = operNumber;
+    }
+
+    public BigDecimal getAllPrice() {
+        return allPrice;
+    }
+
+    public void setAllPrice(BigDecimal allPrice) {
+        this.allPrice = allPrice;
+    }
+
+    public BigDecimal getTaxRate() {
+        return taxRate;
+    }
+
+    public void setTaxRate(BigDecimal taxRate) {
+        this.taxRate = taxRate;
+    }
+
+    public BigDecimal getTaxMoney() {
+        return taxMoney;
+    }
+
+    public void setTaxMoney(BigDecimal taxMoney) {
+        this.taxMoney = taxMoney;
+    }
+
+    public BigDecimal getTaxLastMoney() {
+        return taxLastMoney;
+    }
+
+    public void setTaxLastMoney(BigDecimal taxLastMoney) {
+        this.taxLastMoney = taxLastMoney;
+    }
+
+    public String getSname() {
+        return sname;
+    }
+
+    public void setSname(String sname) {
+        this.sname = sname;
+    }
+
+    public String getDname() {
+        return dname;
+    }
+
+    public void setDname(String dname) {
+        this.dname = dname;
+    }
+
+    public String getOperTime() {
+        return operTime;
+    }
+
+    public void setOperTime(String operTime) {
+        this.operTime = operTime;
+    }
+
+    public String getNewType() {
+        return newType;
+    }
+
+    public void setNewType(String newType) {
+        this.newType = newType;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InOutMCount.java b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InOutMCount.java
new file mode 100644
index 0000000..cdcf0b2
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4InOutMCount.java
@@ -0,0 +1,136 @@
+package com.jsh.erp.datasource.vo;
+
+import java.math.BigDecimal;
+
+public class DepotHeadVo4InOutMCount {
+
+    private Long materialId;
+
+    private String barCode;
+
+    private String mName;
+
+    private String model;
+
+    private String standard;
+
+    private String color;
+
+    private String brand;
+
+    private String mfrs;
+
+    private String categoryName;
+
+    private String materialUnit;
+
+    private BigDecimal numSum;
+
+    private BigDecimal priceSum;
+
+    private Long tenantId;
+
+    public Long getMaterialId() {
+        return materialId;
+    }
+
+    public void setMaterialId(Long materialId) {
+        this.materialId = materialId;
+    }
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode;
+    }
+
+    public String getmName() {
+        return mName;
+    }
+
+    public void setmName(String mName) {
+        this.mName = mName;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getStandard() {
+        return standard;
+    }
+
+    public void setStandard(String standard) {
+        this.standard = standard;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getMfrs() {
+        return mfrs;
+    }
+
+    public void setMfrs(String mfrs) {
+        this.mfrs = mfrs;
+    }
+
+    public String getCategoryName() {
+        return categoryName;
+    }
+
+    public void setCategoryName(String categoryName) {
+        this.categoryName = categoryName;
+    }
+
+    public String getMaterialUnit() {
+        return materialUnit;
+    }
+
+    public void setMaterialUnit(String materialUnit) {
+        this.materialUnit = materialUnit;
+    }
+
+    public BigDecimal getNumSum() {
+        return numSum;
+    }
+
+    public void setNumSum(BigDecimal numSum) {
+        this.numSum = numSum;
+    }
+
+    public BigDecimal getPriceSum() {
+        return priceSum;
+    }
+
+    public void setPriceSum(BigDecimal priceSum) {
+        this.priceSum = priceSum;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4List.java b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4List.java
new file mode 100644
index 0000000..57227b4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4List.java
@@ -0,0 +1,227 @@
+package com.jsh.erp.datasource.vo;
+
+import com.jsh.erp.datasource.entities.DepotHead;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DepotHeadVo4List extends DepotHead{
+
+    private String projectName;
+
+    private String organName;
+
+    private String userName;
+
+    private String accountName;
+
+    private String allocationProjectName;
+
+    private String materialsList;
+
+    private String salesManStr;
+
+    private String operTimeStr;
+
+    private BigDecimal finishDebt;
+
+    private String depotHeadType;
+
+    private String creatorName;
+
+    private String contacts;
+
+    private String telephone;
+
+    private String address;
+
+    private BigDecimal finishDeposit;
+
+    private BigDecimal needDebt;
+
+    private BigDecimal debt;
+
+    private BigDecimal materialCount;
+
+    /**
+     * 是否有付款单或收款单
+     */
+    private Boolean hasFinancialFlag;
+    /**
+     * 是否有退款单
+     */
+    private Boolean hasBackFlag;
+
+    /**
+     * 实际欠款
+     */
+    private BigDecimal realNeedDebt;
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public String getAllocationProjectName() {
+        return allocationProjectName;
+    }
+
+    public void setAllocationProjectName(String allocationProjectName) {
+        this.allocationProjectName = allocationProjectName;
+    }
+
+    public String getMaterialsList() {
+        return materialsList;
+    }
+
+    public void setMaterialsList(String materialsList) {
+        this.materialsList = materialsList;
+    }
+
+    public String getSalesManStr() {
+        return salesManStr;
+    }
+
+    public void setSalesManStr(String salesManStr) {
+        this.salesManStr = salesManStr;
+    }
+
+    public String getOperTimeStr() {
+        return operTimeStr;
+    }
+
+    public void setOperTimeStr(String operTimeStr) {
+        this.operTimeStr = operTimeStr;
+    }
+
+    public BigDecimal getFinishDebt() {
+        return finishDebt;
+    }
+
+    public void setFinishDebt(BigDecimal finishDebt) {
+        this.finishDebt = finishDebt;
+    }
+
+    public String getDepotHeadType() {
+        return depotHeadType;
+    }
+
+    public void setDepotHeadType(String depotHeadType) {
+        this.depotHeadType = depotHeadType;
+    }
+
+    public String getCreatorName() {
+        return creatorName;
+    }
+
+    public void setCreatorName(String creatorName) {
+        this.creatorName = creatorName;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public BigDecimal getFinishDeposit() {
+        return finishDeposit;
+    }
+
+    public void setFinishDeposit(BigDecimal finishDeposit) {
+        this.finishDeposit = finishDeposit;
+    }
+
+    public BigDecimal getNeedDebt() {
+        return needDebt;
+    }
+
+    public void setNeedDebt(BigDecimal needDebt) {
+        this.needDebt = needDebt;
+    }
+
+    public BigDecimal getDebt() {
+        return debt;
+    }
+
+    public void setDebt(BigDecimal debt) {
+        this.debt = debt;
+    }
+
+    public BigDecimal getMaterialCount() {
+        return materialCount;
+    }
+
+    public void setMaterialCount(BigDecimal materialCount) {
+        this.materialCount = materialCount;
+    }
+
+    public Boolean getHasFinancialFlag() {
+        return hasFinancialFlag;
+    }
+
+    public void setHasFinancialFlag(Boolean hasFinancialFlag) {
+        this.hasFinancialFlag = hasFinancialFlag;
+    }
+
+    public Boolean getHasBackFlag() {
+        return hasBackFlag;
+    }
+
+    public void setHasBackFlag(Boolean hasBackFlag) {
+        this.hasBackFlag = hasBackFlag;
+    }
+
+    public BigDecimal getRealNeedDebt() {
+        return realNeedDebt;
+    }
+
+    public void setRealNeedDebt(BigDecimal realNeedDebt) {
+        this.realNeedDebt = realNeedDebt;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4StatementAccount.java b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4StatementAccount.java
new file mode 100644
index 0000000..6eebed8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/DepotHeadVo4StatementAccount.java
@@ -0,0 +1,185 @@
+package com.jsh.erp.datasource.vo;
+
+
+import java.math.BigDecimal;
+
+public class DepotHeadVo4StatementAccount {
+
+    private Long id;
+
+    private String supplier;
+
+    private String contacts;
+
+    private String telephone;
+
+    private String phoneNum;
+
+    private String email;
+
+    /**
+     * 起始期初金额
+     */
+    private BigDecimal beginNeed;
+
+    /**
+     * 上期欠款金额
+     */
+    private BigDecimal preDebtMoney;
+
+    /**
+     * 上期退货的欠款金额
+     */
+    private BigDecimal preReturnDebtMoney;
+
+
+    /**
+     * 上期收付款
+     */
+    private BigDecimal preBackMoney;
+
+    /**
+     * 期初应收
+     */
+    private BigDecimal preNeed;
+
+    /**
+     * 本期欠款
+     */
+    private BigDecimal debtMoney;
+
+    /**
+     * 本期退货的欠款金额
+     */
+    private BigDecimal returnDebtMoney;
+
+    /**
+     * 本期收付款
+     */
+    private BigDecimal backMoney;
+
+    /**
+     * 期末应收
+     */
+    private BigDecimal allNeed;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getPhoneNum() {
+        return phoneNum;
+    }
+
+    public void setPhoneNum(String phoneNum) {
+        this.phoneNum = phoneNum;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public BigDecimal getBeginNeed() {
+        return beginNeed;
+    }
+
+    public void setBeginNeed(BigDecimal beginNeed) {
+        this.beginNeed = beginNeed;
+    }
+
+    public BigDecimal getPreDebtMoney() {
+        return preDebtMoney;
+    }
+
+    public void setPreDebtMoney(BigDecimal preDebtMoney) {
+        this.preDebtMoney = preDebtMoney;
+    }
+
+    public BigDecimal getPreReturnDebtMoney() {
+        return preReturnDebtMoney;
+    }
+
+    public void setPreReturnDebtMoney(BigDecimal preReturnDebtMoney) {
+        this.preReturnDebtMoney = preReturnDebtMoney;
+    }
+
+    public BigDecimal getPreBackMoney() {
+        return preBackMoney;
+    }
+
+    public void setPreBackMoney(BigDecimal preBackMoney) {
+        this.preBackMoney = preBackMoney;
+    }
+
+    public BigDecimal getPreNeed() {
+        return preNeed;
+    }
+
+    public void setPreNeed(BigDecimal preNeed) {
+        this.preNeed = preNeed;
+    }
+
+    public BigDecimal getDebtMoney() {
+        return debtMoney;
+    }
+
+    public void setDebtMoney(BigDecimal debtMoney) {
+        this.debtMoney = debtMoney;
+    }
+
+    public BigDecimal getReturnDebtMoney() {
+        return returnDebtMoney;
+    }
+
+    public void setReturnDebtMoney(BigDecimal returnDebtMoney) {
+        this.returnDebtMoney = returnDebtMoney;
+    }
+
+    public BigDecimal getBackMoney() {
+        return backMoney;
+    }
+
+    public void setBackMoney(BigDecimal backMoney) {
+        this.backMoney = backMoney;
+    }
+
+    public BigDecimal getAllNeed() {
+        return allNeed;
+    }
+
+    public void setAllNeed(BigDecimal allNeed) {
+        this.allNeed = allNeed;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/DepotItemStockWarningCount.java b/src/main/java/com/jsh/erp/datasource/vo/DepotItemStockWarningCount.java
new file mode 100644
index 0000000..ce0c9ea
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/DepotItemStockWarningCount.java
@@ -0,0 +1,207 @@
+package com.jsh.erp.datasource.vo;
+
+
+import java.math.BigDecimal;
+
+public class DepotItemStockWarningCount {
+
+    private Long MId;
+
+    private String barCode;
+
+    private String MName;
+
+    private String MModel;
+
+    private String MaterialUnit;
+
+    private String MColor;
+
+    private String MStandard;
+
+    private String MMfrs;
+
+    private String brand;
+
+    private String unitName;
+
+    private String MaterialOther;
+
+    private String MOtherField1;
+
+    private String MOtherField2;
+
+    private String MOtherField3;
+
+    private String depotName;
+
+    private BigDecimal currentNumber;
+
+    private BigDecimal lowSafeStock;
+
+    private BigDecimal highSafeStock;
+
+    private BigDecimal lowCritical;
+
+    private BigDecimal highCritical;
+
+    public Long getMId() {
+        return MId;
+    }
+
+    public void setMId(Long MId) {
+        this.MId = MId;
+    }
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode;
+    }
+
+    public String getMName() {
+        return MName;
+    }
+
+    public void setMName(String MName) {
+        this.MName = MName;
+    }
+
+    public String getMModel() {
+        return MModel;
+    }
+
+    public void setMModel(String MModel) {
+        this.MModel = MModel;
+    }
+
+    public String getMaterialUnit() {
+        return MaterialUnit;
+    }
+
+    public void setMaterialUnit(String materialUnit) {
+        MaterialUnit = materialUnit;
+    }
+
+    public String getMColor() {
+        return MColor;
+    }
+
+    public void setMColor(String MColor) {
+        this.MColor = MColor;
+    }
+
+    public String getMStandard() {
+        return MStandard;
+    }
+
+    public void setMStandard(String MStandard) {
+        this.MStandard = MStandard;
+    }
+
+    public String getMMfrs() {
+        return MMfrs;
+    }
+
+    public void setMMfrs(String MMfrs) {
+        this.MMfrs = MMfrs;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getUnitName() {
+        return unitName;
+    }
+
+    public void setUnitName(String unitName) {
+        this.unitName = unitName;
+    }
+
+    public String getMaterialOther() {
+        return MaterialOther;
+    }
+
+    public void setMaterialOther(String materialOther) {
+        MaterialOther = materialOther;
+    }
+
+    public String getMOtherField1() {
+        return MOtherField1;
+    }
+
+    public void setMOtherField1(String MOtherField1) {
+        this.MOtherField1 = MOtherField1;
+    }
+
+    public String getMOtherField2() {
+        return MOtherField2;
+    }
+
+    public void setMOtherField2(String MOtherField2) {
+        this.MOtherField2 = MOtherField2;
+    }
+
+    public String getMOtherField3() {
+        return MOtherField3;
+    }
+
+    public void setMOtherField3(String MOtherField3) {
+        this.MOtherField3 = MOtherField3;
+    }
+
+    public String getDepotName() {
+        return depotName;
+    }
+
+    public void setDepotName(String depotName) {
+        this.depotName = depotName;
+    }
+
+    public BigDecimal getCurrentNumber() {
+        return currentNumber;
+    }
+
+    public void setCurrentNumber(BigDecimal currentNumber) {
+        this.currentNumber = currentNumber;
+    }
+
+    public BigDecimal getLowSafeStock() {
+        return lowSafeStock;
+    }
+
+    public void setLowSafeStock(BigDecimal lowSafeStock) {
+        this.lowSafeStock = lowSafeStock;
+    }
+
+    public BigDecimal getHighSafeStock() {
+        return highSafeStock;
+    }
+
+    public void setHighSafeStock(BigDecimal highSafeStock) {
+        this.highSafeStock = highSafeStock;
+    }
+
+    public BigDecimal getLowCritical() {
+        return lowCritical;
+    }
+
+    public void setLowCritical(BigDecimal lowCritical) {
+        this.lowCritical = lowCritical;
+    }
+
+    public BigDecimal getHighCritical() {
+        return highCritical;
+    }
+
+    public void setHighCritical(BigDecimal highCritical) {
+        this.highCritical = highCritical;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/DepotItemVo4Stock.java b/src/main/java/com/jsh/erp/datasource/vo/DepotItemVo4Stock.java
new file mode 100644
index 0000000..5967050
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/DepotItemVo4Stock.java
@@ -0,0 +1,80 @@
+package com.jsh.erp.datasource.vo;
+
+
+import java.math.BigDecimal;
+
+public class DepotItemVo4Stock {
+
+    private BigDecimal inTotal;
+    private BigDecimal outTotal;
+    private BigDecimal transfInTotal;
+    private BigDecimal transfOutTotal;
+    private BigDecimal assemInTotal;
+    private BigDecimal assemOutTotal;
+    private BigDecimal disAssemInTotal;
+    private BigDecimal disAssemOutTotal;
+
+    public BigDecimal getInTotal() {
+        return inTotal;
+    }
+
+    public void setInTotal(BigDecimal inTotal) {
+        this.inTotal = inTotal;
+    }
+
+    public BigDecimal getOutTotal() {
+        return outTotal;
+    }
+
+    public void setOutTotal(BigDecimal outTotal) {
+        this.outTotal = outTotal;
+    }
+
+    public BigDecimal getTransfInTotal() {
+        return transfInTotal;
+    }
+
+    public void setTransfInTotal(BigDecimal transfInTotal) {
+        this.transfInTotal = transfInTotal;
+    }
+
+    public BigDecimal getTransfOutTotal() {
+        return transfOutTotal;
+    }
+
+    public void setTransfOutTotal(BigDecimal transfOutTotal) {
+        this.transfOutTotal = transfOutTotal;
+    }
+
+    public BigDecimal getAssemInTotal() {
+        return assemInTotal;
+    }
+
+    public void setAssemInTotal(BigDecimal assemInTotal) {
+        this.assemInTotal = assemInTotal;
+    }
+
+    public BigDecimal getAssemOutTotal() {
+        return assemOutTotal;
+    }
+
+    public void setAssemOutTotal(BigDecimal assemOutTotal) {
+        this.assemOutTotal = assemOutTotal;
+    }
+
+    public BigDecimal getDisAssemInTotal() {
+        return disAssemInTotal;
+    }
+
+    public void setDisAssemInTotal(BigDecimal disAssemInTotal) {
+        this.disAssemInTotal = disAssemInTotal;
+    }
+
+    public BigDecimal getDisAssemOutTotal() {
+        return disAssemOutTotal;
+    }
+
+    public void setDisAssemOutTotal(BigDecimal disAssemOutTotal) {
+        this.disAssemOutTotal = disAssemOutTotal;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/DepotItemVoBatchNumberList.java b/src/main/java/com/jsh/erp/datasource/vo/DepotItemVoBatchNumberList.java
new file mode 100644
index 0000000..ea7a90b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/DepotItemVoBatchNumberList.java
@@ -0,0 +1,108 @@
+package com.jsh.erp.datasource.vo;
+
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DepotItemVoBatchNumberList {
+
+    private String id;
+    private String barCode;
+    private String name;
+    private String standard;
+    private String model;
+    private Long unitId;
+    private String commodityUnit;
+    private String batchNumber;
+    private Date expirationDate;
+    private String expirationDateStr;
+    private BigDecimal totalNum;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getStandard() {
+        return standard;
+    }
+
+    public void setStandard(String standard) {
+        this.standard = standard;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public Long getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(Long unitId) {
+        this.unitId = unitId;
+    }
+
+    public String getCommodityUnit() {
+        return commodityUnit;
+    }
+
+    public void setCommodityUnit(String commodityUnit) {
+        this.commodityUnit = commodityUnit;
+    }
+
+    public String getBatchNumber() {
+        return batchNumber;
+    }
+
+    public void setBatchNumber(String batchNumber) {
+        this.batchNumber = batchNumber;
+    }
+
+    public Date getExpirationDate() {
+        return expirationDate;
+    }
+
+    public void setExpirationDate(Date expirationDate) {
+        this.expirationDate = expirationDate;
+    }
+
+    public String getExpirationDateStr() {
+        return expirationDateStr;
+    }
+
+    public void setExpirationDateStr(String expirationDateStr) {
+        this.expirationDateStr = expirationDateStr;
+    }
+
+    public BigDecimal getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(BigDecimal totalNum) {
+        this.totalNum = totalNum;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/FinishDepositVo.java b/src/main/java/com/jsh/erp/datasource/vo/FinishDepositVo.java
new file mode 100644
index 0000000..e0d61ac
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/FinishDepositVo.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.vo;
+
+import java.math.BigDecimal;
+
+public class FinishDepositVo {
+
+    private String number;
+
+    private BigDecimal finishDeposit;
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public BigDecimal getFinishDeposit() {
+        return finishDeposit;
+    }
+
+    public void setFinishDeposit(BigDecimal finishDeposit) {
+        this.finishDeposit = finishDeposit;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/InOutPriceVo.java b/src/main/java/com/jsh/erp/datasource/vo/InOutPriceVo.java
new file mode 100644
index 0000000..f2cd425
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/InOutPriceVo.java
@@ -0,0 +1,27 @@
+package com.jsh.erp.datasource.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author jishenghua
+ * @Date 2024-04-26 22:23
+ */
+@Data
+public class InOutPriceVo {
+
+    private Long id;
+
+    private BigDecimal discountLastMoney;
+
+    private BigDecimal totalPrice;
+
+    private String type;
+
+    private String subType;
+
+    private Date operTime;
+
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/LogVo4List.java b/src/main/java/com/jsh/erp/datasource/vo/LogVo4List.java
new file mode 100644
index 0000000..e068e33
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/LogVo4List.java
@@ -0,0 +1,36 @@
+package com.jsh.erp.datasource.vo;
+
+import com.jsh.erp.datasource.entities.Log;
+
+public class LogVo4List extends Log {
+
+    private String loginName;
+
+    private String userName;
+
+    private String createTimeStr;
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getCreateTimeStr() {
+        return createTimeStr;
+    }
+
+    public void setCreateTimeStr(String createTimeStr) {
+        this.createTimeStr = createTimeStr;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/datasource/vo/MaterialCountVo.java b/src/main/java/com/jsh/erp/datasource/vo/MaterialCountVo.java
new file mode 100644
index 0000000..8cd2de0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/MaterialCountVo.java
@@ -0,0 +1,26 @@
+package com.jsh.erp.datasource.vo;
+
+import java.math.BigDecimal;
+
+public class MaterialCountVo {
+
+    private Long headerId;
+
+    private BigDecimal materialCount;
+
+    public Long getHeaderId() {
+        return headerId;
+    }
+
+    public void setHeaderId(Long headerId) {
+        this.headerId = headerId;
+    }
+
+    public BigDecimal getMaterialCount() {
+        return materialCount;
+    }
+
+    public void setMaterialCount(BigDecimal materialCount) {
+        this.materialCount = materialCount;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/MaterialExtendVo4List.java b/src/main/java/com/jsh/erp/datasource/vo/MaterialExtendVo4List.java
new file mode 100644
index 0000000..7c1bc68
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/MaterialExtendVo4List.java
@@ -0,0 +1,68 @@
+package com.jsh.erp.datasource.vo;
+
+import com.jsh.erp.datasource.entities.MaterialExtend;
+
+import java.math.BigDecimal;
+
+public class MaterialExtendVo4List extends MaterialExtend {
+
+    private String supplier;
+
+    private String originPlace;
+
+    private String unit;
+
+    private String brandName;
+
+    private BigDecimal guaranteePeriod;
+
+    private BigDecimal memberDecimal;
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+    public String getOriginPlace() {
+        return originPlace;
+    }
+
+    public void setOriginPlace(String originPlace) {
+        this.originPlace = originPlace;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getBrandName() {
+        return brandName;
+    }
+
+    public void setBrandName(String brandName) {
+        this.brandName = brandName;
+    }
+
+    public BigDecimal getGuaranteePeriod() {
+        return guaranteePeriod;
+    }
+
+    public void setGuaranteePeriod(BigDecimal guaranteePeriod) {
+        this.guaranteePeriod = guaranteePeriod;
+    }
+
+    public BigDecimal getMemberDecimal() {
+        return memberDecimal;
+    }
+
+    public void setMemberDecimal(BigDecimal memberDecimal) {
+        this.memberDecimal = memberDecimal;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/MaterialVoSearch.java b/src/main/java/com/jsh/erp/datasource/vo/MaterialVoSearch.java
new file mode 100644
index 0000000..55d36d2
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/MaterialVoSearch.java
@@ -0,0 +1,74 @@
+package com.jsh.erp.datasource.vo;
+
+public class MaterialVoSearch {
+
+    private String barCode;
+
+    private String name;
+
+    private String mnemonic;
+
+    private String standard;
+
+    private String model;
+
+    private String color;
+
+    private String unit;
+
+    public String getBarCode() {
+        return barCode;
+    }
+
+    public void setBarCode(String barCode) {
+        this.barCode = barCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMnemonic() {
+        return mnemonic;
+    }
+
+    public void setMnemonic(String mnemonic) {
+        this.mnemonic = mnemonic;
+    }
+
+    public String getStandard() {
+        return standard;
+    }
+
+    public void setStandard(String standard) {
+        this.standard = standard;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/MaterialsListVo.java b/src/main/java/com/jsh/erp/datasource/vo/MaterialsListVo.java
new file mode 100644
index 0000000..c076e7e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/MaterialsListVo.java
@@ -0,0 +1,24 @@
+package com.jsh.erp.datasource.vo;
+
+public class MaterialsListVo {
+
+    private Long headerId;
+
+    private String materialsList;
+
+    public Long getHeaderId() {
+        return headerId;
+    }
+
+    public void setHeaderId(Long headerId) {
+        this.headerId = headerId;
+    }
+
+    public String getMaterialsList() {
+        return materialsList;
+    }
+
+    public void setMaterialsList(String materialsList) {
+        this.materialsList = materialsList;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/NodeAttributes.java b/src/main/java/com/jsh/erp/datasource/vo/NodeAttributes.java
new file mode 100644
index 0000000..6b3d4a9
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/NodeAttributes.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.datasource.vo;
+
+/**
+ * Description
+ *
+ * @Author: qiankunpingtai
+ * @Date: 2019/3/13 18:11
+ */
+public class NodeAttributes {
+    //编号
+    private String no;
+    //类型
+    private Integer type;
+
+    public String getNo() {
+        return no;
+    }
+
+    public void setNo(String no) {
+        this.no = no;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/TreeNode.java b/src/main/java/com/jsh/erp/datasource/vo/TreeNode.java
new file mode 100644
index 0000000..244d67c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/TreeNode.java
@@ -0,0 +1,114 @@
+package com.jsh.erp.datasource.vo;
+
+import java.util.List;
+
+/**
+ * Description
+ *  树形结构基本元素
+ * @Author: cjl
+ * @Date: 2019/2/19 11:27
+ */
+public class TreeNode {
+    /**
+     * id主键
+     * */
+     private Long id;
+     private Long key;
+     private Long value;
+     /**
+      * title显示的文本
+      * */
+    private String title;
+    /**
+     *state节点状态,'open' 或 'closed',默认:'open'。如果为'closed'的时候,将不自动展开该节点。
+     * */
+    private String state="open";
+    /**
+     *iconCls 节点图标id
+     * */
+    private String iconCls;
+    /**
+     * checked 是否被选中
+     * */
+    private boolean checked;
+    /**
+     *attributes 自定义属性
+     * */
+    private String attributes;
+    /**
+     * children 子节点
+     * */
+    private List<TreeNode> children;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getKey() {
+        return key;
+    }
+
+    public void setKey(Long key) {
+        this.key = key;
+    }
+
+    public Long getValue() {
+        return value;
+    }
+
+    public void setValue(Long value) {
+        this.value = value;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getIconCls() {
+        return iconCls;
+    }
+
+    public void setIconCls(String iconCls) {
+        this.iconCls = iconCls;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+
+    public String getAttributes() {
+        return attributes;
+    }
+
+    public void setAttributes(String attributes) {
+        this.attributes = attributes;
+    }
+
+    public List<TreeNode> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<TreeNode> children) {
+        this.children = children;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/datasource/vo/TreeNodeEx.java b/src/main/java/com/jsh/erp/datasource/vo/TreeNodeEx.java
new file mode 100644
index 0000000..8c938a5
--- /dev/null
+++ b/src/main/java/com/jsh/erp/datasource/vo/TreeNodeEx.java
@@ -0,0 +1,96 @@
+package com.jsh.erp.datasource.vo;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: qiankunpingtai
+ * @Date: 2019/3/13 18:10
+ */
+public class TreeNodeEx {
+    /**
+     * id主键
+     * */
+    private Long id;
+    /**
+     * text显示的文本
+     * */
+    private String text;
+    /**
+     *state节点状态,'open' 或 'closed',默认:'open'。如果为'closed'的时候,将不自动展开该节点。
+     * */
+    private String state="open";
+    /**
+     *iconCls 节点图标id
+     * */
+    private String iconCls;
+    /**
+     * checked 是否被选中
+     * */
+    private boolean checked;
+    /**
+     *attributes 自定义属性
+     * */
+    private NodeAttributes attributes;
+    /**
+     * children 子节点
+     * */
+    private List<TreeNode> children;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getIconCls() {
+        return iconCls;
+    }
+
+    public void setIconCls(String iconCls) {
+        this.iconCls = iconCls;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+
+    public NodeAttributes getAttributes() {
+        return attributes;
+    }
+
+    public void setAttributes(NodeAttributes attributes) {
+        this.attributes = attributes;
+    }
+
+    public List<TreeNode> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<TreeNode> children) {
+        this.children = children;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java b/src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java
new file mode 100644
index 0000000..47fa28f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java
@@ -0,0 +1,32 @@
+package com.jsh.erp.exception;
+
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Getter
+public class BusinessParamCheckingException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+    private int code;
+    private Map<String, Object> data;
+
+    public BusinessParamCheckingException(int code, String reason) {
+        super(reason);
+        Map<String, Object> objectMap = new HashMap<>();
+        objectMap.put("message", reason);
+        this.code = code;
+        this.data = objectMap;
+    }
+
+    public BusinessParamCheckingException(int code, String reason, Throwable throwable) {
+        super(reason, throwable);
+        Map<String, Object> objectMap = new HashMap<>();
+        objectMap.put("message", reason);
+        this.code = code;
+        this.data = objectMap;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java b/src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java
new file mode 100644
index 0000000..ec3decb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java
@@ -0,0 +1,32 @@
+package com.jsh.erp.exception;
+
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Getter
+public class BusinessRunTimeException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+    private int code;
+    private Map<String, Object> data;
+
+    public BusinessRunTimeException(int code, String reason) {
+        super(reason);
+        Map<String, Object> objectMap = new HashMap<>();
+        objectMap.put("message", reason);
+        this.code = code;
+        this.data = objectMap;
+    }
+
+    public BusinessRunTimeException(int code, String reason, Throwable throwable) {
+        super(reason, throwable);
+        Map<String, Object> objectMap = new HashMap<>();
+        objectMap.put("message", reason);
+        this.code = code;
+        this.data = objectMap;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java b/src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..5cc0b58
--- /dev/null
+++ b/src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java
@@ -0,0 +1,44 @@
+package com.jsh.erp.exception;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.ExceptionConstants;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Slf4j
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    @ExceptionHandler(value = Exception.class)
+    @ResponseBody
+    public Object handleException(Exception e, HttpServletRequest request) {
+        JSONObject status = new JSONObject();
+
+        // 针对业务参数异常的处理
+        if (e instanceof BusinessParamCheckingException) {
+            status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ((BusinessParamCheckingException) e).getCode());
+            status.put(ExceptionConstants.GLOBAL_RETURNS_DATA, ((BusinessParamCheckingException) e).getData());
+            return status;
+        }
+
+        //针对业务运行时异常的处理
+        if (e instanceof BusinessRunTimeException) {
+            status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ((BusinessRunTimeException) e).getCode());
+            status.put(ExceptionConstants.GLOBAL_RETURNS_DATA, ((BusinessRunTimeException) e).getData());
+            return status;
+        }
+
+        status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ExceptionConstants.SERVICE_SYSTEM_ERROR_CODE);
+        status.put(ExceptionConstants.GLOBAL_RETURNS_DATA, ExceptionConstants.SERVICE_SYSTEM_ERROR_MSG);
+        log.error("Global Exception Occured => url : {}, msg : {}", request.getRequestURL(), e.getMessage());
+        /**
+         * 这里输出完整的堆栈信息,否则有些异常完全不知道哪里出错了。
+         */
+        log.error("Global Exception Occured => url : {}", request.getRequestURL(), e);
+        return status;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/exception/JshException.java b/src/main/java/com/jsh/erp/exception/JshException.java
new file mode 100644
index 0000000..cd9f38a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/exception/JshException.java
@@ -0,0 +1,27 @@
+package com.jsh.erp.exception;
+
+import com.jsh.erp.constants.ExceptionConstants;
+import org.slf4j.Logger;
+
+/**
+ * 封装日志打印,收集日志
+ * author: ji shenghua, qq 752718 920
+ */
+public class JshException {
+
+    public static void readFail(Logger logger, Exception e) {
+        logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+        throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                ExceptionConstants.DATA_READ_FAIL_MSG);
+    }
+
+    public static void writeFail(Logger logger, Exception e) {
+        logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                ExceptionConstants.DATA_WRITE_FAIL_CODE,ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+        throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                ExceptionConstants.DATA_WRITE_FAIL_MSG);
+    }
+
+
+}
diff --git a/src/main/java/com/jsh/erp/filter/LogCostFilter.java b/src/main/java/com/jsh/erp/filter/LogCostFilter.java
new file mode 100644
index 0000000..8b8bee2
--- /dev/null
+++ b/src/main/java/com/jsh/erp/filter/LogCostFilter.java
@@ -0,0 +1,72 @@
+package com.jsh.erp.filter;
+
+import com.jsh.erp.service.redis.RedisService;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.annotation.WebInitParam;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@WebFilter(filterName = "LogCostFilter", urlPatterns = {"/*"},
+        initParams = {@WebInitParam(name = "filterPath",
+                      value = "/jshERP-boot/user/login#/jshERP-boot/user/weixinLogin#/jshERP-boot/user/weixinBind#" +
+                              "/jshERP-boot/user/registerUser#/jshERP-boot/user/randomImage#" +
+                              "/jshERP-boot/platformConfig/getPlatform#/jshERP-boot/v2/api-docs#/jshERP-boot/webjars#" +
+                              "/jshERP-boot/systemConfig/static#/jshERP-boot/api/plugin/wechat/weChat/share#" +
+                              "/jshERP-boot/api/plugin/general-ledger/pdf/voucher#/jshERP-boot/api/plugin/tenant-statistics/tenantClean")})
+public class LogCostFilter implements Filter {
+
+    private static final String FILTER_PATH = "filterPath";
+
+    private String[] allowUrls;
+    @Resource
+    private RedisService redisService;
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+        String filterPath = filterConfig.getInitParameter(FILTER_PATH);
+        if (!StringUtils.isEmpty(filterPath)) {
+            allowUrls = filterPath.contains("#") ? filterPath.split("#") : new String[]{filterPath};
+        }
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response,
+                         FilterChain chain) throws IOException, ServletException {
+        HttpServletRequest servletRequest = (HttpServletRequest) request;
+        HttpServletResponse servletResponse = (HttpServletResponse) response;
+        String requestUrl = servletRequest.getRequestURI();
+        //具体,比如:处理若用户未登录,则跳转到登录页
+        Object userId = redisService.getObjectFromSessionByKey(servletRequest,"userId");
+        if(userId!=null) { //如果已登录,不阻止
+            chain.doFilter(request, response);
+            return;
+        }
+        if (requestUrl != null && (requestUrl.contains("/doc.html") ||
+            requestUrl.contains("/user/login") || requestUrl.contains("/user/register"))) {
+            chain.doFilter(request, response);
+            return;
+        }
+        if (null != allowUrls && allowUrls.length > 0) {
+            for (String url : allowUrls) {
+                if (requestUrl.startsWith(url)) {
+                    chain.doFilter(request, response);
+                    return;
+                }
+            }
+        }
+        servletResponse.setStatus(500);
+        if(requestUrl != null && !requestUrl.contains("/user/logout") && !requestUrl.contains("/function/findMenuByPNumber")) {
+            servletResponse.getWriter().write("loginOut");
+        }
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/CommonQueryManager.java b/src/main/java/com/jsh/erp/service/CommonQueryManager.java
new file mode 100644
index 0000000..b78590c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/CommonQueryManager.java
@@ -0,0 +1,137 @@
+package com.jsh.erp.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author jishenghua 752718920 2018-10-7 15:25:58
+ */
+@Service
+public class CommonQueryManager {
+
+    @Resource
+    private InterfaceContainer container;
+
+    @Resource
+    private LogService logService;
+
+    /**
+     * 查询单条
+     *
+     * @param apiName 接口名称
+     * @param id      ID
+     */
+    public Object selectOne(String apiName, Long id) throws Exception {
+        if (StringUtil.isNotEmpty(apiName) && id!=null) {
+            return container.getCommonQuery(apiName).selectOne(id);
+        }
+        return null;
+    }
+
+    /**
+     * 查询
+     * @param apiName
+     * @param parameterMap
+     * @return
+     */
+    public List<?> select(String apiName, Map<String, String> parameterMap)throws Exception {
+        if (StringUtil.isNotEmpty(apiName)) {
+            return container.getCommonQuery(apiName).select(parameterMap);
+        }
+        return new ArrayList<Object>();
+    }
+
+    /**
+     * 计数
+     * @param apiName
+     * @param parameterMap
+     * @return
+     */
+    public Long counts(String apiName, Map<String, String> parameterMap)throws Exception {
+        if (StringUtil.isNotEmpty(apiName)) {
+            return container.getCommonQuery(apiName).counts(parameterMap);
+        }
+        return BusinessConstants.DEFAULT_LIST_NULL_NUMBER;
+    }
+
+    /**
+     * 插入
+     * @param apiName
+     * @param obj
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insert(String apiName, JSONObject obj, HttpServletRequest request) throws Exception{
+        if (StringUtil.isNotEmpty(apiName)) {
+            return container.getCommonQuery(apiName).insert(obj, request);
+        }
+        return 0;
+    }
+
+    /**
+     * 更新
+     * @param apiName
+     * @param obj
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int update(String apiName, JSONObject obj, HttpServletRequest request)throws Exception {
+        if (StringUtil.isNotEmpty(apiName)) {
+            return container.getCommonQuery(apiName).update(obj, request);
+        }
+        return 0;
+    }
+
+    /**
+     * 删除
+     * @param apiName
+     * @param id
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int delete(String apiName, Long id, HttpServletRequest request)throws Exception {
+        if (StringUtil.isNotEmpty(apiName)) {
+            return container.getCommonQuery(apiName).delete(id, request);
+        }
+        return 0;
+    }
+
+    /**
+     * 批量删除
+     * @param apiName
+     * @param ids
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteBatch(String apiName, String ids, HttpServletRequest request)throws Exception {
+        if (StringUtil.isNotEmpty(apiName)) {
+            return container.getCommonQuery(apiName).deleteBatch(ids, request);
+        }
+        return 0;
+    }
+
+    /**
+     * 判断是否存在
+     * @param apiName
+     * @param id
+     * @param name
+     * @return
+     */
+    public int checkIsNameExist(String apiName, Long id, String name) throws Exception{
+        if (StringUtil.isNotEmpty(apiName) && name!=null) {
+            return container.getCommonQuery(apiName).checkIsNameExist(id, name);
+        }
+        return 0;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/ICommonQuery.java b/src/main/java/com/jsh/erp/service/ICommonQuery.java
new file mode 100644
index 0000000..c31c368
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/ICommonQuery.java
@@ -0,0 +1,80 @@
+package com.jsh.erp.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用查询接口
+ * 功能:1、单条查询 2、分页+搜索 3、查询数量
+ *
+ * @author jishenghua
+ * @version 1.0
+ */
+public interface ICommonQuery {
+    /**
+     * 根据id查询明细。
+     *
+     * @param id 资源id
+     * @return 资源
+     */
+    Object selectOne(Long id) throws Exception;
+
+    /**
+     * 自定义查询
+     *
+     * @param parameterMap 查询参数
+     * @return 查询结果
+     */
+    List<?> select(Map<String, String> parameterMap) throws Exception;
+
+    /**
+     * 查询数量
+     *
+     * @param parameterMap 查询参数
+     * @return 查询结果
+     */
+    Long counts(Map<String, String> parameterMap) throws Exception;
+
+    /**
+     * 新增数据
+     *
+     * @param obj
+     * @return
+     */
+    int insert(JSONObject obj, HttpServletRequest request) throws Exception;
+
+    /**
+     * 更新数据
+     *
+     * @param obj
+     * @return
+     */
+    int update(JSONObject obj, HttpServletRequest request) throws Exception;
+
+    /**
+     * 删除数据
+     *
+     * @param id
+     * @return
+     */
+    int delete(Long id, HttpServletRequest request) throws Exception;
+
+    /**
+     * 批量删除数据
+     *
+     * @param ids
+     * @return
+     */
+    int deleteBatch(String ids, HttpServletRequest request) throws Exception;
+
+    /**
+     * 查询名称是否存在
+     *
+     * @param id
+     * @return
+     */
+    int checkIsNameExist(Long id, String name) throws Exception;
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/InterfaceContainer.java b/src/main/java/com/jsh/erp/service/InterfaceContainer.java
new file mode 100644
index 0000000..b362291
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/InterfaceContainer.java
@@ -0,0 +1,31 @@
+package com.jsh.erp.service;
+
+import com.jsh.erp.utils.AnnotationUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author jishenghua 2018-10-7 15:25:09
+ */
+@Service
+public class InterfaceContainer {
+    private final Map<String, ICommonQuery> configComponentMap = new HashMap<>();
+
+    @Autowired(required = false)
+    private synchronized void init(ICommonQuery[] configComponents) {
+        for (ICommonQuery configComponent : configComponents) {
+            ResourceInfo info = AnnotationUtils.getAnnotation(configComponent, ResourceInfo.class);
+            if (info != null) {
+                configComponentMap.put(info.value(), configComponent);
+            }
+        }
+    }
+
+    public ICommonQuery getCommonQuery(String apiName) {
+        return configComponentMap.get(apiName);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/ResourceInfo.java b/src/main/java/com/jsh/erp/service/ResourceInfo.java
new file mode 100644
index 0000000..3b0c185
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/ResourceInfo.java
@@ -0,0 +1,14 @@
+package com.jsh.erp.service;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua 2018-10-7 15:25:39
+ */
+@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Documented
+public @interface ResourceInfo {
+    String value();
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/account/AccountComponent.java b/src/main/java/com/jsh/erp/service/account/AccountComponent.java
new file mode 100644
index 0000000..21c3249
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/account/AccountComponent.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.service.account;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "account_component")
+@AccountResource
+public class AccountComponent implements ICommonQuery {
+
+    @Resource
+    private AccountService accountService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return accountService.getAccount(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getAccountList(map);
+    }
+
+    private List<?> getAccountList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String serialNo = StringUtil.getInfo(search, "serialNo");
+        String remark = StringUtil.getInfo(search, "remark");
+        String order = QueryUtils.order(map);
+        return accountService.select(name, serialNo, remark, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String serialNo = StringUtil.getInfo(search, "serialNo");
+        String remark = StringUtil.getInfo(search, "remark");
+        return accountService.countAccount(name, serialNo, remark);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return accountService.insertAccount(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return accountService.updateAccount(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return accountService.deleteAccount(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return accountService.batchDeleteAccount(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return accountService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/account/AccountResource.java b/src/main/java/com/jsh/erp/service/account/AccountResource.java
new file mode 100644
index 0000000..d3812b0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/account/AccountResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.account;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "account")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AccountResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/account/AccountService.java b/src/main/java/com/jsh/erp/service/account/AccountService.java
new file mode 100644
index 0000000..c98ca5d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/account/AccountService.java
@@ -0,0 +1,597 @@
+package com.jsh.erp.service.account;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.*;
+import com.jsh.erp.datasource.vo.AccountVo4InOutList;
+import com.jsh.erp.datasource.vo.AccountVo4List;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.*;
+
+@Service
+public class AccountService {
+    private Logger logger = LoggerFactory.getLogger(AccountService.class);
+
+    @Resource
+    private AccountMapper accountMapper;
+
+    @Resource
+    private AccountMapperEx accountMapperEx;
+
+    @Resource
+    private DepotHeadMapper depotHeadMapper;
+    @Resource
+    private DepotHeadMapperEx depotHeadMapperEx;
+
+    @Resource
+    private AccountHeadMapper accountHeadMapper;
+    @Resource
+    private AccountHeadMapperEx accountHeadMapperEx;
+
+    @Resource
+    private AccountItemMapper accountItemMapper;
+    @Resource
+    private AccountItemMapperEx accountItemMapperEx;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    public Account getAccount(long id) throws Exception{
+        return accountMapper.selectByPrimaryKey(id);
+    }
+
+    public List<Account> getAccountListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Account> list = new ArrayList<>();
+        try{
+            AccountExample example = new AccountExample();
+            example.createCriteria().andIdIn(idList);
+            list = accountMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Account> getAccount() throws Exception{
+        List<Account> list=null;
+        try{
+            AccountExample example = new AccountExample();
+            example.createCriteria().andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            example.setOrderByClause("sort asc, id desc");
+            list=accountMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Account> getAccountByParam(String name, String serialNo) throws Exception{
+        List<Account> list=null;
+        try{
+            list=accountMapperEx.getAccountByParam(name, serialNo);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<AccountVo4List> select(String name, String serialNo, String remark, int offset, int rows) throws Exception{
+        List<AccountVo4List> resList = new ArrayList<>();
+        try{
+            List<AccountVo4List> list = accountMapperEx.selectByConditionAccount(name, serialNo, remark, offset, rows);
+            String timeStr = Tools.getCurrentMonth();
+            String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME;
+            String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME;
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
+            Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
+            Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
+            List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, offset, rows);
+            List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, offset, rows);
+            List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
+            List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
+            for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
+                thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
+                thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
+                thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
+            }
+            for (AccountVo4Sum currentAmount: currentAmountList) {
+                currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
+                currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
+                currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
+            }
+            if (null != list) {
+                for (AccountVo4List al : list) {
+                    DecimalFormat df = new DecimalFormat(".##");
+                    BigDecimal thisMonthAmount = thisMonthAccountSumMap.get(al.getId())
+                            .add(thisMonthAccountSumByHeadMap.get(al.getId()))
+                            .add(thisMonthAccountSumByDetailMap.get(al.getId()))
+                            .add(getManyAccountSumParse(al.getId(), thisMonthManyAmountList));
+                    String thisMonthAmountFmt = "0";
+                    if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) {
+                        thisMonthAmountFmt = df.format(thisMonthAmount);
+                    }
+                    al.setThisMonthAmount(thisMonthAmountFmt);  //本月发生额
+                    BigDecimal currentAmount = currentAccountSumMap.get(al.getId())
+                            .add(currentAccountSumByHeadMap.get(al.getId()))
+                            .add(currentAccountSumByDetailMap.get(al.getId()))
+                            .add(getManyAccountSumParse(al.getId(), currentManyAmountList))
+                            .add(al.getInitialAmount()) ;
+                    al.setCurrentAmount(currentAmount);
+                    resList.add(al);
+                }
+            }
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public Long countAccount(String name, String serialNo, String remark)throws Exception {
+        Long result = null;
+        try{
+            result = accountMapperEx.countsByAccount(name, serialNo, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertAccount(JSONObject obj, HttpServletRequest request)throws Exception {
+        Account account = JSONObject.parseObject(obj.toJSONString(), Account.class);
+        if(account.getInitialAmount() == null) {
+            account.setInitialAmount(BigDecimal.ZERO);
+        }
+        List<Account> accountList = getAccountByParam(null, null);
+        if(accountList.size() == 0) {
+            account.setIsDefault(true);
+        } else {
+            account.setIsDefault(false);
+        }
+        account.setEnabled(true);
+        int result=0;
+        try{
+            result = accountMapper.insertSelective(account);
+            logService.insertLog("账户",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(account.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateAccount(JSONObject obj, HttpServletRequest request)throws Exception {
+        Account account = JSONObject.parseObject(obj.toJSONString(), Account.class);
+        int result=0;
+        try{
+            result = accountMapper.updateByPrimaryKeySelective(account);
+            logService.insertLog("账户",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(account.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteAccount(Long id, HttpServletRequest request) throws Exception{
+        return batchDeleteAccountByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteAccount(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteAccountByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteAccountByIds(String ids) throws Exception{
+        int result=0;
+        String [] idArray=ids.split(",");
+        //校验财务主表	jsh_accounthead
+        List<AccountHead> accountHeadList=null;
+        try{
+            accountHeadList = accountHeadMapperEx.getAccountHeadListByAccountIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(accountHeadList!=null&&accountHeadList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,AccountIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //校验财务子表	jsh_accountitem
+        List<AccountItem> accountItemList=null;
+        try{
+            accountItemList = accountItemMapperEx.getAccountItemListByAccountIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(accountItemList!=null&&accountItemList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,AccountIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //校验单据主表	jsh_depot_head
+        List<DepotHead> depotHeadList =null;
+        try{
+            depotHeadList = depotHeadMapperEx.getDepotHeadListByAccountIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(depotHeadList!=null&&depotHeadList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,AccountIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //记录日志
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<Account> list = getAccountListByIds(ids);
+        for(Account account: list){
+            sb.append("[").append(account.getName()).append("]");
+        }
+        logService.insertLog("账户", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        //校验通过执行删除操作
+        try{
+            result = accountMapperEx.batchDeleteAccountByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        AccountExample example = new AccountExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Account> list=null;
+        try{
+            list = accountMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public List<Account> findBySelect()throws Exception {
+        AccountExample example = new AccountExample();
+        example.createCriteria().andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Account> list=null;
+        try{
+            list = accountMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    /**
+     * 单个账户的金额求和-入库和出库
+     * @return
+     */
+    public BigDecimal getAccountSum(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
+        return accountMapperEx.getAccountSum(accountId, beginTime, endTime, forceFlag);
+    }
+
+    /**
+     * 单个账户的金额求和-收入、支出、转账的单据表头的合计
+     * @return
+     */
+    public BigDecimal getAccountSumByHead(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
+        return accountMapperEx.getAccountSumByHead(accountId, beginTime, endTime, forceFlag);
+    }
+
+    /**
+     * 单个账户的金额求和-收款、付款、转账、收预付款的单据明细的合计
+     * @return
+     */
+    public BigDecimal getAccountSumByDetail(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
+        return accountMapperEx.getAccountSumByDetail(accountId, beginTime, endTime, forceFlag);
+    }
+
+    /**
+     * 单个账户的金额求和-多账户的明细合计
+     * @return
+     */
+    public BigDecimal getManyAccountSum(Long accountId, String beginTime, String endTime, Boolean forceFlag) {
+        BigDecimal accountSum = BigDecimal.ZERO;
+        List<DepotHead> dataList = accountMapperEx.getManyAccountSum(accountId, beginTime, endTime, forceFlag);
+        if (dataList != null) {
+            for (DepotHead depotHead : dataList) {
+                if(depotHead != null) {
+                    String accountIdList = depotHead.getAccountIdList();
+                    String accountMoneyList = depotHead.getAccountMoneyList();
+                    if(StringUtil.isNotEmpty(accountIdList) && StringUtil.isNotEmpty(accountMoneyList)) {
+                        String[] aList = accountIdList.split(",");
+                        String[] amList = accountMoneyList.split(",");
+                        for (int i = 0; i < aList.length; i++) {
+                            if (aList[i].equals(accountId.toString())) {
+                                if(amList.length>0) {
+                                    accountSum = accountSum.add(new BigDecimal(amList[i]));
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return accountSum;
+    }
+
+    /**
+     * 单个账户的金额求和-多账户的明细合计(格式化)
+     * @return
+     */
+    public BigDecimal getManyAccountSumParse(Long accountId, List<DepotHead> manyAmountList) {
+        BigDecimal accountSum = BigDecimal.ZERO;
+        if (manyAmountList != null) {
+            for (DepotHead depotHead : manyAmountList) {
+                String accountIdList = depotHead.getAccountIdList();
+                String accountMoneyList = depotHead.getAccountMoneyList();
+                if(StringUtil.isNotEmpty(accountIdList) && StringUtil.isNotEmpty(accountMoneyList)) {
+                    String[] aList = accountIdList.split(",");
+                    String[] amList = accountMoneyList.split(",");
+                    for (int i = 0; i < aList.length; i++) {
+                        if (aList[i].equals(accountId.toString())) {
+                            if(amList.length>0) {
+                                accountSum = accountSum.add(new BigDecimal(amList[i]));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return accountSum;
+    }
+
+    public List<AccountVo4InOutList> findAccountInOutList(Long accountId, String number, String beginTime, String endTime,
+                                                          Boolean forceFlag, Integer offset, Integer rows) throws Exception{
+        List<AccountVo4InOutList> list=null;
+        try{
+            list = accountMapperEx.findAccountInOutList(accountId, number, beginTime, endTime, forceFlag, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int findAccountInOutListCount(Long accountId, String number, String beginTime, String endTime, Boolean forceFlag) throws Exception{
+        int result=0;
+        try{
+            result = accountMapperEx.findAccountInOutListCount(accountId, number, beginTime, endTime, forceFlag);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateIsDefault(Long accountId) throws Exception{
+        int result=0;
+        try{
+            //全部取消默认
+            Account allAccount = new Account();
+            allAccount.setIsDefault(false);
+            AccountExample allExample = new AccountExample();
+            allExample.createCriteria();
+            accountMapper.updateByExampleSelective(allAccount, allExample);
+            //给指定账户设为默认
+            Account account = new Account();
+            account.setIsDefault(true);
+            AccountExample example = new AccountExample();
+            example.createCriteria().andIdEqualTo(accountId);
+            accountMapper.updateByExampleSelective(account, example);
+            logService.insertLog("账户",BusinessConstants.LOG_OPERATION_TYPE_EDIT+accountId,
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            result = 1;
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public Map<Long,String> getAccountMap() throws Exception {
+        List<Account> accountList = getAccount();
+        Map<Long,String> accountMap = new HashMap<>();
+        for(Account account : accountList){
+            accountMap.put(account.getId(), account.getName());
+        }
+        return accountMap;
+    }
+
+    public String getAccountStrByIdAndMoney(Map<Long,String> accountMap, String accountIdList, String accountMoneyList){
+        StringBuffer sb = new StringBuffer();
+        List<Long> idList = StringUtil.strToLongList(accountIdList);
+        List<BigDecimal> moneyList = StringUtil.strToBigDecimalList(accountMoneyList);
+        for (int i = 0; i < idList.size(); i++) {
+            Long id = idList.get(i);
+            BigDecimal money =  moneyList.get(i).abs();
+            sb.append(accountMap.get(id) + "(" + money + "元) ");
+        }
+        return sb.toString();
+    }
+
+    public List<AccountVo4List> listWithBalance(String name, String serialNo, Integer offset, Integer rows) throws Exception {
+        List<AccountVo4List> resList = new ArrayList<>();
+        try{
+            List<AccountVo4List> list = accountMapperEx.selectByConditionAccount(name, serialNo, null, offset, rows);
+            String timeStr = Tools.getCurrentMonth();
+            String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME;
+            String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME;
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
+            Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
+            Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
+            List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, offset, rows);
+            List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, offset, rows);
+            List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
+            List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
+            for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
+                thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
+                thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
+                thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
+            }
+            for (AccountVo4Sum currentAmount: currentAmountList) {
+                currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
+                currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
+                currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
+            }
+            if (null != list) {
+                for (AccountVo4List al : list) {
+                    DecimalFormat df = new DecimalFormat(".##");
+                    BigDecimal thisMonthAmount = thisMonthAccountSumMap.get(al.getId())
+                            .add(thisMonthAccountSumByHeadMap.get(al.getId()))
+                            .add(thisMonthAccountSumByDetailMap.get(al.getId()))
+                            .add(getManyAccountSumParse(al.getId(), thisMonthManyAmountList));
+                    String thisMonthAmountFmt = "0";
+                    if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) {
+                        thisMonthAmountFmt = df.format(thisMonthAmount);
+                    }
+                    al.setThisMonthAmount(thisMonthAmountFmt);  //本月发生额
+                    BigDecimal currentAmount = currentAccountSumMap.get(al.getId())
+                            .add(currentAccountSumByHeadMap.get(al.getId()))
+                            .add(currentAccountSumByDetailMap.get(al.getId()))
+                            .add(getManyAccountSumParse(al.getId(), currentManyAmountList))
+                            .add(al.getInitialAmount());
+                    al.setCurrentAmount(currentAmount);
+                    resList.add(al);
+                }
+            }
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public Long listWithBalanceCount(String name, String serialNo) {
+        Long result = null;
+        try{
+            result = accountMapperEx.countsByAccount(name, serialNo, null);
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public Map<String, Object> getStatistics(String name, String serialNo) {
+        Map<String, Object> map = new HashMap<>();
+        try {
+            List<Account> list = getAccountByParam(name, serialNo);
+            String timeStr = Tools.getCurrentMonth();
+            String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME;
+            String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME;
+            BigDecimal allMonthAmount = BigDecimal.ZERO;
+            BigDecimal allCurrentAmount = BigDecimal.ZERO;
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
+            Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
+            Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
+            Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
+            List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, null, null);
+            List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, null, null);
+            List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
+            List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
+            for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
+                thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
+                thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
+                thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
+            }
+            for (AccountVo4Sum currentAmount: currentAmountList) {
+                currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
+                currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
+                currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
+            }
+            if (null != list) {
+                for (Account a : list) {
+                    BigDecimal monthAmount = thisMonthAccountSumMap.get(a.getId())
+                            .add(thisMonthAccountSumByHeadMap.get(a.getId()))
+                            .add(thisMonthAccountSumByDetailMap.get(a.getId()))
+                            .add(getManyAccountSumParse(a.getId(), thisMonthManyAmountList));
+                    BigDecimal currentAmount = currentAccountSumMap.get(a.getId())
+                            .add(currentAccountSumByHeadMap.get(a.getId()))
+                            .add(currentAccountSumByDetailMap.get(a.getId()))
+                            .add(getManyAccountSumParse(a.getId(), currentManyAmountList))
+                            .add(a.getInitialAmount());
+                    allMonthAmount = allMonthAmount.add(monthAmount);
+                    allCurrentAmount = allCurrentAmount.add(currentAmount);
+                }
+            }
+            map.put("allMonthAmount", priceFormat(allMonthAmount));  //本月发生额
+            map.put("allCurrentAmount", priceFormat(allCurrentAmount));  //当前总金额
+        } catch (Exception e) {
+            JshException.readFail(logger, e);
+        }
+        return map;
+    }
+
+    /**
+     * 价格格式化
+     * @param price
+     * @return
+     */
+    private String priceFormat(BigDecimal price) {
+        String priceFmt = "0";
+        DecimalFormat df = new DecimalFormat(".##");
+        if ((price.compareTo(BigDecimal.ZERO))!=0) {
+            priceFmt = df.format(price);
+        }
+        return priceFmt;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("账户",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ENABLED).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> accountIds = StringUtil.strToLongList(ids);
+        Account account = new Account();
+        account.setEnabled(status);
+        AccountExample example = new AccountExample();
+        example.createCriteria().andIdIn(accountIds);
+        int result=0;
+        try{
+            result = accountMapper.updateByExampleSelective(account, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/accountHead/AccountHeadComponent.java b/src/main/java/com/jsh/erp/service/accountHead/AccountHeadComponent.java
new file mode 100644
index 0000000..c985a5a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/accountHead/AccountHeadComponent.java
@@ -0,0 +1,92 @@
+package com.jsh.erp.service.accountHead;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "accountHead_component")
+@AccountHeadResource
+public class AccountHeadComponent implements ICommonQuery {
+
+    @Resource
+    private AccountHeadService accountHeadService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return accountHeadService.getAccountHead(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getAccountHeadList(map);
+    }
+
+    private List<?> getAccountHeadList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String type = StringUtil.getInfo(search, "type");
+        String billNo = StringUtil.getInfo(search, "billNo");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        Long organId = StringUtil.parseStrLong(StringUtil.getInfo(search, "organId"));
+        Long creator = StringUtil.parseStrLong(StringUtil.getInfo(search, "creator"));
+        Long handsPersonId = StringUtil.parseStrLong(StringUtil.getInfo(search, "handsPersonId"));
+        Long accountId = StringUtil.parseStrLong(StringUtil.getInfo(search, "accountId"));
+        String status = StringUtil.getInfo(search, "status");
+        String remark = StringUtil.getInfo(search, "remark");
+        String number = StringUtil.getInfo(search, "number");
+        return accountHeadService.select(type, billNo, beginTime, endTime, organId, creator, handsPersonId,
+                accountId, status, remark, number, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String type = StringUtil.getInfo(search, "type");
+        String billNo = StringUtil.getInfo(search, "billNo");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        Long organId = StringUtil.parseStrLong(StringUtil.getInfo(search, "organId"));
+        Long creator = StringUtil.parseStrLong(StringUtil.getInfo(search, "creator"));
+        Long handsPersonId = StringUtil.parseStrLong(StringUtil.getInfo(search, "handsPersonId"));
+        Long accountId = StringUtil.parseStrLong(StringUtil.getInfo(search, "accountId"));
+        String status = StringUtil.getInfo(search, "status");
+        String remark = StringUtil.getInfo(search, "remark");
+        String number = StringUtil.getInfo(search, "number");
+        return accountHeadService.countAccountHead(type, billNo, beginTime, endTime, organId, creator, handsPersonId,
+                accountId, status, remark, number);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return accountHeadService.insertAccountHead(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return accountHeadService.updateAccountHead(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return accountHeadService.deleteAccountHead(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return accountHeadService.batchDeleteAccountHead(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 0;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/accountHead/AccountHeadResource.java b/src/main/java/com/jsh/erp/service/accountHead/AccountHeadResource.java
new file mode 100644
index 0000000..3132ed4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/accountHead/AccountHeadResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.accountHead;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "accountHead")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AccountHeadResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/accountHead/AccountHeadService.java b/src/main/java/com/jsh/erp/service/accountHead/AccountHeadService.java
new file mode 100644
index 0000000..4399814
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/accountHead/AccountHeadService.java
@@ -0,0 +1,426 @@
+package com.jsh.erp.service.accountHead;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.AccountHeadMapper;
+import com.jsh.erp.datasource.mappers.AccountHeadMapperEx;
+import com.jsh.erp.datasource.mappers.AccountItemMapperEx;
+import com.jsh.erp.datasource.mappers.AccountMapper;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.accountItem.AccountItemService;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.orgaUserRel.OrgaUserRelService;
+import com.jsh.erp.service.supplier.SupplierService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static com.jsh.erp.utils.Tools.getCenternTime;
+
+@Service
+public class AccountHeadService {
+    private Logger logger = LoggerFactory.getLogger(AccountHeadService.class);
+    @Resource
+    private AccountHeadMapper accountHeadMapper;
+    @Resource
+    private AccountHeadMapperEx accountHeadMapperEx;
+    @Resource
+    private OrgaUserRelService orgaUserRelService;
+    @Resource
+    private AccountItemService accountItemService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private SupplierService supplierService;
+    @Resource
+    private SystemConfigService systemConfigService;
+    @Resource
+    private LogService logService;
+    @Resource
+    private AccountItemMapperEx accountItemMapperEx;
+    @Resource
+    private AccountMapper accountMapper;
+
+    public AccountHead getAccountHead(long id) throws Exception {
+        AccountHead result=null;
+        try{
+            result=accountHeadMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<AccountHead> getAccountHeadListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<AccountHead> list = new ArrayList<>();
+        try{
+            AccountHeadExample example = new AccountHeadExample();
+            example.createCriteria().andIdIn(idList);
+            list = accountHeadMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<AccountHead> getAccountHead() throws Exception{
+        AccountHeadExample example = new AccountHeadExample();
+        List<AccountHead> list=null;
+        try{
+            list=accountHeadMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<AccountHeadVo4ListEx> select(String type, String billNo, String beginTime, String endTime,
+                                             Long organId, Long creator, Long handsPersonId, Long accountId, String status,
+                                             String remark, String number, int offset, int rows) throws Exception{
+        List<AccountHeadVo4ListEx> resList = new ArrayList<>();
+        try{
+            String [] creatorArray = getCreatorArray();
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            List<AccountHeadVo4ListEx> list = accountHeadMapperEx.selectByConditionAccountHead(type, creatorArray, billNo,
+                    beginTime, endTime, organId, creator, handsPersonId, accountId, status, remark, number, offset, rows);
+            if (null != list) {
+                for (AccountHeadVo4ListEx ah : list) {
+                    if(ah.getChangeAmount() != null) {
+                        if(BusinessConstants.TYPE_MONEY_IN.equals(ah.getType())) {
+                            ah.setChangeAmount(ah.getChangeAmount());
+                        } else if(BusinessConstants.TYPE_MONEY_OUT.equals(ah.getType())) {
+                            ah.setChangeAmount(BigDecimal.ZERO.subtract(ah.getChangeAmount()));
+                        } else {
+                            ah.setChangeAmount(ah.getChangeAmount().abs());
+                        }
+                    }
+                    if(ah.getTotalPrice() != null) {
+                        if(BusinessConstants.TYPE_MONEY_IN.equals(ah.getType())) {
+                            ah.setTotalPrice(ah.getTotalPrice());
+                        } else if(BusinessConstants.TYPE_MONEY_OUT.equals(ah.getType())) {
+                            ah.setTotalPrice(BigDecimal.ZERO.subtract(ah.getTotalPrice()));
+                        } else {
+                            ah.setTotalPrice(ah.getTotalPrice().abs());
+                        }
+                    }
+                    if(ah.getBillTime() !=null) {
+                        ah.setBillTimeStr(getCenternTime(ah.getBillTime()));
+                    }
+                    resList.add(ah);
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public Long countAccountHead(String type, String billNo, String beginTime, String endTime,
+                                 Long organId, Long creator, Long handsPersonId, Long accountId, String status,
+                                 String remark, String number) throws Exception{
+        Long result=null;
+        try{
+            String [] creatorArray = getCreatorArray();
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            result = accountHeadMapperEx.countsByAccountHead(type, creatorArray, billNo,
+                    beginTime, endTime, organId, creator, handsPersonId, accountId, status, remark, number);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 根据角色类型获取操作员数组
+     * @return
+     * @throws Exception
+     */
+    private String[] getCreatorArray() throws Exception {
+        String creator = "";
+        User user = userService.getCurrentUser();
+        String roleType = userService.getRoleTypeByUserId(user.getId()).getType(); //角色类型
+        if(BusinessConstants.ROLE_TYPE_PRIVATE.equals(roleType)) {
+            creator = user.getId().toString();
+        } else if(BusinessConstants.ROLE_TYPE_THIS_ORG.equals(roleType)) {
+            creator = orgaUserRelService.getUserIdListByUserId(user.getId());
+        }
+        String [] creatorArray=null;
+        if(StringUtil.isNotEmpty(creator)){
+            creatorArray = creator.split(",");
+        }
+        return creatorArray;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertAccountHead(JSONObject obj, HttpServletRequest request) throws Exception{
+        AccountHead accountHead = JSONObject.parseObject(obj.toJSONString(), AccountHead.class);
+        int result=0;
+        try{
+            User userInfo=userService.getCurrentUser();
+            accountHead.setCreator(userInfo==null?null:userInfo.getId());
+            result = accountHeadMapper.insertSelective(accountHead);
+            logService.insertLog("财务",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(accountHead.getBillNo()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateAccountHead(JSONObject obj, HttpServletRequest request)throws Exception {
+        AccountHead accountHead = JSONObject.parseObject(obj.toJSONString(), AccountHead.class);
+        int result=0;
+        try{
+            result = accountHeadMapper.updateByPrimaryKeySelective(accountHead);
+            logService.insertLog("财务",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(accountHead.getBillNo()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteAccountHead(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteAccountHeadByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteAccountHead(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteAccountHeadByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteAccountHeadByIds(String ids)throws Exception {
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        List<AccountHead> list = getAccountHeadListByIds(ids);
+        for(AccountHead accountHead: list){
+            if(!"0".equals(accountHead.getStatus())) {
+                throw new BusinessRunTimeException(ExceptionConstants.ACCOUNT_HEAD_UN_AUDIT_DELETE_FAILED_CODE,
+                        String.format(ExceptionConstants.ACCOUNT_HEAD_UN_AUDIT_DELETE_FAILED_MSG));
+            }
+        }
+        //删除主表
+        accountItemMapperEx.batchDeleteAccountItemByHeadIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        //删除子表
+        accountHeadMapperEx.batchDeleteAccountHeadByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        //路径列表
+        List<String> pathList = new ArrayList<>();
+        for(AccountHead accountHead: list){
+            sb.append("[").append(accountHead.getBillNo()).append("]");
+            if(StringUtil.isNotEmpty(accountHead.getFileName())) {
+                pathList.add(accountHead.getFileName());
+            }
+            if("收预付款".equals(accountHead.getType())){
+                if (accountHead.getOrganId() != null) {
+                    //更新会员预付款
+                    supplierService.updateAdvanceIn(accountHead.getOrganId());
+                }
+            }
+        }
+        //逻辑删除文件
+        systemConfigService.deleteFileByPathList(pathList);
+        logService.insertLog("财务", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        return 1;
+    }
+
+    /**
+     * 校验单据编号是否存在
+     * @param id
+     * @param billNo
+     * @return
+     * @throws Exception
+     */
+    public int checkIsBillNoExist(Long id, String billNo)throws Exception {
+        AccountHeadExample example = new AccountHeadExample();
+        example.createCriteria().andIdNotEqualTo(id).andBillNoEqualTo(billNo).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<AccountHead> list = null;
+        try{
+            list = accountHeadMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(String status, String accountHeadIds)throws Exception {
+        int result = 0;
+        try{
+            List<Long> ahIds = new ArrayList<>();
+            List<Long> ids = StringUtil.strToLongList(accountHeadIds);
+            for(Long id: ids) {
+                AccountHead accountHead = getAccountHead(id);
+                if("0".equals(status)){
+                    if("1".equals(accountHead.getStatus())) {
+                        ahIds.add(id);
+                    }
+                } else if("1".equals(status)){
+                    if("0".equals(accountHead.getStatus())) {
+                        ahIds.add(id);
+                    }
+                }
+            }
+            if(ahIds.size()>0) {
+                AccountHead accountHead = new AccountHead();
+                accountHead.setStatus(status);
+                AccountHeadExample example = new AccountHeadExample();
+                example.createCriteria().andIdIn(ahIds);
+                result = accountHeadMapper.updateByExampleSelective(accountHead, example);
+            } else {
+                return 1;
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void addAccountHeadAndDetail(String beanJson, String rows, HttpServletRequest request) throws Exception {
+        AccountHead accountHead = JSONObject.parseObject(beanJson, AccountHead.class);
+        //校验单号是否重复
+        if(checkIsBillNoExist(0L, accountHead.getBillNo())>0) {
+            throw new BusinessRunTimeException(ExceptionConstants.ACCOUNT_HEAD_BILL_NO_EXIST_CODE,
+                    String.format(ExceptionConstants.ACCOUNT_HEAD_BILL_NO_EXIST_MSG));
+        }
+        //校验付款账户和明细中的账户重复(转账单据)
+        if(BusinessConstants.TYPE_GIRO.equals(accountHead.getType())) {
+            JSONArray rowArr = JSONArray.parseArray(rows);
+            if (null != rowArr && rowArr.size()>0) {
+                for (int i = 0; i < rowArr.size(); i++) {
+                    JSONObject object = JSONObject.parseObject(rowArr.getString(i));
+                    if (object.get("accountId") != null && !object.get("accountId").equals("")) {
+                        Long accoutId = object.getLong("accountId");
+                        String accountName = accountMapper.selectByPrimaryKey(accoutId).getName();
+                        if(accoutId.equals(accountHead.getAccountId())) {
+                            throw new BusinessRunTimeException(ExceptionConstants.ACCOUNT_HEAD_ACCOUNT_REPEAT_CODE,
+                                    String.format(ExceptionConstants.ACCOUNT_HEAD_ACCOUNT_REPEAT_MSG, accountName));
+                        }
+                    }
+                }
+            }
+        }
+        User userInfo=userService.getCurrentUser();
+        accountHead.setCreator(userInfo==null?null:userInfo.getId());
+        if(StringUtil.isEmpty(accountHead.getStatus())) {
+            accountHead.setStatus(BusinessConstants.BILLS_STATUS_UN_AUDIT);
+        }
+        accountHeadMapper.insertSelective(accountHead);
+        //根据单据编号查询单据id
+        AccountHeadExample dhExample = new AccountHeadExample();
+        dhExample.createCriteria().andBillNoEqualTo(accountHead.getBillNo()).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<AccountHead> list = accountHeadMapper.selectByExample(dhExample);
+        if(list!=null) {
+            Long headId = list.get(0).getId();
+            String type = list.get(0).getType();
+            /**处理单据子表信息*/
+            accountItemService.saveDetials(rows, headId, type, request);
+        }
+        if("收预付款".equals(accountHead.getType())){
+            //更新会员预付款
+            supplierService.updateAdvanceIn(accountHead.getOrganId());
+        }
+        logService.insertLog("财务单据",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(accountHead.getBillNo()).toString(), request);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateAccountHeadAndDetail(String beanJson, String rows, HttpServletRequest request) throws Exception {
+        AccountHead accountHead = JSONObject.parseObject(beanJson, AccountHead.class);
+        //校验单号是否重复
+        if(checkIsBillNoExist(accountHead.getId(), accountHead.getBillNo())>0) {
+            throw new BusinessRunTimeException(ExceptionConstants.ACCOUNT_HEAD_BILL_NO_EXIST_CODE,
+                    String.format(ExceptionConstants.ACCOUNT_HEAD_BILL_NO_EXIST_MSG));
+        }
+        accountHeadMapper.updateByPrimaryKeySelective(accountHead);
+        //根据单据编号查询单据id
+        AccountHeadExample dhExample = new AccountHeadExample();
+        dhExample.createCriteria().andBillNoEqualTo(accountHead.getBillNo()).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<AccountHead> list = accountHeadMapper.selectByExample(dhExample);
+        if(list!=null) {
+            Long headId = list.get(0).getId();
+            String type = list.get(0).getType();
+            /**处理单据子表信息*/
+            accountItemService.saveDetials(rows, headId, type, request);
+        }
+        if("收预付款".equals(accountHead.getType())){
+            //更新会员预付款
+            supplierService.updateAdvanceIn(accountHead.getOrganId());
+        }
+        logService.insertLog("财务单据",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(accountHead.getBillNo()).toString(), request);
+    }
+
+    public List<AccountHeadVo4ListEx> getDetailByNumber(String billNo)throws Exception {
+        List<AccountHeadVo4ListEx> resList = new ArrayList<AccountHeadVo4ListEx>();
+        List<AccountHeadVo4ListEx> list = null;
+        try{
+            list = accountHeadMapperEx.getDetailByNumber(billNo);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if (null != list) {
+            for (AccountHeadVo4ListEx ah : list) {
+                if(ah.getChangeAmount() != null) {
+                    if(BusinessConstants.TYPE_MONEY_IN.equals(ah.getType())) {
+                        ah.setChangeAmount(ah.getChangeAmount());
+                    } else if(BusinessConstants.TYPE_MONEY_OUT.equals(ah.getType())) {
+                        ah.setChangeAmount(BigDecimal.ZERO.subtract(ah.getChangeAmount()));
+                    } else {
+                        ah.setChangeAmount(ah.getChangeAmount().abs());
+                    }
+                }
+                if(ah.getTotalPrice() != null) {
+                    if(BusinessConstants.TYPE_MONEY_IN.equals(ah.getType())) {
+                        ah.setTotalPrice(ah.getTotalPrice());
+                    } else if(BusinessConstants.TYPE_MONEY_OUT.equals(ah.getType())) {
+                        ah.setTotalPrice(BigDecimal.ZERO.subtract(ah.getTotalPrice()));
+                    } else {
+                        ah.setTotalPrice(ah.getTotalPrice().abs());
+                    }
+                }
+                if(ah.getBillTime() !=null) {
+                    ah.setBillTimeStr(getCenternTime(ah.getBillTime()));
+                }
+                resList.add(ah);
+            }
+        }
+        return resList;
+    }
+
+    public List<AccountItem> getFinancialBillNoByBillIdList(List<Long> idList) {
+        return accountHeadMapperEx.getFinancialBillNoByBillIdList(idList);
+    }
+
+    public List<AccountHead> getFinancialBillNoByBillId(Long billId) {
+        return accountHeadMapperEx.getFinancialBillNoByBillId(billId);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/accountItem/AccountItemComponent.java b/src/main/java/com/jsh/erp/service/accountItem/AccountItemComponent.java
new file mode 100644
index 0000000..84bd891
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/accountItem/AccountItemComponent.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.service.accountItem;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "accountItem_component")
+@AccountItemResource
+public class AccountItemComponent implements ICommonQuery {
+
+    @Resource
+    private AccountItemService accountItemService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return accountItemService.getAccountItem(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getAccountItemList(map);
+    }
+
+    private List<?> getAccountItemList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer type = StringUtil.parseInteger(StringUtil.getInfo(search, "type"));
+        String remark = StringUtil.getInfo(search, "remark");
+        String order = QueryUtils.order(map);
+        return accountItemService.select(name, type, remark, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer type = StringUtil.parseInteger(StringUtil.getInfo(search, "type"));
+        String remark = StringUtil.getInfo(search, "remark");
+        return accountItemService.countAccountItem(name, type, remark);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return accountItemService.insertAccountItem(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return accountItemService.updateAccountItem(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return accountItemService.deleteAccountItem(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return accountItemService.batchDeleteAccountItem(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return accountItemService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/accountItem/AccountItemResource.java b/src/main/java/com/jsh/erp/service/accountItem/AccountItemResource.java
new file mode 100644
index 0000000..d623631
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/accountItem/AccountItemResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.accountItem;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "accountItem")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AccountItemResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/accountItem/AccountItemService.java b/src/main/java/com/jsh/erp/service/accountItem/AccountItemService.java
new file mode 100644
index 0000000..3f55594
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/accountItem/AccountItemService.java
@@ -0,0 +1,264 @@
+package com.jsh.erp.service.accountItem;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.AccountItem;
+import com.jsh.erp.datasource.entities.AccountItemExample;
+import com.jsh.erp.datasource.entities.DepotHead;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.AccountItemMapper;
+import com.jsh.erp.datasource.mappers.AccountItemMapperEx;
+import com.jsh.erp.datasource.vo.AccountItemVo4List;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class AccountItemService {
+    private Logger logger = LoggerFactory.getLogger(AccountItemService.class);
+
+    @Resource
+    private AccountItemMapper accountItemMapper;
+    @Resource
+    private AccountItemMapperEx accountItemMapperEx;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private DepotHeadService depotHeadService;
+
+    public AccountItem getAccountItem(long id)throws Exception {
+        AccountItem result=null;
+        try{
+            result=accountItemMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<AccountItem> getAccountItem()throws Exception {
+        AccountItemExample example = new AccountItemExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<AccountItem> list=null;
+        try{
+            list=accountItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<AccountItem> select(String name, Integer type, String remark, int offset, int rows)throws Exception {
+        List<AccountItem> list=null;
+        try{
+            list = accountItemMapperEx.selectByConditionAccountItem(name, type, remark, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countAccountItem(String name, Integer type, String remark)throws Exception {
+        Long result=null;
+        try{
+            result = accountItemMapperEx.countsByAccountItem(name, type, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertAccountItem(JSONObject obj, HttpServletRequest request) throws Exception{
+        AccountItem accountItem = JSONObject.parseObject(obj.toJSONString(), AccountItem.class);
+        int result=0;
+        try{
+            result = accountItemMapper.insertSelective(accountItem);
+            logService.insertLog("财务明细", BusinessConstants.LOG_OPERATION_TYPE_ADD, request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateAccountItem(JSONObject obj, HttpServletRequest request)throws Exception {
+        AccountItem accountItem = JSONObject.parseObject(obj.toJSONString(), AccountItem.class);
+        int result=0;
+        try{
+            result = accountItemMapper.updateByPrimaryKeySelective(accountItem);
+            logService.insertLog("财务明细",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(accountItem.getId()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteAccountItem(Long id, HttpServletRequest request)throws Exception {
+        int result=0;
+        try{
+            result = accountItemMapper.deleteByPrimaryKey(id);
+            logService.insertLog("财务明细",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(id).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteAccountItem(String ids, HttpServletRequest request)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        AccountItemExample example = new AccountItemExample();
+        example.createCriteria().andIdIn(idList);
+        int result=0;
+        try{
+            result = accountItemMapper.deleteByExample(example);
+            logService.insertLog("财务明细", "批量删除,id集:" + ids, request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        AccountItemExample example = new AccountItemExample();
+        example.createCriteria().andIdNotEqualTo(id).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<AccountItem> list = null;
+        try{
+            list = accountItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertAccountItemWithObj(AccountItem accountItem)throws Exception {
+        int result=0;
+        try{
+            result = accountItemMapper.insertSelective(accountItem);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateAccountItemWithObj(AccountItem accountItem)throws Exception {
+        int result=0;
+        try{
+            result = accountItemMapper.updateByPrimaryKeySelective(accountItem);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<AccountItemVo4List> getDetailList(Long headerId) {
+        List<AccountItemVo4List> list=null;
+        try{
+            list = accountItemMapperEx.getDetailList(headerId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void saveDetials(String rows, Long headerId, String type, HttpServletRequest request) throws Exception {
+        //删除单据的明细
+        deleteAccountItemHeadId(headerId);
+        JSONArray rowArr = JSONArray.parseArray(rows);
+        if (null != rowArr && rowArr.size()>0) {
+            for (int i = 0; i < rowArr.size(); i++) {
+                AccountItem accountItem = new AccountItem();
+                JSONObject tempInsertedJson = JSONObject.parseObject(rowArr.getString(i));
+                accountItem.setHeaderId(headerId);
+                if (tempInsertedJson.get("accountId") != null && !tempInsertedJson.get("accountId").equals("")) {
+                    accountItem.setAccountId(tempInsertedJson.getLong("accountId"));
+                }
+                if (tempInsertedJson.get("inOutItemId") != null && !tempInsertedJson.get("inOutItemId").equals("")) {
+                    accountItem.setInOutItemId(tempInsertedJson.getLong("inOutItemId"));
+                }
+                if (tempInsertedJson.get("billNumber") != null && !tempInsertedJson.get("billNumber").equals("")) {
+                    String billNo = tempInsertedJson.getString("billNumber");
+                    accountItem.setBillId(depotHeadService.getDepotHead(billNo).getId());
+                }
+                if (tempInsertedJson.get("needDebt") != null && !tempInsertedJson.get("needDebt").equals("")) {
+                    accountItem.setNeedDebt(tempInsertedJson.getBigDecimal("needDebt"));
+                }
+                if (tempInsertedJson.get("finishDebt") != null && !tempInsertedJson.get("finishDebt").equals("")) {
+                    accountItem.setFinishDebt(tempInsertedJson.getBigDecimal("finishDebt"));
+                }
+                if (tempInsertedJson.get("eachAmount") != null && !tempInsertedJson.get("eachAmount").equals("")) {
+                    BigDecimal eachAmount = tempInsertedJson.getBigDecimal("eachAmount");
+                    if (type.equals("付款")) {
+                        eachAmount = BigDecimal.ZERO.subtract(eachAmount);
+                    }
+                    accountItem.setEachAmount(eachAmount);
+                } else {
+                    accountItem.setEachAmount(BigDecimal.ZERO);
+                }
+                accountItem.setRemark(tempInsertedJson.getString("remark"));
+                this.insertAccountItemWithObj(accountItem);
+            }
+        } else {
+            throw new BusinessRunTimeException(ExceptionConstants.ACCOUNT_HEAD_ROW_FAILED_CODE,
+                    String.format(ExceptionConstants.ACCOUNT_HEAD_ROW_FAILED_MSG));
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void deleteAccountItemHeadId(Long headerId)throws Exception {
+        AccountItemExample example = new AccountItemExample();
+        example.createCriteria().andHeaderIdEqualTo(headerId);
+        try{
+            accountItemMapper.deleteByExample(example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteAccountItemByIds(String ids) throws Exception{
+        logService.insertLog("财务明细",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(ids).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            result = accountItemMapperEx.batchDeleteAccountItemByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public BigDecimal getEachAmountByBillId(Long billId) {
+        return accountItemMapperEx.getEachAmountByBillId(billId).abs();
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/depot/DepotComponent.java b/src/main/java/com/jsh/erp/service/depot/DepotComponent.java
new file mode 100644
index 0000000..6a4105e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depot/DepotComponent.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.service.depot;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "depot_component")
+@DepotResource
+public class DepotComponent implements ICommonQuery {
+
+    @Resource
+    private DepotService depotService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return depotService.getDepot(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getDepotList(map);
+    }
+
+    private List<?> getDepotList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer type = StringUtil.parseInteger(StringUtil.getInfo(search, "type"));
+        String remark = StringUtil.getInfo(search, "remark");
+        String order = QueryUtils.order(map);
+        return depotService.select(name, type, remark, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer type = StringUtil.parseInteger(StringUtil.getInfo(search, "type"));
+        String remark = StringUtil.getInfo(search, "remark");
+        return depotService.countDepot(name, type, remark);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return depotService.insertDepot(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return depotService.updateDepot(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return depotService.deleteDepot(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return depotService.batchDeleteDepot(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return depotService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/depot/DepotResource.java b/src/main/java/com/jsh/erp/service/depot/DepotResource.java
new file mode 100644
index 0000000..db5f5bc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depot/DepotResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.depot;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "depot")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DepotResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/depot/DepotService.java b/src/main/java/com/jsh/erp/service/depot/DepotService.java
new file mode 100644
index 0000000..3f0c9c6
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depot/DepotService.java
@@ -0,0 +1,376 @@
+package com.jsh.erp.service.depot;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.*;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class DepotService {
+    private Logger logger = LoggerFactory.getLogger(DepotService.class);
+
+    @Resource
+    private DepotMapper depotMapper;
+    @Resource
+    private DepotMapperEx depotMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private SystemConfigService systemConfigService;
+    @Resource
+    private UserBusinessService userBusinessService;
+    @Resource
+    private LogService logService;
+    @Resource
+    private DepotItemMapperEx depotItemMapperEx;
+    @Resource
+    private MaterialInitialStockMapperEx materialInitialStockMapperEx;
+    @Resource
+    private MaterialCurrentStockMapperEx materialCurrentStockMapperEx;
+
+    public Depot getDepot(long id)throws Exception {
+        Depot result=null;
+        try{
+            result=depotMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Depot> getDepotListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        DepotExample example = new DepotExample();
+        example.createCriteria().andIdIn(idList);
+        return depotMapper.selectByExample(example);
+    }
+
+    public List<Depot> getDepot()throws Exception {
+        DepotExample example = new DepotExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Depot> list=null;
+        try{
+            list=depotMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Depot> getAllList()throws Exception {
+        DepotExample example = new DepotExample();
+        example.createCriteria().andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Depot> list=null;
+        try{
+            list=depotMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<DepotEx> select(String name, Integer type, String remark, int offset, int rows)throws Exception {
+        List<DepotEx> list=null;
+        try{
+            list=depotMapperEx.selectByConditionDepot(name, type, remark, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countDepot(String name, Integer type, String remark)throws Exception {
+        Long result=null;
+        try{
+            result=depotMapperEx.countsByDepot(name, type, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertDepot(JSONObject obj, HttpServletRequest request)throws Exception {
+        Depot depot = JSONObject.parseObject(obj.toJSONString(), Depot.class);
+        int result=0;
+        try{
+            depot.setType(0);
+            List<Depot> depotList = getDepot();
+            if(depotList.size() == 0) {
+                depot.setIsDefault(true);
+            } else {
+                depot.setIsDefault(false);
+            }
+            depot.setEnabled(true);
+            result=depotMapper.insertSelective(depot);
+            //新增仓库时给当前用户自动授权
+            Long userId = userService.getUserId(request);
+            Long depotId = getIdByName(depot.getName());
+            String ubKey = "[" + depotId + "]";
+            List<UserBusiness> ubList = userBusinessService.getBasicData(userId.toString(), "UserDepot");
+            if(ubList ==null || ubList.size() == 0) {
+                JSONObject ubObj = new JSONObject();
+                ubObj.put("type", "UserDepot");
+                ubObj.put("keyId", userId);
+                ubObj.put("value", ubKey);
+                userBusinessService.insertUserBusiness(ubObj, request);
+            } else {
+                UserBusiness ubInfo = ubList.get(0);
+                JSONObject ubObj = new JSONObject();
+                ubObj.put("id", ubInfo.getId());
+                ubObj.put("type", ubInfo.getType());
+                ubObj.put("keyId", ubInfo.getKeyId());
+                ubObj.put("value", ubInfo.getValue() + ubKey);
+                userBusinessService.updateUserBusiness(ubObj, request);
+            }
+            logService.insertLog("仓库",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(depot.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateDepot(JSONObject obj, HttpServletRequest request) throws Exception{
+        Depot depot = JSONObject.parseObject(obj.toJSONString(), Depot.class);
+        int result=0;
+        try{
+            result= depotMapper.updateByPrimaryKeySelective(depot);
+            logService.insertLog("仓库",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(depot.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteDepot(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteDepotByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteDepot(String ids, HttpServletRequest request) throws Exception{
+        return batchDeleteDepotByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteDepotByIds(String ids)throws Exception {
+        int result=0;
+        String [] idArray=ids.split(",");
+        //校验单据子表	jsh_depot_item
+        List<DepotItem> depotItemList = depotItemMapperEx.getDepotItemListListByDepotIds(idArray);
+        if(depotItemList!=null&&depotItemList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,DepotIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        try{
+            //记录日志
+            StringBuffer sb = new StringBuffer();
+            sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+            List<Depot> list = getDepotListByIds(ids);
+            for(Depot depot: list){
+                sb.append("[").append(depot.getName()).append("]");
+            }
+            User userInfo=userService.getCurrentUser();
+            //校验通过执行删除操作
+            //删除仓库关联的商品的初始库存
+            materialInitialStockMapperEx.batchDeleteByDepots(idArray);
+            //删除仓库关联的商品的当前库存
+            materialCurrentStockMapperEx.batchDeleteByDepots(idArray);
+            //删除仓库
+            result = depotMapperEx.batchDeleteDepotByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+            //记录日志
+            logService.insertLog("仓库", sb.toString(),
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        } catch (Exception e) {
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        DepotExample example = new DepotExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Depot> list=null;
+        try{
+            list= depotMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public List<Depot> findUserDepot()throws Exception{
+        DepotExample example = new DepotExample();
+        example.createCriteria().andTypeEqualTo(0).andEnabledEqualTo(true)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Depot> list=null;
+        try{
+            list= depotMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateIsDefault(Long depotId) throws Exception{
+        int result=0;
+        try{
+            //全部取消默认
+            Depot allDepot = new Depot();
+            allDepot.setIsDefault(false);
+            DepotExample allExample = new DepotExample();
+            allExample.createCriteria();
+            depotMapper.updateByExampleSelective(allDepot, allExample);
+            //给指定仓库设为默认
+            Depot depot = new Depot();
+            depot.setIsDefault(true);
+            DepotExample example = new DepotExample();
+            example.createCriteria().andIdEqualTo(depotId);
+            depotMapper.updateByExampleSelective(depot, example);
+            logService.insertLog("仓库",BusinessConstants.LOG_OPERATION_TYPE_EDIT+depotId,
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            result = 1;
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 根据名称获取id
+     * @param name
+     */
+    public Long getIdByName(String name){
+        Long id = 0L;
+        DepotExample example = new DepotExample();
+        example.createCriteria().andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Depot> list = depotMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            id = list.get(0).getId();
+        }
+        return id;
+    }
+
+    public List<Long> parseDepotList(Long depotId) throws Exception {
+        List<Long> depotList = new ArrayList<>();
+        if(depotId !=null) {
+            depotList.add(depotId);
+        } else {
+            //未选择仓库时默认为当前用户有权限的仓库
+            JSONArray depotArr = findDepotByCurrentUser();
+            for(Object obj: depotArr) {
+                JSONObject object = JSONObject.parseObject(obj.toString());
+                depotList.add(object.getLong("id"));
+            }
+        }
+        return depotList;
+    }
+
+    public JSONArray findDepotByCurrentUser() throws Exception {
+        JSONArray arr = new JSONArray();
+        String type = "UserDepot";
+        Long userId = userService.getCurrentUser().getId();
+        List<Depot> dataList = findUserDepot();
+        //开始拼接json数据
+        if (null != dataList) {
+            boolean depotFlag = systemConfigService.getDepotFlag();
+            if(depotFlag) {
+                List<UserBusiness> list = userBusinessService.getBasicData(userId.toString(), type);
+                if(list!=null && list.size()>0) {
+                    String depotStr = list.get(0).getValue();
+                    if(StringUtil.isNotEmpty(depotStr)){
+                        depotStr = depotStr.replaceAll("\\[", "").replaceAll("]", ",");
+                        String[] depotArr = depotStr.split(",");
+                        for (Depot depot : dataList) {
+                            for(String depotId: depotArr) {
+                                if(depot.getId() == Long.parseLong(depotId)){
+                                    JSONObject item = new JSONObject();
+                                    item.put("id", depot.getId());
+                                    item.put("depotName", depot.getName());
+                                    item.put("isDefault", depot.getIsDefault());
+                                    arr.add(item);
+                                }
+                            }
+                        }
+                    }
+                }
+            } else {
+                for (Depot depot : dataList) {
+                    JSONObject item = new JSONObject();
+                    item.put("id", depot.getId());
+                    item.put("depotName", depot.getName());
+                    item.put("isDefault", depot.getIsDefault());
+                    arr.add(item);
+                }
+            }
+        }
+        return arr;
+    }
+
+    /**
+     * 当前用户有权限使用的仓库列表的id,用逗号隔开
+     * @return
+     * @throws Exception
+     */
+    public String findDepotStrByCurrentUser() throws Exception {
+        JSONArray arr =  findDepotByCurrentUser();
+        StringBuffer sb = new StringBuffer();
+        for(Object object: arr) {
+            JSONObject obj = (JSONObject)object;
+            sb.append(obj.getLong("id")).append(",");
+        }
+        String depotStr = sb.toString();
+        if(StringUtil.isNotEmpty(depotStr)){
+            depotStr = depotStr.substring(0, depotStr.length()-1);
+        }
+        return depotStr;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("仓库",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ENABLED).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> depotIds = StringUtil.strToLongList(ids);
+        Depot depot = new Depot();
+        depot.setEnabled(status);
+        DepotExample example = new DepotExample();
+        example.createCriteria().andIdIn(depotIds);
+        int result=0;
+        try{
+            result = depotMapper.updateByExampleSelective(depot, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/depotHead/DepotHeadComponent.java b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadComponent.java
new file mode 100644
index 0000000..6303423
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadComponent.java
@@ -0,0 +1,102 @@
+package com.jsh.erp.service.depotHead;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "depotHead_component")
+@DepotHeadResource
+public class DepotHeadComponent implements ICommonQuery {
+
+    @Resource
+    private DepotHeadService depotHeadService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return depotHeadService.getDepotHead(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getDepotHeadList(map);
+    }
+
+    private List<?> getDepotHeadList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String type = StringUtil.getInfo(search, "type");
+        String subType = StringUtil.getInfo(search, "subType");
+        String hasDebt = StringUtil.getInfo(search, "hasDebt");
+        String status = StringUtil.getInfo(search, "status");
+        String purchaseStatus = StringUtil.getInfo(search, "purchaseStatus");
+        String number = StringUtil.getInfo(search, "number");
+        String linkApply = StringUtil.getInfo(search, "linkApply");
+        String linkNumber = StringUtil.getInfo(search, "linkNumber");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        String materialParam = StringUtil.getInfo(search, "materialParam");
+        Long organId = StringUtil.parseStrLong(StringUtil.getInfo(search, "organId"));
+        Long creator = StringUtil.parseStrLong(StringUtil.getInfo(search, "creator"));
+        Long depotId = StringUtil.parseStrLong(StringUtil.getInfo(search, "depotId"));
+        Long accountId = StringUtil.parseStrLong(StringUtil.getInfo(search, "accountId"));
+        String remark = StringUtil.getInfo(search, "remark");
+        return depotHeadService.select(type, subType, hasDebt, status, purchaseStatus, number, linkApply, linkNumber,
+                beginTime, endTime, materialParam, organId, creator, depotId, accountId, remark, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String type = StringUtil.getInfo(search, "type");
+        String subType = StringUtil.getInfo(search, "subType");
+        String hasDebt = StringUtil.getInfo(search, "hasDebt");
+        String status = StringUtil.getInfo(search, "status");
+        String purchaseStatus = StringUtil.getInfo(search, "purchaseStatus");
+        String number = StringUtil.getInfo(search, "number");
+        String linkApply = StringUtil.getInfo(search, "linkApply");
+        String linkNumber = StringUtil.getInfo(search, "linkNumber");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        String materialParam = StringUtil.getInfo(search, "materialParam");
+        Long organId = StringUtil.parseStrLong(StringUtil.getInfo(search, "organId"));
+        Long creator = StringUtil.parseStrLong(StringUtil.getInfo(search, "creator"));
+        Long depotId = StringUtil.parseStrLong(StringUtil.getInfo(search, "depotId"));
+        Long accountId = StringUtil.parseStrLong(StringUtil.getInfo(search, "accountId"));
+        String remark = StringUtil.getInfo(search, "remark");
+        return depotHeadService.countDepotHead(type, subType, hasDebt, status, purchaseStatus, number, linkApply, linkNumber,
+                beginTime, endTime, materialParam, organId, creator, depotId, accountId, remark);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return depotHeadService.insertDepotHead(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return depotHeadService.updateDepotHead(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return depotHeadService.deleteDepotHead(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return depotHeadService.batchDeleteDepotHead(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 0;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/depotHead/DepotHeadResource.java b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadResource.java
new file mode 100644
index 0000000..769027e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.depotHead;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "depotHead")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DepotHeadResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java
new file mode 100644
index 0000000..e9d6d74
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java
@@ -0,0 +1,1750 @@
+package com.jsh.erp.service.depotHead;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.DepotHeadMapper;
+import com.jsh.erp.datasource.mappers.DepotHeadMapperEx;
+import com.jsh.erp.datasource.mappers.DepotItemMapperEx;
+import com.jsh.erp.datasource.vo.*;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.account.AccountService;
+import com.jsh.erp.service.accountHead.AccountHeadService;
+import com.jsh.erp.service.accountItem.AccountItemService;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.depotItem.DepotItemService;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.orgaUserRel.OrgaUserRelService;
+import com.jsh.erp.service.person.PersonService;
+import com.jsh.erp.service.role.RoleService;
+import com.jsh.erp.service.sequence.SequenceService;
+import com.jsh.erp.service.serialNumber.SerialNumberService;
+import com.jsh.erp.service.supplier.SupplierService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.ExcelUtils;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import jxl.Workbook;
+import jxl.write.WritableWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.jsh.erp.utils.Tools.getCenternTime;
+import static com.jsh.erp.utils.Tools.getNow3;
+
+@Service
+public class DepotHeadService {
+    private Logger logger = LoggerFactory.getLogger(DepotHeadService.class);
+
+    @Resource
+    private DepotHeadMapper depotHeadMapper;
+    @Resource
+    private DepotHeadMapperEx depotHeadMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private RoleService roleService;
+    @Resource
+    private DepotService depotService;
+    @Resource
+    DepotItemService depotItemService;
+    @Resource
+    private SupplierService supplierService;
+    @Resource
+    private UserBusinessService userBusinessService;
+    @Resource
+    private SystemConfigService systemConfigService;
+    @Resource
+    private SerialNumberService serialNumberService;
+    @Resource
+    private OrgaUserRelService orgaUserRelService;
+    @Resource
+    private PersonService personService;
+    @Resource
+    private AccountService accountService;
+    @Resource
+    private AccountHeadService accountHeadService;
+    @Resource
+    private AccountItemService accountItemService;
+    @Resource
+    private SequenceService sequenceService;
+    @Resource
+    DepotItemMapperEx depotItemMapperEx;
+    @Resource
+    private LogService logService;
+
+    public DepotHead getDepotHead(long id)throws Exception {
+        DepotHead result=null;
+        try{
+            result=depotHeadMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<DepotHead> getDepotHead()throws Exception {
+        DepotHeadExample example = new DepotHeadExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<DepotHead> list=null;
+        try{
+            list=depotHeadMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<DepotHeadVo4List> select(String type, String subType, String hasDebt, String status, String purchaseStatus, String number, String linkApply, String linkNumber,
+           String beginTime, String endTime, String materialParam, Long organId, Long creator, Long depotId, Long accountId, String remark, int offset, int rows) throws Exception {
+        List<DepotHeadVo4List> resList = new ArrayList<>();
+        try{
+            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+            Long userId = userService.getUserId(request);
+            String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+            String billCategory = getBillCategory(subType);
+            String [] depotArray = getDepotArray(subType);
+            String [] creatorArray = getCreatorArray();
+            String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
+            String [] purchaseStatusArray = StringUtil.isNotEmpty(purchaseStatus) ? purchaseStatus.split(",") : null;
+            String [] organArray = getOrganArray(subType, purchaseStatus);
+            //以销定购,查看全部数据
+            creatorArray = StringUtil.isNotEmpty(purchaseStatus) ? null: creatorArray;
+            Map<Long,String> personMap = personService.getPersonMap();
+            Map<Long,String> accountMap = accountService.getAccountMap();
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            List<DepotHeadVo4List> list = depotHeadMapperEx.selectByConditionDepotHead(type, subType, creatorArray, hasDebt,
+                    statusArray, purchaseStatusArray, number, linkApply, linkNumber, beginTime, endTime,
+                    materialParam, organId, organArray, creator, depotId, depotArray, accountId, remark, offset, rows);
+            if (null != list) {
+                List<Long> idList = new ArrayList<>();
+                List<String> numberList = new ArrayList<>();
+                for (DepotHeadVo4List dh : list) {
+                    idList.add(dh.getId());
+                    numberList.add(dh.getNumber());
+                }
+                //通过批量查询去构造map
+                Map<String,BigDecimal> finishDepositMap = getFinishDepositMapByNumberList(numberList);
+                Map<Long,Integer> financialBillNoMap = getFinancialBillNoMapByBillIdList(idList);
+                Map<String,Integer> billSizeMap = getBillSizeMapByLinkNumberList(numberList);
+                Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
+                Map<Long,BigDecimal> materialCountListMap = getMaterialCountListMapByHeaderIdList(idList);
+                for (DepotHeadVo4List dh : list) {
+                    if(accountMap!=null && StringUtil.isNotEmpty(dh.getAccountIdList()) && StringUtil.isNotEmpty(dh.getAccountMoneyList())) {
+                        String accountStr = accountService.getAccountStrByIdAndMoney(accountMap, dh.getAccountIdList(), dh.getAccountMoneyList());
+                        dh.setAccountName(accountStr);
+                    }
+                    if(dh.getAccountIdList() != null) {
+                        String accountidlistStr = dh.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", "");
+                        dh.setAccountIdList(accountidlistStr);
+                    }
+                    if(dh.getAccountMoneyList() != null) {
+                        String accountmoneylistStr = dh.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
+                        dh.setAccountMoneyList(accountmoneylistStr);
+                    }
+                    if(dh.getChangeAmount() != null) {
+                        dh.setChangeAmount(roleService.parseBillPriceByLimit(dh.getChangeAmount().abs(), billCategory, priceLimit, request));
+                    } else {
+                        dh.setChangeAmount(BigDecimal.ZERO);
+                    }
+                    if(dh.getTotalPrice() != null) {
+                        BigDecimal lastTotalPrice = BusinessConstants.SUB_TYPE_CHECK_ENTER.equals(dh.getSubType())||
+                                BusinessConstants.SUB_TYPE_REPLAY.equals(dh.getSubType())?dh.getTotalPrice():dh.getTotalPrice().abs();
+                        dh.setTotalPrice(roleService.parseBillPriceByLimit(lastTotalPrice, billCategory, priceLimit, request));
+                    }
+                    BigDecimal discountLastMoney = dh.getDiscountLastMoney()!=null?dh.getDiscountLastMoney():BigDecimal.ZERO;
+                    dh.setDiscountLastMoney(roleService.parseBillPriceByLimit(discountLastMoney, billCategory, priceLimit, request));
+                    BigDecimal backAmount = dh.getBackAmount()!=null?dh.getBackAmount():BigDecimal.ZERO;
+                    dh.setBackAmount(roleService.parseBillPriceByLimit(backAmount, billCategory, priceLimit, request));
+                    if(dh.getDeposit() == null) {
+                        dh.setDeposit(BigDecimal.ZERO);
+                    } else {
+                        dh.setDeposit(roleService.parseBillPriceByLimit(dh.getDeposit(), billCategory, priceLimit, request));
+                    }
+                    //已经完成的欠款
+                    if(finishDepositMap!=null) {
+                        BigDecimal finishDeposit = finishDepositMap.get(dh.getNumber()) != null ? finishDepositMap.get(dh.getNumber()) : BigDecimal.ZERO;
+                        dh.setFinishDeposit(roleService.parseBillPriceByLimit(finishDeposit, billCategory, priceLimit, request));
+                    }
+                    //欠款计算
+                    BigDecimal otherMoney = dh.getOtherMoney()!=null?dh.getOtherMoney():BigDecimal.ZERO;
+                    BigDecimal deposit = dh.getDeposit()!=null?dh.getDeposit():BigDecimal.ZERO;
+                    BigDecimal changeAmount = dh.getChangeAmount()!=null?dh.getChangeAmount():BigDecimal.ZERO;
+                    BigDecimal debt = discountLastMoney.add(otherMoney).subtract((deposit.add(changeAmount)));
+                    dh.setDebt(roleService.parseBillPriceByLimit(debt, billCategory, priceLimit, request));
+                    //是否有付款单或收款单
+                    if(financialBillNoMap!=null) {
+                        Integer financialBillNoSize = financialBillNoMap.get(dh.getId());
+                        dh.setHasFinancialFlag(financialBillNoSize!=null && financialBillNoSize>0);
+                    }
+                    //是否有退款单
+                    if(billSizeMap!=null) {
+                        Integer billListSize = billSizeMap.get(dh.getNumber());
+                        dh.setHasBackFlag(billListSize!=null && billListSize>0);
+                    }
+                    if(StringUtil.isNotEmpty(dh.getSalesMan())) {
+                        dh.setSalesManStr(personService.getPersonByMapAndIds(personMap,dh.getSalesMan()));
+                    }
+                    if(dh.getOperTime() != null) {
+                        dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
+                    }
+                    //商品信息简述
+                    if(materialsListMap!=null) {
+                        dh.setMaterialsList(materialsListMap.get(dh.getId()));
+                    }
+                    //商品总数量
+                    if(materialCountListMap!=null) {
+                        dh.setMaterialCount(materialCountListMap.get(dh.getId()));
+                    }
+                    //以销定购的情况(不能显示销售单据的金额和客户名称)
+                    if(StringUtil.isNotEmpty(purchaseStatus)) {
+                        dh.setOrganName("****");
+                        dh.setTotalPrice(null);
+                        dh.setDiscountLastMoney(null);
+                    }
+                    resList.add(dh);
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public Long countDepotHead(String type, String subType, String hasDebt, String status, String purchaseStatus, String number, String linkApply, String linkNumber,
+           String beginTime, String endTime, String materialParam, Long organId, Long creator, Long depotId, Long accountId, String remark) throws Exception{
+        Long result=null;
+        try{
+            String [] depotArray = getDepotArray(subType);
+            String [] creatorArray = getCreatorArray();
+            String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
+            String [] purchaseStatusArray = StringUtil.isNotEmpty(purchaseStatus) ? purchaseStatus.split(",") : null;
+            String [] organArray = getOrganArray(subType, purchaseStatus);
+            //以销定购,查看全部数据
+            creatorArray = StringUtil.isNotEmpty(purchaseStatus) ? null: creatorArray;
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            result=depotHeadMapperEx.countsByDepotHead(type, subType, creatorArray, hasDebt,
+                    statusArray, purchaseStatusArray, number, linkApply, linkNumber, beginTime, endTime,
+                   materialParam, organId, organArray, creator, depotId, depotArray, accountId, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 根据单据类型获取仓库数组
+     * @param subType
+     * @return
+     * @throws Exception
+     */
+    public String[] getDepotArray(String subType) throws Exception {
+        String [] depotArray = null;
+        if(!BusinessConstants.SUB_TYPE_PURCHASE_APPLY.equals(subType)
+                && !BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(subType)
+                && !BusinessConstants.SUB_TYPE_SALES_ORDER.equals(subType)) {
+            String depotIds = depotService.findDepotStrByCurrentUser();
+            depotArray = StringUtil.isNotEmpty(depotIds) ? depotIds.split(",") : null;
+        }
+        return depotArray;
+    }
+
+    /**
+     * 根据角色类型获取操作员数组
+     * @return
+     * @throws Exception
+     */
+    public String[] getCreatorArray() throws Exception {
+        String creator = getCreatorByCurrentUser();
+        String [] creatorArray=null;
+        if(StringUtil.isNotEmpty(creator)){
+            creatorArray = creator.split(",");
+        }
+        return creatorArray;
+    }
+
+    /**
+     * 根据角色类型获取操作员数组
+     * @param organizationId
+     * @return
+     * @throws Exception
+     */
+    public String[] getCreatorArrayByOrg(Long organizationId) throws Exception {
+        List<Long> userIdList = orgaUserRelService.getUserIdListByOrgId(organizationId);
+        if(userIdList.size()>0) {
+            List<String> userIdStrList = userIdList.stream().map(Object::toString).collect(Collectors.toList());
+            return StringUtil.listToStringArray(userIdStrList);
+        } else {
+            return "-1".split(",");
+        }
+    }
+
+    /**
+     * 获取机构数组
+     * @return
+     */
+    public String[] getOrganArray(String subType, String purchaseStatus) throws Exception {
+        String [] organArray = null;
+        String type = "UserCustomer";
+        Long userId = userService.getCurrentUser().getId();
+        //获取权限信息
+        String ubValue = userBusinessService.getUBValueByTypeAndKeyId(type, userId.toString());
+        List<Supplier> supplierList = supplierService.findBySelectCus();
+        if(BusinessConstants.SUB_TYPE_SALES_ORDER.equals(subType) || BusinessConstants.SUB_TYPE_SALES.equals(subType)
+                ||BusinessConstants.SUB_TYPE_SALES_RETURN.equals(subType) ) {
+            //采购订单里面选择销售订单的时候不要过滤
+            if(StringUtil.isEmpty(purchaseStatus)) {
+                if (null != supplierList && supplierList.size() > 0) {
+                    boolean customerFlag = systemConfigService.getCustomerFlag();
+                    List<String> organList = new ArrayList<>();
+                    for (Supplier supplier : supplierList) {
+                        boolean flag = ubValue.contains("[" + supplier.getId().toString() + "]");
+                        if (!customerFlag || flag) {
+                            organList.add(supplier.getId().toString());
+                        }
+                    }
+                    if(organList.size() > 0) {
+                        organArray = StringUtil.listToStringArray(organList);
+                    }
+                }
+            }
+        }
+        return organArray;
+    }
+
+    /**
+     * 根据角色类型获取操作员
+     * @return
+     * @throws Exception
+     */
+    public String getCreatorByCurrentUser() throws Exception {
+        String creator = "";
+        User user = userService.getCurrentUser();
+        String roleType = userService.getRoleTypeByUserId(user.getId()).getType(); //角色类型
+        if(BusinessConstants.ROLE_TYPE_PRIVATE.equals(roleType)) {
+            creator = user.getId().toString();
+        } else if(BusinessConstants.ROLE_TYPE_THIS_ORG.equals(roleType)) {
+            creator = orgaUserRelService.getUserIdListByUserId(user.getId());
+        }
+        return creator;
+    }
+
+    public Map<String, BigDecimal> getFinishDepositMapByNumberList(List<String> numberList) {
+        Map<String,BigDecimal> finishDepositMap = new HashMap<>();
+        if(numberList.size()>0) {
+            List<FinishDepositVo> list = depotHeadMapperEx.getFinishDepositByNumberList(numberList);
+            if(list!=null && list.size()>0) {
+                for (FinishDepositVo finishDepositVo : list) {
+                    if(finishDepositVo!=null) {
+                        finishDepositMap.put(finishDepositVo.getNumber(), finishDepositVo.getFinishDeposit());
+                    }
+                }
+            }
+        }
+        return finishDepositMap;
+    }
+
+    public Map<String, Integer> getBillSizeMapByLinkNumberList(List<String> numberList) throws Exception {
+        Map<String, Integer> billListMap = new HashMap<>();
+        if(numberList.size()>0) {
+            List<DepotHead> list = getBillListByLinkNumberList(numberList);
+            if(list!=null && list.size()>0) {
+                for (DepotHead depotHead : list) {
+                    if(depotHead!=null) {
+                        billListMap.put(depotHead.getLinkNumber(), list.size());
+                    }
+                }
+            }
+        }
+        return billListMap;
+    }
+
+    public Map<Long,Integer> getFinancialBillNoMapByBillIdList(List<Long> idList) {
+        Map<Long, Integer> billListMap = new HashMap<>();
+        if(idList.size()>0) {
+            List<AccountItem> list = accountHeadService.getFinancialBillNoByBillIdList(idList);
+            if(list!=null && list.size()>0) {
+                for (AccountItem accountItem : list) {
+                    if(accountItem!=null) {
+                        billListMap.put(accountItem.getBillId(), list.size());
+                    }
+                }
+            }
+        }
+        return billListMap;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertDepotHead(JSONObject obj, HttpServletRequest request)throws Exception {
+        DepotHead depotHead = JSONObject.parseObject(obj.toJSONString(), DepotHead.class);
+        depotHead.setCreateTime(new Timestamp(System.currentTimeMillis()));
+        depotHead.setStatus(BusinessConstants.BILLS_STATUS_UN_AUDIT);
+        int result=0;
+        try{
+            result=depotHeadMapper.insert(depotHead);
+            logService.insertLog("单据", BusinessConstants.LOG_OPERATION_TYPE_ADD, request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateDepotHead(JSONObject obj, HttpServletRequest request) throws Exception{
+        DepotHead depotHead = JSONObject.parseObject(obj.toJSONString(), DepotHead.class);
+        DepotHead dh=null;
+        try{
+            dh = depotHeadMapper.selectByPrimaryKey(depotHead.getId());
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        depotHead.setStatus(dh.getStatus());
+        depotHead.setCreateTime(dh.getCreateTime());
+        int result=0;
+        try{
+            result = depotHeadMapper.updateByPrimaryKey(depotHead);
+            logService.insertLog("单据",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(depotHead.getId()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteDepotHead(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteBillByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteDepotHead(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteBillByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteBillByIds(String ids)throws Exception {
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<DepotHead> dhList = getDepotHeadListByIds(ids);
+        for(DepotHead depotHead: dhList){
+            //只有未审核的单据才能被删除
+            if(!"0".equals(depotHead.getStatus())) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_DELETE_FAILED_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_DELETE_FAILED_MSG));
+            }
+        }
+        for(DepotHead depotHead: dhList){
+            sb.append("[").append(depotHead.getNumber()).append("]");
+            User userInfo = userService.getCurrentUser();
+            //删除入库单据,先校验序列号是否出库,如果未出库则同时删除序列号,如果已出库则不能删除单据
+            if (BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType())) {
+                List<DepotItem> depotItemList = depotItemMapperEx.findDepotItemListBydepotheadId(depotHead.getId(), BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED);
+                if (depotItemList != null && depotItemList.size() > 0) {
+                    //单据明细里面存在序列号商品
+                    int serialNumberSellCount = depotHeadMapperEx.getSerialNumberBySell(depotHead.getNumber());
+                    if (serialNumberSellCount > 0) {
+                        //已出库则不能删除单据
+                        throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_SERIAL_IS_SELL_CODE,
+                                String.format(ExceptionConstants.DEPOT_HEAD_SERIAL_IS_SELL_MSG, depotHead.getNumber()));
+                    } else {
+                        //删除序列号
+                        SerialNumberExample example = new SerialNumberExample();
+                        example.createCriteria().andInBillNoEqualTo(depotHead.getNumber());
+                        serialNumberService.deleteByExample(example);
+                    }
+                }
+            }
+            //删除出库数据回收序列号
+            if (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())
+                    && !BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubType())) {
+                //查询单据子表列表
+                List<DepotItem> depotItemList = depotItemMapperEx.findDepotItemListBydepotheadId(depotHead.getId(), BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED);
+                /**回收序列号*/
+                if (depotItemList != null && depotItemList.size() > 0) {
+                    for (DepotItem depotItem : depotItemList) {
+                        //BasicNumber=OperNumber*ratio
+                        serialNumberService.cancelSerialNumber(depotItem.getMaterialId(), depotHead.getNumber(), (depotItem.getBasicNumber() == null ? 0 : depotItem.getBasicNumber()).intValue(), userInfo);
+                    }
+                }
+            }
+            List<DepotItem> list = depotItemService.getListByHeaderId(depotHead.getId());
+            //删除单据子表数据
+            depotItemMapperEx.batchDeleteDepotItemByDepotHeadIds(new Long[]{depotHead.getId()});
+            //删除单据主表信息
+            batchDeleteDepotHeadByIds(depotHead.getId().toString());
+            //将关联的单据置为审核状态-针对采购入库、销售出库、盘点复盘、其它入库、其它出库
+            if(StringUtil.isNotEmpty(depotHead.getLinkNumber())){
+                if((BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType()) &&
+                        BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType()))
+                        || (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) &&
+                        BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType()))
+                        || (BusinessConstants.DEPOTHEAD_TYPE_OTHER.equals(depotHead.getType()) &&
+                        BusinessConstants.SUB_TYPE_REPLAY.equals(depotHead.getSubType()))
+                        || (BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType()) &&
+                        BusinessConstants.SUB_TYPE_OTHER.equals(depotHead.getSubType()))
+                        || (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) &&
+                        BusinessConstants.SUB_TYPE_OTHER.equals(depotHead.getSubType()))) {
+                    String status = BusinessConstants.BILLS_STATUS_AUDIT;
+                    //查询除当前单据之外的关联单据列表
+                    List<DepotHead> exceptCurrentList = getListByLinkNumberExceptCurrent(depotHead.getLinkNumber(), depotHead.getNumber(), depotHead.getType());
+                    if(exceptCurrentList!=null && exceptCurrentList.size()>0) {
+                        status = BusinessConstants.BILLS_STATUS_SKIPING;
+                    }
+                    DepotHead dh = new DepotHead();
+                    dh.setStatus(status);
+                    DepotHeadExample example = new DepotHeadExample();
+                    example.createCriteria().andNumberEqualTo(depotHead.getLinkNumber());
+                    depotHeadMapper.updateByExampleSelective(dh, example);
+                }
+            }
+            //将关联的单据置为审核状态-针对请购单转采购订单的情况
+            if(StringUtil.isNotEmpty(depotHead.getLinkApply())){
+                if(BusinessConstants.DEPOTHEAD_TYPE_OTHER.equals(depotHead.getType()) &&
+                        BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())) {
+                    String status = BusinessConstants.BILLS_STATUS_AUDIT;
+                    //查询除当前单据之外的关联单据列表
+                    List<DepotHead> exceptCurrentList = getListByLinkApplyExceptCurrent(depotHead.getLinkApply(), depotHead.getNumber(), depotHead.getType());
+                    if(exceptCurrentList!=null && exceptCurrentList.size()>0) {
+                        status = BusinessConstants.BILLS_STATUS_SKIPING;
+                    }
+                    DepotHead dh = new DepotHead();
+                    dh.setStatus(status);
+                    DepotHeadExample example = new DepotHeadExample();
+                    example.createCriteria().andNumberEqualTo(depotHead.getLinkApply());
+                    depotHeadMapper.updateByExampleSelective(dh, example);
+                }
+            }
+            //将关联的销售订单单据置为未采购状态-针对销售订单转采购订单的情况
+            if(StringUtil.isNotEmpty(depotHead.getLinkNumber())){
+                if(BusinessConstants.DEPOTHEAD_TYPE_OTHER.equals(depotHead.getType()) &&
+                        BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())) {
+                    DepotHead dh = new DepotHead();
+                    //获取分批操作后单据的商品和商品数量(汇总)
+                    List<DepotItemVo4MaterialAndSum> batchList = depotItemMapperEx.getBatchBillDetailMaterialSum(depotHead.getLinkNumber(), "normal", depotHead.getType());
+                    if(batchList.size()>0) {
+                        dh.setPurchaseStatus(BusinessConstants.PURCHASE_STATUS_SKIPING);
+                    } else {
+                        dh.setPurchaseStatus(BusinessConstants.PURCHASE_STATUS_UN_AUDIT);
+                    }
+                    DepotHeadExample example = new DepotHeadExample();
+                    example.createCriteria().andNumberEqualTo(depotHead.getLinkNumber());
+                    depotHeadMapper.updateByExampleSelective(dh, example);
+                }
+            }
+            //对于零售出库单据,更新会员的预收款信息
+            if (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())
+                    && BusinessConstants.SUB_TYPE_RETAIL.equals(depotHead.getSubType())){
+                if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPayType())) {
+                    if (depotHead.getOrganId() != null) {
+                        //更新会员预付款
+                        supplierService.updateAdvanceIn(depotHead.getOrganId());
+                    }
+                }
+            }
+            for (DepotItem depotItem : list) {
+                //更新当前库存
+                depotItemService.updateCurrentStock(depotItem);
+                //更新当前成本价
+                depotItemService.updateCurrentUnitPrice(depotItem);
+            }
+        }
+        //路径列表
+        List<String> pathList = new ArrayList<>();
+        for(DepotHead depotHead: dhList){
+            if(StringUtil.isNotEmpty(depotHead.getFileName())) {
+                pathList.add(depotHead.getFileName());
+            }
+        }
+        //逻辑删除文件
+        systemConfigService.deleteFileByPathList(pathList);
+        logService.insertLog("单据", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        return 1;
+    }
+
+    /**
+     * 删除单据主表信息
+     * @param ids
+     * @return
+     * @throws Exception
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteDepotHeadByIds(String ids)throws Exception {
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            result = depotHeadMapperEx.batchDeleteDepotHeadByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<DepotHead> getDepotHeadListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<DepotHead> list = new ArrayList<>();
+        try{
+            DepotHeadExample example = new DepotHeadExample();
+            example.createCriteria().andIdIn(idList);
+            list = depotHeadMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    /**
+     * 校验单据编号是否存在
+     * @param id
+     * @param number
+     * @return
+     * @throws Exception
+     */
+    public int checkIsBillNumberExist(Long id, String number)throws Exception {
+        DepotHeadExample example = new DepotHeadExample();
+        example.createCriteria().andIdNotEqualTo(id).andNumberEqualTo(number).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<DepotHead> list = null;
+        try{
+            list = depotHeadMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(String status, String depotHeadIDs)throws Exception {
+        int result = 0;
+        List<Long> dhIds = new ArrayList<>();
+        List<Long> ids = StringUtil.strToLongList(depotHeadIDs);
+        for(Long id: ids) {
+            DepotHead depotHead = getDepotHead(id);
+            if("0".equals(status)){
+                //进行反审核操作
+                if("1".equals(depotHead.getStatus()) && "0".equals(depotHead.getPurchaseStatus())) {
+                    dhIds.add(id);
+                } else if("2".equals(depotHead.getPurchaseStatus())) {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_TWO_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_TWO_MSG));
+                } else if("3".equals(depotHead.getPurchaseStatus())) {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_THREE_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_PURCHASE_STATUS_THREE_MSG));
+                } else {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_AUDIT_TO_UN_AUDIT_FAILED_MSG));
+                }
+            } else if("1".equals(status)){
+                //进行审核操作
+                if("0".equals(depotHead.getStatus())) {
+                    dhIds.add(id);
+                } else {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_TO_AUDIT_FAILED_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_UN_AUDIT_TO_AUDIT_FAILED_MSG));
+                }
+            }
+        }
+        if(dhIds.size()>0) {
+            DepotHead depotHead = new DepotHead();
+            depotHead.setStatus(status);
+            DepotHeadExample example = new DepotHeadExample();
+            example.createCriteria().andIdIn(dhIds);
+            result = depotHeadMapper.updateByExampleSelective(depotHead, example);
+            //更新当前库存
+            if(systemConfigService.getForceApprovalFlag()) {
+                for(Long dhId: dhIds) {
+                    List<DepotItem> list = depotItemService.getListByHeaderId(dhId);
+                    for (DepotItem depotItem : list) {
+                        depotItemService.updateCurrentStock(depotItem);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    public Map<Long,String> findMaterialsListMapByHeaderIdList(List<Long> idList)throws Exception {
+        Map<Long,String> materialsListMap = new HashMap<>();
+        if(idList.size()>0) {
+            List<MaterialsListVo> list = depotHeadMapperEx.findMaterialsListMapByHeaderIdList(idList);
+            for (MaterialsListVo materialsListVo : list) {
+                String materialsList = materialsListVo.getMaterialsList();
+                if(StringUtil.isNotEmpty(materialsList)) {
+                    materialsList = materialsList.replace(",",",");
+                }
+                materialsListMap.put(materialsListVo.getHeaderId(), materialsList);
+            }
+        }
+        return materialsListMap;
+    }
+
+    public Map<Long,BigDecimal> getMaterialCountListMapByHeaderIdList(List<Long> idList)throws Exception {
+        Map<Long,BigDecimal> materialCountListMap = new HashMap<>();
+        if(idList.size()>0) {
+            List<MaterialCountVo> list = depotHeadMapperEx.getMaterialCountListByHeaderIdList(idList);
+            for(MaterialCountVo materialCountVo : list){
+                materialCountListMap.put(materialCountVo.getHeaderId(), materialCountVo.getMaterialCount());
+            }
+        }
+        return materialCountListMap;
+    }
+
+    public List<DepotHeadVo4InDetail> findInOutDetail(String beginTime, String endTime, String type, String[] creatorArray,
+                                                      String[] organArray, List<Long> categoryList, Boolean forceFlag, Boolean inOutManageFlag,
+                                                      String materialParam, List<Long> depotList, Integer oId, String number,
+                                                      Long creator, String remark, String column, String order, Integer offset, Integer rows) throws Exception{
+        List<DepotHeadVo4InDetail> list = null;
+        try{
+            list =depotHeadMapperEx.findInOutDetail(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
+                    materialParam, depotList, oId, number, creator, remark, column, order, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int findInOutDetailCount(String beginTime, String endTime, String type, String[] creatorArray,
+                                    String[] organArray, List<Long> categoryList, Boolean forceFlag, Boolean inOutManageFlag, String materialParam, List<Long> depotList, Integer oId, String number,
+                                    Long creator, String remark) throws Exception{
+        int result = 0;
+        try{
+            result =depotHeadMapperEx.findInOutDetailCount(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
+                    materialParam, depotList, oId, number, creator, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public DepotHeadVo4InDetail findInOutDetailStatistic(String beginTime, String endTime, String type, String [] creatorArray,
+                                                      String [] organArray, List<Long> categoryList, Boolean forceFlag, Boolean inOutManageFlag,
+                                                      String materialParam, List<Long> depotList, Integer oId, String number,
+                                                      Long creator, String remark) throws Exception{
+        DepotHeadVo4InDetail item = new DepotHeadVo4InDetail();
+        try{
+            List<DepotHeadVo4InDetail> list =depotHeadMapperEx.findInOutDetailStatistic(beginTime, endTime, type, creatorArray, organArray, categoryList, forceFlag, inOutManageFlag,
+                    materialParam, depotList, oId, number, creator, remark);
+            if(list.size()>0) {
+                item.setOperNumber(list.get(0).getOperNumber());
+                item.setAllPrice(list.get(0).getAllPrice());
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return item;
+    }
+
+    public List<DepotHeadVo4InOutMCount> findInOutMaterialCount(String beginTime, String endTime, String type, List<Long> categoryList,
+                                                                Boolean forceFlag, Boolean inOutManageFlag, String materialParam,
+                                                                List<Long> depotList, Long organizationId, Integer oId, String column, String order,
+                                                                Integer offset, Integer rows)throws Exception {
+        List<DepotHeadVo4InOutMCount> list = null;
+        try{
+            String [] creatorArray = getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = getCreatorArrayByOrg(organizationId);
+            }
+            String subType = "出库".equals(type)? "销售" : "";
+            String [] organArray = getOrganArray(subType, "");
+            list =depotHeadMapperEx.findInOutMaterialCount(beginTime, endTime, type, categoryList, forceFlag, inOutManageFlag, materialParam, depotList, oId,
+                    creatorArray, organArray, column, order, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int findInOutMaterialCountTotal(String beginTime, String endTime, String type, List<Long> categoryList,
+                                           Boolean forceFlag, Boolean inOutManageFlag, String materialParam,
+                                           List<Long> depotList, Long organizationId, Integer oId)throws Exception {
+        int result = 0;
+        try{
+            String [] creatorArray = getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = getCreatorArrayByOrg(organizationId);
+            }
+            String subType = "出库".equals(type)? "销售" : "";
+            String [] organArray = getOrganArray(subType, "");
+            result =depotHeadMapperEx.findInOutMaterialCountTotal(beginTime, endTime, type, categoryList, forceFlag, inOutManageFlag, materialParam, depotList, oId,
+                    creatorArray, organArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public DepotHeadVo4InOutMCount findInOutMaterialCountStatistic(String beginTime, String endTime, String type, List<Long> categoryList,
+                                                                Boolean forceFlag, Boolean inOutManageFlag, String materialParam,
+                                                                List<Long> depotList, Long organizationId, Integer oId) throws Exception {
+        DepotHeadVo4InOutMCount item = new DepotHeadVo4InOutMCount();
+        try{
+            String [] creatorArray = getCreatorArray();
+            if(creatorArray == null && organizationId != null) {
+                creatorArray = getCreatorArrayByOrg(organizationId);
+            }
+            String subType = "出库".equals(type)? "销售" : "";
+            String [] organArray = getOrganArray(subType, "");
+            List<DepotHeadVo4InOutMCount> list = depotHeadMapperEx.findInOutMaterialCountStatistic(beginTime, endTime, type, categoryList,
+                    forceFlag, inOutManageFlag, materialParam, depotList, oId, creatorArray, organArray);
+            if(list.size()>0) {
+                item.setNumSum(list.get(0).getNumSum());
+                item.setPriceSum(list.get(0).getPriceSum());
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return item;
+    }
+
+    public List<DepotHeadVo4InDetail> findAllocationDetail(String beginTime, String endTime, String subType, String number,
+                            String [] creatorArray, List<Long> categoryList, Boolean forceFlag, String materialParam, List<Long> depotList, List<Long> depotFList,
+                            String remark, String column, String order, Integer offset, Integer rows) throws Exception{
+        List<DepotHeadVo4InDetail> list = null;
+        try{
+            list =depotHeadMapperEx.findAllocationDetail(beginTime, endTime, subType, number, creatorArray, categoryList, forceFlag,
+                    materialParam, depotList, depotFList, remark, column, order, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int findAllocationDetailCount(String beginTime, String endTime, String subType, String number,
+                            String [] creatorArray, List<Long> categoryList, Boolean forceFlag, String materialParam, List<Long> depotList,  List<Long> depotFList,
+                            String remark) throws Exception{
+        int result = 0;
+        try{
+            result =depotHeadMapperEx.findAllocationDetailCount(beginTime, endTime, subType, number, creatorArray, categoryList, forceFlag,
+                    materialParam, depotList, depotFList, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public DepotHeadVo4InDetail findAllocationStatistic(String beginTime, String endTime, String subType, String number,
+                                                        String [] creatorArray, List<Long> categoryList, Boolean forceFlag, String materialParam, List<Long> depotList, List<Long> depotFList,
+                                                        String remark) throws Exception{
+        DepotHeadVo4InDetail item = new DepotHeadVo4InDetail();
+        try{
+            List<DepotHeadVo4InDetail> list =depotHeadMapperEx.findAllocationStatistic(beginTime, endTime, subType, number, creatorArray, categoryList, forceFlag,
+                    materialParam, depotList, depotFList, remark);
+            if(list.size()>0) {
+                item.setOperNumber(list.get(0).getOperNumber());
+                item.setAllPrice(list.get(0).getAllPrice());
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return item;
+    }
+
+    public List<DepotHeadVo4StatementAccount> getStatementAccount(String beginTime, String endTime, Integer organId, String [] organArray,
+                                                                  Integer hasDebt, String supplierType, String type, String subType, String typeBack,
+                                                                  String subTypeBack, String billType, Integer offset, Integer rows) {
+        List<DepotHeadVo4StatementAccount> list = null;
+        try{
+            list = depotHeadMapperEx.getStatementAccount(beginTime, endTime, organId, organArray, hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType, offset, rows);
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int getStatementAccountCount(String beginTime, String endTime, Integer organId, String [] organArray,
+                                        Integer hasDebt, String supplierType, String type, String subType, String typeBack, String subTypeBack, String billType) {
+        int result = 0;
+        try{
+            result = depotHeadMapperEx.getStatementAccountCount(beginTime, endTime, organId, organArray, hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType);
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<DepotHeadVo4StatementAccount> getStatementAccountTotalPay(String beginTime, String endTime, Integer organId, String [] organArray,
+                                                                          Integer hasDebt, String supplierType, String type, String subType,
+                                                                          String typeBack, String subTypeBack, String billType) {
+        List<DepotHeadVo4StatementAccount> list = null;
+        try{
+            list = depotHeadMapperEx.getStatementAccountTotalPay(beginTime, endTime, organId, organArray, hasDebt, supplierType, type, subType,typeBack, subTypeBack, billType);
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<DepotHeadVo4List> getDetailByNumber(String number, HttpServletRequest request)throws Exception {
+        List<DepotHeadVo4List> resList = new ArrayList<>();
+        try{
+            Long userId = userService.getUserId(request);
+            String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+            Map<Long,String> personMap = personService.getPersonMap();
+            Map<Long,String> accountMap = accountService.getAccountMap();
+            List<DepotHeadVo4List> list = depotHeadMapperEx.getDetailByNumber(number);
+            if (null != list) {
+                List<Long> idList = new ArrayList<>();
+                List<String> numberList = new ArrayList<>();
+                for (DepotHeadVo4List dh : list) {
+                    idList.add(dh.getId());
+                    numberList.add(dh.getNumber());
+                }
+                //通过批量查询去构造map
+                Map<Long,Integer> financialBillNoMap = getFinancialBillNoMapByBillIdList(idList);
+                Map<String,Integer> billSizeMap = getBillSizeMapByLinkNumberList(numberList);
+                Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
+                DepotHeadVo4List dh = list.get(0);
+                String billCategory = getBillCategory(dh.getSubType());
+                if(accountMap!=null && StringUtil.isNotEmpty(dh.getAccountIdList()) && StringUtil.isNotEmpty(dh.getAccountMoneyList())) {
+                    String accountStr = accountService.getAccountStrByIdAndMoney(accountMap, dh.getAccountIdList(), dh.getAccountMoneyList());
+                    dh.setAccountName(accountStr);
+                }
+                if(dh.getAccountIdList() != null) {
+                    String accountidlistStr = dh.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", "");
+                    dh.setAccountIdList(accountidlistStr);
+                }
+                if(dh.getAccountMoneyList() != null) {
+                    String accountmoneylistStr = dh.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
+                    dh.setAccountMoneyList(accountmoneylistStr);
+                }
+                if(dh.getChangeAmount() != null) {
+                    dh.setChangeAmount(roleService.parseBillPriceByLimit(dh.getChangeAmount().abs(), billCategory, priceLimit, request));
+                } else {
+                    dh.setChangeAmount(BigDecimal.ZERO);
+                }
+                if(dh.getTotalPrice() != null) {
+                    dh.setTotalPrice(roleService.parseBillPriceByLimit(dh.getTotalPrice().abs(), billCategory, priceLimit, request));
+                }
+                BigDecimal discountLastMoney = dh.getDiscountLastMoney()!=null?dh.getDiscountLastMoney():BigDecimal.ZERO;
+                dh.setDiscountLastMoney(roleService.parseBillPriceByLimit(discountLastMoney, billCategory, priceLimit, request));
+                BigDecimal backAmount = dh.getBackAmount()!=null?dh.getBackAmount():BigDecimal.ZERO;
+                dh.setBackAmount(roleService.parseBillPriceByLimit(backAmount, billCategory, priceLimit, request));
+                if(dh.getDeposit() == null) {
+                    dh.setDeposit(BigDecimal.ZERO);
+                } else {
+                    dh.setDeposit(roleService.parseBillPriceByLimit(dh.getDeposit(), billCategory, priceLimit, request));
+                }
+                //欠款计算
+                BigDecimal otherMoney = dh.getOtherMoney()!=null?dh.getOtherMoney():BigDecimal.ZERO;
+                BigDecimal deposit = dh.getDeposit()!=null?dh.getDeposit():BigDecimal.ZERO;
+                BigDecimal changeAmount = dh.getChangeAmount()!=null?dh.getChangeAmount():BigDecimal.ZERO;
+                BigDecimal debt = discountLastMoney.add(otherMoney).subtract((deposit.add(changeAmount)));
+                dh.setDebt(roleService.parseBillPriceByLimit(debt, billCategory, priceLimit, request));
+                //是否有付款单或收款单
+                if(financialBillNoMap!=null) {
+                    Integer financialBillNoSize = financialBillNoMap.get(dh.getId());
+                    dh.setHasFinancialFlag(financialBillNoSize!=null && financialBillNoSize>0);
+                }
+                //是否有退款单
+                if(billSizeMap!=null) {
+                    Integer billListSize = billSizeMap.get(dh.getNumber());
+                    dh.setHasBackFlag(billListSize!=null && billListSize>0);
+                }
+                if(StringUtil.isNotEmpty(dh.getSalesMan())) {
+                    dh.setSalesManStr(personService.getPersonByMapAndIds(personMap,dh.getSalesMan()));
+                }
+                if(dh.getOperTime() != null) {
+                    dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
+                }
+                //商品信息简述
+                if(materialsListMap!=null) {
+                    dh.setMaterialsList(materialsListMap.get(dh.getId()));
+                }
+                dh.setCreatorName(userService.getUser(dh.getCreator()).getUsername());
+                resList.add(dh);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    /**
+     * 查询除当前单据之外的关联单据列表
+     * @param linkNumber
+     * @param number
+     * @return
+     * @throws Exception
+     */
+    public List<DepotHead> getListByLinkNumberExceptCurrent(String linkNumber, String number, String type)throws Exception {
+        DepotHeadExample example = new DepotHeadExample();
+        example.createCriteria().andLinkNumberEqualTo(linkNumber).andNumberNotEqualTo(number).andTypeEqualTo(type)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        return depotHeadMapper.selectByExample(example);
+    }
+
+    /**
+     * 查询除当前单据之外的关联单据列表
+     * @param linkApply
+     * @param number
+     * @return
+     * @throws Exception
+     */
+    public List<DepotHead> getListByLinkApplyExceptCurrent(String linkApply, String number, String type)throws Exception {
+        DepotHeadExample example = new DepotHeadExample();
+        example.createCriteria().andLinkApplyEqualTo(linkApply).andNumberNotEqualTo(number).andTypeEqualTo(type)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        return depotHeadMapper.selectByExample(example);
+    }
+
+    /**
+     * 根据原单号查询关联的单据列表(批量)
+     * @param linkNumberList
+     * @return
+     * @throws Exception
+     */
+    public List<DepotHead> getBillListByLinkNumberList(List<String> linkNumberList)throws Exception {
+        if(linkNumberList!=null && linkNumberList.size()>0) {
+            DepotHeadExample example = new DepotHeadExample();
+            example.createCriteria().andLinkNumberIn(linkNumberList).andSubTypeLike("退货").andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            return depotHeadMapper.selectByExample(example);
+        } else {
+            return new ArrayList<>();
+        }
+    }
+
+    /**
+     * 根据原单号查询关联的单据列表
+     * @param linkNumber
+     * @return
+     * @throws Exception
+     */
+    public List<DepotHead> getBillListByLinkNumber(String linkNumber)throws Exception {
+        DepotHeadExample example = new DepotHeadExample();
+        example.createCriteria().andLinkNumberEqualTo(linkNumber).andSubTypeLike("退货").andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        return depotHeadMapper.selectByExample(example);
+    }
+
+    /**
+     * 新增单据主表及单据子表信息
+     * @param beanJson
+     * @param rows
+     * @param request
+     * @throws Exception
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void addDepotHeadAndDetail(String beanJson, String rows,
+                                      HttpServletRequest request) throws Exception {
+        /**处理单据主表数据*/
+        DepotHead depotHead = JSONObject.parseObject(beanJson, DepotHead.class);
+        //校验单号是否重复
+        if(checkIsBillNumberExist(0L, depotHead.getNumber())>0) {
+            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_CODE,
+                    String.format(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_MSG));
+        }
+        //校验是否同时录入关联请购单号和关联订单号
+        if(StringUtil.isNotEmpty(depotHead.getLinkNumber()) && StringUtil.isNotEmpty(depotHead.getLinkApply())) {
+            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_CODE,
+                    String.format(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_MSG));
+        }
+        String subType = depotHead.getSubType();
+        //结算账户校验
+        if("采购".equals(subType) || "采购退货".equals(subType) || "销售".equals(subType) || "销售退货".equals(subType)) {
+            if (StringUtil.isEmpty(depotHead.getAccountIdList()) && depotHead.getAccountId() == null) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_MSG));
+            }
+        }
+        //判断用户是否已经登录过,登录过不再处理
+        User userInfo=userService.getCurrentUser();
+        depotHead.setCreator(userInfo==null?null:userInfo.getId());
+        depotHead.setCreateTime(new Timestamp(System.currentTimeMillis()));
+        if(StringUtil.isEmpty(depotHead.getStatus())) {
+            depotHead.setStatus(BusinessConstants.BILLS_STATUS_UN_AUDIT);
+        }
+        depotHead.setPurchaseStatus(BusinessConstants.BILLS_STATUS_UN_AUDIT);
+        depotHead.setPayType(depotHead.getPayType()==null?"现付":depotHead.getPayType());
+        if(StringUtil.isNotEmpty(depotHead.getAccountIdList())){
+            depotHead.setAccountIdList(depotHead.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", ""));
+        }
+        if(StringUtil.isNotEmpty(depotHead.getAccountMoneyList())) {
+            //校验多账户的结算金额
+            String accountMoneyList = depotHead.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
+            BigDecimal sum = StringUtil.getArrSum(accountMoneyList.split(","));
+            BigDecimal manyAccountSum = sum.abs();
+            if(manyAccountSum.compareTo(depotHead.getChangeAmount().abs())!=0) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_MSG));
+            }
+            depotHead.setAccountMoneyList(accountMoneyList);
+        }
+        //校验累计扣除订金是否超出订单中的金额
+        if(depotHead.getDeposit()!=null && StringUtil.isNotEmpty(depotHead.getLinkNumber())) {
+            BigDecimal finishDeposit = depotHeadMapperEx.getFinishDepositByNumberExceptCurrent(depotHead.getLinkNumber(), depotHead.getNumber());
+            //订单中的订金金额
+            BigDecimal changeAmount = getDepotHead(depotHead.getLinkNumber()).getChangeAmount();
+            if(changeAmount!=null) {
+                BigDecimal preDeposit = changeAmount.abs();
+                if(depotHead.getDeposit().add(finishDeposit).compareTo(preDeposit)>0) {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_MSG));
+                }
+            }
+        }
+        //校验附件的数量
+        if(StringUtil.isNotEmpty(depotHead.getFileName())) {
+            String[] fileArr = depotHead.getFileName().split(",");
+            if(fileArr.length>4) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_MSG, 4));
+            }
+        }
+        depotHeadMapper.insertSelective(depotHead);
+        /**入库和出库处理预付款信息*/
+        if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPayType())){
+            if(depotHead.getOrganId()!=null) {
+                BigDecimal currentAdvanceIn = supplierService.getSupplier(depotHead.getOrganId()).getAdvanceIn();
+                if(currentAdvanceIn.compareTo(depotHead.getTotalPrice())>=0) {
+                    //更新会员的预付款
+                    supplierService.updateAdvanceIn(depotHead.getOrganId());
+                } else {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_MSG));
+                }
+            }
+        }
+        //根据单据编号查询单据id
+        DepotHeadExample dhExample = new DepotHeadExample();
+        dhExample.createCriteria().andNumberEqualTo(depotHead.getNumber()).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<DepotHead> list = depotHeadMapper.selectByExample(dhExample);
+        if(list!=null) {
+            Long headId = list.get(0).getId();
+            /**入库和出库处理单据子表信息*/
+            depotItemService.saveDetials(rows,headId, "add",request);
+        }
+        logService.insertLog("单据",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(depotHead.getNumber()).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+    }
+
+    /**
+     * 更新单据主表及单据子表信息
+     * @param beanJson
+     * @param rows
+     * @param request
+     * @throws Exception
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateDepotHeadAndDetail(String beanJson, String rows,HttpServletRequest request)throws Exception {
+        /**更新单据主表信息*/
+        DepotHead depotHead = JSONObject.parseObject(beanJson, DepotHead.class);
+        //校验单号是否重复
+        if(checkIsBillNumberExist(depotHead.getId(), depotHead.getNumber())>0) {
+            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_CODE,
+                    String.format(ExceptionConstants.DEPOT_HEAD_BILL_NUMBER_EXIST_MSG));
+        }
+        //校验是否同时录入关联请购单号和关联订单号
+        if(StringUtil.isNotEmpty(depotHead.getLinkNumber()) && StringUtil.isNotEmpty(depotHead.getLinkApply())) {
+            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_CODE,
+                    String.format(ExceptionConstants.DEPOT_ITEM_EXIST_REPEAT_NO_FAILED_MSG));
+        }
+        //校验单据状态,如果不是未审核则提示
+        if(!"0".equals(getDepotHead(depotHead.getId()).getStatus())) {
+            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_BILL_CANNOT_EDIT_CODE,
+                    String.format(ExceptionConstants.DEPOT_HEAD_BILL_CANNOT_EDIT_MSG));
+        }
+        //获取之前的会员id
+        Long preOrganId = getDepotHead(depotHead.getId()).getOrganId();
+        String subType = depotHead.getSubType();
+        //结算账户校验
+        if("采购".equals(subType) || "采购退货".equals(subType) || "销售".equals(subType) || "销售退货".equals(subType)) {
+            if (StringUtil.isEmpty(depotHead.getAccountIdList()) && depotHead.getAccountId() == null) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_ACCOUNT_FAILED_MSG));
+            }
+        }
+        if(StringUtil.isNotEmpty(depotHead.getAccountIdList())){
+            depotHead.setAccountIdList(depotHead.getAccountIdList().replace("[", "").replace("]", "").replaceAll("\"", ""));
+        }
+        if(StringUtil.isNotEmpty(depotHead.getAccountMoneyList())) {
+            //校验多账户的结算金额
+            String accountMoneyList = depotHead.getAccountMoneyList().replace("[", "").replace("]", "").replaceAll("\"", "");
+            BigDecimal sum = StringUtil.getArrSum(accountMoneyList.split(","));
+            BigDecimal manyAccountSum = sum.abs();
+            if(manyAccountSum.compareTo(depotHead.getChangeAmount().abs())!=0) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_MANY_ACCOUNT_FAILED_MSG));
+            }
+            depotHead.setAccountMoneyList(accountMoneyList);
+        }
+        //校验累计扣除订金是否超出订单中的金额
+        if(depotHead.getDeposit()!=null && StringUtil.isNotEmpty(depotHead.getLinkNumber())) {
+            BigDecimal finishDeposit = depotHeadMapperEx.getFinishDepositByNumberExceptCurrent(depotHead.getLinkNumber(), depotHead.getNumber());
+            //订单中的订金金额
+            BigDecimal changeAmount = getDepotHead(depotHead.getLinkNumber()).getChangeAmount();
+            if(changeAmount!=null) {
+                BigDecimal preDeposit = changeAmount.abs();
+                if(depotHead.getDeposit().add(finishDeposit).compareTo(preDeposit)>0) {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_DEPOSIT_OVER_PRE_MSG));
+                }
+            }
+        }
+        //校验附件的数量
+        if(StringUtil.isNotEmpty(depotHead.getFileName())) {
+            String[] fileArr = depotHead.getFileName().split(",");
+            if(fileArr.length>4) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_FILE_NUM_LIMIT_MSG, 4));
+            }
+        }
+        depotHeadMapper.updateByPrimaryKeySelective(depotHead);
+        //如果存在多账户结算需要将原账户的id置空
+        if(StringUtil.isNotEmpty(depotHead.getAccountIdList())) {
+            depotHeadMapperEx.setAccountIdToNull(depotHead.getId());
+        }
+        /**入库和出库处理预付款信息*/
+        if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPayType())){
+            if(depotHead.getOrganId()!=null){
+                BigDecimal currentAdvanceIn = supplierService.getSupplier(depotHead.getOrganId()).getAdvanceIn();
+                if(currentAdvanceIn.compareTo(depotHead.getTotalPrice())>=0) {
+                    //更新会员的预付款
+                    supplierService.updateAdvanceIn(depotHead.getOrganId());
+                    if(null != preOrganId && !preOrganId.equals(depotHead.getOrganId())) {
+                        //更新之前会员的预付款
+                        supplierService.updateAdvanceIn(preOrganId);
+                    }
+                } else {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_MEMBER_PAY_LACK_MSG));
+                }
+            }
+        }
+        /**入库和出库处理单据子表信息*/
+        depotItemService.saveDetials(rows,depotHead.getId(), "update",request);
+        logService.insertLog("单据",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(depotHead.getNumber()).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+    }
+
+    public Map<String, Object> getBuyAndSaleStatistics(String today, String monthFirstDay, String yesterdayBegin, String yesterdayEnd,
+                                                       String yearBegin, String yearEnd, HttpServletRequest request) throws Exception {
+        Long userId = userService.getUserId(request);
+        String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+        Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+        String[] creatorArray = getCreatorArray();
+        List<InOutPriceVo> inOutPriceVoList = depotHeadMapperEx.getBuyAndSaleStatisticsList(yearBegin, yearEnd, creatorArray, forceFlag);
+
+        String[] periods = {"today", "month", "yesterday", "year"};
+        String[] types = {"Buy", "BuyBack", "Sale", "SaleBack", "RetailSale", "RetailSaleBack"};
+
+        Map<String, BigDecimal> statistics = new HashMap<>();
+
+        // 初始化 statistics Map
+        for (String period : periods) {
+            for (String type : types) {
+                statistics.put(period + type, BigDecimal.ZERO);
+            }
+        }
+
+        Date todayDate = Tools.strToDate(today);
+        Date monthFirstDate = Tools.strToDate(monthFirstDay);
+        Date yesterdayStartDate = Tools.strToDate(yesterdayBegin);
+        Date yesterdayEndDate = Tools.strToDate(yesterdayEnd);
+        Date yearStartDate = Tools.strToDate(yearBegin);
+        Date yearEndDate = Tools.strToDate(yearEnd);
+
+        for (InOutPriceVo item : inOutPriceVoList) {
+            Date operTime = item.getOperTime();
+            BigDecimal discountLastMoney = item.getDiscountLastMoney();
+            BigDecimal totalPriceAbs = item.getTotalPrice().abs();
+
+            if (isWithinRange(operTime, todayDate, Tools.strToDate(getNow3()))) {
+                updateStatistics(statistics, item, "today", discountLastMoney, totalPriceAbs);
+            }
+
+            if (isWithinRange(operTime, monthFirstDate, Tools.strToDate(getNow3()))) {
+                updateStatistics(statistics, item, "month", discountLastMoney, totalPriceAbs);
+            }
+
+            if (isWithinRange(operTime, yesterdayStartDate, yesterdayEndDate)) {
+                updateStatistics(statistics, item, "yesterday", discountLastMoney, totalPriceAbs);
+            }
+
+            if (isWithinRange(operTime, yearStartDate, yearEndDate)) {
+                updateStatistics(statistics, item, "year", discountLastMoney, totalPriceAbs);
+            }
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        for (String period : periods) {
+            result.put(period + "Buy", roleService.parseHomePriceByLimit(statistics.get(period + "Buy").subtract(statistics.get(period + "BuyBack")), "buy", priceLimit, "***", request));
+            result.put(period + "Sale", roleService.parseHomePriceByLimit(statistics.get(period + "Sale").subtract(statistics.get(period + "SaleBack")), "sale", priceLimit, "***", request));
+            result.put(period + "RetailSale", roleService.parseHomePriceByLimit(statistics.get(period + "RetailSale").subtract(statistics.get(period + "RetailSaleBack")), "retail", priceLimit, "***", request));
+        }
+
+        return result;
+    }
+
+    private boolean isWithinRange(Date operTime, Date startDate, Date endDate) {
+        return operTime.compareTo(startDate) >= 0 && operTime.compareTo(endDate) <= 0;
+    }
+
+    private void updateStatistics(Map<String, BigDecimal> statistics, InOutPriceVo item, String period, BigDecimal discountLastMoney, BigDecimal totalPriceAbs) {
+        switch (item.getType()) {
+            case "入库":
+                switch (item.getSubType()) {
+                    case "采购":
+                        statistics.put(period + "Buy", statistics.get(period + "Buy").add(discountLastMoney));
+                        break;
+                    case "销售退货":
+                        statistics.put(period + "SaleBack", statistics.get(period + "SaleBack").add(discountLastMoney));
+                        break;
+                    case "零售退货":
+                        statistics.put(period + "RetailSaleBack", statistics.get(period + "RetailSaleBack").add(totalPriceAbs));
+                        break;
+                }
+                break;
+            case "出库":
+                switch (item.getSubType()) {
+                    case "采购退货":
+                        statistics.put(period + "BuyBack", statistics.get(period + "BuyBack").add(discountLastMoney));
+                        break;
+                    case "销售":
+                        statistics.put(period + "Sale", statistics.get(period + "Sale").add(discountLastMoney));
+                        break;
+                    case "零售":
+                        statistics.put(period + "RetailSale", statistics.get(period + "RetailSale").add(totalPriceAbs));
+                        break;
+                }
+                break;
+        }
+    }
+
+
+    public DepotHead getDepotHead(String number)throws Exception {
+        DepotHead depotHead = new DepotHead();
+        try{
+            DepotHeadExample example = new DepotHeadExample();
+            example.createCriteria().andNumberEqualTo(number).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            List<DepotHead> list = depotHeadMapper.selectByExample(example);
+            if(null!=list && list.size()>0) {
+                depotHead = list.get(0);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return depotHead;
+    }
+
+    public List<DepotHeadVo4List> debtList(Long organId, String materialParam, String number, String beginTime, String endTime,
+                                           String status, Integer offset, Integer rows) {
+        List<DepotHeadVo4List> resList = new ArrayList<>();
+        try{
+            String depotIds = depotService.findDepotStrByCurrentUser();
+            String [] depotArray=depotIds.split(",");
+            String [] creatorArray = getCreatorArray();
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            List<DepotHeadVo4List> list=depotHeadMapperEx.debtList(organId, creatorArray, status, number,
+                    beginTime, endTime, materialParam, depotArray, offset, rows);
+            if (null != list) {
+                resList = parseDebtBillList(list);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public int debtListCount(Long organId, String materialParam, String number, String beginTime, String endTime,
+                             String status) {
+        int total = 0;
+        try {
+            String depotIds = depotService.findDepotStrByCurrentUser();
+            String[] depotArray = depotIds.split(",");
+            String[] creatorArray = getCreatorArray();
+            beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime, BusinessConstants.DAY_LAST_TIME);
+            total = depotHeadMapperEx.debtListCount(organId, creatorArray, status, number,
+                    beginTime, endTime, materialParam, depotArray);
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return total;
+    }
+
+    public void debtExport(Long organId, String materialParam, String number, String type, String subType,
+                           String beginTime, String endTime, String status, String mpList,
+                           HttpServletRequest request, HttpServletResponse response) {
+        try {
+            Long userId = userService.getUserId(request);
+            String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+            String billCategory = getBillCategory(subType);
+            String depotIds = depotService.findDepotStrByCurrentUser();
+            String[] depotArray = depotIds.split(",");
+            String[] creatorArray = getCreatorArray();
+            status = StringUtil.isNotEmpty(status) ? status : null;
+            beginTime = Tools.parseDayToTime(beginTime, BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime, BusinessConstants.DAY_LAST_TIME);
+            List<DepotHeadVo4List> dhList = new ArrayList<>();
+            List<DepotHeadVo4List> list = depotHeadMapperEx.debtList(organId, creatorArray, status, number,
+                    beginTime, endTime, materialParam, depotArray, null, null);
+            if (null != list) {
+                dhList = parseDebtBillList(list);
+            }
+            //生成Excel文件
+            String fileName = "单据信息";
+            File file = new File("/opt/"+ fileName);
+            WritableWorkbook wtwb = Workbook.createWorkbook(file);
+            String oneTip = "";
+            String sheetOneStr = "";
+            if("采购".equals(subType)) {
+                oneTip = "供应商对账列表";
+                sheetOneStr = "供应商,单据编号,关联单据,商品信息,单据日期,操作员,单据金额,本单欠款,已付欠款,待付欠款,备注";
+            } else if("出库".equals(type) && "销售".equals(subType)) {
+                oneTip = "客户对账列表";
+                sheetOneStr = "客户,单据编号,关联单据,商品信息,单据日期,操作员,单据金额,本单欠款,已收欠款,待收欠款,备注";
+            }
+            if(StringUtil.isNotEmpty(beginTime) && StringUtil.isNotEmpty(endTime)) {
+                oneTip = oneTip + "(" + beginTime + "至" + endTime + ")";
+            }
+            List<String> sheetOneList = StringUtil.strToStringList(sheetOneStr);
+            String[] sheetOneArr = StringUtil.listToStringArray(sheetOneList);
+            List<Long> idList = new ArrayList<>();
+            List<String[]> billList = new ArrayList<>();
+            Map<Long, BillListCacheVo> billListCacheVoMap = new HashMap<>();
+            for (DepotHeadVo4List dh : dhList) {
+                idList.add(dh.getId());
+                BillListCacheVo billListCacheVo = new BillListCacheVo();
+                billListCacheVo.setNumber(dh.getNumber());
+                billListCacheVo.setOrganName(dh.getOrganName());
+                billListCacheVo.setOperTimeStr(getCenternTime(dh.getOperTime()));
+                billListCacheVoMap.put(dh.getId(), billListCacheVo);
+                String[] objs = new String[sheetOneArr.length];
+                objs[0] = dh.getOrganName();
+                objs[1] = dh.getNumber();
+                objs[2] = dh.getLinkNumber();
+                objs[3] = dh.getMaterialsList();
+                objs[4] = dh.getOperTimeStr();
+                objs[5] = dh.getUserName();
+                BigDecimal discountLastMoney = dh.getDiscountLastMoney() == null ? BigDecimal.ZERO : dh.getDiscountLastMoney();
+                BigDecimal otherMoney = dh.getOtherMoney() == null ? BigDecimal.ZERO : dh.getOtherMoney();
+                BigDecimal deposit = dh.getDeposit() == null ? BigDecimal.ZERO : dh.getDeposit();
+                objs[6] = parseDecimalToStr(discountLastMoney.add(otherMoney).subtract(deposit), 2);
+                objs[7] = parseDecimalToStr(dh.getNeedDebt(), 2);
+                objs[8] = parseDecimalToStr(dh.getFinishDebt(), 2);
+                objs[9] = parseDecimalToStr(dh.getDebt(), 2);
+                objs[10] = dh.getRemark();
+                billList.add(objs);
+            }
+            ExcelUtils.exportObjectsManySheet(wtwb, oneTip, sheetOneArr, "单据列表", 0, billList);
+            //导出明细数据
+            if(idList.size()>0) {
+                List<DepotItemVo4WithInfoEx> dataList = depotItemMapperEx.getBillDetailListByIds(idList);
+                String[] mpArr = mpList.split(",");
+                String twoTip = "";
+                String sheetTwoStr = "";
+                if ("采购".equals(subType)) {
+                    twoTip = "供应商单据明细";
+                    sheetTwoStr = "供应商,单据编号,单据日期,仓库名称,条码,名称,规格,型号,颜色,品牌,制造商,扩展信息,单位,序列号,批号,有效期,多属性,数量,单价,金额,税率(%),税额,价税合计,重量,备注";
+                } else if ("销售".equals(subType)) {
+                    twoTip = "客户单据明细";
+                    sheetTwoStr = "客户,单据编号,单据日期,仓库名称,条码,名称,规格,型号,颜色,品牌,制造商,扩展信息,单位,序列号,批号,有效期,多属性,数量,单价,金额,税率(%),税额,价税合计,重量,备注";
+                }
+                if (StringUtil.isNotEmpty(beginTime) && StringUtil.isNotEmpty(endTime)) {
+                    twoTip = twoTip + "(" + beginTime + "至" + endTime + ")";
+                }
+                List<String> sheetTwoList = StringUtil.strToStringList(sheetTwoStr);
+                String[] sheetTwoArr = StringUtil.listToStringArray(sheetTwoList);
+                List<String[]> billDetail = new ArrayList<>();
+                for (DepotItemVo4WithInfoEx diEx : dataList) {
+                    String[] objs = new String[sheetTwoArr.length];
+                    BillListCacheVo billListCacheVo = billListCacheVoMap.get(diEx.getHeaderId());
+                    objs[0] = billListCacheVo != null ? billListCacheVo.getOrganName() : "";
+                    objs[1] = billListCacheVo != null ? billListCacheVo.getNumber() : "";
+                    objs[2] = billListCacheVo != null ? billListCacheVo.getOperTimeStr() : "";
+                    objs[3] = diEx.getDepotId() == null ? "" : diEx.getDepotName();
+                    objs[4] = diEx.getBarCode();
+                    objs[5] = diEx.getMName();
+                    objs[6] = diEx.getMStandard();
+                    objs[7] = diEx.getMModel();
+                    objs[8] = diEx.getMColor();
+                    objs[9] = diEx.getBrand();
+                    objs[10] = diEx.getMMfrs();
+                    objs[11] = depotItemService.getOtherInfo(mpArr, diEx);
+                    objs[12] = diEx.getMaterialUnit();
+                    objs[13] = diEx.getSnList();
+                    objs[14] = diEx.getBatchNumber();
+                    objs[15] = Tools.parseDateToStr(diEx.getExpirationDate());
+                    objs[16] = diEx.getSku();
+                    objs[17] = parseDecimalToStr(diEx.getOperNumber(), 2);
+                    objs[18] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getUnitPrice(), billCategory, priceLimit, request), 2);
+                    objs[19] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getAllPrice(), billCategory, priceLimit, request), 2);
+                    objs[20] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getTaxRate(), billCategory, priceLimit, request), 2);
+                    objs[21] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getTaxMoney(), billCategory, priceLimit, request), 2);
+                    objs[22] = parseDecimalToStr(roleService.parseBillPriceByLimit(diEx.getTaxLastMoney(), billCategory, priceLimit, request), 2);
+                    BigDecimal allWeight = diEx.getBasicNumber() == null || diEx.getWeight() == null ? BigDecimal.ZERO : diEx.getBasicNumber().multiply(diEx.getWeight());
+                    objs[23] = parseDecimalToStr(allWeight, 2);
+                    objs[24] = diEx.getRemark();
+                    billDetail.add(objs);
+                }
+                ExcelUtils.exportObjectsManySheet(wtwb, twoTip, sheetTwoArr, "单据明细", 1, billDetail);
+            }
+            wtwb.write();
+            wtwb.close();
+            ExcelUtils.downloadExcel(file, file.getName(), response);
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+    }
+
+    public List<DepotHeadVo4List> parseDebtBillList(List<DepotHeadVo4List> list) throws Exception {
+        List<Long> idList = new ArrayList<>();
+        List<DepotHeadVo4List> dhList = new ArrayList<>();
+        for (DepotHeadVo4List dh : list) {
+            idList.add(dh.getId());
+        }
+        //通过批量查询去构造map
+        Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
+        for (DepotHeadVo4List dh : list) {
+            if(dh.getChangeAmount() != null) {
+                dh.setChangeAmount(dh.getChangeAmount().abs());
+            }
+            if(dh.getTotalPrice() != null) {
+                dh.setTotalPrice(dh.getTotalPrice().abs());
+            }
+            if(dh.getDeposit() == null) {
+                dh.setDeposit(BigDecimal.ZERO);
+            }
+            if(dh.getOperTime() != null) {
+                dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
+            }
+            BigDecimal discountLastMoney = dh.getDiscountLastMoney()!=null?dh.getDiscountLastMoney():BigDecimal.ZERO;
+            BigDecimal otherMoney = dh.getOtherMoney()!=null?dh.getOtherMoney():BigDecimal.ZERO;
+            BigDecimal deposit = dh.getDeposit()!=null?dh.getDeposit():BigDecimal.ZERO;
+            BigDecimal changeAmount = dh.getChangeAmount()!=null?dh.getChangeAmount().abs():BigDecimal.ZERO;
+            //本单欠款(如果退货则为负数)
+            dh.setNeedDebt(discountLastMoney.add(otherMoney).subtract(deposit.add(changeAmount)));
+            if(BusinessConstants.SUB_TYPE_PURCHASE_RETURN.equals(dh.getSubType()) || BusinessConstants.SUB_TYPE_SALES_RETURN.equals(dh.getSubType())) {
+                dh.setNeedDebt(BigDecimal.ZERO.subtract(dh.getNeedDebt()));
+            }
+            BigDecimal needDebt = dh.getNeedDebt()!=null?dh.getNeedDebt():BigDecimal.ZERO;
+            BigDecimal finishDebt = accountItemService.getEachAmountByBillId(dh.getId());
+            finishDebt = finishDebt!=null?finishDebt:BigDecimal.ZERO;
+            //已收欠款
+            dh.setFinishDebt(finishDebt);
+            //待收欠款
+            dh.setDebt(needDebt.subtract(finishDebt));
+            //商品信息简述
+            if(materialsListMap!=null) {
+                dh.setMaterialsList(materialsListMap.get(dh.getId()));
+            }
+            dhList.add(dh);
+        }
+        return dhList;
+    }
+
+    public String getBillCategory(String subType) {
+        if(subType.equals("零售") || subType.equals("零售退货")) {
+            return "retail";
+        } else if(subType.equals("销售订单") || subType.equals("销售") || subType.equals("销售退货")) {
+            return "sale";
+        } else {
+            return "buy";
+        }
+    }
+
+    /**
+     * 格式化金额样式
+     * @param decimal
+     * @param num
+     * @return
+     */
+    private String parseDecimalToStr(BigDecimal decimal, Integer num) {
+        return decimal == null ? "" : decimal.setScale(num, BigDecimal.ROUND_HALF_UP).toString();
+    }
+
+    private String parseStatusToStr(String status, String type) {
+        if(StringUtil.isNotEmpty(status)) {
+            if("purchase".equals(type)) {
+                switch (status) {
+                    case "2":
+                        return "完成采购";
+                    case "3":
+                        return "部分采购";
+                }
+            } else if("sale".equals(type)) {
+                switch (status) {
+                    case "2":
+                        return "完成销售";
+                    case "3":
+                        return "部分销售";
+                }
+            }
+            switch (status) {
+                case "0":
+                    return "未审核";
+                case "1":
+                    return "已审核";
+                case "9":
+                    return "审核中";
+            }
+        }
+        return "";
+    }
+
+    public List<DepotHeadVo4List> waitBillList(String number, String materialParam, String type, String subType,
+                                               String beginTime, String endTime, String status, int offset, int rows) {
+        List<DepotHeadVo4List> resList = new ArrayList<>();
+        try{
+            String [] depotArray = getDepotArray("其它");
+            //给仓管可以看全部的单据(此时可以通过分配仓库去控制权限)
+            String [] creatorArray = null;
+            String [] subTypeArray = StringUtil.isNotEmpty(subType) ? subType.split(",") : null;
+            String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
+            Map<Long,String> accountMap = accountService.getAccountMap();
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            List<DepotHeadVo4List> list = depotHeadMapperEx.waitBillList(type, subTypeArray, creatorArray, statusArray, number, beginTime, endTime,
+                    materialParam, depotArray, offset, rows);
+            if (null != list) {
+                List<Long> idList = new ArrayList<>();
+                for (DepotHeadVo4List dh : list) {
+                    idList.add(dh.getId());
+                }
+                //通过批量查询去构造map
+                Map<Long,String> materialsListMap = findMaterialsListMapByHeaderIdList(idList);
+                Map<Long,BigDecimal> materialCountListMap = getMaterialCountListMapByHeaderIdList(idList);
+                for (DepotHeadVo4List dh : list) {
+                    if(accountMap!=null && StringUtil.isNotEmpty(dh.getAccountIdList()) && StringUtil.isNotEmpty(dh.getAccountMoneyList())) {
+                        String accountStr = accountService.getAccountStrByIdAndMoney(accountMap, dh.getAccountIdList(), dh.getAccountMoneyList());
+                        dh.setAccountName(accountStr);
+                    }
+                    if(dh.getOperTime() != null) {
+                        dh.setOperTimeStr(getCenternTime(dh.getOperTime()));
+                    }
+                    //商品信息简述
+                    if(materialsListMap!=null) {
+                        dh.setMaterialsList(materialsListMap.get(dh.getId()));
+                    }
+                    //商品总数量
+                    if(materialCountListMap!=null) {
+                        dh.setMaterialCount(materialCountListMap.get(dh.getId()));
+                    }
+                    resList.add(dh);
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public Long waitBillCount(String number, String materialParam, String type, String subType,
+                             String beginTime, String endTime, String status) {
+        Long result=null;
+        try{
+            String [] depotArray = getDepotArray("其它");
+            //给仓管可以看全部的单据(此时可以通过分配仓库去控制权限)
+            String [] creatorArray = null;
+            String [] subTypeArray = StringUtil.isNotEmpty(subType) ? subType.split(",") : null;
+            String [] statusArray = StringUtil.isNotEmpty(status) ? status.split(",") : null;
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            result=depotHeadMapperEx.waitBillCount(type, subTypeArray, creatorArray, statusArray, number, beginTime, endTime,
+                    materialParam, depotArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void batchAddDepotHeadAndDetail(String ids, HttpServletRequest request) throws Exception {
+        List<DepotHead> dhList = getDepotHeadListByIds(ids);
+        StringBuilder sb = new StringBuilder();
+        User userInfo=userService.getCurrentUser();
+        for(DepotHead depotHead : dhList) {
+            String prefixNo = BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType())?"QTRK":"QTCK";
+            //关联单据单号
+            String oldNumber = depotHead.getNumber();
+            //校验单据最新状态不能进行批量操作
+            if("0".equals(depotHead.getStatus()) || "2".equals(depotHead.getStatus()) || "9".equals(depotHead.getStatus())) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_NEW_STATUS_FAILED_CODE,
+                        String.format(ExceptionConstants.DEPOT_ITEM_EXIST_NEW_STATUS_FAILED_MSG, oldNumber, depotHead.getType()));
+            }
+            //校验是否是部分入库或者部分出库
+            if("3".equals(depotHead.getStatus())) {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_PARTIALLY_STATUS_FAILED_CODE,
+                        String.format(ExceptionConstants.DEPOT_ITEM_EXIST_PARTIALLY_STATUS_FAILED_MSG, oldNumber, depotHead.getType()));
+            }
+            depotHead.setLinkNumber(oldNumber);
+            //给单号重新赋值
+            String number = prefixNo + sequenceService.buildOnlyNumber();
+            depotHead.setNumber(number);
+            depotHead.setDefaultNumber(number);
+            depotHead.setOperTime(new Date());
+            depotHead.setSubType(BusinessConstants.SUB_TYPE_OTHER);
+            depotHead.setChangeAmount(BigDecimal.ZERO);
+            depotHead.setTotalPrice(BigDecimal.ZERO);
+            depotHead.setDiscountLastMoney(BigDecimal.ZERO);
+            depotHead.setCreator(userInfo==null?null:userInfo.getId());
+            depotHead.setOrganId(null);
+            depotHead.setAccountId(null);
+            depotHead.setAccountIdList(null);
+            depotHead.setAccountMoneyList(null);
+            depotHead.setSalesMan(null);
+            depotHead.setStatus("0");
+            depotHead.setTenantId(null);
+            //查询明细
+            List<DepotItemVo4WithInfoEx> itemList = depotItemService.getDetailList(depotHead.getId());
+            depotHead.setId(null);
+            JSONArray rowArr = new JSONArray();
+            for(DepotItemVo4WithInfoEx item: itemList) {
+                if("1".equals(item.getEnableSerialNumber())) {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_SERIAL_NUMBER_FAILED_CODE,
+                            String.format(ExceptionConstants.DEPOT_ITEM_EXIST_SERIAL_NUMBER_FAILED_MSG, oldNumber));
+                }
+                if("1".equals(item.getEnableBatchNumber())) {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_EXIST_BATCH_NUMBER_FAILED_CODE,
+                            String.format(ExceptionConstants.DEPOT_ITEM_EXIST_BATCH_NUMBER_FAILED_MSG, oldNumber));
+                }
+                item.setUnitPrice(BigDecimal.ZERO);
+                item.setAllPrice(BigDecimal.ZERO);
+                item.setLinkId(item.getId());
+                item.setTenantId(null);
+                String itemStr = JSONObject.toJSONString(item);
+                JSONObject itemObj = JSONObject.parseObject(itemStr);
+                itemObj.put("unit", itemObj.getString("materialUnit"));
+                rowArr.add(itemObj.toJSONString());
+            }
+            String rows = rowArr.toJSONString();
+            //新增其它入库单或其它出库单
+            sb.append("[").append(depotHead.getNumber()).append("]");
+            depotHeadMapper.insertSelective(depotHead);
+            //根据单据编号查询单据id
+            DepotHeadExample dhExample = new DepotHeadExample();
+            dhExample.createCriteria().andNumberEqualTo(depotHead.getNumber()).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            List<DepotHead> list = depotHeadMapper.selectByExample(dhExample);
+            if(list!=null) {
+                Long headId = list.get(0).getId();
+                /**入库和出库处理单据子表信息*/
+                depotItemService.saveDetials(rows, headId, "add", request);
+            }
+        }
+        logService.insertLog("单据",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_BATCH_ADD).append(sb).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/depotItem/DepotItemComponent.java b/src/main/java/com/jsh/erp/service/depotItem/DepotItemComponent.java
new file mode 100644
index 0000000..8c74baf
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depotItem/DepotItemComponent.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.service.depotItem;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "depotItem_component")
+@DepotItemResource
+public class DepotItemComponent implements ICommonQuery {
+
+    @Resource
+    private DepotItemService depotItemService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return depotItemService.getDepotItem(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getDepotItemList(map);
+    }
+
+    private List<?> getDepotItemList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer type = StringUtil.parseInteger(StringUtil.getInfo(search, "type"));
+        String remark = StringUtil.getInfo(search, "remark");
+        String order = QueryUtils.order(map);
+        return depotItemService.select(name, type, remark, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer type = StringUtil.parseInteger(StringUtil.getInfo(search, "type"));
+        String remark = StringUtil.getInfo(search, "remark");
+        return depotItemService.countDepotItem(name, type, remark);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return depotItemService.insertDepotItem(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return depotItemService.updateDepotItem(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return depotItemService.deleteDepotItem(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return depotItemService.batchDeleteDepotItem(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return depotItemService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/depotItem/DepotItemResource.java b/src/main/java/com/jsh/erp/service/depotItem/DepotItemResource.java
new file mode 100644
index 0000000..e8ff2cc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depotItem/DepotItemResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.depotItem;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "depotItem")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DepotItemResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java b/src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java
new file mode 100644
index 0000000..7f8b923
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/depotItem/DepotItemService.java
@@ -0,0 +1,1442 @@
+package com.jsh.erp.service.depotItem;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.*;
+import com.jsh.erp.datasource.vo.DepotItemStockWarningCount;
+import com.jsh.erp.datasource.vo.DepotItemVo4Stock;
+import com.jsh.erp.datasource.vo.DepotItemVoBatchNumberList;
+import com.jsh.erp.datasource.vo.InOutPriceVo;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.material.MaterialService;
+import com.jsh.erp.service.materialExtend.MaterialExtendService;
+import com.jsh.erp.service.serialNumber.SerialNumberService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.unit.UnitService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service
+public class DepotItemService {
+    private Logger logger = LoggerFactory.getLogger(DepotItemService.class);
+
+    private final static String TYPE = "入库";
+    private final static String SUM_TYPE = "number";
+    private final static String IN = "in";
+    private final static String OUT = "out";
+
+    @Resource
+    private DepotItemMapper depotItemMapper;
+    @Resource
+    private DepotItemMapperEx depotItemMapperEx;
+    @Resource
+    private MaterialService materialService;
+    @Resource
+    private MaterialExtendService materialExtendService;
+    @Resource
+    private SerialNumberMapperEx serialNumberMapperEx;
+    @Resource
+    private DepotHeadService depotHeadService;
+    @Resource
+    private DepotHeadMapper depotHeadMapper;
+    @Resource
+    private SerialNumberService serialNumberService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private SystemConfigService systemConfigService;
+    @Resource
+    private DepotService depotService;
+    @Resource
+    private UnitService unitService;
+    @Resource
+    private MaterialCurrentStockMapper materialCurrentStockMapper;
+    @Resource
+    private MaterialCurrentStockMapperEx materialCurrentStockMapperEx;
+    @Resource
+    private LogService logService;
+
+    public DepotItem getDepotItem(long id)throws Exception {
+        DepotItem result=null;
+        try{
+            result=depotItemMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<DepotItem> getDepotItem()throws Exception {
+        DepotItemExample example = new DepotItemExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<DepotItem> list=null;
+        try{
+            list=depotItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<DepotItem> select(String name, Integer type, String remark, int offset, int rows)throws Exception {
+        List<DepotItem> list=null;
+        try{
+            list=depotItemMapperEx.selectByConditionDepotItem(name, type, remark, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countDepotItem(String name, Integer type, String remark) throws Exception{
+        Long result =null;
+        try{
+            result=depotItemMapperEx.countsByDepotItem(name, type, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertDepotItem(JSONObject obj, HttpServletRequest request)throws Exception {
+        DepotItem depotItem = JSONObject.parseObject(obj.toJSONString(), DepotItem.class);
+        int result =0;
+        try{
+            result=depotItemMapper.insertSelective(depotItem);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateDepotItem(JSONObject obj, HttpServletRequest request)throws Exception {
+        DepotItem depotItem = JSONObject.parseObject(obj.toJSONString(), DepotItem.class);
+        int result =0;
+        try{
+            result=depotItemMapper.updateByPrimaryKeySelective(depotItem);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteDepotItem(Long id, HttpServletRequest request)throws Exception {
+        int result =0;
+        try{
+            result=depotItemMapper.deleteByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteDepotItem(String ids, HttpServletRequest request)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        DepotItemExample example = new DepotItemExample();
+        example.createCriteria().andIdIn(idList);
+        int result =0;
+        try{
+            result=depotItemMapper.deleteByExample(example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        DepotItemExample example = new DepotItemExample();
+        example.createCriteria().andIdNotEqualTo(id).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<DepotItem> list =null;
+        try{
+            list=depotItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public List<DepotItemVo4DetailByTypeAndMId> findDetailByDepotIdsAndMaterialIdList(String depotIds, Boolean forceFlag, Boolean inOutManageFlag, String sku, String batchNumber,
+                                                                                      String number, String beginTime, String endTime, Long mId, Integer offset, Integer rows)throws Exception {
+        Long depotId = null;
+        if(StringUtil.isNotEmpty(depotIds)) {
+            depotId = Long.parseLong(depotIds);
+        }
+        List<Long> depotList = depotService.parseDepotList(depotId);
+        Long[] depotIdArray = StringUtil.listToLongArray(depotList);
+        List<DepotItemVo4DetailByTypeAndMId> list =null;
+        try{
+            list = depotItemMapperEx.findDetailByDepotIdsAndMaterialIdList(depotIdArray, forceFlag, inOutManageFlag, sku, batchNumber, number, beginTime, endTime, mId, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long findDetailByDepotIdsAndMaterialIdCount(String depotIds, Boolean forceFlag, Boolean inOutManageFlag, String sku, String batchNumber,
+                                                       String number, String beginTime, String endTime, Long mId)throws Exception {
+        Long depotId = null;
+        if(StringUtil.isNotEmpty(depotIds)) {
+            depotId = Long.parseLong(depotIds);
+        }
+        List<Long> depotList = depotService.parseDepotList(depotId);
+        Long[] depotIdArray = StringUtil.listToLongArray(depotList);
+        Long result =null;
+        try{
+            result = depotItemMapperEx.findDetailByDepotIdsAndMaterialIdCount(depotIdArray, forceFlag, inOutManageFlag, sku, batchNumber, number, beginTime, endTime, mId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertDepotItemWithObj(DepotItem depotItem)throws Exception {
+        int result =0;
+        try{
+            result = depotItemMapper.insertSelective(depotItem);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateDepotItemWithObj(DepotItem depotItem)throws Exception {
+        int result =0;
+        try{
+            result = depotItemMapper.updateByPrimaryKeySelective(depotItem);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<DepotItem> getListByHeaderId(Long headerId)throws Exception {
+        List<DepotItem> list =null;
+        try{
+            DepotItemExample example = new DepotItemExample();
+            example.createCriteria().andHeaderIdEqualTo(headerId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            list = depotItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    /**
+     * 查询当前单据中指定商品的明细信息
+     * @param headerId
+     * @param meId
+     * @return
+     * @throws Exception
+     */
+    public DepotItem getItemByHeaderIdAndMaterial(Long headerId, Long meId)throws Exception {
+        DepotItem depotItem = new DepotItem();
+        try{
+            DepotItemExample example = new DepotItemExample();
+            example.createCriteria().andHeaderIdEqualTo(headerId).andMaterialExtendIdEqualTo(meId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            List<DepotItem> list = depotItemMapper.selectByExample(example);
+            if(list!=null && list.size()>0) {
+                depotItem = list.get(0);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return depotItem;
+    }
+
+    /**
+     * 查询被关联订单中指定商品的明细信息
+     * @param linkStr
+     * @param meId
+     * @return
+     * @throws Exception
+     */
+    public DepotItem getPreItemByHeaderIdAndMaterial(String linkStr, Long meId, Long linkId)throws Exception {
+        DepotItem depotItem = new DepotItem();
+        try{
+            DepotHead depotHead = depotHeadService.getDepotHead(linkStr);
+            if(null!=depotHead && null!=depotHead.getId()) {
+                DepotItemExample example = new DepotItemExample();
+                example.createCriteria().andHeaderIdEqualTo(depotHead.getId()).andMaterialExtendIdEqualTo(meId).andIdEqualTo(linkId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                List<DepotItem> list = depotItemMapper.selectByExample(example);
+                if(list!=null && list.size()>0) {
+                    depotItem = list.get(0);
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return depotItem;
+    }
+
+    public List<DepotItemVo4WithInfoEx> getDetailList(Long headerId)throws Exception {
+        List<DepotItemVo4WithInfoEx> list =null;
+        try{
+            list = depotItemMapperEx.getDetailList(headerId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<DepotItemVo4WithInfoEx> getInOutStock(String materialParam, List<Long> categoryIdList, String endTime, Integer offset, Integer rows)throws Exception {
+        List<DepotItemVo4WithInfoEx> list =null;
+        try{
+            list = depotItemMapperEx.getInOutStock(materialParam, categoryIdList, endTime, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int getInOutStockCount(String materialParam, List<Long> categoryIdList, String endTime)throws Exception {
+        int result=0;
+        try{
+            result = depotItemMapperEx.getInOutStockCount(materialParam, categoryIdList, endTime);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<DepotItemVo4WithInfoEx> getListWithBuyOrSale(String materialParam, String billType,
+                                                             String beginTime, String endTime, String[] creatorArray, Long organId, String[] organArray, List<Long> categoryList, List<Long> depotList, Boolean forceFlag, Integer offset, Integer rows)throws Exception {
+        List<DepotItemVo4WithInfoEx> list =null;
+        try{
+            list = depotItemMapperEx.getListWithBuyOrSale(materialParam, billType, beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int getListWithBuyOrSaleCount(String materialParam, String billType,
+                                         String beginTime, String endTime, String[] creatorArray, Long organId, String[] organArray, List<Long> categoryList, List<Long> depotList, Boolean forceFlag)throws Exception {
+        int result=0;
+        try{
+            result = depotItemMapperEx.getListWithBuyOrSaleCount(materialParam, billType, beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public BigDecimal buyOrSale(String type, String subType, Long MId, String beginTime, String endTime,
+                                String[] creatorArray, Long organId, String [] organArray, List<Long> depotList, Boolean forceFlag, String sumType) throws Exception{
+        BigDecimal result= BigDecimal.ZERO;
+        try{
+            if (SUM_TYPE.equals(sumType)) {
+                result= depotItemMapperEx.buyOrSaleNumber(type, subType, MId, beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, sumType);
+            } else {
+                result= depotItemMapperEx.buyOrSalePrice(type, subType, MId, beginTime, endTime, creatorArray, organId, organArray, depotList, forceFlag, sumType);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public BigDecimal buyOrSalePriceTotal(String type, String subType, String materialParam, String beginTime, String endTime,
+                                String[] creatorArray, Long organId, String [] organArray, List<Long> categoryList, List<Long> depotList, Boolean forceFlag) throws Exception{
+        BigDecimal result= BigDecimal.ZERO;
+        try{
+            result= depotItemMapperEx.buyOrSalePriceTotal(type, subType, materialParam, beginTime, endTime, creatorArray, organId, organArray, categoryList, depotList, forceFlag);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+
+    }
+
+    /**
+     * 统计采购、销售、零售的总金额列表
+     * @param beginTime
+     * @param endTime
+     * @return
+     * @throws Exception
+     */
+    public List<InOutPriceVo> inOrOutPriceList(String beginTime, String endTime) throws Exception{
+        List<InOutPriceVo> result = new ArrayList<>();
+        try{
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+            result = depotItemMapperEx.inOrOutPriceList(beginTime, endTime, creatorArray, forceFlag);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void saveDetials(String rows, Long headerId, String actionType, HttpServletRequest request) throws Exception{
+        //查询单据主表信息
+        DepotHead depotHead =depotHeadMapper.selectByPrimaryKey(headerId);
+        //删除序列号和回收序列号
+        deleteOrCancelSerialNumber(actionType, depotHead, headerId);
+        //删除单据的明细
+        deleteDepotItemHeadId(headerId);
+        JSONArray rowArr = JSONArray.parseArray(rows);
+        if (null != rowArr && rowArr.size()>0) {
+            //针对组装单、拆卸单校验是否存在组合件和普通子件
+            checkAssembleWithMaterialType(rowArr, depotHead.getSubType());
+            for (int i = 0; i < rowArr.size(); i++) {
+                DepotItem depotItem = new DepotItem();
+                JSONObject rowObj = JSONObject.parseObject(rowArr.getString(i));
+                depotItem.setHeaderId(headerId);
+                String barCode = rowObj.getString("barCode");
+                MaterialExtend materialExtend = materialExtendService.getInfoByBarCode(barCode);
+                if(materialExtend == null) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_IS_NOT_EXIST_CODE,
+                            String.format(ExceptionConstants.MATERIAL_BARCODE_IS_NOT_EXIST_MSG, barCode));
+                }
+                depotItem.setMaterialId(materialExtend.getMaterialId());
+                depotItem.setMaterialExtendId(materialExtend.getId());
+                depotItem.setMaterialUnit(rowObj.getString("unit"));
+                Material material= materialService.getMaterial(depotItem.getMaterialId());
+                if (BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED.equals(material.getEnableSerialNumber()) ||
+                        BusinessConstants.ENABLE_BATCH_NUMBER_ENABLED.equals(material.getEnableBatchNumber())) {
+                    //组装拆卸单不能选择批号或序列号商品
+                    if(BusinessConstants.SUB_TYPE_ASSEMBLE.equals(depotHead.getSubType()) ||
+                            BusinessConstants.SUB_TYPE_DISASSEMBLE.equals(depotHead.getSubType())) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_ASSEMBLE_SELECT_ERROR_CODE,
+                                String.format(ExceptionConstants.MATERIAL_ASSEMBLE_SELECT_ERROR_MSG, barCode));
+                    }
+                    //调拨单不能选择批号或序列号商品(该场景走出库和入库单)
+                    if(BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubType())) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_TRANSFER_SELECT_ERROR_CODE,
+                                String.format(ExceptionConstants.MATERIAL_TRANSFER_SELECT_ERROR_MSG, barCode));
+                    }
+                    //盘点业务不能选择批号或序列号商品(该场景走出库和入库单)
+                    if(BusinessConstants.SUB_TYPE_CHECK_ENTER.equals(depotHead.getSubType())
+                       ||BusinessConstants.SUB_TYPE_REPLAY.equals(depotHead.getSubType())) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_STOCK_CHECK_ERROR_CODE,
+                                String.format(ExceptionConstants.MATERIAL_STOCK_CHECK_ERROR_MSG, barCode));
+                    }
+                }
+                if (StringUtil.isExist(rowObj.get("snList"))) {
+                    depotItem.setSnList(rowObj.getString("snList"));
+                    if(StringUtil.isExist(rowObj.get("depotId"))) {
+                        String [] snArray = depotItem.getSnList().split(",");
+                        int operNum = rowObj.getInteger("operNumber");
+                        if(snArray.length == operNum) {
+                            Long depotId = rowObj.getLong("depotId");
+                            BigDecimal inPrice = BigDecimal.ZERO;
+                            if (StringUtil.isExist(rowObj.get("unitPrice"))) {
+                                inPrice = rowObj.getBigDecimal("unitPrice");
+                            }
+                            serialNumberService.addSerialNumberByBill(depotHead.getType(), depotHead.getSubType(),
+                                    depotHead.getNumber(), materialExtend.getMaterialId(), depotId, inPrice, depotItem.getSnList());
+                        } else {
+                            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_SN_NUMBERE_FAILED_CODE,
+                                    String.format(ExceptionConstants.DEPOT_HEAD_SN_NUMBERE_FAILED_MSG, barCode));
+                        }
+                    }
+                } else {
+                    //入库或出库
+                    if (BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType()) ||
+                            BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())) {
+                        //序列号不能为空
+                        if (BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED.equals(material.getEnableSerialNumber())) {
+                            //如果开启出入库管理,并且类型等于采购、采购退货、销售、销售退货,则跳过
+                            if(systemConfigService.getInOutManageFlag() &&
+                                    (BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_PURCHASE_RETURN.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_SALES_RETURN.equals(depotHead.getSubType()))) {
+                                //跳过
+                            } else {
+                                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_SERIAL_NUMBERE_EMPTY_CODE,
+                                        String.format(ExceptionConstants.MATERIAL_SERIAL_NUMBERE_EMPTY_MSG, barCode));
+                            }
+                        }
+                    }
+                }
+                if (StringUtil.isExist(rowObj.get("batchNumber"))) {
+                    depotItem.setBatchNumber(rowObj.getString("batchNumber"));
+                } else {
+                    //入库或出库
+                    if(BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType()) ||
+                            BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())) {
+                        //批号不能为空
+                        if (BusinessConstants.ENABLE_BATCH_NUMBER_ENABLED.equals(material.getEnableBatchNumber())) {
+                            //如果开启出入库管理,并且类型等于采购、采购退货、销售、销售退货,则跳过
+                            if(systemConfigService.getInOutManageFlag() &&
+                                    (BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_PURCHASE_RETURN.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_SALES_RETURN.equals(depotHead.getSubType()))) {
+                                //跳过
+                            } else {
+                                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_BATCH_NUMBERE_EMPTY_CODE,
+                                        String.format(ExceptionConstants.DEPOT_HEAD_BATCH_NUMBERE_EMPTY_MSG, barCode));
+                            }
+                        }
+                    }
+                }
+                if (StringUtil.isExist(rowObj.get("expirationDate"))) {
+                    depotItem.setExpirationDate(rowObj.getDate("expirationDate"));
+                }
+                if (StringUtil.isExist(rowObj.get("sku"))) {
+                    depotItem.setSku(rowObj.getString("sku"));
+                }
+                if (StringUtil.isExist(rowObj.get("linkId"))) {
+                    depotItem.setLinkId(rowObj.getLong("linkId"));
+                }
+                //以下进行单位换算
+                Unit unitInfo = materialService.findUnit(materialExtend.getMaterialId()); //查询多单位信息
+                if (StringUtil.isExist(rowObj.get("operNumber"))) {
+                    depotItem.setOperNumber(rowObj.getBigDecimal("operNumber"));
+                    String unit = rowObj.get("unit").toString();
+                    BigDecimal oNumber = rowObj.getBigDecimal("operNumber");
+                    if (StringUtil.isNotEmpty(unitInfo.getName())) {
+                        String basicUnit = unitInfo.getBasicUnit(); //基本单位
+                        if (unit.equals(basicUnit)) { //如果等于基本单位
+                            depotItem.setBasicNumber(oNumber); //数量一致
+                        } else if (unit.equals(unitInfo.getOtherUnit())) { //如果等于副单位
+                            depotItem.setBasicNumber(oNumber.multiply(unitInfo.getRatio())); //数量乘以比例
+                        } else if (unit.equals(unitInfo.getOtherUnitTwo())) { //如果等于副单位2
+                            depotItem.setBasicNumber(oNumber.multiply(unitInfo.getRatioTwo())); //数量乘以比例
+                        } else if (unit.equals(unitInfo.getOtherUnitThree())) { //如果等于副单位3
+                            depotItem.setBasicNumber(oNumber.multiply(unitInfo.getRatioThree())); //数量乘以比例
+                        } else {
+                            depotItem.setBasicNumber(oNumber); //数量一致
+                        }
+                    } else {
+                        depotItem.setBasicNumber(oNumber); //其他情况
+                    }
+                }
+                //如果数量+已完成数量>原订单数量,给出预警(判断前提是存在关联订单|关联请购单)
+                String linkStr = StringUtil.isNotEmpty(depotHead.getLinkNumber())? depotHead.getLinkNumber(): depotHead.getLinkApply();
+                if (StringUtil.isNotEmpty(linkStr) && StringUtil.isExist(rowObj.get("preNumber")) && StringUtil.isExist(rowObj.get("finishNumber"))) {
+                    if("add".equals(actionType)) {
+                        //在新增模式进行状态赋值
+                        BigDecimal preNumber = rowObj.getBigDecimal("preNumber");
+                        BigDecimal finishNumber = rowObj.getBigDecimal("finishNumber");
+                        if(depotItem.getOperNumber().add(finishNumber).compareTo(preNumber)>0) {
+                            if(!systemConfigService.getOverLinkBillFlag()) {
+                                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_CODE,
+                                        String.format(ExceptionConstants.DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_MSG, barCode));
+                            }
+                        }
+                    } else if("update".equals(actionType)) {
+                        //当前单据的类型
+                        String currentSubType = depotHead.getSubType();
+                        //在更新模式进行状态赋值
+                        String unit = rowObj.get("unit").toString();
+                        Long preHeaderId = depotHeadService.getDepotHead(linkStr).getId();
+                        if(null!=preHeaderId) {
+                            //前一个单据的数量
+                            BigDecimal preNumber = getPreItemByHeaderIdAndMaterial(linkStr, depotItem.getMaterialExtendId(), depotItem.getLinkId()).getOperNumber();
+                            //除去此单据之外的已入库|已出库
+                            BigDecimal realFinishNumber = getRealFinishNumber(currentSubType, depotItem.getMaterialExtendId(), depotItem.getLinkId(), preHeaderId, headerId, unitInfo, unit);
+                            if(preNumber!=null) {
+                                if (depotItem.getOperNumber().add(realFinishNumber).compareTo(preNumber) > 0) {
+                                    if (!systemConfigService.getOverLinkBillFlag()) {
+                                        throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_CODE,
+                                                String.format(ExceptionConstants.DEPOT_HEAD_NUMBER_NEED_EDIT_FAILED_MSG, barCode));
+                                    }
+                                }
+                            } else {
+                                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_PRE_BILL_IS_CHANGE_CODE,
+                                        ExceptionConstants.DEPOT_ITEM_PRE_BILL_IS_CHANGE_MSG);
+                            }
+                        }
+                    }
+                }
+                if (StringUtil.isExist(rowObj.get("unitPrice"))) {
+                    BigDecimal unitPrice = rowObj.getBigDecimal("unitPrice");
+                    depotItem.setUnitPrice(unitPrice);
+                    if(materialExtend.getLowDecimal()!=null) {
+                        //零售或销售单价低于最低售价,进行提示
+                        if("零售".equals(depotHead.getSubType()) || "销售".equals(depotHead.getSubType())) {
+                            if (unitPrice.compareTo(materialExtend.getLowDecimal()) < 0) {
+                                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_UNIT_PRICE_LOW_CODE,
+                                        String.format(ExceptionConstants.DEPOT_HEAD_UNIT_PRICE_LOW_MSG, barCode));
+                            }
+                        }
+                    }
+                }
+                //如果是销售出库、销售退货、零售出库、零售退货则给采购单价字段赋值(如果是批次商品,则要根据批号去找之前的入库价)
+                if(BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType()) ||
+                    BusinessConstants.SUB_TYPE_SALES_RETURN.equals(depotHead.getSubType()) ||
+                    BusinessConstants.SUB_TYPE_RETAIL.equals(depotHead.getSubType()) ||
+                    BusinessConstants.SUB_TYPE_RETAIL_RETURN.equals(depotHead.getSubType())) {
+                    boolean moveAvgPriceFlag = systemConfigService.getMoveAvgPriceFlag();
+                    BigDecimal currentUnitPrice = materialCurrentStockMapperEx.getCurrentUnitPriceByMId(materialExtend.getMaterialId());
+                    currentUnitPrice = unitService.parseUnitPriceByUnit(currentUnitPrice, unitInfo, depotItem.getMaterialUnit());
+                    BigDecimal unitPrice = moveAvgPriceFlag? currentUnitPrice: materialExtend.getPurchaseDecimal();
+                    depotItem.setPurchaseUnitPrice(unitPrice);
+                    if(StringUtil.isNotEmpty(depotItem.getBatchNumber())) {
+                        depotItem.setPurchaseUnitPrice(getDepotItemByBatchNumber(depotItem.getMaterialExtendId(),depotItem.getBatchNumber()).getUnitPrice());
+                    }
+                }
+                if (StringUtil.isExist(rowObj.get("taxUnitPrice"))) {
+                    depotItem.setTaxUnitPrice(rowObj.getBigDecimal("taxUnitPrice"));
+                }
+                if (StringUtil.isExist(rowObj.get("allPrice"))) {
+                    depotItem.setAllPrice(rowObj.getBigDecimal("allPrice"));
+                }
+                if (StringUtil.isExist(rowObj.get("depotId"))) {
+                    depotItem.setDepotId(rowObj.getLong("depotId"));
+                } else {
+                    if(!BusinessConstants.SUB_TYPE_PURCHASE_APPLY.equals(depotHead.getSubType())
+                            && !BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())
+                            && !BusinessConstants.SUB_TYPE_SALES_ORDER.equals(depotHead.getSubType())) {
+                        throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_DEPOT_FAILED_CODE,
+                                String.format(ExceptionConstants.DEPOT_HEAD_DEPOT_FAILED_MSG));
+                    }
+                }
+                if(BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubType())) {
+                    if (StringUtil.isExist(rowObj.get("anotherDepotId"))) {
+                        if(rowObj.getLong("anotherDepotId").equals(rowObj.getLong("depotId"))) {
+                            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ANOTHER_DEPOT_EQUAL_FAILED_CODE,
+                                    String.format(ExceptionConstants.DEPOT_HEAD_ANOTHER_DEPOT_EQUAL_FAILED_MSG));
+                        } else {
+                            depotItem.setAnotherDepotId(rowObj.getLong("anotherDepotId"));
+                        }
+                    } else {
+                        throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ANOTHER_DEPOT_FAILED_CODE,
+                                String.format(ExceptionConstants.DEPOT_HEAD_ANOTHER_DEPOT_FAILED_MSG));
+                    }
+                }
+                if (StringUtil.isExist(rowObj.get("taxRate"))) {
+                    depotItem.setTaxRate(rowObj.getBigDecimal("taxRate"));
+                }
+                if (StringUtil.isExist(rowObj.get("taxMoney"))) {
+                    depotItem.setTaxMoney(rowObj.getBigDecimal("taxMoney"));
+                }
+                if (StringUtil.isExist(rowObj.get("taxLastMoney"))) {
+                    depotItem.setTaxLastMoney(rowObj.getBigDecimal("taxLastMoney"));
+                }
+                if (StringUtil.isExist(rowObj.get("mType"))) {
+                    depotItem.setMaterialType(rowObj.getString("mType"));
+                }
+                if (StringUtil.isExist(rowObj.get("remark"))) {
+                    depotItem.setRemark(rowObj.getString("remark"));
+                }
+                //出库时判断库存是否充足
+                if(BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())){
+                    String stockMsg = material.getName() + "-" + barCode;
+                    BigDecimal stock = getCurrentStockByParam(depotItem.getDepotId(),depotItem.getMaterialId());
+                    if(StringUtil.isNotEmpty(depotItem.getSku())) {
+                        //对于sku商品要换个方式计算库存
+                        stock = getSkuStockByParam(depotItem.getDepotId(),depotItem.getMaterialExtendId(),null,null);
+                    }
+                    if(StringUtil.isNotEmpty(depotItem.getBatchNumber())) {
+                        //对于批次商品要换个方式计算库存
+                        stock = getOneBatchNumberStock(depotItem.getDepotId(), barCode, depotItem.getBatchNumber());
+                        stockMsg += "-批号" + depotItem.getBatchNumber();
+                    }
+                    BigDecimal thisRealNumber = depotItem.getBasicNumber()==null?BigDecimal.ZERO:depotItem.getBasicNumber();
+                    if(StringUtil.isNotEmpty(depotItem.getBatchNumber())) {
+                        //对于批次商品,直接使用当前填写的数量
+                        thisRealNumber = depotItem.getOperNumber()==null?BigDecimal.ZERO:depotItem.getOperNumber();
+                    }
+                    if(!systemConfigService.getMinusStockFlag() && stock.compareTo(thisRealNumber)<0){
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_STOCK_NOT_ENOUGH_CODE,
+                                String.format(ExceptionConstants.MATERIAL_STOCK_NOT_ENOUGH_MSG, stockMsg));
+                    }
+                    //出库时处理序列号
+                    if(!BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubType())) {
+                        //判断商品是否开启序列号,开启的售出序列号,未开启的跳过
+                        if(BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED.equals(material.getEnableSerialNumber())) {
+                            //如果开启出入库管理,并且类型等于采购、采购退货、销售、销售退货,则跳过
+                            if(systemConfigService.getInOutManageFlag() &&
+                                    (BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_PURCHASE_RETURN.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType())
+                                            ||BusinessConstants.SUB_TYPE_SALES_RETURN.equals(depotHead.getSubType()))) {
+                                //跳过
+                            } else {
+                                //售出序列号,获得当前操作人
+                                User userInfo = userService.getCurrentUser();
+                                serialNumberService.checkAndUpdateSerialNumber(depotItem, depotHead.getNumber(), userInfo, StringUtil.toNull(depotItem.getSnList()));
+                            }
+                        }
+                    }
+                }
+                this.insertDepotItemWithObj(depotItem);
+                //更新当前库存
+                updateCurrentStock(depotItem);
+                //更新当前成本价
+                updateCurrentUnitPrice(depotItem);
+                //更新商品的价格
+                updateMaterialExtendPrice(materialExtend.getId(), depotHead.getSubType(), depotHead.getBillType(), rowObj);
+            }
+            //如果关联单据号非空则更新订单的状态,单据类型:采购入库单、销售出库单、盘点复盘单、其它入库单、其它出库单
+            if(BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType())
+                    || BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType())
+                    || BusinessConstants.SUB_TYPE_REPLAY.equals(depotHead.getSubType())
+                    || BusinessConstants.SUB_TYPE_OTHER.equals(depotHead.getSubType())) {
+                if(StringUtil.isNotEmpty(depotHead.getLinkNumber())) {
+                    //单据状态:是否全部完成 2-全部完成 3-部分完成(针对订单的分批出入库)
+                    String billStatus = getBillStatusByParam(depotHead, depotHead.getLinkNumber(), "normal");
+                    changeBillStatus(depotHead.getLinkNumber(), billStatus);
+                }
+            }
+            //当前单据类型为采购订单的逻辑
+            if(BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())) {
+                //如果关联单据号非空则更新订单的状态,此处针对销售订单转采购订单的场景
+                if(StringUtil.isNotEmpty(depotHead.getLinkNumber())) {
+                    String billStatus = getBillStatusByParam(depotHead, depotHead.getLinkNumber(), "normal");
+                    changeBillPurchaseStatus(depotHead.getLinkNumber(), billStatus);
+                }
+                //如果关联单据号非空则更新订单的状态,此处针对请购单转采购订单的场景
+                if(StringUtil.isNotEmpty(depotHead.getLinkApply())) {
+                    String billStatus = getBillStatusByParam(depotHead, depotHead.getLinkApply(), "apply");
+                    changeBillStatus(depotHead.getLinkApply(), billStatus);
+                }
+            }
+        } else {
+            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_ROW_FAILED_CODE,
+                    String.format(ExceptionConstants.DEPOT_HEAD_ROW_FAILED_MSG));
+        }
+    }
+    /**
+     * 判断单据的状态
+     * 通过数组对比:原单据的商品和商品数量(汇总) 与 分批操作后单据的商品和商品数量(汇总)
+     * @param depotHead
+     * @param linkStr
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public String getBillStatusByParam(DepotHead depotHead, String linkStr, String linkType) {
+        String res = BusinessConstants.BILLS_STATUS_SKIPED;
+        //获取原单据的商品和商品数量(汇总)
+        List<DepotItemVo4MaterialAndSum> linkList = depotItemMapperEx.getLinkBillDetailMaterialSum(linkStr);
+        //获取分批操作后单据的商品和商品数量(汇总)
+        List<DepotItemVo4MaterialAndSum> batchList = depotItemMapperEx.getBatchBillDetailMaterialSum(linkStr, linkType, depotHead.getType());
+        //将分批操作后的单据的商品和商品数据构造成Map
+        Map<Long, BigDecimal> materialSumMap = new HashMap<>();
+        for(DepotItemVo4MaterialAndSum materialAndSum : batchList) {
+            materialSumMap.put(materialAndSum.getMaterialExtendId(), materialAndSum.getOperNumber());
+        }
+        for(DepotItemVo4MaterialAndSum materialAndSum : linkList) {
+            //过滤掉原单里面有数量为0的商品
+            if(materialAndSum.getOperNumber().compareTo(BigDecimal.ZERO) != 0) {
+                BigDecimal materialSum = materialSumMap.get(materialAndSum.getMaterialExtendId());
+                if (materialSum != null) {
+                    if (materialSum.compareTo(materialAndSum.getOperNumber()) < 0) {
+                        res = BusinessConstants.BILLS_STATUS_SKIPING;
+                    }
+                } else {
+                    res = BusinessConstants.BILLS_STATUS_SKIPING;
+                }
+            }
+        }
+        return res;
+    }
+
+    /**
+     * 更新单据状态
+     * @param linkStr
+     * @param billStatus
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void changeBillStatus(String linkStr, String billStatus) {
+        DepotHead depotHeadOrders = new DepotHead();
+        depotHeadOrders.setStatus(billStatus);
+        DepotHeadExample example = new DepotHeadExample();
+        List<String> linkNoList = StringUtil.strToStringList(linkStr);
+        example.createCriteria().andNumberIn(linkNoList);
+        try{
+            depotHeadMapper.updateByExampleSelective(depotHeadOrders, example);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE,ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+    }
+
+    /**
+     * 更新单据状态,此处针对销售订单转采购订单的场景
+     * @param linkStr
+     * @param billStatus
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void changeBillPurchaseStatus(String linkStr, String billStatus) {
+        DepotHead depotHeadOrders = new DepotHead();
+        depotHeadOrders.setPurchaseStatus(billStatus);
+        DepotHeadExample example = new DepotHeadExample();
+        List<String> linkNoList = StringUtil.strToStringList(linkStr);
+        example.createCriteria().andNumberIn(linkNoList);
+        try{
+            depotHeadMapper.updateByExampleSelective(depotHeadOrders, example);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE,ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+    }
+
+    /**
+     * 根据批号查询单据明细信息
+     * @param materialExtendId
+     * @param batchNumber
+     * @return
+     */
+    public DepotItem getDepotItemByBatchNumber(Long materialExtendId, String batchNumber) {
+        List<DepotItem> depotItemList = depotItemMapperEx.getDepotItemByBatchNumber(materialExtendId, batchNumber);
+        if(null != depotItemList && depotItemList.size() > 0){
+            return depotItemList.get(0);
+        } else {
+            return new DepotItem();
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void deleteDepotItemHeadId(Long headerId)throws Exception {
+        try{
+            //1、查询删除前的单据明细
+            List<DepotItem> depotItemList = getListByHeaderId(headerId);
+            //2、删除单据明细
+            DepotItemExample example = new DepotItemExample();
+            example.createCriteria().andHeaderIdEqualTo(headerId);
+            depotItemMapper.deleteByExample(example);
+            //3、计算删除之后单据明细中商品的库存
+            for(DepotItem depotItem : depotItemList){
+                updateCurrentStock(depotItem);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+    }
+
+    /**
+     * 删除序列号和回收序列号
+     * @param actionType
+     * @throws Exception
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void deleteOrCancelSerialNumber(String actionType, DepotHead depotHead, Long headerId) throws Exception {
+        if(actionType.equals("update")) {
+            User userInfo = userService.getCurrentUser();
+            if(BusinessConstants.DEPOTHEAD_TYPE_IN.equals(depotHead.getType())){
+                //入库逻辑
+                String number = depotHead.getNumber();
+                SerialNumberExample example = new SerialNumberExample();
+                example.createCriteria().andInBillNoEqualTo(number);
+                serialNumberService.deleteByExample(example);
+            } else if(BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType())){
+                //出库逻辑
+                DepotItemExample example = new DepotItemExample();
+                example.createCriteria().andHeaderIdEqualTo(headerId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                List<DepotItem> depotItemList = depotItemMapper.selectByExample(example);
+                if(null != depotItemList && depotItemList.size() > 0){
+                    for (DepotItem depotItem : depotItemList){
+                        if(StringUtil.isNotEmpty(depotItem.getSnList())){
+                            serialNumberService.cancelSerialNumber(depotItem.getMaterialId(), depotHead.getNumber(), (depotItem.getBasicNumber() == null ? 0 : depotItem.getBasicNumber()).intValue(), userInfo);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 针对组装单、拆卸单校验是否存在组合件和普通子件
+     * @param rowArr
+     * @param subType
+     */
+    public void checkAssembleWithMaterialType(JSONArray rowArr, String subType) {
+        if(BusinessConstants.SUB_TYPE_ASSEMBLE.equals(subType) ||
+                BusinessConstants.SUB_TYPE_DISASSEMBLE.equals(subType)) {
+            if(rowArr.size() > 1) {
+                JSONObject firstRowObj = JSONObject.parseObject(rowArr.getString(0));
+                JSONObject secondRowObj = JSONObject.parseObject(rowArr.getString(1));
+                String firstMaterialType = firstRowObj.getString("mType");
+                String secondMaterialType = secondRowObj.getString("mType");
+                if(!"组合件".equals(firstMaterialType) || !"普通子件".equals(secondMaterialType)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_CHECK_ASSEMBLE_EMPTY_CODE,
+                            String.format(ExceptionConstants.DEPOT_HEAD_CHECK_ASSEMBLE_EMPTY_MSG));
+                }
+            } else {
+                throw new BusinessRunTimeException(ExceptionConstants.DEPOT_HEAD_CHECK_ASSEMBLE_EMPTY_CODE,
+                        String.format(ExceptionConstants.DEPOT_HEAD_CHECK_ASSEMBLE_EMPTY_MSG));
+            }
+        }
+    }
+
+    /**
+     * 更新商品的价格
+     * @param meId
+     * @param subType
+     * @param rowObj
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateMaterialExtendPrice(Long meId, String subType, String billType, JSONObject rowObj) throws Exception {
+        if(systemConfigService.getUpdateUnitPriceFlag()) {
+            if (StringUtil.isExist(rowObj.get("unitPrice"))) {
+                BigDecimal unitPrice = rowObj.getBigDecimal("unitPrice");
+                MaterialExtend materialExtend = new MaterialExtend();
+                materialExtend.setId(meId);
+                if(BusinessConstants.SUB_TYPE_PURCHASE.equals(subType)) {
+                    materialExtend.setPurchaseDecimal(unitPrice);
+                }
+                if(BusinessConstants.SUB_TYPE_SALES.equals(subType)) {
+                    materialExtend.setWholesaleDecimal(unitPrice);
+                }
+                if(BusinessConstants.SUB_TYPE_RETAIL.equals(subType)) {
+                    materialExtend.setCommodityDecimal(unitPrice);
+                }
+                //其它入库-生产入库的情况更新采购单价
+                if(BusinessConstants.SUB_TYPE_OTHER.equals(subType)) {
+                    if(BusinessConstants.BILL_TYPE_PRODUCE_IN.equals(billType)) {
+                        materialExtend.setPurchaseDecimal(unitPrice);
+                    }
+                }
+                materialExtendService.updateMaterialExtend(materialExtend);
+            }
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public List<DepotItemStockWarningCount> findStockWarningCount(Integer offset, Integer rows, String materialParam, List<Long> depotList, List<Long> categoryList) {
+        List<DepotItemStockWarningCount> list = null;
+        try{
+            list =depotItemMapperEx.findStockWarningCount(offset, rows, materialParam, depotList, categoryList);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int findStockWarningCountTotal(String materialParam, List<Long> depotList, List<Long> categoryList) {
+        int result = 0;
+        try{
+            result =depotItemMapperEx.findStockWarningCountTotal(materialParam, depotList, categoryList);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 库存统计-sku
+     * @param depotId
+     * @param meId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    public BigDecimal getSkuStockByParam(Long depotId, Long meId, String beginTime, String endTime) throws Exception {
+        Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+        Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+        List<Long> depotList = depotService.parseDepotList(depotId);
+        //盘点复盘后数量的变动
+        BigDecimal stockCheckSum = depotItemMapperEx.getSkuStockCheckSumByDepotList(depotList, meId, forceFlag, beginTime, endTime);
+        DepotItemVo4Stock stockObj = depotItemMapperEx.getSkuStockByParamWithDepotList(depotList, meId, forceFlag, inOutManageFlag, beginTime, endTime);
+        BigDecimal stockSum = BigDecimal.ZERO;
+        if(stockObj!=null) {
+            BigDecimal inTotal = stockObj.getInTotal();
+            BigDecimal transfInTotal = stockObj.getTransfInTotal();
+            BigDecimal assemInTotal = stockObj.getAssemInTotal();
+            BigDecimal disAssemInTotal = stockObj.getDisAssemInTotal();
+            BigDecimal outTotal = stockObj.getOutTotal();
+            BigDecimal transfOutTotal = stockObj.getTransfOutTotal();
+            BigDecimal assemOutTotal = stockObj.getAssemOutTotal();
+            BigDecimal disAssemOutTotal = stockObj.getDisAssemOutTotal();
+            stockSum = inTotal.add(transfInTotal).add(assemInTotal).add(disAssemInTotal)
+                    .subtract(outTotal).subtract(transfOutTotal).subtract(assemOutTotal).subtract(disAssemOutTotal);
+        }
+        return stockCheckSum.add(stockSum);
+    }
+
+    /**
+     * 库存统计-单仓库
+     * @param depotId
+     * @param mId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    public BigDecimal getStockByParam(Long depotId, Long mId, String beginTime, String endTime) throws Exception {
+        List<Long> depotList = depotService.parseDepotList(depotId);
+        return getStockByParamWithDepotList(depotList, mId, beginTime, endTime);
+    }
+
+    /**
+     * 库存统计-多仓库
+     * @param depotList
+     * @param mId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    public BigDecimal getStockByParamWithDepotList(List<Long> depotList, Long mId, String beginTime, String endTime) throws Exception {
+        Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+        Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+        //初始库存
+        BigDecimal initStock = materialService.getInitStockByMidAndDepotList(depotList, mId);
+        //盘点复盘后数量的变动
+        BigDecimal stockCheckSum = depotItemMapperEx.getStockCheckSumByDepotList(depotList, mId, forceFlag, beginTime, endTime);
+        DepotItemVo4Stock stockObj = depotItemMapperEx.getStockByParamWithDepotList(depotList, mId, forceFlag, inOutManageFlag, beginTime, endTime);
+        BigDecimal stockSum = BigDecimal.ZERO;
+        if(stockObj!=null) {
+            BigDecimal inTotal = stockObj.getInTotal();
+            BigDecimal transfInTotal = stockObj.getTransfInTotal();
+            BigDecimal assemInTotal = stockObj.getAssemInTotal();
+            BigDecimal disAssemInTotal = stockObj.getDisAssemInTotal();
+            BigDecimal outTotal = stockObj.getOutTotal();
+            BigDecimal transfOutTotal = stockObj.getTransfOutTotal();
+            BigDecimal assemOutTotal = stockObj.getAssemOutTotal();
+            BigDecimal disAssemOutTotal = stockObj.getDisAssemOutTotal();
+            stockSum = inTotal.add(transfInTotal).add(assemInTotal).add(disAssemInTotal)
+                    .subtract(outTotal).subtract(transfOutTotal).subtract(assemOutTotal).subtract(disAssemOutTotal);
+        }
+        return initStock.add(stockCheckSum).add(stockSum);
+    }
+
+    /**
+     * 统计时间段内的入库和出库数量-多仓库
+     * @param depotList
+     * @param mId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    public Map<String, BigDecimal> getIntervalMapByParamWithDepotList(List<Long> depotList, Long mId, String beginTime, String endTime) throws Exception {
+        Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+        Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+        Map<String,BigDecimal> intervalMap = new HashMap<>();
+        BigDecimal inSum = BigDecimal.ZERO;
+        BigDecimal outSum = BigDecimal.ZERO;
+        //盘点复盘后数量的变动
+        BigDecimal stockCheckSum = depotItemMapperEx.getStockCheckSumByDepotList(depotList, mId, forceFlag, beginTime, endTime);
+        DepotItemVo4Stock stockObj = depotItemMapperEx.getStockByParamWithDepotList(depotList, mId, forceFlag, inOutManageFlag, beginTime, endTime);
+        if(stockObj!=null) {
+            BigDecimal inTotal = stockObj.getInTotal();
+            BigDecimal transfInTotal = stockObj.getTransfInTotal();
+            BigDecimal assemInTotal = stockObj.getAssemInTotal();
+            BigDecimal disAssemInTotal = stockObj.getDisAssemInTotal();
+            inSum = inTotal.add(transfInTotal).add(assemInTotal).add(disAssemInTotal);
+            BigDecimal outTotal = stockObj.getOutTotal();
+            BigDecimal transfOutTotal = stockObj.getTransfOutTotal();
+            BigDecimal assemOutTotal = stockObj.getAssemOutTotal();
+            BigDecimal disAssemOutTotal = stockObj.getDisAssemOutTotal();
+            outSum = outTotal.add(transfOutTotal).add(assemOutTotal).add(disAssemOutTotal);
+        }
+        if(stockCheckSum.compareTo(BigDecimal.ZERO)>0) {
+            inSum = inSum.add(stockCheckSum);
+        } else {
+            //盘点复盘数量为负数代表出库
+            outSum = outSum.subtract(stockCheckSum);
+        }
+        intervalMap.put("inSum", inSum);
+        intervalMap.put("outSum", outSum);
+        return intervalMap;
+    }
+
+    /**
+     * 根据单据明细来批量更新当前库存
+     * @param depotItem
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateCurrentStock(DepotItem depotItem) throws Exception {
+        updateCurrentStockFun(depotItem.getMaterialId(), depotItem.getDepotId());
+        if(depotItem.getAnotherDepotId()!=null){
+            updateCurrentStockFun(depotItem.getMaterialId(), depotItem.getAnotherDepotId());
+        }
+    }
+
+    /**
+     * 根据单据明细来批量更新当前成本价
+     * @param depotItem
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateCurrentUnitPrice(DepotItem depotItem) throws Exception {
+        Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+        Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+        //查询多单位信息
+        Unit unitInfo = materialService.findUnit(depotItem.getMaterialId());
+        List<DepotItemVo4DetailByTypeAndMId> itemList = findDetailByDepotIdsAndMaterialIdList(null, forceFlag, inOutManageFlag, depotItem.getSku(),
+                depotItem.getBatchNumber(), null, null, null, depotItem.getMaterialId(), null, null);
+        Collections.reverse(itemList); //倒序之后变成按时间从前往后排序
+        BigDecimal currentNumber = BigDecimal.ZERO;
+        BigDecimal currentUnitPrice = BigDecimal.ZERO;
+        BigDecimal currentAllPrice = BigDecimal.ZERO;
+        for(DepotItemVo4DetailByTypeAndMId item: itemList) {
+            BigDecimal basicNumber = item.getBnum()!=null?item.getBnum():BigDecimal.ZERO;
+            //数量*单价  另外计算新的成本价
+            BigDecimal allPrice = unitService.parseAllPriceByUnit(item.getAllPrice()!=null?item.getAllPrice():BigDecimal.ZERO, unitInfo, item.getMaterialUnit());
+            if(basicNumber.compareTo(BigDecimal.ZERO)!=0 && allPrice.compareTo(BigDecimal.ZERO)!=0) {
+                //入库
+                if (BusinessConstants.DEPOTHEAD_TYPE_IN.equals(item.getType())) {
+                    //零售退货、销售退货
+                    if (BusinessConstants.SUB_TYPE_RETAIL_RETURN.equals(item.getSubType()) || BusinessConstants.SUB_TYPE_SALES_RETURN.equals(item.getSubType())) {
+                        //数量*当前的成本单价
+                        currentNumber = currentNumber.add(basicNumber);
+                        currentAllPrice = currentAllPrice.add(basicNumber.multiply(currentUnitPrice));
+                    } else {
+                        currentAllPrice = currentAllPrice.add(allPrice);
+                        currentNumber = currentNumber.add(basicNumber);
+                        //只有当前库存总金额和当前库存数量都大于0才计算移动平均价
+                        if (currentAllPrice.compareTo(BigDecimal.ZERO) > 0 && currentNumber.compareTo(BigDecimal.ZERO) > 0) {
+                            currentUnitPrice = currentAllPrice.divide(currentNumber, 2, BigDecimal.ROUND_HALF_UP);
+                        } else {
+                            currentUnitPrice = item.getUnitPrice();
+                        }
+                    }
+                }
+                //出库
+                if (BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(item.getType())) {
+                    //采购退货
+                    if (BusinessConstants.SUB_TYPE_PURCHASE_RETURN.equals(item.getSubType())) {
+                        currentAllPrice = currentAllPrice.add(allPrice);
+                        currentNumber = currentNumber.add(basicNumber);
+                        //只有当前库存总金额和当前库存数量都大于0才计算移动平均价
+                        if (currentAllPrice.compareTo(BigDecimal.ZERO) > 0 && currentNumber.compareTo(BigDecimal.ZERO) > 0) {
+                            currentUnitPrice = currentAllPrice.divide(currentNumber, 2, BigDecimal.ROUND_HALF_UP);
+                        } else {
+                            currentUnitPrice = item.getUnitPrice();
+                        }
+                    } else {
+                        currentNumber = currentNumber.add(basicNumber);
+                        //数量*当前的成本单价
+                        currentAllPrice = currentAllPrice.add(basicNumber.multiply(currentUnitPrice));
+                    }
+                }
+                //防止单价金额溢出
+                if(currentUnitPrice.compareTo(BigDecimal.valueOf(100000000))>0 || currentUnitPrice.compareTo(BigDecimal.valueOf(-100000000))<0) {
+                    currentUnitPrice = BigDecimal.ZERO;
+                }
+            }
+        }
+        //更新实时库存中的当前单价
+        materialCurrentStockMapperEx.updateUnitPriceByMId(currentUnitPrice, depotItem.getMaterialId());
+    }
+
+    /**
+     * 根据商品和仓库来更新当前库存
+     * @param mId
+     * @param dId
+     */
+    public void updateCurrentStockFun(Long mId, Long dId) throws Exception {
+        if(mId!=null && dId!=null) {
+            MaterialCurrentStockExample example = new MaterialCurrentStockExample();
+            example.createCriteria().andMaterialIdEqualTo(mId).andDepotIdEqualTo(dId)
+                    .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            List<MaterialCurrentStock> list = materialCurrentStockMapper.selectByExample(example);
+            MaterialCurrentStock materialCurrentStock = new MaterialCurrentStock();
+            materialCurrentStock.setMaterialId(mId);
+            materialCurrentStock.setDepotId(dId);
+            materialCurrentStock.setCurrentNumber(getStockByParam(dId,mId,null,null));
+            if(list!=null && list.size()>0) {
+                Long mcsId = list.get(0).getId();
+                materialCurrentStock.setId(mcsId);
+                materialCurrentStockMapper.updateByPrimaryKeySelective(materialCurrentStock);
+            } else {
+                materialCurrentStockMapper.insertSelective(materialCurrentStock);
+            }
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public BigDecimal getFinishNumber(Long meId, Long id, Long headerId, Unit unitInfo, String materialUnit, String linkType) {
+        Long linkId = id;
+        String goToType = "";
+        DepotHead depotHead =depotHeadMapper.selectByPrimaryKey(headerId);
+        String linkStr = depotHead.getNumber(); //订单号
+        if("purchase".equals(linkType)) {
+            //针对以销定购的情况
+            if(BusinessConstants.SUB_TYPE_SALES_ORDER.equals(depotHead.getSubType())) {
+                goToType = BusinessConstants.SUB_TYPE_PURCHASE_ORDER;
+            }
+        } else if("other".equals(linkType)) {
+            //采购入库、采购退货、销售出库、销售退货都转其它入库
+            if(BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType())
+                    || BusinessConstants.SUB_TYPE_PURCHASE_RETURN.equals(depotHead.getSubType())
+                    || BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType())
+                    || BusinessConstants.SUB_TYPE_SALES_RETURN.equals(depotHead.getSubType())) {
+                goToType = BusinessConstants.SUB_TYPE_OTHER;
+            }
+        } else if("basic".equals(linkType)) {
+            //采购订单转采购入库
+            if(BusinessConstants.SUB_TYPE_PURCHASE_ORDER.equals(depotHead.getSubType())) {
+                goToType = BusinessConstants.SUB_TYPE_PURCHASE;
+            }
+            //销售订单转销售出库
+            if(BusinessConstants.SUB_TYPE_SALES_ORDER.equals(depotHead.getSubType())) {
+                goToType = BusinessConstants.SUB_TYPE_SALES;
+            }
+            //采购入库转采购退货
+            if(BusinessConstants.SUB_TYPE_PURCHASE.equals(depotHead.getSubType())) {
+                goToType = BusinessConstants.SUB_TYPE_PURCHASE_RETURN;
+            }
+            //销售出库转销售退货
+            if(BusinessConstants.SUB_TYPE_SALES.equals(depotHead.getSubType())) {
+                goToType = BusinessConstants.SUB_TYPE_SALES_RETURN;
+            }
+        }
+        String noType = "normal";
+        if(BusinessConstants.SUB_TYPE_PURCHASE_APPLY.equals(depotHead.getSubType())) {
+            noType = "apply";
+        }
+        BigDecimal count = depotItemMapperEx.getFinishNumber(meId, linkId, linkStr, noType, goToType);
+        //根据多单位情况进行数量的转换
+        if(materialUnit.equals(unitInfo.getOtherUnit()) && unitInfo.getRatio()!=null && unitInfo.getRatio().compareTo(BigDecimal.ZERO)!=0) {
+            count = count.divide(unitInfo.getRatio(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        if(materialUnit.equals(unitInfo.getOtherUnitTwo()) && unitInfo.getRatioTwo()!=null && unitInfo.getRatioTwo().compareTo(BigDecimal.ZERO)!=0) {
+            count = count.divide(unitInfo.getRatioTwo(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        if(materialUnit.equals(unitInfo.getOtherUnitThree()) && unitInfo.getRatioThree()!=null && unitInfo.getRatioThree().compareTo(BigDecimal.ZERO)!=0) {
+            count = count.divide(unitInfo.getRatioThree(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        return count;
+    }
+
+    /**
+     * 除去此单据之外的已入库|已出库|已转采购
+     * @param currentSubType
+     * @param meId
+     * @param linkId
+     * @param preHeaderId
+     * @param currentHeaderId
+     * @param unitInfo
+     * @param materialUnit
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public BigDecimal getRealFinishNumber(String currentSubType, Long meId, Long linkId, Long preHeaderId, Long currentHeaderId, Unit unitInfo, String materialUnit) {
+        String goToType = currentSubType;
+        DepotHead depotHead =depotHeadMapper.selectByPrimaryKey(preHeaderId);
+        String linkStr = depotHead.getNumber(); //订单号
+        String linkType = "normal";
+        if(BusinessConstants.SUB_TYPE_PURCHASE_APPLY.equals(depotHead.getSubType())) {
+            linkType = "apply";
+        }
+        BigDecimal count = depotItemMapperEx.getRealFinishNumber(meId, linkId, linkStr, linkType, currentHeaderId, goToType);
+        //根据多单位情况进行数量的转换
+        if(materialUnit.equals(unitInfo.getOtherUnit()) && unitInfo.getRatio()!=null && unitInfo.getRatio().compareTo(BigDecimal.ZERO)!=0) {
+            count = count.divide(unitInfo.getRatio(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        if(materialUnit.equals(unitInfo.getOtherUnitTwo()) && unitInfo.getRatioTwo()!=null && unitInfo.getRatioTwo().compareTo(BigDecimal.ZERO)!=0) {
+            count = count.divide(unitInfo.getRatioTwo(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        if(materialUnit.equals(unitInfo.getOtherUnitThree()) && unitInfo.getRatioThree()!=null && unitInfo.getRatioThree().compareTo(BigDecimal.ZERO)!=0) {
+            count = count.divide(unitInfo.getRatioThree(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        return count;
+    }
+
+    public List<DepotItemVoBatchNumberList> getBatchNumberList(String number, String name, Long depotId, String barCode,
+                                                               String batchNumber, Boolean forceFlag, Boolean inOutManageFlag) throws Exception {
+        List<DepotItemVoBatchNumberList> reslist = new ArrayList<>();
+        List<DepotItemVoBatchNumberList> list =  depotItemMapperEx.getBatchNumberList(StringUtil.toNull(number), name,
+                depotId, barCode, batchNumber, forceFlag, inOutManageFlag);
+        for(DepotItemVoBatchNumberList bn: list) {
+            if(bn.getTotalNum()!=null && bn.getTotalNum().compareTo(BigDecimal.ZERO)>0) {
+                bn.setExpirationDateStr(Tools.parseDateToStr(bn.getExpirationDate()));
+                if(bn.getUnitId()!=null) {
+                    Unit unit = unitService.getUnit(bn.getUnitId());
+                    String commodityUnit = bn.getCommodityUnit();
+                    bn.setTotalNum(unitService.parseStockByUnit(bn.getTotalNum(), unit, commodityUnit));
+                }
+                reslist.add(bn);
+            }
+        }
+        return reslist;
+    }
+
+    /**
+     * 查询某个批号的商品库存
+     * @param depotId
+     * @param barCode
+     * @param batchNumber
+     * @return
+     * @throws Exception
+     */
+    public BigDecimal getOneBatchNumberStock(Long depotId, String barCode, String batchNumber) throws Exception {
+        BigDecimal totalNum = BigDecimal.ZERO;
+        Boolean forceFlag = systemConfigService.getForceApprovalFlag();
+        Boolean inOutManageFlag = systemConfigService.getInOutManageFlag();
+        List<DepotItemVoBatchNumberList> list =  depotItemMapperEx.getBatchNumberList(null, null,
+                depotId, barCode, batchNumber, forceFlag, inOutManageFlag);
+        if(list!=null && list.size()>0) {
+            DepotItemVoBatchNumberList bn = list.get(0);
+            totalNum = bn.getTotalNum();
+            if(bn.getTotalNum()!=null && bn.getTotalNum().compareTo(BigDecimal.ZERO)>0) {
+                if(bn.getUnitId()!=null) {
+                    Unit unit = unitService.getUnit(bn.getUnitId());
+                    String commodityUnit = bn.getCommodityUnit();
+                    totalNum = unitService.parseStockByUnit(bn.getTotalNum(), unit, commodityUnit);
+                }
+            }
+        }
+        return totalNum;
+    }
+
+    public Long getCountByMaterialAndDepot(Long mId, Long depotId) {
+        return depotItemMapperEx.getCountByMaterialAndDepot(mId, depotId);
+    }
+
+    public JSONObject parseMapByExcelData(String barCodes, List<Map<String, String>> detailList, String prefixNo) throws Exception {
+        JSONObject map = new JSONObject();
+        JSONArray arr = new JSONArray();
+        List<MaterialVo4Unit> list = depotItemMapperEx.getBillItemByParam(barCodes);
+        Map<String, MaterialVo4Unit> materialMap = new HashMap<>();
+        Map<String, Long> depotMap = new HashMap<>();
+        for (MaterialVo4Unit material: list) {
+            materialMap.put(material.getmBarCode(), material);
+        }
+        JSONArray depotArr = depotService.findDepotByCurrentUser();
+        for (Object depotObj: depotArr) {
+            if(depotObj!=null) {
+                JSONObject depotObject = JSONObject.parseObject(depotObj.toString());
+                depotMap.put(depotObject.getString("depotName"), depotObject.getLong("id"));
+            }
+        }
+        for (Map<String, String> detailMap: detailList) {
+            JSONObject item = new JSONObject();
+            String barCode = detailMap.get("barCode");
+            if(StringUtil.isNotEmpty(barCode)) {
+                MaterialVo4Unit m = materialMap.get(barCode);
+                if(m!=null) {
+                    //判断仓库是否存在
+                    String depotName = detailMap.get("depotName");
+                    if(StringUtil.isNotEmpty(depotName)) {
+                        if(depotMap.get(depotName)!=null) {
+                            item.put("depotName", depotName);
+                            item.put("depotId", depotMap.get(depotName));
+                        } else {
+                            throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_DEPOTNAME_IS_NOT_EXIST_CODE,
+                                    String.format(ExceptionConstants.DEPOT_ITEM_DEPOTNAME_IS_NOT_EXIST_MSG, depotName));
+                        }
+                    }
+                    item.put("barCode", barCode);
+                    item.put("name", m.getName());
+                    item.put("standard", m.getStandard());
+                    if(StringUtil.isNotEmpty(m.getModel())) {
+                        item.put("model", m.getModel());
+                    }
+                    if(StringUtil.isNotEmpty(m.getColor())) {
+                        item.put("color", m.getColor());
+                    }
+                    if(StringUtil.isNotEmpty(m.getSku())) {
+                        item.put("sku", m.getSku());
+                    }
+                    BigDecimal stock = BigDecimal.ZERO;
+                    if(StringUtil.isNotEmpty(m.getSku())){
+                        stock = getSkuStockByParam(null, m.getMeId(),null,null);
+                    } else {
+                        stock = getCurrentStockByParam(null, m.getId());
+                    }
+                    item.put("stock", stock);
+                    item.put("unit", m.getCommodityUnit());
+                    BigDecimal operNumber = BigDecimal.ZERO;
+                    BigDecimal unitPrice = BigDecimal.ZERO;
+                    BigDecimal taxRate = BigDecimal.ZERO;
+                    if(StringUtil.isNotEmpty(detailMap.get("num"))) {
+                        operNumber = new BigDecimal(detailMap.get("num"));
+                    }
+                    if(StringUtil.isNotEmpty(detailMap.get("unitPrice"))) {
+                        unitPrice = new BigDecimal(detailMap.get("unitPrice"));
+                    } else {
+                        if("CGDD".equals(prefixNo)) {
+                            unitPrice = m.getPurchaseDecimal();
+                        } else if("XSDD".equals(prefixNo)) {
+                            unitPrice = m.getWholesaleDecimal();
+                        }
+                    }
+                    if(StringUtil.isNotEmpty(detailMap.get("taxRate"))) {
+                        taxRate = new BigDecimal(detailMap.get("taxRate"));
+                    }
+                    String remark = detailMap.get("remark");
+                    item.put("operNumber", operNumber);
+                    item.put("unitPrice", unitPrice);
+                    BigDecimal allPrice = BigDecimal.ZERO;
+                    if(unitPrice!=null && unitPrice.compareTo(BigDecimal.ZERO)!=0) {
+                        allPrice = unitPrice.multiply(operNumber);
+                    }
+                    BigDecimal taxMoney = BigDecimal.ZERO;
+                    if(taxRate.compareTo(BigDecimal.ZERO) != 0) {
+                        taxMoney = taxRate.multiply(allPrice).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP);
+                    }
+                    BigDecimal taxLastMoney = allPrice.add(taxMoney);
+                    item.put("allPrice", allPrice);
+                    item.put("taxRate", taxRate);
+                    item.put("taxMoney", taxMoney);
+                    item.put("taxLastMoney", taxLastMoney);
+                    item.put("remark", remark);
+                    arr.add(item);
+                } else {
+                    throw new BusinessRunTimeException(ExceptionConstants.DEPOT_ITEM_BARCODE_IS_NOT_EXIST_CODE,
+                            String.format(ExceptionConstants.DEPOT_ITEM_BARCODE_IS_NOT_EXIST_MSG, barCode));
+                }
+            }
+        }
+        map.put("rows", arr);
+        return map;
+    }
+
+    public BigDecimal getLastUnitPriceByParam(Long organId, Long meId, String prefixNo) {
+        String type = "";
+        String subType = "";
+        if("XSDD".equals(prefixNo)) {
+            type = "其它";
+            subType = "销售订单";
+        } else if("XSCK".equals(prefixNo)) {
+            type = "出库";
+            subType = "销售";
+        } else if("XSTH".equals(prefixNo)) {
+            type = "入库";
+            subType = "销售退货";
+        } else if("QTCK".equals(prefixNo)) {
+            type = "出库";
+            subType = "其它";
+        }
+        return depotItemMapperEx.getLastUnitPriceByParam(organId, meId, type, subType);
+    }
+
+    public BigDecimal getCurrentStockByParam(Long depotId, Long mId) {
+        BigDecimal stock = depotItemMapperEx.getCurrentStockByParam(depotId, mId);
+        return stock!=null? stock: BigDecimal.ZERO;
+    }
+
+    /**
+     * 获取扩展信息
+     *
+     * @return
+     */
+    public String getOtherInfo(String[] mpArr, DepotItemVo4WithInfoEx diEx)throws Exception {
+        String materialOther = "";
+        for (int i = 0; i < mpArr.length; i++) {
+            if (mpArr[i].equals("自定义1")) {
+                materialOther = materialOther + ((diEx.getMOtherField1() == null || diEx.getMOtherField1().equals("")) ? "" : "(" + diEx.getMOtherField1() + ")");
+            }
+            if (mpArr[i].equals("自定义2")) {
+                materialOther = materialOther + ((diEx.getMOtherField2() == null || diEx.getMOtherField2().equals("")) ? "" : "(" + diEx.getMOtherField2() + ")");
+            }
+            if (mpArr[i].equals("自定义3")) {
+                materialOther = materialOther + ((diEx.getMOtherField3() == null || diEx.getMOtherField3().equals("")) ? "" : "(" + diEx.getMOtherField3() + ")");
+            }
+        }
+        return materialOther;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/functions/FunctionComponent.java b/src/main/java/com/jsh/erp/service/functions/FunctionComponent.java
new file mode 100644
index 0000000..d9a9d13
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/functions/FunctionComponent.java
@@ -0,0 +1,73 @@
+package com.jsh.erp.service.functions;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "function_component")
+@FunctionResource
+public class FunctionComponent implements ICommonQuery {
+
+    @Resource
+    private FunctionService functionService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return functionService.getFunction(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getFunctionsList(map);
+    }
+
+    private List<?> getFunctionsList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String type = StringUtil.getInfo(search, "type");
+        String order = QueryUtils.order(map);
+        return functionService.select(name, type, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String type = StringUtil.getInfo(search, "type");
+        return functionService.countFunction(name, type);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return functionService.insertFunction(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return functionService.updateFunction(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return functionService.deleteFunction(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return functionService.batchDeleteFunction(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return functionService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/functions/FunctionResource.java b/src/main/java/com/jsh/erp/service/functions/FunctionResource.java
new file mode 100644
index 0000000..3f05bc0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/functions/FunctionResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.functions;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "function")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface FunctionResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/functions/FunctionService.java b/src/main/java/com/jsh/erp/service/functions/FunctionService.java
new file mode 100644
index 0000000..08153d3
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/functions/FunctionService.java
@@ -0,0 +1,244 @@
+package com.jsh.erp.service.functions;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.Function;
+import com.jsh.erp.datasource.entities.FunctionEx;
+import com.jsh.erp.datasource.entities.FunctionExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.FunctionMapper;
+import com.jsh.erp.datasource.mappers.FunctionMapperEx;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class FunctionService {
+    private Logger logger = LoggerFactory.getLogger(FunctionService.class);
+
+    @Resource
+    private FunctionMapper functionsMapper;
+
+    @Resource
+    private FunctionMapperEx functionMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private SystemConfigService systemConfigService;
+    @Resource
+    private LogService logService;
+
+    public Function getFunction(long id)throws Exception {
+        Function result=null;
+        try{
+            result=functionsMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Function> getFunctionListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Function> list = new ArrayList<>();
+        try{
+            FunctionExample example = new FunctionExample();
+            example.createCriteria().andIdIn(idList);
+            list = functionsMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Function> getFunction()throws Exception {
+        FunctionExample example = new FunctionExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Function> list=null;
+        try{
+            list=functionsMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<FunctionEx> select(String name, String type, int offset, int rows)throws Exception {
+        List<FunctionEx> list=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                list = functionMapperEx.selectByConditionFunction(name, type, offset, rows);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countFunction(String name, String type)throws Exception {
+        Long result=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = functionMapperEx.countsByFunction(name, type);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertFunction(JSONObject obj, HttpServletRequest request)throws Exception {
+        Function functions = JSONObject.parseObject(obj.toJSONString(), Function.class);
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                functions.setState(false);
+                functions.setType("电脑版");
+                result = functionsMapper.insertSelective(functions);
+                logService.insertLog("功能",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(functions.getName()).toString(), request);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateFunction(JSONObject obj, HttpServletRequest request) throws Exception{
+        Function functions = JSONObject.parseObject(obj.toJSONString(), Function.class);
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = functionsMapper.updateByPrimaryKeySelective(functions);
+                logService.insertLog("功能",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(functions.getName()).toString(), request);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteFunction(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteFunctionByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteFunction(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteFunctionByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteFunctionByIds(String ids)throws Exception {
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<Function> list = getFunctionListByIds(ids);
+        for(Function functions: list){
+            sb.append("[").append(functions.getName()).append("]");
+        }
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = functionMapperEx.batchDeleteFunctionByIds(new Date(), userInfo == null ? null : userInfo.getId(), idArray);
+                logService.insertLog("功能", sb.toString(),
+                        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        FunctionExample example = new FunctionExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Function> list=null;
+        try{
+            list = functionsMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public int checkIsNumberExist(Long id, String number)throws Exception {
+        FunctionExample example = new FunctionExample();
+        example.createCriteria().andIdNotEqualTo(id).andNumberEqualTo(number).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Function> list=null;
+        try{
+            list = functionsMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public List<Function> getRoleFunction(String pNumber)throws Exception {
+        FunctionExample example = new FunctionExample();
+        example.createCriteria().andEnabledEqualTo(true).andParentNumberEqualTo(pNumber)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("Sort");
+        List<Function> list=null;
+        try{
+            list = functionsMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Function> findRoleFunction(String pnumber)throws Exception{
+        List<Function> list=null;
+        try{
+            Boolean multiLevelApprovalFlag = systemConfigService.getMultiLevelApprovalFlag();
+            FunctionExample example = new FunctionExample();
+            FunctionExample.Criteria criteria = example.createCriteria();
+            criteria.andEnabledEqualTo(true).andParentNumberEqualTo(pnumber)
+                    .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            if("0".equals(pnumber)) {
+                if(!multiLevelApprovalFlag) {
+                    criteria.andUrlNotEqualTo("/workflow");
+                }
+            }
+            example.setOrderByClause("Sort");
+            list =functionsMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Function> findByIds(String functionsIds)throws Exception{
+        List<Long> idList = StringUtil.strToLongList(functionsIds);
+        FunctionExample example = new FunctionExample();
+        example.createCriteria().andEnabledEqualTo(true).andIdIn(idList).andPushBtnIsNotNull().andPushBtnNotEqualTo("")
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("Sort asc");
+        List<Function> list=null;
+        try{
+            list =functionsMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/inOutItem/InOutItemComponent.java b/src/main/java/com/jsh/erp/service/inOutItem/InOutItemComponent.java
new file mode 100644
index 0000000..41f3753
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/inOutItem/InOutItemComponent.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.service.inOutItem;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "inOutItem_component")
+@InOutItemResource
+public class InOutItemComponent implements ICommonQuery {
+
+    @Resource
+    private InOutItemService inOutItemService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return inOutItemService.getInOutItem(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getFunctionsList(map);
+    }
+
+    private List<?> getFunctionsList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String type = StringUtil.getInfo(search, "type");
+        String remark = StringUtil.getInfo(search, "remark");
+        String order = QueryUtils.order(map);
+        return inOutItemService.select(name, type, remark, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String type = StringUtil.getInfo(search, "type");
+        String remark = StringUtil.getInfo(search, "remark");
+        return inOutItemService.countInOutItem(name, type, remark);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return inOutItemService.insertInOutItem(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return inOutItemService.updateInOutItem(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return inOutItemService.deleteInOutItem(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return inOutItemService.batchDeleteInOutItem(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return inOutItemService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/inOutItem/InOutItemResource.java b/src/main/java/com/jsh/erp/service/inOutItem/InOutItemResource.java
new file mode 100644
index 0000000..1bdcb1b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/inOutItem/InOutItemResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.inOutItem;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "inOutItem")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface InOutItemResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/inOutItem/InOutItemService.java b/src/main/java/com/jsh/erp/service/inOutItem/InOutItemService.java
new file mode 100644
index 0000000..9024bdc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/inOutItem/InOutItemService.java
@@ -0,0 +1,229 @@
+package com.jsh.erp.service.inOutItem;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.AccountItem;
+import com.jsh.erp.datasource.entities.InOutItem;
+import com.jsh.erp.datasource.entities.InOutItemExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.AccountItemMapperEx;
+import com.jsh.erp.datasource.mappers.InOutItemMapper;
+import com.jsh.erp.datasource.mappers.InOutItemMapperEx;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class InOutItemService {
+    private Logger logger = LoggerFactory.getLogger(InOutItemService.class);
+
+    @Resource
+    private InOutItemMapper inOutItemMapper;
+
+    @Resource
+    private InOutItemMapperEx inOutItemMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+    @Resource
+    private AccountItemMapperEx accountItemMapperEx;
+
+    public InOutItem getInOutItem(long id)throws Exception {
+        InOutItem result=null;
+        try{
+            result=inOutItemMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<InOutItem> getInOutItemListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<InOutItem> list = new ArrayList<>();
+        try{
+            InOutItemExample example = new InOutItemExample();
+            example.createCriteria().andIdIn(idList);
+            list = inOutItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<InOutItem> getInOutItem()throws Exception {
+        InOutItemExample example = new InOutItemExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<InOutItem> list=null;
+        try{
+            list=inOutItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<InOutItem> select(String name, String type, String remark, int offset, int rows)throws Exception {
+        List<InOutItem> list=null;
+        try{
+            list=inOutItemMapperEx.selectByConditionInOutItem(name, type, remark, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countInOutItem(String name, String type, String remark)throws Exception {
+        Long result=null;
+        try{
+            result=inOutItemMapperEx.countsByInOutItem(name, type, remark);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertInOutItem(JSONObject obj, HttpServletRequest request)throws Exception {
+        InOutItem inOutItem = JSONObject.parseObject(obj.toJSONString(), InOutItem.class);
+        int result=0;
+        try{
+            inOutItem.setEnabled(true);
+            result=inOutItemMapper.insertSelective(inOutItem);
+            logService.insertLog("收支项目",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(inOutItem.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateInOutItem(JSONObject obj, HttpServletRequest request)throws Exception {
+        InOutItem inOutItem = JSONObject.parseObject(obj.toJSONString(), InOutItem.class);
+        int result=0;
+        try{
+            result=inOutItemMapper.updateByPrimaryKeySelective(inOutItem);
+            logService.insertLog("收支项目",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(inOutItem.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteInOutItem(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteInOutItemByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteInOutItem(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteInOutItemByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteInOutItemByIds(String ids)throws Exception {
+        int result = 0;
+        String [] idArray=ids.split(",");
+        //校验财务子表	jsh_accountitem
+        List<AccountItem> accountItemList=null;
+        try{
+            accountItemList=accountItemMapperEx.getAccountItemListByInOutItemIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(accountItemList!=null&&accountItemList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,InOutItemIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //校验通过执行删除操作
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<InOutItem> list = getInOutItemListByIds(ids);
+        for(InOutItem inOutItem: list){
+            sb.append("[").append(inOutItem.getName()).append("]");
+        }
+        logService.insertLog("收支项目", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        try{
+            result=inOutItemMapperEx.batchDeleteInOutItemByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        InOutItemExample example = new InOutItemExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<InOutItem> list = null;
+        try{
+            list=inOutItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+
+        return list==null?0:list.size();
+    }
+
+    public List<InOutItem> findBySelect(String type)throws Exception {
+        InOutItemExample example = new InOutItemExample();
+        if (type.equals("in")) {
+            example.createCriteria().andTypeEqualTo("收入").andEnabledEqualTo(true)
+                    .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        } else if (type.equals("out")) {
+            example.createCriteria().andTypeEqualTo("支出").andEnabledEqualTo(true)
+                    .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        } else {
+            example.createCriteria().andEnabledEqualTo(true)
+                    .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        }
+        example.setOrderByClause("sort asc, id desc");
+        List<InOutItem> list = null;
+        try{
+            list=inOutItemMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("收支项目",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ENABLED).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> inOutItemIds = StringUtil.strToLongList(ids);
+        InOutItem inOutItem = new InOutItem();
+        inOutItem.setEnabled(status);
+        InOutItemExample example = new InOutItemExample();
+        example.createCriteria().andIdIn(inOutItemIds);
+        int result=0;
+        try{
+            result = inOutItemMapper.updateByExampleSelective(inOutItem, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/log/LogComponent.java b/src/main/java/com/jsh/erp/service/log/LogComponent.java
new file mode 100644
index 0000000..b12cebc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/log/LogComponent.java
@@ -0,0 +1,85 @@
+package com.jsh.erp.service.log;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "log_component")
+@LogResource
+public class LogComponent implements ICommonQuery {
+
+    @Resource
+    private LogService logService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return logService.getLog(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getLogList(map);
+    }
+
+    private List<?> getLogList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String operation = StringUtil.getInfo(search, "operation");
+        String userInfo = StringUtil.getInfo(search, "userInfo");
+        String clientIp = StringUtil.getInfo(search, "clientIp");
+        String tenantLoginName = StringUtil.getInfo(search, "tenantLoginName");
+        String tenantType = StringUtil.getInfo(search, "tenantType");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        String content = StringUtil.getInfo(search, "content");
+        return logService.select(operation, userInfo, clientIp, tenantLoginName, tenantType, beginTime, endTime, content,
+                QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String operation = StringUtil.getInfo(search, "operation");
+        String userInfo = StringUtil.getInfo(search, "userInfo");
+        String clientIp = StringUtil.getInfo(search, "clientIp");
+        String tenantLoginName = StringUtil.getInfo(search, "tenantLoginName");
+        String tenantType = StringUtil.getInfo(search, "tenantType");
+        String beginTime = StringUtil.getInfo(search, "beginTime");
+        String endTime = StringUtil.getInfo(search, "endTime");
+        String content = StringUtil.getInfo(search, "content");
+        return logService.countLog(operation, userInfo, clientIp, tenantLoginName, tenantType, beginTime, endTime, content);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return logService.insertLog(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return logService.updateLog(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return logService.deleteLog(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return logService.batchDeleteLog(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 0;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/log/LogResource.java b/src/main/java/com/jsh/erp/service/log/LogResource.java
new file mode 100644
index 0000000..007e9a5
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/log/LogResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.log;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "log")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LogResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/log/LogService.java b/src/main/java/com/jsh/erp/service/log/LogService.java
new file mode 100644
index 0000000..6693f5a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/log/LogService.java
@@ -0,0 +1,192 @@
+package com.jsh.erp.service.log;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.Log;
+import com.jsh.erp.datasource.entities.LogExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.LogMapper;
+import com.jsh.erp.datasource.mappers.LogMapperEx;
+import com.jsh.erp.datasource.vo.LogVo4List;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.redis.RedisService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+import static com.jsh.erp.utils.Tools.getLocalIp;
+
+@Service
+public class LogService {
+    private Logger logger = LoggerFactory.getLogger(LogService.class);
+    @Resource
+    private LogMapper logMapper;
+
+    @Resource
+    private LogMapperEx logMapperEx;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private RedisService redisService;
+
+    public Log getLog(long id)throws Exception {
+        Log result=null;
+        try{
+            result=logMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Log> getLog()throws Exception {
+        LogExample example = new LogExample();
+        List<Log> list=null;
+        try{
+            list=logMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<LogVo4List> select(String operation, String userInfo, String clientIp, String tenantLoginName, String tenantType,
+                                   String beginTime, String endTime, String content, int offset, int rows)throws Exception {
+        List<LogVo4List> list=null;
+        try{
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            list=logMapperEx.selectByConditionLog(operation, userInfo, clientIp, tenantLoginName, tenantType, beginTime, endTime,
+                    content, offset, rows);
+            if (null != list) {
+                for (LogVo4List log : list) {
+                    log.setCreateTimeStr(Tools.getCenternTime(log.getCreateTime()));
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countLog(String operation, String userInfo, String clientIp, String tenantLoginName, String tenantType,
+                         String beginTime, String endTime, String content)throws Exception {
+        Long result=null;
+        try{
+            beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
+            endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
+            result=logMapperEx.countsByLog(operation, userInfo, clientIp, tenantLoginName, tenantType, beginTime, endTime, content);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertLog(JSONObject obj, HttpServletRequest request) throws Exception{
+        Log log = JSONObject.parseObject(obj.toJSONString(), Log.class);
+        int result=0;
+        try{
+            result=logMapper.insertSelective(log);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateLog(JSONObject obj, HttpServletRequest request)throws Exception {
+        Log log = JSONObject.parseObject(obj.toJSONString(), Log.class);
+        int result=0;
+        try{
+            result=logMapper.updateByPrimaryKeySelective(log);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteLog(Long id, HttpServletRequest request)throws Exception {
+        int result=0;
+        try{
+            result=logMapper.deleteByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteLog(String ids, HttpServletRequest request)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        LogExample example = new LogExample();
+        example.createCriteria().andIdIn(idList);
+        int result=0;
+        try{
+            result=logMapper.deleteByExample(example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public void insertLog(String moduleName, String content, HttpServletRequest request)throws Exception{
+        try{
+            Long userId = userService.getUserId(request);
+            if(userId!=null) {
+                String clientIp = getLocalIp(request);
+                String createTime = Tools.getNow3();
+                Long count = logMapperEx.getCountByIpAndDate(userId, moduleName, clientIp, createTime);
+                if(count > 0) {
+                    //如果某个用户某个IP在同1秒内连续操作两遍,此时需要删除该redis记录,使其退出,防止恶意攻击
+                    redisService.deleteObjectByUserAndIp(userId, clientIp);
+                } else {
+                    Log log = new Log();
+                    log.setUserId(userId);
+                    log.setOperation(moduleName);
+                    log.setClientIp(getLocalIp(request));
+                    log.setCreateTime(new Date());
+                    Byte status = 0;
+                    log.setStatus(status);
+                    log.setContent(content);
+                    logMapper.insertSelective(log);
+                }
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+    }
+
+    public void insertLogWithUserId(Long userId, Long tenantId, String moduleName, String content, HttpServletRequest request)throws Exception{
+        try{
+            if(userId!=null) {
+                Log log = new Log();
+                log.setUserId(userId);
+                log.setOperation(moduleName);
+                log.setClientIp(getLocalIp(request));
+                log.setCreateTime(new Date());
+                Byte status = 0;
+                log.setStatus(status);
+                log.setContent(content);
+                log.setTenantId(tenantId);
+                logMapperEx.insertLogWithUserId(log);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/material/MaterialComponent.java b/src/main/java/com/jsh/erp/service/material/MaterialComponent.java
new file mode 100644
index 0000000..8e54a1c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/material/MaterialComponent.java
@@ -0,0 +1,104 @@
+package com.jsh.erp.service.material;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.depot.DepotResource;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "material_component")
+@MaterialResource
+public class MaterialComponent implements ICommonQuery {
+
+    @Resource
+    private MaterialService materialService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return materialService.getMaterial(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getMaterialList(map);
+    }
+
+    private List<?> getMaterialList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String categoryId = StringUtil.getInfo(search, "categoryId");
+        String materialParam = StringUtil.getInfo(search, "materialParam");
+        String standard = StringUtil.getInfo(search, "standard");
+        String model = StringUtil.getInfo(search, "model");
+        String color = StringUtil.getInfo(search, "color");
+        String brand = StringUtil.getInfo(search, "brand");
+        String mfrs = StringUtil.getInfo(search, "mfrs");
+        String materialOther = StringUtil.getInfo(search, "materialOther");
+        String weight = StringUtil.getInfo(search, "weight");
+        String expiryNum = StringUtil.getInfo(search, "expiryNum");
+        String enableSerialNumber = StringUtil.getInfo(search, "enableSerialNumber");
+        String enableBatchNumber = StringUtil.getInfo(search, "enableBatchNumber");
+        String position = StringUtil.getInfo(search, "position");
+        String enabled = StringUtil.getInfo(search, "enabled");
+        String remark = StringUtil.getInfo(search, "remark");
+        String mpList = StringUtil.getInfo(search, "mpList");
+        return materialService.select(materialParam, standard, model, color, brand, mfrs, materialOther, weight, expiryNum,
+                enableSerialNumber, enableBatchNumber, position, enabled, remark, categoryId, mpList, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String categoryId = StringUtil.getInfo(search, "categoryId");
+        String materialParam = StringUtil.getInfo(search, "materialParam");
+        String standard = StringUtil.getInfo(search, "standard");
+        String model = StringUtil.getInfo(search, "model");
+        String color = StringUtil.getInfo(search, "color");
+        String brand = StringUtil.getInfo(search, "brand");
+        String mfrs = StringUtil.getInfo(search, "mfrs");
+        String materialOther = StringUtil.getInfo(search, "materialOther");
+        String weight = StringUtil.getInfo(search, "weight");
+        String expiryNum = StringUtil.getInfo(search, "expiryNum");
+        String enableSerialNumber = StringUtil.getInfo(search, "enableSerialNumber");
+        String enableBatchNumber = StringUtil.getInfo(search, "enableBatchNumber");
+        String position = StringUtil.getInfo(search, "position");
+        String enabled = StringUtil.getInfo(search, "enabled");
+        String remark = StringUtil.getInfo(search, "remark");
+        String mpList = StringUtil.getInfo(search, "mpList");
+        return materialService.countMaterial(materialParam, standard, model, color, brand, mfrs, materialOther, weight, expiryNum,
+                enableSerialNumber, enableBatchNumber, position, enabled, remark, categoryId, mpList);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return materialService.insertMaterial(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return materialService.updateMaterial(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return materialService.deleteMaterial(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return materialService.batchDeleteMaterial(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return materialService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/material/MaterialResource.java b/src/main/java/com/jsh/erp/service/material/MaterialResource.java
new file mode 100644
index 0000000..4cc6069
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/material/MaterialResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.material;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "material")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MaterialResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/material/MaterialService.java b/src/main/java/com/jsh/erp/service/material/MaterialService.java
new file mode 100644
index 0000000..6a5177b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/material/MaterialService.java
@@ -0,0 +1,1479 @@
+package com.jsh.erp.service.material;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.*;
+import com.jsh.erp.datasource.vo.MaterialVoSearch;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.service.depotItem.DepotItemService;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.materialCategory.MaterialCategoryService;
+import com.jsh.erp.service.materialExtend.MaterialExtendService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.unit.UnitService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ExcelUtils;
+import com.jsh.erp.utils.PinYinUtil;
+import com.jsh.erp.utils.StringUtil;
+import jxl.Sheet;
+import jxl.Workbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service
+public class MaterialService {
+    private Logger logger = LoggerFactory.getLogger(MaterialService.class);
+
+    @Resource
+    private MaterialMapper materialMapper;
+    @Resource
+    private MaterialExtendMapper materialExtendMapper;
+    @Resource
+    private MaterialMapperEx materialMapperEx;
+    @Resource
+    private MaterialCategoryMapperEx materialCategoryMapperEx;
+    @Resource
+    private MaterialExtendMapperEx materialExtendMapperEx;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private DepotItemMapperEx depotItemMapperEx;
+    @Resource
+    private DepotItemService depotItemService;
+    @Resource
+    private MaterialCategoryService materialCategoryService;
+    @Resource
+    private UnitService unitService;
+    @Resource
+    private MaterialInitialStockMapper materialInitialStockMapper;
+    @Resource
+    private MaterialInitialStockMapperEx materialInitialStockMapperEx;
+    @Resource
+    private MaterialCurrentStockMapper materialCurrentStockMapper;
+    @Resource
+    private MaterialCurrentStockMapperEx materialCurrentStockMapperEx;
+    @Resource
+    private DepotService depotService;
+    @Resource
+    private MaterialExtendService materialExtendService;
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Value(value="${file.uploadType}")
+    private Long fileUploadType;
+
+    public Material getMaterial(long id)throws Exception {
+        Material result=null;
+        try{
+            result=materialMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Material> getMaterialListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Material> list = new ArrayList<>();
+        try{
+            MaterialExample example = new MaterialExample();
+            example.createCriteria().andIdIn(idList);
+            list = materialMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Material> getMaterial() throws Exception{
+        MaterialExample example = new MaterialExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Material> list=null;
+        try{
+            list=materialMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialVo4Unit> select(String materialParam, String standard, String model, String color, String brand, String mfrs,
+                                        String materialOther, String weight, String expiryNum, String enableSerialNumber,
+                                        String enableBatchNumber, String position, String enabled, String remark, String categoryId,
+                                        String mpList, int offset, int rows)
+            throws Exception{
+        String[] mpArr = new String[]{};
+        if(StringUtil.isNotEmpty(mpList)){
+            mpArr= mpList.split(",");
+        }
+        List<MaterialVo4Unit> resList = new ArrayList<>();
+        List<MaterialVo4Unit> list =null;
+        try{
+            List<Long> idList = new ArrayList<>();
+            if(StringUtil.isNotEmpty(categoryId)){
+                idList = getListByParentId(Long.parseLong(categoryId));
+            }
+            list= materialMapperEx.selectByConditionMaterial(materialParam, standard, model, color, brand, mfrs, materialOther, weight, expiryNum,
+                    enableSerialNumber, enableBatchNumber, position, enabled, remark, idList, mpList, offset, rows);
+            if (null != list && list.size()>0) {
+                Map<Long,BigDecimal> initialStockMap = getInitialStockMapByMaterialList(list);
+                Map<Long,BigDecimal> currentStockMap = getCurrentStockMapByMaterialList(list);
+                for (MaterialVo4Unit m : list) {
+                    if(fileUploadType == 2) {
+                        m.setImgSmall("small");
+                        m.setImgLarge("large");
+                    }
+                    m.setMaterialOther(getMaterialOtherByParam(mpArr, m));
+                    m.setInitialStock(initialStockMap.get(m.getId())!=null? initialStockMap.get(m.getId()): BigDecimal.ZERO);
+                    m.setBigUnitInitialStock(getBigUnitStock(m.getInitialStock(), m.getUnitId()));
+                    m.setStock(currentStockMap.get(m.getId())!=null? currentStockMap.get(m.getId()): BigDecimal.ZERO);
+                    m.setBigUnitStock(getBigUnitStock(m.getStock(), m.getUnitId()));
+                    resList.add(m);
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public Long countMaterial(String materialParam, String standard, String model, String color, String brand, String mfrs,
+                              String materialOther, String weight, String expiryNum, String enableSerialNumber,
+                              String enableBatchNumber, String position, String enabled, String remark, String categoryId,
+                              String mpList)throws Exception {
+        Long result =null;
+        try{
+            List<Long> idList = new ArrayList<>();
+            if(StringUtil.isNotEmpty(categoryId)){
+                idList = getListByParentId(Long.parseLong(categoryId));
+            }
+            result= materialMapperEx.countsByMaterial(materialParam, standard, model, color, brand, mfrs, materialOther, weight, expiryNum,
+                    enableSerialNumber, enableBatchNumber, position, enabled, remark, idList, mpList);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertMaterial(JSONObject obj, HttpServletRequest request)throws Exception {
+        Material m = JSONObject.parseObject(obj.toJSONString(), Material.class);
+        m.setEnabled(true);
+        try{
+            materialMapperEx.insertSelectiveEx(m);
+            Long mId = m.getId();
+            materialExtendService.saveDetials(obj, obj.getString("sortList"), mId, "insert");
+            if(obj.get("stock")!=null) {
+                JSONArray stockArr = obj.getJSONArray("stock");
+                for (int i = 0; i < stockArr.size(); i++) {
+                    JSONObject jsonObj = stockArr.getJSONObject(i);
+                    if(jsonObj.get("id")!=null && jsonObj.get("initStock")!=null) {
+                        String number = jsonObj.getString("initStock");
+                        BigDecimal lowSafeStock = null;
+                        BigDecimal highSafeStock = null;
+                        if(jsonObj.get("lowSafeStock")!=null) {
+                            lowSafeStock = jsonObj.getBigDecimal("lowSafeStock");
+                        }
+                        if(jsonObj.get("highSafeStock")!=null) {
+                            highSafeStock = jsonObj.getBigDecimal("highSafeStock");
+                        }
+                        Long depotId = jsonObj.getLong("id");
+                        if(StringUtil.isNotEmpty(number) && Double.parseDouble(number)>0 || lowSafeStock!=null || highSafeStock!=null) {
+                            insertInitialStockByMaterialAndDepot(depotId, mId, parseBigDecimalEx(number), lowSafeStock, highSafeStock);
+                            insertCurrentStockByMaterialAndDepot(depotId, mId, parseBigDecimalEx(number));
+                        }
+                    }
+                }
+            }
+            logService.insertLog("商品",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(m.getName()).toString(), request);
+            return 1;
+        }
+        catch (BusinessRunTimeException ex) {
+            throw new BusinessRunTimeException(ex.getCode(), ex.getMessage());
+        }
+        catch(Exception e){
+            JshException.writeFail(logger, e);
+            return 0;
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateMaterial(JSONObject obj, HttpServletRequest request) throws Exception{
+        Material material = JSONObject.parseObject(obj.toJSONString(), Material.class);
+        try{
+            materialMapper.updateByPrimaryKeySelective(material);
+            if(material.getUnitId() == null) {
+                materialMapperEx.setUnitIdToNull(material.getId());
+            }
+            if(material.getExpiryNum() == null) {
+                materialMapperEx.setExpiryNumToNull(material.getId());
+            }
+            materialExtendService.saveDetials(obj, obj.getString("sortList"),material.getId(), "update");
+            if(obj.get("stock")!=null) {
+                JSONArray stockArr = obj.getJSONArray("stock");
+                for (int i = 0; i < stockArr.size(); i++) {
+                    JSONObject jsonObj = stockArr.getJSONObject(i);
+                    if (jsonObj.get("id") != null && jsonObj.get("initStock") != null) {
+                        String number = jsonObj.getString("initStock");
+                        BigDecimal lowSafeStock = null;
+                        BigDecimal highSafeStock = null;
+                        if(jsonObj.get("lowSafeStock")!=null) {
+                            lowSafeStock = jsonObj.getBigDecimal("lowSafeStock");
+                        }
+                        if(jsonObj.get("highSafeStock")!=null) {
+                            highSafeStock = jsonObj.getBigDecimal("highSafeStock");
+                        }
+                        Long depotId = jsonObj.getLong("id");
+                        //初始库存-先清除再插入
+                        MaterialInitialStockExample example = new MaterialInitialStockExample();
+                        example.createCriteria().andMaterialIdEqualTo(material.getId()).andDepotIdEqualTo(depotId);
+                        materialInitialStockMapper.deleteByExample(example);
+                        if (StringUtil.isNotEmpty(number) || lowSafeStock!=null || highSafeStock!=null) {
+                            insertInitialStockByMaterialAndDepot(depotId, material.getId(), parseBigDecimalEx(number), lowSafeStock, highSafeStock);
+                        }
+                        //更新当前库存
+                        depotItemService.updateCurrentStockFun(material.getId(), depotId);
+                    }
+                }
+            }
+            logService.insertLog("商品",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(material.getName()).toString(), request);
+            return 1;
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+            return 0;
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteMaterial(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterial(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialByIds(String ids) throws Exception{
+        String [] idArray=ids.split(",");
+        //校验单据子表	jsh_depot_item
+        List<DepotItem> depotItemList =null;
+        try{
+            depotItemList=  depotItemMapperEx.getDepotItemListListByMaterialIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(depotItemList!=null&&depotItemList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,MaterialIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //记录日志
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        //路径列表
+        List<String> pathList = new ArrayList<>();
+        List<Material> list = getMaterialListByIds(ids);
+        for(Material material: list){
+            sb.append("[").append(material.getName()).append("]");
+            if(StringUtil.isNotEmpty(material.getImgName())) {
+                pathList.add(material.getImgName());
+            }
+        }
+        logService.insertLog("商品", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        //校验通过执行删除操作
+        try{
+            //逻辑删除商品
+            materialMapperEx.batchDeleteMaterialByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+            //逻辑删除商品价格扩展
+            materialExtendMapperEx.batchDeleteMaterialExtendByMIds(idArray);
+            //逻辑删除文件
+            systemConfigService.deleteFileByPathList(pathList);
+            return 1;
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+            return 0;
+        }
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        MaterialExample example = new MaterialExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Material> list =null;
+        try{
+            list=  materialMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public int checkIsExist(Long id, String name, String model, String color, String standard, String mfrs,
+                            String otherField1, String otherField2, String otherField3, String unit, Long unitId)throws Exception {
+        return materialMapperEx.checkIsExist(id, name, model, color, standard, mfrs, otherField1,
+                otherField2, otherField3, unit, unitId);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("商品",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(ids).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> materialIds = StringUtil.strToLongList(ids);
+        Material material = new Material();
+        material.setEnabled(status);
+        MaterialExample example = new MaterialExample();
+        example.createCriteria().andIdIn(materialIds);
+        int result =0;
+        try{
+            result=  materialMapper.updateByExampleSelective(material, example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public Unit findUnit(Long mId)throws Exception{
+        Unit unit = new Unit();
+        try{
+            List<Unit> list = materialMapperEx.findUnitList(mId);
+            if(list!=null && list.size()>0) {
+                unit = list.get(0);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return unit;
+    }
+
+    public List<MaterialVo4Unit> findById(Long id)throws Exception{
+        List<MaterialVo4Unit> list =null;
+        try{
+            list=  materialMapperEx.findById(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialVo4Unit> findByIdWithBarCode(Long meId)throws Exception{
+        List<MaterialVo4Unit> list =null;
+        try{
+            list=  materialMapperEx.findByIdWithBarCode(meId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Long> getListByParentId(Long parentId) {
+        List<Long> idList = new ArrayList<Long>();
+        List<MaterialCategory> list = materialCategoryMapperEx.getListByParentId(parentId);
+        idList.add(parentId);
+        if(list!=null && list.size()>0) {
+            getIdListByParentId(idList, parentId);
+        }
+        return idList;
+    }
+
+    public List<Long> getIdListByParentId(List<Long> idList, Long parentId){
+        List<MaterialCategory> list = materialCategoryMapperEx.getListByParentId(parentId);
+        if(list!=null && list.size()>0) {
+            for(MaterialCategory mc : list){
+                idList.add(mc.getId());
+                getIdListByParentId(idList, mc.getId());
+            }
+        }
+        return idList;
+    }
+
+    public JSONArray getMaterialByParam(String materialParam) {
+        JSONArray arr = new JSONArray();
+        List<MaterialVoSearch> list = materialMapperEx.getMaterialByParam(materialParam);
+        for(MaterialVoSearch item: list) {
+            JSONObject obj = new JSONObject();
+            StringBuilder sb = new StringBuilder();
+            sb.append(item.getBarCode());
+            sb.append("_").append(item.getName());
+            if(StringUtil.isNotEmpty(item.getMnemonic())) {
+                sb.append("(").append(item.getMnemonic()).append(")");
+            }
+            if(StringUtil.isNotEmpty(item.getStandard())) {
+                sb.append("(").append(item.getStandard()).append(")");
+            }
+            if(StringUtil.isNotEmpty(item.getModel())) {
+                sb.append("(").append(item.getModel()).append(")");
+            }
+            if(StringUtil.isNotEmpty(item.getColor())) {
+                sb.append("(").append(item.getColor()).append(")");
+            }
+            if(StringUtil.isNotEmpty(item.getUnit())) {
+                sb.append("(").append(item.getUnit()).append(")");
+            }
+            obj.put("barCode", item.getBarCode());
+            obj.put("materialStr", sb.toString());
+            arr.add(obj);
+        }
+        return arr;
+    }
+
+    public List<MaterialVo4Unit> findBySelectWithBarCode(Long categoryId, String q, String standardOrModel, String color,
+                                                         String brand, String mfrs, String enableSerialNumber, String enableBatchNumber,
+                                                         Integer offset, Integer rows) throws Exception{
+        List<MaterialVo4Unit> list =null;
+        try{
+            List<Long> idList = new ArrayList<>();
+            if(categoryId!=null){
+                Long parentId = categoryId;
+                idList = getListByParentId(parentId);
+            }
+            if(StringUtil.isNotEmpty(q)) {
+                q = q.replace("'", "");
+                q = q.trim();
+            }
+            list=  materialMapperEx.findBySelectWithBarCode(idList, q, standardOrModel, color, brand, mfrs,
+                    enableSerialNumber, enableBatchNumber, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public int findBySelectWithBarCodeCount(Long categoryId, String q, String standardOrModel, String color,
+                                            String brand, String mfrs, String enableSerialNumber, String enableBatchNumber) throws Exception{
+        int result=0;
+        try{
+            List<Long> idList = new ArrayList<>();
+            if(categoryId!=null){
+                Long parentId = categoryId;
+                idList = getListByParentId(parentId);
+            }
+            if(StringUtil.isNotEmpty(q)) {
+                q = q.replace("'", "");
+            }
+            result = materialMapperEx.findBySelectWithBarCodeCount(idList, q, standardOrModel, color, brand, mfrs,
+                    enableSerialNumber, enableBatchNumber);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE,ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return result;
+    }
+
+    public void exportExcel(String categoryId, String materialParam, String color, String materialOther, String weight,
+                                             String expiryNum, String enabled, String enableSerialNumber, String enableBatchNumber,
+                                             String remark, HttpServletResponse response)throws Exception {
+        List<Long> idList = new ArrayList<>();
+        if(StringUtil.isNotEmpty(categoryId)){
+            idList = getListByParentId(Long.parseLong(categoryId));
+        }
+        //查询商品主条码相关列表
+        List<MaterialVo4Unit> dataList = materialMapperEx.exportExcel(materialParam, color, materialOther, weight, expiryNum, enabled, enableSerialNumber,
+                enableBatchNumber, remark, idList);
+        //查询商品副条码相关列表
+        Map<Long, MaterialExtend> otherMaterialMap = new HashMap<>();
+        List<MaterialExtend> otherDataList = materialMapperEx.getOtherMaterialList();
+        for(MaterialExtend me: otherDataList) {
+            otherMaterialMap.put(me.getMaterialId(), me);
+        }
+        String nameStr = "名称*,规格,型号,颜色,品牌,类别,基础重量(kg),保质期(天),基本单位*,副单位,基本条码*,副条码,比例,多属性," +
+                "采购价,零售价,销售价,最低售价,状态*,序列号,批号,仓位货架,制造商,自定义1,自定义2,自定义3,备注";
+        List<String> nameList = StringUtil.strToStringList(nameStr);
+        //仓库列表
+        List<Depot> depotList = depotService.getAllList();
+        if (nameList != null) {
+            for(Depot depot: depotList) {
+                nameList.add(depot.getName());
+            }
+        }
+        //期初库存缓存
+        List<MaterialInitialStock> misList = materialInitialStockMapperEx.getListExceptZero();
+        Map<String, BigDecimal> misMap = new HashMap<>();
+        if (misList != null) {
+            for (MaterialInitialStock mis : misList) {
+                misMap.put(mis.getMaterialId() + "_" + mis.getDepotId(), mis.getNumber());
+            }
+        }
+        String[] names = StringUtil.listToStringArray(nameList);
+        String title = "商品信息";
+        List<String[]> objects = new ArrayList<>();
+        if (null != dataList) {
+            for (MaterialVo4Unit m : dataList) {
+                String[] objs = new String[names.length];
+                objs[0] = m.getName();
+                objs[1] = m.getStandard();
+                objs[2] = m.getModel();
+                objs[3] = m.getColor();
+                objs[4] = m.getBrand();
+                objs[5] = m.getCategoryName();
+                objs[6] = m.getWeight() == null ? "" : m.getWeight().setScale(3, BigDecimal.ROUND_HALF_UP).toString();
+                objs[7] = m.getExpiryNum() == null ? "" : m.getExpiryNum().toString();
+                objs[8] = m.getCommodityUnit();
+                objs[9] = otherMaterialMap.get(m.getId()) == null ? "" : otherMaterialMap.get(m.getId()).getCommodityUnit();
+                objs[10] = m.getmBarCode();
+                objs[11] = otherMaterialMap.get(m.getId()) == null ? "" : otherMaterialMap.get(m.getId()).getBarCode();
+                objs[12] = m.getRatio() == null ? "" : m.getRatio().toString();
+                objs[13] = m.getSku();
+                objs[14] = m.getPurchaseDecimal() == null ? "" : m.getPurchaseDecimal().setScale(3, BigDecimal.ROUND_HALF_UP).toString();
+                objs[15] = m.getCommodityDecimal() == null ? "" : m.getCommodityDecimal().setScale(3, BigDecimal.ROUND_HALF_UP).toString();
+                objs[16] = m.getWholesaleDecimal() == null ? "" : m.getWholesaleDecimal().setScale(3, BigDecimal.ROUND_HALF_UP).toString();
+                objs[17] = m.getLowDecimal() == null ? "" : m.getLowDecimal().setScale(3, BigDecimal.ROUND_HALF_UP).toString();
+                objs[18] = m.getEnabled() ? "1" : "0";
+                objs[19] = m.getEnableSerialNumber();
+                objs[20] = m.getEnableBatchNumber();
+                objs[21] = m.getPosition();
+                objs[22] = m.getMfrs();
+                objs[23] = m.getOtherField1();
+                objs[24] = m.getOtherField2();
+                objs[25] = m.getOtherField3();
+                objs[26] = m.getRemark();
+                //仓库期初库存
+                int i = 27;
+                for(Depot depot: depotList) {
+                    BigDecimal number = misMap.get(m.getId() + "_" + depot.getId());
+                    objs[i] = number == null ? "0" : number.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
+                    i++;
+                }
+                objects.add(objs);
+            }
+        }
+        File file = ExcelUtils.exportObjectsOneSheet(title, "*导入时本行内容请勿删除,切记!", names, title, objects);
+        ExcelUtils.downloadExcel(file, file.getName(), response);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public BaseResponseInfo importExcel(MultipartFile file, HttpServletRequest request) throws Exception {
+        BaseResponseInfo info = new BaseResponseInfo();
+        try {
+            Long beginTime = System.currentTimeMillis();
+            //文件扩展名只能为xls
+            String fileName = file.getOriginalFilename();
+            if(StringUtil.isNotEmpty(fileName)) {
+                String fileExt = fileName.substring(fileName.indexOf(".")+1);
+                if(!"xls".equals(fileExt)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXTENSION_ERROR_CODE,
+                            ExceptionConstants.MATERIAL_EXTENSION_ERROR_MSG);
+                }
+            }
+            Workbook workbook = Workbook.getWorkbook(file.getInputStream());
+            Sheet src = workbook.getSheet(0);
+            //获取真实的行数,剔除掉空白行
+            int rightRows = ExcelUtils.getRightRows(src);
+            List<Depot> depotList= depotService.getDepot();
+            int depotCount = depotList.size();
+            Map<String, Long> depotMap = parseDepotToMap(depotList);
+            User user = userService.getCurrentUser();
+            List<MaterialWithInitStock> mList = new ArrayList<>();
+            //单次导入超出1000条
+            if(rightRows > 1002) {
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_IMPORT_OVER_LIMIT_CODE,
+                        String.format(ExceptionConstants.MATERIAL_IMPORT_OVER_LIMIT_MSG));
+            }
+            for (int i = 2; i < rightRows; i++) {
+                String name = ExcelUtils.getContent(src, i, 0); //名称
+                String standard = ExcelUtils.getContent(src, i, 1); //规格
+                String model = ExcelUtils.getContent(src, i, 2); //型号
+                String color = ExcelUtils.getContent(src, i, 3); //颜色
+                String brand = ExcelUtils.getContent(src, i, 4); //品牌
+                String categoryName = ExcelUtils.getContent(src, i, 5); //类别
+                String weight = ExcelUtils.getContent(src, i, 6); //基础重量(kg)
+                String expiryNum = ExcelUtils.getContent(src, i, 7); //保质期(天)
+                String unit = ExcelUtils.getContent(src, i, 8); //基本单位
+                //名称为空
+                if(StringUtil.isEmpty(name)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NAME_EMPTY_CODE,
+                            String.format(ExceptionConstants.MATERIAL_NAME_EMPTY_MSG, i+1));
+                }
+                //名称长度超出
+                if(name.length()>100) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NAME_OVER_CODE,
+                            String.format(ExceptionConstants.MATERIAL_NAME_OVER_MSG, i+1));
+                }
+                //规格长度超出
+                if(StringUtil.isNotEmpty(standard) && standard.length()>100) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_STANDARD_OVER_CODE,
+                            String.format(ExceptionConstants.MATERIAL_STANDARD_OVER_MSG, i+1));
+                }
+                //型号长度超出
+                if(StringUtil.isNotEmpty(model) && model.length()>100) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_MODEL_OVER_CODE,
+                            String.format(ExceptionConstants.MATERIAL_MODEL_OVER_MSG, i+1));
+                }
+                //基本单位为空
+                if(StringUtil.isEmpty(unit)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_UNIT_EMPTY_CODE,
+                            String.format(ExceptionConstants.MATERIAL_UNIT_EMPTY_MSG, i+1));
+                }
+                MaterialWithInitStock m = new MaterialWithInitStock();
+                m.setName(name);
+                m.setStandard(standard);
+                m.setModel(model);
+                m.setColor(color);
+                m.setBrand(brand);
+                //通过名称生成助记码
+                m.setMnemonic(PinYinUtil.getFirstLettersLo(name));
+                Long categoryId = materialCategoryService.getCategoryIdByName(categoryName);
+                if(null!=categoryId){
+                    m.setCategoryId(categoryId);
+                }
+                if(StringUtil.isNotEmpty(weight)) {
+                    //校验基础重量是否是数字(含小数)
+                    if(!StringUtil.isPositiveBigDecimal(weight)) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_WEIGHT_NOT_DECIMAL_CODE,
+                                String.format(ExceptionConstants.MATERIAL_WEIGHT_NOT_DECIMAL_MSG, i+1));
+                    }
+                    m.setWeight(new BigDecimal(weight));
+                }
+                if(StringUtil.isNotEmpty(expiryNum)) {
+                    //校验保质期是否是正整数
+                    if(!StringUtil.isPositiveLong(expiryNum)) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXPIRY_NUM_NOT_INTEGER_CODE,
+                                String.format(ExceptionConstants.MATERIAL_EXPIRY_NUM_NOT_INTEGER_MSG, i+1));
+                    }
+                    m.setExpiryNum(Integer.parseInt(expiryNum));
+                }
+                String manyUnit = ExcelUtils.getContent(src, i, 9); //副单位
+                String barCode = ExcelUtils.getContent(src, i, 10); //基础条码
+                String manyBarCode = ExcelUtils.getContent(src, i, 11); //副条码
+                String ratio = ExcelUtils.getContent(src, i, 12); //比例
+                String sku = ExcelUtils.getContent(src, i, 13); //多属性
+                String purchaseDecimal = ExcelUtils.getContent(src, i, 14); //采购价
+                String commodityDecimal = ExcelUtils.getContent(src, i, 15); //零售价
+                String wholesaleDecimal = ExcelUtils.getContent(src, i, 16); //销售价
+                String lowDecimal = ExcelUtils.getContent(src, i, 17); //最低售价
+                String enabled = ExcelUtils.getContent(src, i, 18); //状态
+                String enableSerialNumber = ExcelUtils.getContent(src, i, 19); //序列号
+                String enableBatchNumber = ExcelUtils.getContent(src, i, 20); //批号
+                String position = ExcelUtils.getContent(src, i, 21); //仓位货架
+                String mfrs = ExcelUtils.getContent(src, i, 22); //制造商
+                String otherField1 = ExcelUtils.getContent(src, i, 23); //自定义1
+                String otherField2 = ExcelUtils.getContent(src, i, 24); //自定义2
+                String otherField3 = ExcelUtils.getContent(src, i, 25); //自定义3
+                String remark = ExcelUtils.getContent(src, i, 26); //备注
+                m.setPosition(StringUtil.isNotEmpty(position)?position:null);
+                m.setMfrs(StringUtil.isNotEmpty(mfrs)?mfrs:null);
+                m.setOtherField1(StringUtil.isNotEmpty(otherField1)?otherField1:null);
+                m.setOtherField2(StringUtil.isNotEmpty(otherField2)?otherField2:null);
+                m.setOtherField3(StringUtil.isNotEmpty(otherField3)?otherField3:null);
+                m.setRemark(remark);
+                //状态格式错误
+                if(!"1".equals(enabled) && !"0".equals(enabled)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_ENABLED_ERROR_CODE,
+                            String.format(ExceptionConstants.MATERIAL_ENABLED_ERROR_MSG, i+1));
+                }
+                //基本条码为空
+                if(StringUtil.isEmpty(barCode)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_EMPTY_CODE,
+                            String.format(ExceptionConstants.MATERIAL_BARCODE_EMPTY_MSG, i+1));
+                }
+                //校验基本条码长度为4到40位
+                if(!StringUtil.checkBarCodeLength(barCode)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_LENGTH_ERROR_CODE,
+                            String.format(ExceptionConstants.MATERIAL_BARCODE_LENGTH_ERROR_MSG, barCode));
+                }
+                //校验副条码长度为4到40位
+                if(StringUtil.isNotEmpty(manyBarCode) && !StringUtil.checkBarCodeLength(manyBarCode)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_LENGTH_ERROR_CODE,
+                            String.format(ExceptionConstants.MATERIAL_BARCODE_LENGTH_ERROR_MSG, manyBarCode));
+                }
+                //批量校验excel中有无重复商品,是指名称、规格、型号、颜色、单位、多属性
+                batchCheckExistMaterialListByParam(mList, name, standard, model, color, unit, sku);
+                //批量校验excel中有无重复条码(1-文档自身校验,2-和数据库里面的商品校验)
+                batchCheckExistBarCodeByParam(mList, barCode, manyBarCode);
+                JSONObject materialExObj = new JSONObject();
+                JSONObject basicObj = new JSONObject();
+                basicObj.put("barCode", barCode);
+                basicObj.put("commodityUnit", unit);
+                basicObj.put("sku", sku);
+                basicObj.put("purchaseDecimal", purchaseDecimal);
+                basicObj.put("commodityDecimal", commodityDecimal);
+                basicObj.put("wholesaleDecimal", wholesaleDecimal);
+                basicObj.put("lowDecimal", lowDecimal);
+                materialExObj.put("basic", basicObj);
+                if(StringUtil.isNotEmpty(manyUnit) && StringUtil.isNotEmpty(ratio)){ //多单位
+                    //校验比例是否是数字(含小数)
+                    if(!StringUtil.isPositiveBigDecimal(ratio.trim())) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_RATIO_NOT_INTEGER_CODE,
+                                String.format(ExceptionConstants.MATERIAL_RATIO_NOT_INTEGER_MSG, i+1));
+                    }
+                    Long unitId = unitService.getUnitIdByParam(unit, manyUnit, new BigDecimal(ratio.trim()));
+                    if(unitId != null) {
+                        m.setUnitId(unitId);
+                        m.setUnit("");
+                    } else {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_UNIT_MATE_CODE,
+                                String.format(ExceptionConstants.MATERIAL_UNIT_MATE_MSG, manyBarCode));
+                    }
+                    JSONObject otherObj = new JSONObject();
+                    otherObj.put("barCode", manyBarCode);
+                    otherObj.put("commodityUnit", manyUnit);
+                    otherObj.put("purchaseDecimal", parsePrice(purchaseDecimal,ratio));
+                    otherObj.put("commodityDecimal", parsePrice(commodityDecimal,ratio));
+                    otherObj.put("wholesaleDecimal", parsePrice(wholesaleDecimal,ratio));
+                    otherObj.put("lowDecimal", parsePrice(lowDecimal,ratio));
+                    materialExObj.put("other", otherObj);
+                } else {
+                    m.setUnit(unit);
+                    m.setUnitId(null);
+                }
+                m.setMaterialExObj(materialExObj);
+                m.setEnabled("1".equals(enabled));
+                if(StringUtil.isNotEmpty(enableSerialNumber) && "1".equals(enableSerialNumber)) {
+                    m.setEnableSerialNumber("1");
+                } else {
+                    m.setEnableSerialNumber("0");
+                }
+                if(StringUtil.isNotEmpty(enableBatchNumber) && "1".equals(enableBatchNumber)) {
+                    m.setEnableBatchNumber("1");
+                } else {
+                    m.setEnableBatchNumber("0");
+                }
+                if("1".equals(enableSerialNumber) && "1".equals(enableBatchNumber)) {
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_ENABLE_MUST_ONE_CODE,
+                            String.format(ExceptionConstants.MATERIAL_ENABLE_MUST_ONE_MSG, barCode));
+                }
+                m.setStockMap(getStockMapCache(src, depotCount, depotMap, i));
+                mList.add(m);
+            }
+            List<Long> deleteInitialStockMaterialIdList = new ArrayList<>();
+            List<Long> deleteCurrentStockMaterialIdList = new ArrayList<>();
+            List<MaterialInitialStock> insertInitialStockMaterialList = new ArrayList<>();
+            List<MaterialCurrentStock> insertCurrentStockMaterialList = new ArrayList<>();
+            //防止初始库存和当前库存出现重复
+            Map<String, String> materialDepotInitialMap = new HashMap<>();
+            Map<String, String> materialDepotCurrentMap = new HashMap<>();
+            for(MaterialWithInitStock m: mList) {
+                Long mId = 0L;
+                //判断该商品是否存在,如果不存在就新增,如果存在就更新
+                String basicBarCode = getBasicBarCode(m);
+                List<Material> materials = getMaterialListByParam(m.getName(),m.getStandard(),m.getModel(),m.getColor(),m.getUnit(),m.getUnitId(), basicBarCode);
+                if(materials.size() == 0) {
+                    materialMapperEx.insertSelectiveEx(m);
+                    mId = m.getId();
+                } else {
+                    mId = materials.get(0).getId();
+                    String materialJson = JSON.toJSONString(m);
+                    Material material = JSONObject.parseObject(materialJson, Material.class);
+                    material.setId(mId);
+                    materialMapper.updateByPrimaryKeySelective(material);
+                    //更新多单位
+                    if(material.getUnitId() == null) {
+                        materialMapperEx.setUnitIdToNull(material.getId());
+                    }
+                    //如果之前有保质期,则更新保质期
+                    if(materials.get(0).getExpiryNum()!=null && material.getExpiryNum() == null) {
+                        materialMapperEx.setExpiryNumToNull(material.getId());
+                    }
+                }
+                //给商品新增或更新条码与价格相关信息
+                JSONObject materialExObj = m.getMaterialExObj();
+                insertOrUpdateMaterialExtend(materialExObj, "basic", "1", mId, user);
+                insertOrUpdateMaterialExtend(materialExObj, "other", "0", mId, user);
+                //给商品更新库存
+                Map<Long, BigDecimal> stockMap = m.getStockMap();
+                for(Depot depot: depotList){
+                    Long depotId = depot.getId();
+                    String materialDepotKey = mId + "_" + depotId;
+                    //获取初始库存
+                    BigDecimal initStock = getInitStock(mId, depotId);
+                    //excel里面的当前库存
+                    BigDecimal stock = stockMap.get(depot.getId());
+                    //新增或更新初始库存
+                    if(stock!=null && stock.compareTo(BigDecimal.ZERO)!=0) {
+                        String basicStr = materialExObj.getString("basic");
+                        MaterialExtend materialExtend = JSONObject.parseObject(basicStr, MaterialExtend.class);
+                        if(StringUtil.isNotEmpty(materialExtend.getSku())) {
+                            throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_SKU_BEGIN_STOCK_FAILED_CODE,
+                                    String.format(ExceptionConstants.MATERIAL_SKU_BEGIN_STOCK_FAILED_MSG, materialExtend.getBarCode()));
+                        }
+                        buildChangeInitialStock(deleteInitialStockMaterialIdList, insertInitialStockMaterialList, materialDepotInitialMap, mId, depotId, materialDepotKey, stock);
+                    } else {
+                        if(initStock.compareTo(BigDecimal.ZERO)!=0) {
+                            buildChangeInitialStock(deleteInitialStockMaterialIdList, insertInitialStockMaterialList, materialDepotInitialMap, mId, depotId, materialDepotKey, stock);
+                        }
+                    }
+                    //新增或更新当前库存
+                    Long billCount = depotItemService.getCountByMaterialAndDepot(mId, depotId);
+                    if(billCount == 0) {
+                        if(stock!=null && stock.compareTo(BigDecimal.ZERO)!=0) {
+                            buildChangeCurrentStock(deleteCurrentStockMaterialIdList, insertCurrentStockMaterialList, materialDepotCurrentMap, mId, depotId, materialDepotKey, stock);
+                        } else {
+                            if(initStock.compareTo(BigDecimal.ZERO)!=0) {
+                                buildChangeCurrentStock(deleteCurrentStockMaterialIdList, insertCurrentStockMaterialList, materialDepotCurrentMap, mId, depotId, materialDepotKey, stock);
+                            }
+                        }
+                    } else {
+                        BigDecimal currentNumber = getCurrentStockByMaterialIdAndDepotId(mId, depotId);
+                        //当前库存的更新:减去初始库存,再加上导入的新初始库存
+                        if(currentNumber!=null && initStock!=null && stock!=null) {
+                            currentNumber = currentNumber.subtract(initStock).add(stock);
+                        }
+                        buildChangeCurrentStock(deleteCurrentStockMaterialIdList, insertCurrentStockMaterialList, materialDepotCurrentMap, mId, depotId, materialDepotKey, currentNumber);
+                    }
+                }
+            }
+            //批量更新库存,先删除后新增
+            if(insertInitialStockMaterialList.size()>0) {
+                batchDeleteInitialStockByMaterialList(deleteInitialStockMaterialIdList);
+                materialInitialStockMapperEx.batchInsert(insertInitialStockMaterialList);
+            }
+            if(insertCurrentStockMaterialList.size()>0) {
+                batchDeleteCurrentStockByMaterialList(deleteCurrentStockMaterialIdList);
+                materialCurrentStockMapperEx.batchInsert(insertCurrentStockMaterialList);
+            }
+            logService.insertLog("商品",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_IMPORT).append(mList.size()).append(BusinessConstants.LOG_DATA_UNIT).toString(),
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            Long endTime = System.currentTimeMillis();
+            logger.info("导入耗时:{}", endTime-beginTime);
+            info.code = 200;
+            info.data = "导入成功";
+        } catch (BusinessRunTimeException e) {
+            info.code = e.getCode();
+            info.data = e.getData().get("message");
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            info.code = 500;
+            info.data = "导入失败";
+        }
+        return info;
+    }
+
+    /**
+     * 构造初始库存的变化
+     */
+    private void buildChangeInitialStock(List<Long> deleteInitialStockMaterialIdList, List<MaterialInitialStock> insertInitialStockMaterialList,
+                                         Map<String, String> materialDepotInitialMap, Long mId, Long depotId, String materialDepotKey, BigDecimal stock) {
+        if(materialDepotInitialMap.get(materialDepotKey)==null) {
+            MaterialInitialStock materialInitialStock = new MaterialInitialStock();
+            materialInitialStock.setMaterialId(mId);
+            materialInitialStock.setDepotId(depotId);
+            materialInitialStock.setNumber(stock);
+            insertInitialStockMaterialList.add(materialInitialStock);
+            deleteInitialStockMaterialIdList.add(mId);
+            materialDepotInitialMap.put(materialDepotKey, materialDepotKey);
+        }
+    }
+
+    /**
+     * 构造当前库存的变化
+     */
+    private void buildChangeCurrentStock(List<Long> deleteCurrentStockMaterialIdList, List<MaterialCurrentStock> insertCurrentStockMaterialList,
+                                         Map<String, String> materialDepotCurrentMap, Long mId, Long depotId, String materialDepotKey, BigDecimal stock) {
+        if(materialDepotCurrentMap.get(materialDepotKey)==null) {
+            MaterialCurrentStock materialCurrentStock = new MaterialCurrentStock();
+            materialCurrentStock.setMaterialId(mId);
+            materialCurrentStock.setDepotId(depotId);
+            materialCurrentStock.setCurrentNumber(stock);
+            insertCurrentStockMaterialList.add(materialCurrentStock);
+            deleteCurrentStockMaterialIdList.add(mId);
+            materialDepotCurrentMap.put(materialDepotKey, materialDepotKey);
+        }
+    }
+
+    private Map<String, Long> parseDepotToMap(List<Depot> depotList) {
+        Map<String, Long> map = new HashMap<>();
+        for(Depot depot: depotList) {
+            map.put(depot.getName(), depot.getId());
+        }
+        return map;
+    }
+
+    /**
+     * 缓存各个仓库的库存信息
+     * @param src
+     * @param depotCount
+     * @param depotMap
+     * @param i
+     * @return
+     * @throws Exception
+     */
+    private Map<Long, BigDecimal> getStockMapCache(Sheet src, int depotCount, Map<String, Long> depotMap, int i) throws Exception {
+        Map<Long, BigDecimal> stockMap = new HashMap<>();
+        for(int j = 1; j<= depotCount; j++) {
+            int col = 26 + j;
+            if(col < src.getColumns()){
+                String depotName = ExcelUtils.getContent(src, 1, col); //获取仓库名称
+                if(StringUtil.isNotEmpty(depotName)) {
+                    Long depotId = depotMap.get(depotName);
+                    if(depotId!=null && depotId!=0L){
+                        String stockStr = ExcelUtils.getContent(src, i, col);
+                        if(StringUtil.isNotEmpty(stockStr)) {
+                            stockMap.put(depotId, parseBigDecimalEx(stockStr));
+                        }
+                    }
+                }
+            }
+        }
+        return stockMap;
+    }
+
+    /**
+     * 批量校验excel中有无重复商品,是指名称、规格、型号、颜色、单位
+     * @param mList
+     */
+    public void batchCheckExistMaterialListByParam(List<MaterialWithInitStock> mList, String name, String standard,
+                                                   String model, String color, String unit, String sku) {
+        for(MaterialWithInitStock material: mList){
+            String materialSku = "";
+            JSONObject materialExObj = material.getMaterialExObj();
+            if(materialExObj!=null && materialExObj.get("basic")!=null) {
+                JSONObject basicObj = materialExObj.getJSONObject("basic");
+                if(basicObj!=null && materialExObj.get("sku")!=null) {
+                    materialSku = basicObj.getString("sku");
+                }
+            }
+            if(name.equals(material.getName()) &&
+                    standard.equals(material.getStandard()) &&
+                    model.equals(material.getModel()) &&
+                    color.equals(material.getColor()) &&
+                    unit.equals(material.getUnit()) &&
+                    sku.equals(materialSku)) {
+                String info = name + "-" + standard + "-" + model + "-" + color + "-" + unit + "-" + sku;
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXCEL_IMPORT_EXIST_CODE,
+                        String.format(ExceptionConstants.MATERIAL_EXCEL_IMPORT_EXIST_MSG, info));
+            }
+        }
+    }
+
+    /**
+     * 批量校验excel中有无重复条码(1-文档自身校验,2-和数据库里面的商品校验)
+     * @param mList
+     */
+    public void batchCheckExistBarCodeByParam(List<MaterialWithInitStock> mList,
+                                              String barCode, String manyBarCode) throws Exception {
+        if(StringUtil.isNotEmpty(manyBarCode)) {
+            if(barCode.equals(manyBarCode)) {
+                //同一个商品的主副条码重复了,进行提醒
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_CODE,
+                        String.format(ExceptionConstants.MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_MSG, manyBarCode));
+            }
+            //EXCEL中有副条码在系统中已存在(除自身商品之外)
+            int count = materialExtendService.getCountByManyBarCodeWithoutUs(manyBarCode, barCode);
+            if (count>0) {
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXCEL_IMPORT_MANY_BARCODE_EXIST_CODE,
+                        String.format(ExceptionConstants.MATERIAL_EXCEL_IMPORT_MANY_BARCODE_EXIST_MSG, manyBarCode));
+            }
+        }
+        for(MaterialWithInitStock material: mList){
+            JSONObject materialExObj = material.getMaterialExObj();
+            String basicBarCode = "";
+            String otherBarCode = "";
+            if(materialExObj.get("basic")!=null) {
+                JSONObject basicObj = materialExObj.getJSONObject("basic");
+                basicBarCode = basicObj.getString("barCode");
+            }
+            if(materialExObj.get("other")!=null) {
+                JSONObject otherObj = materialExObj.getJSONObject("other");
+                otherBarCode = otherObj.getString("barCode");
+            }
+            if(barCode.equals(basicBarCode) || barCode.equals(otherBarCode)){
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_CODE,
+                        String.format(ExceptionConstants.MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_MSG, barCode));
+            }
+            if(StringUtil.isNotEmpty(manyBarCode)) {
+                if(manyBarCode.equals(basicBarCode) || manyBarCode.equals(otherBarCode)){
+                    throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_CODE,
+                            String.format(ExceptionConstants.MATERIAL_EXCEL_IMPORT_BARCODE_EXIST_MSG, manyBarCode));
+                }
+            }
+        }
+    }
+
+    /**
+     * 给商品新增或更新条码与价格相关信息
+     * @param materialExObj
+     * @param type
+     * @param defaultFlag
+     * @param mId
+     * @param user
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void insertOrUpdateMaterialExtend(JSONObject materialExObj, String type, String defaultFlag, Long mId, User user) throws Exception {
+        if(StringUtil.isExist(materialExObj.get(type))){
+            String basicStr = materialExObj.getString(type);
+            MaterialExtend materialExtend = JSONObject.parseObject(basicStr, MaterialExtend.class);
+            materialExtend.setMaterialId(mId);
+            materialExtend.setDefaultFlag(defaultFlag);
+            materialExtend.setCreateTime(new Date());
+            materialExtend.setUpdateTime(System.currentTimeMillis());
+            materialExtend.setCreateSerial(user.getLoginName());
+            materialExtend.setUpdateSerial(user.getLoginName());
+            Long meId = 0L;
+            if(StringUtil.isNotEmpty(materialExtend.getSku())){
+                //含sku的商品,特殊逻辑
+                meId = materialExtendService.selectIdByMaterialIdAndBarCode(mId, materialExtend.getBarCode());
+                List<MaterialExtend> meList = materialExtendService.getListByMaterialIdAndDefaultFlagAndBarCode(mId, "1", materialExtend.getBarCode());
+                if(meList.size() == 0) {
+                    materialExtend.setDefaultFlag("1");
+                } else {
+                    materialExtend.setDefaultFlag("0");
+                }
+            } else {
+                meId = materialExtendService.selectIdByMaterialIdAndDefaultFlag(mId, defaultFlag);
+            }
+            if(meId==0L){
+                materialExtendMapper.insertSelective(materialExtend);
+            } else {
+                materialExtend.setId(meId);
+                materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
+                //如果金额为空,此处单独置空
+                materialExtendMapperEx.specialUpdatePrice(materialExtend);
+            }
+        }
+    }
+
+    public String getBasicBarCode(MaterialWithInitStock m) {
+        String barCode = "";
+        JSONObject materialExObj = m.getMaterialExObj();
+        if(StringUtil.isExist(materialExObj.get("basic"))) {
+            String basicStr = materialExObj.getString("basic");
+            MaterialExtend basicMaterialExtend = JSONObject.parseObject(basicStr, MaterialExtend.class);
+            barCode = basicMaterialExtend.getBarCode();
+        }
+        return barCode;
+    }
+
+    /**
+     * 根据条件返回产品列表
+     * @param name
+     * @param standard
+     * @param model
+     * @param color
+     * @param unit
+     * @param unitId
+     * @return
+     */
+    private List<Material> getMaterialListByParam(String name, String standard, String model, String color, String unit, Long unitId, String basicBarCode) throws Exception {
+        List<Material> list = new ArrayList<>();
+        MaterialExample example = new MaterialExample();
+        MaterialExample.Criteria criteria = example.createCriteria();
+        criteria.andNameEqualTo(name);
+        if (StringUtil.isNotEmpty(model)) {
+            criteria.andModelEqualTo(model);
+        }
+        if (StringUtil.isNotEmpty(color)) {
+            criteria.andColorEqualTo(color);
+        }
+        if (StringUtil.isNotEmpty(standard)) {
+            criteria.andStandardEqualTo(standard);
+        }
+        if (StringUtil.isNotEmpty(unit)) {
+            criteria.andUnitEqualTo(unit);
+        }
+        if (unitId !=null) {
+            criteria.andUnitIdEqualTo(unitId);
+        }
+        criteria.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        list = materialMapper.selectByExample(example);
+        if(list.size()==0) {
+            //如果通过组合条件没有查到该商品,则通过条码再查一次
+            MaterialExtend materialExtend = materialExtendService.getInfoByBarCode(basicBarCode);
+            if(materialExtend != null && materialExtend.getMaterialId()!=null) {
+                Material material = new Material();
+                material.setId(materialExtend.getMaterialId());
+                list.add(material);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 写入初始库存
+     * @param depotId
+     * @param mId
+     * @param stock
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void insertInitialStockByMaterialAndDepot(Long depotId, Long mId, BigDecimal stock, BigDecimal lowSafeStock, BigDecimal highSafeStock){
+        MaterialInitialStock materialInitialStock = new MaterialInitialStock();
+        materialInitialStock.setDepotId(depotId);
+        materialInitialStock.setMaterialId(mId);
+        stock = stock == null? BigDecimal.ZERO: stock;
+        materialInitialStock.setNumber(stock);
+        if(lowSafeStock!=null) {
+            materialInitialStock.setLowSafeStock(lowSafeStock);
+        }
+        if(highSafeStock!=null) {
+            materialInitialStock.setHighSafeStock(highSafeStock);
+        }
+        materialInitialStockMapper.insertSelective(materialInitialStock); //存入初始库存
+    }
+
+    /**
+     * 写入当前库存
+     * @param depotId
+     * @param mId
+     * @param stock
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void insertCurrentStockByMaterialAndDepot(Long depotId, Long mId, BigDecimal stock){
+        MaterialCurrentStock materialCurrentStock = new MaterialCurrentStock();
+        materialCurrentStock.setDepotId(depotId);
+        materialCurrentStock.setMaterialId(mId);
+        materialCurrentStock.setCurrentNumber(stock);
+        materialCurrentStockMapper.insertSelective(materialCurrentStock); //存入初始库存
+    }
+
+    /**
+     * 批量删除初始库存
+     * @param mIdList
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void batchDeleteInitialStockByMaterialList(List<Long> mIdList){
+        MaterialInitialStockExample example = new MaterialInitialStockExample();
+        example.createCriteria().andMaterialIdIn(mIdList);
+        materialInitialStockMapper.deleteByExample(example);
+    }
+
+    /**
+     * 批量删除当前库存
+     * @param mIdList
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void batchDeleteCurrentStockByMaterialList(List<Long> mIdList){
+        MaterialCurrentStockExample example = new MaterialCurrentStockExample();
+        example.createCriteria().andMaterialIdIn(mIdList);
+        materialCurrentStockMapper.deleteByExample(example);
+    }
+
+    public List<MaterialVo4Unit> getMaterialEnableSerialNumberList(String q, Integer offset, Integer rows)throws Exception {
+        List<MaterialVo4Unit> list =null;
+        try{
+            list=  materialMapperEx.getMaterialEnableSerialNumberList(q, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long getMaterialEnableSerialNumberCount(String q)throws Exception {
+        Long count =null;
+        try{
+            count=  materialMapperEx.getMaterialEnableSerialNumberCount(q);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return count;
+    }
+
+    public BigDecimal parseBigDecimalEx(String str) throws Exception{
+        if(!StringUtil.isEmpty(str)) {
+            return  new BigDecimal(str);
+        } else {
+            return null;
+        }
+    }
+
+    public BigDecimal parsePrice(String price, String ratio) throws Exception{
+        if(StringUtil.isEmpty(price) || StringUtil.isEmpty(ratio)) {
+            return BigDecimal.ZERO;
+        } else {
+            BigDecimal pr=new BigDecimal(price);
+            BigDecimal r=new BigDecimal(ratio);
+            return pr.multiply(r);
+        }
+    }
+
+    /**
+     * 根据商品获取初始库存-多仓库
+     * @param depotList
+     * @param materialId
+     * @return
+     */
+    public BigDecimal getInitStockByMidAndDepotList(List<Long> depotList, Long materialId) {
+        BigDecimal stock = BigDecimal.ZERO;
+        MaterialInitialStockExample example = new MaterialInitialStockExample();
+        if(depotList!=null && depotList.size()>0) {
+            example.createCriteria().andMaterialIdEqualTo(materialId).andDepotIdIn(depotList)
+                    .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        } else {
+            example.createCriteria().andMaterialIdEqualTo(materialId)
+                    .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        }
+        List<MaterialInitialStock> list = materialInitialStockMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            for(MaterialInitialStock ms: list) {
+                if(ms!=null) {
+                    stock = stock.add(ms.getNumber());
+                }
+            }
+        }
+        return stock;
+    }
+
+    /**
+     * 根据商品和仓库获取初始库存
+     * @param materialId
+     * @param depotId
+     * @return
+     */
+    public BigDecimal getInitStock(Long materialId, Long depotId) {
+        BigDecimal stock = BigDecimal.ZERO;
+        MaterialInitialStockExample example = new MaterialInitialStockExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andDepotIdEqualTo(depotId)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialInitialStock> list = materialInitialStockMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            stock = list.get(0).getNumber();
+        }
+        return stock;
+    }
+
+    /**
+     * 根据商品和仓库获取当前库存
+     * @param materialId
+     * @param depotId
+     * @return
+     */
+    public BigDecimal getCurrentStockByMaterialIdAndDepotId(Long materialId, Long depotId) {
+        BigDecimal stock = BigDecimal.ZERO;
+        MaterialCurrentStockExample example = new MaterialCurrentStockExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andDepotIdEqualTo(depotId)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialCurrentStock> list = materialCurrentStockMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            stock = list.get(0).getCurrentNumber();
+        } else {
+            stock = getInitStock(materialId,depotId);
+        }
+        return stock;
+    }
+
+    /**
+     * 根据商品列表获取初始库存Map
+     * @param list
+     * @return
+     */
+    public Map<Long,BigDecimal> getInitialStockMapByMaterialList(List<MaterialVo4Unit> list) {
+        Map<Long,BigDecimal> map = new HashMap<>();
+        List<Long> materialIdList = new ArrayList<>();
+        for(MaterialVo4Unit materialVo4Unit: list) {
+            materialIdList.add(materialVo4Unit.getId());
+        }
+        List<MaterialInitialStock> mcsList = materialInitialStockMapperEx.getInitialStockMapByIdList(materialIdList);
+        for(MaterialInitialStock materialInitialStock: mcsList) {
+            map.put(materialInitialStock.getMaterialId(), materialInitialStock.getNumber());
+        }
+        return map;
+    }
+
+    /**
+     * 根据商品列表获取当前库存Map
+     * @param list
+     * @return
+     */
+    public Map<Long,BigDecimal> getCurrentStockMapByMaterialList(List<MaterialVo4Unit> list) {
+        Map<Long,BigDecimal> map = new HashMap<>();
+        List<Long> materialIdList = new ArrayList<>();
+        for(MaterialVo4Unit materialVo4Unit: list) {
+            materialIdList.add(materialVo4Unit.getId());
+        }
+        List<MaterialCurrentStock> mcsList = materialCurrentStockMapperEx.getCurrentStockMapByIdList(materialIdList);
+        for(MaterialCurrentStock materialCurrentStock: mcsList) {
+            map.put(materialCurrentStock.getMaterialId(), materialCurrentStock.getCurrentNumber());
+        }
+        return map;
+    }
+
+    /**
+     * 根据商品和仓库获取安全库存信息
+     * @param materialId
+     * @param depotId
+     * @return
+     */
+    public MaterialInitialStock getSafeStock(Long materialId, Long depotId) {
+        MaterialInitialStock materialInitialStock = new MaterialInitialStock();
+        MaterialInitialStockExample example = new MaterialInitialStockExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andDepotIdEqualTo(depotId)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialInitialStock> list = materialInitialStockMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            materialInitialStock = list.get(0);
+        }
+        return materialInitialStock;
+    }
+
+    public List<MaterialVo4Unit> getMaterialByMeId(Long meId) {
+        List<MaterialVo4Unit> result = new ArrayList<MaterialVo4Unit>();
+        try{
+            if(meId!=null) {
+                result= materialMapperEx.getMaterialByMeId(meId);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public String getMaxBarCode() {
+        String maxBarCodeOld = materialMapperEx.getMaxBarCode();
+        if(StringUtil.isNotEmpty(maxBarCodeOld)) {
+            return Long.parseLong(maxBarCodeOld)+"";
+        } else {
+            return "1000";
+        }
+    }
+
+    public List<String> getMaterialNameList() {
+        return materialMapperEx.getMaterialNameList();
+    }
+
+    public List<MaterialVo4Unit> getMaterialByBarCode(String barCode) {
+        String [] barCodeArray=barCode.split(",");
+        return materialMapperEx.getMaterialByBarCode(barCodeArray);
+    }
+
+    public List<MaterialVo4Unit> getMaterialByBarCodeAndWithOutMId(String barCode, Long mId) {
+        String [] barCodeArray=barCode.split(",");
+        return materialMapperEx.getMaterialByBarCodeAndWithOutMId(barCodeArray, mId);
+    }
+
+    public List<MaterialInitialStockWithMaterial> getInitialStockWithMaterial(List<Long> depotList) {
+        return materialMapperEx.getInitialStockWithMaterial(depotList);
+    }
+
+    public List<MaterialVo4Unit> getListWithStock(List<Long> depotList, List<Long> idList, String position, String materialParam,
+                                                  Boolean moveAvgPriceFlag, Integer zeroStock, String column, String order,
+                                                  Integer offset, Integer rows) throws Exception {
+        Map<Long, BigDecimal> initialStockMap = new HashMap<>();
+        List<MaterialInitialStockWithMaterial> initialStockList = getInitialStockWithMaterial(depotList);
+        for (MaterialInitialStockWithMaterial mism: initialStockList) {
+            initialStockMap.put(mism.getMaterialId(), mism.getNumber());
+        }
+        List<MaterialVo4Unit> dataList = materialMapperEx.getListWithStock(depotList, idList, position, materialParam, zeroStock, column, order, offset, rows);
+        for(MaterialVo4Unit item: dataList) {
+            if(moveAvgPriceFlag) {
+                item.setPurchaseDecimal(item.getCurrentUnitPrice());
+                item.setCurrentStockPrice(item.getCurrentStockMovePrice());
+            }
+            item.setUnitName(null!=item.getUnitId()?item.getUnitName() + "[多单位]":item.getUnitName());
+            item.setInitialStock(null!=initialStockMap.get(item.getId())?initialStockMap.get(item.getId()):BigDecimal.ZERO);
+            item.setBigUnitStock(getBigUnitStock(item.getCurrentStock(), item.getUnitId()));
+            if(fileUploadType == 2) {
+                item.setImgSmall("small");
+                item.setImgLarge("large");
+            }
+        }
+        return dataList;
+    }
+
+    public int getListWithStockCount(List<Long> depotList, List<Long> idList, String position, String materialParam, Integer zeroStock) {
+        return materialMapperEx.getListWithStockCount(depotList, idList, position, materialParam, zeroStock);
+    }
+
+    public MaterialVo4Unit getTotalStockAndPrice(List<Long> depotList, List<Long> idList, String position, String materialParam) {
+        return materialMapperEx.getTotalStockAndPrice(depotList, idList, position, materialParam);
+    }
+
+    /**
+     * 将小单位的库存换算为大单位的库存
+     * @param stock
+     * @param unitId
+     * @return
+     * @throws Exception
+     */
+    public String getBigUnitStock(BigDecimal stock, Long unitId) throws Exception {
+        String bigUnitStock = "";
+        if(null!= unitId) {
+            Unit unit = unitService.getUnit(unitId);
+            if(unit.getRatio()!=null && unit.getRatio().compareTo(BigDecimal.ZERO)!=0 && stock!=null) {
+                bigUnitStock = stock.divide(unit.getRatio(),2,BigDecimal.ROUND_HALF_UP) + unit.getOtherUnit();
+            }
+        }
+        return bigUnitStock;
+    }
+
+    /**
+     * 构造扩展信息
+     * @param mpArr
+     * @param m
+     * @return
+     */
+    public String getMaterialOtherByParam(String[] mpArr, MaterialVo4Unit m) {
+        String materialOther = "";
+        for (int i = 0; i < mpArr.length; i++) {
+            if (mpArr[i].equals("自定义1")) {
+                materialOther = materialOther + ((m.getOtherField1() == null || m.getOtherField1().equals("")) ? "" : "(" + m.getOtherField1() + ")");
+            }
+            if (mpArr[i].equals("自定义2")) {
+                materialOther = materialOther + ((m.getOtherField2() == null || m.getOtherField2().equals("")) ? "" : "(" + m.getOtherField2() + ")");
+            }
+            if (mpArr[i].equals("自定义3")) {
+                materialOther = materialOther + ((m.getOtherField3() == null || m.getOtherField3().equals("")) ? "" : "(" + m.getOtherField3() + ")");
+            }
+        }
+        return materialOther;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetMaterialCurrentStock(String ids) throws Exception {
+        int res = 0;
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Depot> depotList = depotService.getAllList();
+        for(Long mId: idList) {
+            for(Depot depot: depotList) {
+                depotItemService.updateCurrentStockFun(mId, depot.getId());
+                res = 1;
+            }
+        }
+        return res;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetMaterialCurrentUnitPrice(String ids) throws Exception {
+        int res = 0;
+        List<Long> idList = StringUtil.strToLongList(ids);
+        for(Long mId: idList) {
+            DepotItem depotItem = new DepotItem();
+            depotItem.setMaterialId(mId);
+            depotItemService.updateCurrentUnitPrice(depotItem);
+            res = 1;
+        }
+        return res;
+    }
+
+    public int batchUpdate(JSONObject jsonObject) {
+        String ids = jsonObject.getString("ids");
+        String materialStr = jsonObject.getString("material");
+        List<Long> idList = StringUtil.strToLongList(ids);
+        Material material = JSONObject.parseObject(materialStr, Material.class);
+        MaterialExample example = new MaterialExample();
+        example.createCriteria().andIdIn(idList).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        return materialMapper.updateByExampleSelective(material, example);
+    }
+
+    public MaterialExtend getMaterialExtendBySerialNumber(String serialNumber) {
+        return materialMapperEx.getMaterialExtendBySerialNumber(serialNumber);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeComponent.java b/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeComponent.java
new file mode 100644
index 0000000..f1aa22b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeComponent.java
@@ -0,0 +1,70 @@
+package com.jsh.erp.service.materialAttribute;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "materialAttribute_component")
+@MaterialAttributeResource
+public class MaterialAttributeComponent implements ICommonQuery {
+
+    @Resource
+    private MaterialAttributeService materialAttributeService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return materialAttributeService.getMaterialAttribute(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getMaterialList(map);
+    }
+
+    private List<?> getMaterialList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String attributeName = StringUtil.getInfo(search, "attributeName");
+        return materialAttributeService.select(attributeName, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String attributeField = StringUtil.getInfo(search, "attributeField");
+        return materialAttributeService.countMaterialAttribute(attributeField);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return materialAttributeService.insertMaterialAttribute(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return materialAttributeService.updateMaterialAttribute(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return materialAttributeService.deleteMaterialAttribute(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return materialAttributeService.batchDeleteMaterialAttribute(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return materialAttributeService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeResource.java b/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeResource.java
new file mode 100644
index 0000000..a23425c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.materialAttribute;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2021-07-21 22:26:27
+ */
+@ResourceInfo(value = "materialAttribute")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MaterialAttributeResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeService.java b/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeService.java
new file mode 100644
index 0000000..f14214a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialAttribute/MaterialAttributeService.java
@@ -0,0 +1,176 @@
+package com.jsh.erp.service.materialAttribute;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.MaterialAttribute;
+import com.jsh.erp.datasource.entities.MaterialAttributeExample;
+import com.jsh.erp.datasource.mappers.MaterialAttributeMapper;
+import com.jsh.erp.datasource.mappers.MaterialAttributeMapperEx;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class MaterialAttributeService {
+    private Logger logger = LoggerFactory.getLogger(MaterialAttributeService.class);
+
+    @Resource
+    private LogService logService;
+
+    @Resource
+    private MaterialAttributeMapper materialAttributeMapper;
+
+    @Resource
+    private MaterialAttributeMapperEx materialAttributeMapperEx;
+
+    public MaterialAttribute getMaterialAttribute(long id)throws Exception {
+        MaterialAttribute result=null;
+        try{
+            result=materialAttributeMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<MaterialAttribute> getMaterialAttribute() throws Exception{
+        MaterialAttributeExample example = new MaterialAttributeExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("id desc");
+        List<MaterialAttribute> list=null;
+        try{
+            list=materialAttributeMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialAttribute> select(String attributeName, int offset, int rows)
+            throws Exception{
+        List<MaterialAttribute> list = new ArrayList<>();
+        try{
+            list = materialAttributeMapperEx.selectByConditionMaterialAttribute(attributeName, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countMaterialAttribute(String attributeField)throws Exception {
+        Long result =null;
+        try{
+            result= 5L;
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertMaterialAttribute(JSONObject obj, HttpServletRequest request)throws Exception {
+        MaterialAttribute m = JSONObject.parseObject(obj.toJSONString(), MaterialAttribute.class);
+        try{
+            materialAttributeMapper.insertSelective(m);
+            logService.insertLog("商品属性",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(m.getAttributeName()).toString(), request);
+            return 1;
+        }
+        catch (BusinessRunTimeException ex) {
+            throw new BusinessRunTimeException(ex.getCode(), ex.getMessage());
+        }
+        catch(Exception e){
+            JshException.writeFail(logger, e);
+            return 0;
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateMaterialAttribute(JSONObject obj, HttpServletRequest request) throws Exception{
+        MaterialAttribute materialAttribute = JSONObject.parseObject(obj.toJSONString(), MaterialAttribute.class);
+        try{
+            materialAttributeMapper.updateByPrimaryKeySelective(materialAttribute);
+            logService.insertLog("商品属性",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(materialAttribute.getAttributeName()).toString(), request);
+            return 1;
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+            return 0;
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteMaterialAttribute(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialAttributeByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialAttribute(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialAttributeByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialAttributeByIds(String ids) throws Exception{
+        String [] idArray=ids.split(",");
+        try{
+            return materialAttributeMapperEx.batchDeleteMaterialAttributeByIds(idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+            return 0;
+        }
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        MaterialAttributeExample example = new MaterialAttributeExample();
+        example.createCriteria().andIdNotEqualTo(id).andAttributeNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialAttribute> list =null;
+        try{
+            list = materialAttributeMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public JSONArray getValueArrById(Long id) {
+        JSONArray valueArr = new JSONArray();
+        MaterialAttribute ma = getInfoById(id);
+        if(ma!=null) {
+            String value = ma.getAttributeValue();
+            if(StringUtil.isNotEmpty(value)){
+                String[] arr = value.split("\\|");
+                for(String v: arr) {
+                    JSONObject item = new JSONObject();
+                    item.put("value",v);
+                    item.put("name",v);
+                    valueArr.add(item);
+                }
+            }
+        }
+        return valueArr;
+    }
+
+    public MaterialAttribute getInfoById(Long id) {
+        MaterialAttributeExample example = new MaterialAttributeExample();
+        example.createCriteria().andIdEqualTo(id).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialAttribute> list = materialAttributeMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            return list.get(0);
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryComponent.java b/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryComponent.java
new file mode 100644
index 0000000..62c9273
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryComponent.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.service.materialCategory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.materialProperty.MaterialPropertyResource;
+import com.jsh.erp.service.materialProperty.MaterialPropertyService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "materialCategory_component")
+@MaterialCategoryResource
+public class MaterialCategoryComponent implements ICommonQuery {
+
+    @Resource
+    private MaterialCategoryService materialCategoryService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return materialCategoryService.getMaterialCategory(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getMaterialCategoryList(map);
+    }
+
+    private List<?> getMaterialCategoryList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer parentId = StringUtil.parseInteger(StringUtil.getInfo(search, "parentId"));
+        String order = QueryUtils.order(map);
+        return materialCategoryService.select(name, parentId, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        Integer parentId = StringUtil.parseInteger(StringUtil.getInfo(search, "parentId"));
+        return materialCategoryService.countMaterialCategory(name, parentId);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return materialCategoryService.insertMaterialCategory(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return materialCategoryService.updateMaterialCategory(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return materialCategoryService.deleteMaterialCategory(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return materialCategoryService.batchDeleteMaterialCategory(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return materialCategoryService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryResource.java b/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryResource.java
new file mode 100644
index 0000000..042a9f5
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.materialCategory;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "materialCategory")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MaterialCategoryResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryService.java b/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryService.java
new file mode 100644
index 0000000..a0f43bc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialCategory/MaterialCategoryService.java
@@ -0,0 +1,308 @@
+package com.jsh.erp.service.materialCategory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.MaterialCategoryMapper;
+import com.jsh.erp.datasource.mappers.MaterialCategoryMapperEx;
+import com.jsh.erp.datasource.mappers.MaterialMapperEx;
+import com.jsh.erp.datasource.vo.TreeNode;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class MaterialCategoryService {
+    private Logger logger = LoggerFactory.getLogger(MaterialCategoryService.class);
+
+    @Resource
+    private MaterialCategoryMapper materialCategoryMapper;
+    @Resource
+    private MaterialCategoryMapperEx materialCategoryMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+    @Resource
+    private MaterialMapperEx materialMapperEx;
+
+    public MaterialCategory getMaterialCategory(long id)throws Exception {
+        MaterialCategory result=null;
+        try{
+            result=materialCategoryMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<MaterialCategory> getMaterialCategoryListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<MaterialCategory> list = new ArrayList<>();
+        try{
+            MaterialCategoryExample example = new MaterialCategoryExample();
+            example.createCriteria().andIdIn(idList);
+            list = materialCategoryMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialCategory> getMaterialCategory()throws Exception {
+        MaterialCategoryExample example = new MaterialCategoryExample();
+        List<MaterialCategory> list=null;
+        try{
+            list=materialCategoryMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialCategory> getAllList(Long parentId)throws Exception {
+        List<MaterialCategory> list=null;
+        try{
+            list = getMCList(parentId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialCategory> getMCList(Long parentId)throws Exception {
+        List<MaterialCategory> res= new ArrayList<MaterialCategory>();
+        List<MaterialCategory> list=null;
+        MaterialCategoryExample example = new MaterialCategoryExample();
+        example.createCriteria().andParentIdEqualTo(parentId).andIdNotEqualTo(1L);
+        example.setOrderByClause("id");
+        list=materialCategoryMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            res.addAll(list);
+            for(MaterialCategory mc : list) {
+                List<MaterialCategory> mcList = getMCList(mc.getId());
+                if(mcList!=null && mcList.size()>0) {
+                    res.addAll(mcList);
+                }
+            }
+        }
+        return res;
+    }
+
+    public List<MaterialCategory> select(String name, Integer parentId, int offset, int rows) throws Exception{
+        List<MaterialCategory> list=null;
+        try{
+            list=materialCategoryMapperEx.selectByConditionMaterialCategory(name, parentId, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countMaterialCategory(String name, Integer parentId) throws Exception{
+        Long result=null;
+        try{
+            result=materialCategoryMapperEx.countsByMaterialCategory(name, parentId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertMaterialCategory(JSONObject obj, HttpServletRequest request)throws Exception {
+        MaterialCategory materialCategory = JSONObject.parseObject(obj.toJSONString(), MaterialCategory.class);
+        materialCategory.setCreateTime(new Date());
+        materialCategory.setUpdateTime(new Date());
+        int result=0;
+        try{
+            result=materialCategoryMapper.insertSelective(materialCategory);
+            logService.insertLog("商品类型",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(materialCategory.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateMaterialCategory(JSONObject obj, HttpServletRequest request) throws Exception{
+        MaterialCategory materialCategory = JSONObject.parseObject(obj.toJSONString(), MaterialCategory.class);
+        materialCategory.setUpdateTime(new Date());
+        int result=0;
+        try{
+            result=materialCategoryMapperEx.editMaterialCategory(materialCategory);
+            logService.insertLog("商品类型",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(materialCategory.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteMaterialCategory(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialCategoryByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialCategory(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialCategoryByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialCategoryByIds(String ids) throws Exception {
+        int result=0;
+        String [] idArray=ids.split(",");
+        //校验产品表	jsh_material
+        List<Material> materialList=null;
+        try{
+            materialList= materialMapperEx.getMaterialListByCategoryIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(materialList!=null&&materialList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,CategoryIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<MaterialCategory> list = getMaterialCategoryListByIds(ids);
+        for(MaterialCategory materialCategory: list){
+            sb.append("[").append(materialCategory.getName()).append("]");
+        }
+        logService.insertLog("商品类型", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        //更新时间
+        Date updateDate =new Date();
+        //更新人
+        User userInfo=userService.getCurrentUser();
+        Long updater=userInfo==null?null:userInfo.getId();
+        String strArray[]=ids.split(",");
+        if(strArray.length<1){
+            return 0;
+        }
+        List<MaterialCategory> mcList = materialCategoryMapperEx.getMaterialCategoryListByCategoryIds(idArray);
+        if(mcList!=null && mcList.size()>0) {
+            logger.error("异常码[{}],异常提示[{}]",
+                    ExceptionConstants.MATERIAL_CATEGORY_CHILD_NOT_SUPPORT_DELETE_CODE,ExceptionConstants.MATERIAL_CATEGORY_CHILD_NOT_SUPPORT_DELETE_MSG);
+            throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_CATEGORY_CHILD_NOT_SUPPORT_DELETE_CODE,
+                    ExceptionConstants.MATERIAL_CATEGORY_CHILD_NOT_SUPPORT_DELETE_MSG);
+        } else {
+            result=materialCategoryMapperEx.batchDeleteMaterialCategoryByIds(updateDate,updater,strArray);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        MaterialCategoryExample example = new MaterialCategoryExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialCategory> list=null;
+        try{
+            list= materialCategoryMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public List<MaterialCategory> findById(Long id)throws Exception {
+        List<MaterialCategory> list=null;
+        if(id!=null) {
+            MaterialCategoryExample example = new MaterialCategoryExample();
+            example.createCriteria().andIdEqualTo(id);
+            try{
+                list=materialCategoryMapper.selectByExample(example);
+            }catch(Exception e){
+                JshException.readFail(logger, e);
+            }
+        }
+        return list;
+    }
+    /**
+     * description:
+     * 获取商品类别树数据
+     */
+    public List<TreeNode> getMaterialCategoryTree(Long id) throws Exception{
+        List<TreeNode> list=null;
+        try{
+            list=materialCategoryMapperEx.getNodeTree(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+       return list;
+    }
+    /**
+     * 根据商品类别编号判断商品类别是否已存在
+     * */
+    public void  checkMaterialCategorySerialNo(MaterialCategory mc)throws Exception {
+        if(mc==null){
+            return;
+        }
+        if(StringUtil.isEmpty(mc.getSerialNo())){
+            return;
+        }
+        //根据商品类别编号查询商品类别
+        List<MaterialCategory> mList=null;
+        try{
+            mList= materialCategoryMapperEx.getMaterialCategoryBySerialNo(mc.getSerialNo(), mc.getId());
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(mList==null||mList.size()<1){
+            //未查询到对应数据,编号可用
+            return;
+        }
+        if(mList.size()>1){
+            //查询到的数据条数大于1,编号已存在
+            throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_CODE,
+                    ExceptionConstants.MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_MSG);
+        }
+        if(mc.getId()==null){
+            //新增时,编号已存在
+            throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_CODE,
+                    ExceptionConstants.MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_MSG);
+        }
+        /**
+         * 包装类型用equals来比较
+         * */
+        if(mc.getId().equals(mList.get(0).getId())){
+            //修改时,相同编号,id不同
+            throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_CODE,
+                    ExceptionConstants.MATERIAL_CATEGORY_SERIAL_ALREADY_EXISTS_MSG);
+        }
+    }
+
+    /**
+     * 根据名称获取类型
+     * @param name
+     */
+    public Long getCategoryIdByName(String name){
+        Long categoryId = null;
+        MaterialCategoryExample example = new MaterialCategoryExample();
+        example.createCriteria().andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialCategory> list = materialCategoryMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            categoryId = list.get(0).getId();
+        }
+        return categoryId;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendComponent.java b/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendComponent.java
new file mode 100644
index 0000000..d45d7d7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendComponent.java
@@ -0,0 +1,65 @@
+package com.jsh.erp.service.materialExtend;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "material_extend")
+@MaterialExtendResource
+public class MaterialExtendComponent implements ICommonQuery {
+
+    @Resource
+    private MaterialExtendService materialExtendService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return materialExtendService.getMaterialExtend(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getMaterialList(map);
+    }
+
+    private List<?> getMaterialList(Map<String, String> map) throws Exception{
+
+        return null;
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+
+        return 0L;
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception{
+        return materialExtendService.insertMaterialExtend(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return materialExtendService.updateMaterialExtend(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return materialExtendService.deleteMaterialExtend(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return materialExtendService.batchDeleteMaterialExtendByIds(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 0;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendResource.java b/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendResource.java
new file mode 100644
index 0000000..8181766
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.materialExtend;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "materialExtend")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MaterialExtendResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendService.java b/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendService.java
new file mode 100644
index 0000000..1e14a7a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialExtend/MaterialExtendService.java
@@ -0,0 +1,412 @@
+package com.jsh.erp.service.materialExtend;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.MaterialExtend;
+import com.jsh.erp.datasource.entities.MaterialExtendExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.MaterialExtendMapper;
+import com.jsh.erp.datasource.mappers.MaterialExtendMapperEx;
+import com.jsh.erp.datasource.vo.MaterialExtendVo4List;
+import com.jsh.erp.exception.BusinessParamCheckingException;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.redis.RedisService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class MaterialExtendService {
+    private Logger logger = LoggerFactory.getLogger(MaterialExtendService.class);
+
+    @Resource
+    private MaterialExtendMapper materialExtendMapper;
+    @Resource
+    private MaterialExtendMapperEx materialExtendMapperEx;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private RedisService redisService;
+    
+    public MaterialExtend getMaterialExtend(long id)throws Exception {
+        MaterialExtend result=null;
+        try{
+            result=materialExtendMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+    public List<MaterialExtendVo4List> getDetailList(Long materialId) {
+        List<MaterialExtendVo4List> list=null;
+        try{
+            list = materialExtendMapperEx.getDetailList(materialId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialExtend> getListByMIds(List<Long> idList) {
+        List<MaterialExtend> meList = null;
+        try{
+            Long [] idArray= StringUtil.listToLongArray(idList);
+            if(idArray!=null && idArray.length>0) {
+                meList = materialExtendMapperEx.getListByMId(idArray);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return meList;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public String saveDetials(JSONObject obj, String sortList, Long materialId, String type) throws Exception {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        JSONArray meArr = obj.getJSONArray("meList");
+        JSONArray insertedJson = new JSONArray();
+        JSONArray updatedJson = new JSONArray();
+        JSONArray deletedJson = obj.getJSONArray("meDeleteIdList");
+        JSONArray sortJson = JSONArray.parseArray(sortList);
+        if (null != meArr) {
+            if("insert".equals(type)){
+                for (int i = 0; i < meArr.size(); i++) {
+                    JSONObject tempJson = meArr.getJSONObject(i);
+                    insertedJson.add(tempJson);
+                }
+            } else if("update".equals(type)){
+                for (int i = 0; i < meArr.size(); i++) {
+                    JSONObject tempJson = meArr.getJSONObject(i);
+                    String tempId = tempJson.getString("id");
+                    if(tempId.length()>19){
+                        insertedJson.add(tempJson);
+                    } else {
+                        updatedJson.add(tempJson);
+                    }
+                }
+            }
+        }
+        if (null != deletedJson) {
+            StringBuffer bf=new StringBuffer();
+            for (int i = 0; i < deletedJson.size(); i++) {
+                bf.append(deletedJson.getString(i));
+                if(i<(deletedJson.size()-1)){
+                    bf.append(",");
+                }
+            }
+            this.batchDeleteMaterialExtendByIds(bf.toString(), request);
+        }
+        if (null != insertedJson) {
+            for (int i = 0; i < insertedJson.size(); i++) {
+                MaterialExtend materialExtend = new MaterialExtend();
+                JSONObject tempInsertedJson = JSONObject.parseObject(insertedJson.getString(i));
+                materialExtend.setMaterialId(materialId);
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("barCode"))) {
+                    int exist = checkIsBarCodeExist(0L, tempInsertedJson.getString("barCode"));
+                    if(exist>0) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_EXISTS_CODE,
+                                String.format(ExceptionConstants.MATERIAL_BARCODE_EXISTS_MSG,tempInsertedJson.getString("barCode")));
+                    } else {
+                        materialExtend.setBarCode(tempInsertedJson.getString("barCode"));
+                    }
+                }
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("commodityUnit"))) {
+                    materialExtend.setCommodityUnit(tempInsertedJson.getString("commodityUnit"));
+                }
+                if (tempInsertedJson.get("sku")!=null) {
+                    materialExtend.setSku(tempInsertedJson.getString("sku"));
+                }
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("purchaseDecimal"))) {
+                    materialExtend.setPurchaseDecimal(tempInsertedJson.getBigDecimal("purchaseDecimal"));
+                }
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("commodityDecimal"))) {
+                    materialExtend.setCommodityDecimal(tempInsertedJson.getBigDecimal("commodityDecimal"));
+                }
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("wholesaleDecimal"))) {
+                    materialExtend.setWholesaleDecimal(tempInsertedJson.getBigDecimal("wholesaleDecimal"));
+                }
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("lowDecimal"))) {
+                    materialExtend.setLowDecimal(tempInsertedJson.getBigDecimal("lowDecimal"));
+                }
+                this.insertMaterialExtend(materialExtend);
+            }
+        }
+        if (null != updatedJson) {
+            for (int i = 0; i < updatedJson.size(); i++) {
+                JSONObject tempUpdatedJson = JSONObject.parseObject(updatedJson.getString(i));
+                MaterialExtend materialExtend = new MaterialExtend();
+                materialExtend.setId(tempUpdatedJson.getLong("id"));
+                if (StringUtils.isNotEmpty(tempUpdatedJson.getString("barCode"))) {
+                    int exist = checkIsBarCodeExist(tempUpdatedJson.getLong("id"), tempUpdatedJson.getString("barCode"));
+                    if(exist>0) {
+                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_EXISTS_CODE,
+                                String.format(ExceptionConstants.MATERIAL_BARCODE_EXISTS_MSG,tempUpdatedJson.getString("barCode")));
+                    } else {
+                        materialExtend.setBarCode(tempUpdatedJson.getString("barCode"));
+                    }
+                }
+                if (StringUtils.isNotEmpty(tempUpdatedJson.getString("commodityUnit"))) {
+                    materialExtend.setCommodityUnit(tempUpdatedJson.getString("commodityUnit"));
+                }
+                if (tempUpdatedJson.get("sku")!=null) {
+                    materialExtend.setSku(tempUpdatedJson.getString("sku"));
+                }
+                if (StringUtils.isNotEmpty(tempUpdatedJson.getString("purchaseDecimal"))) {
+                    materialExtend.setPurchaseDecimal(tempUpdatedJson.getBigDecimal("purchaseDecimal"));
+                }
+                if (StringUtils.isNotEmpty(tempUpdatedJson.getString("commodityDecimal"))) {
+                    materialExtend.setCommodityDecimal(tempUpdatedJson.getBigDecimal("commodityDecimal"));
+                }
+                if (StringUtils.isNotEmpty(tempUpdatedJson.getString("wholesaleDecimal"))) {
+                    materialExtend.setWholesaleDecimal(tempUpdatedJson.getBigDecimal("wholesaleDecimal"));
+                }
+                if (StringUtils.isNotEmpty(tempUpdatedJson.getString("lowDecimal"))) {
+                    materialExtend.setLowDecimal(tempUpdatedJson.getBigDecimal("lowDecimal"));
+                }
+                this.updateMaterialExtend(materialExtend);
+                //如果金额为空,此处单独置空
+                materialExtendMapperEx.specialUpdatePrice(materialExtend);
+            }
+        }
+        //处理条码的排序,基本单位排第一个
+        if (null != sortJson && sortJson.size()>0) {
+            //此处为更新的逻辑
+            for (int i = 0; i < sortJson.size(); i++) {
+                JSONObject tempSortJson = JSONObject.parseObject(sortJson.getString(i));
+                MaterialExtend materialExtend = new MaterialExtend();
+                if(StringUtil.isExist(tempSortJson.get("id"))) {
+                    materialExtend.setId(tempSortJson.getLong("id"));
+                }
+                if(StringUtil.isExist(tempSortJson.get("defaultFlag"))) {
+                    materialExtend.setDefaultFlag(tempSortJson.getString("defaultFlag"));
+                }
+                this.updateMaterialExtend(materialExtend);
+            }
+        } else {
+            //新增的时候将第一条记录设置为默认基本单位
+            MaterialExtendExample example = new MaterialExtendExample();
+            example.createCriteria().andMaterialIdEqualTo(materialId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            List<MaterialExtend> meList = materialExtendMapper.selectByExample(example);
+            if(meList!=null) {
+                for(int i=0; i<meList.size(); i++) {
+                    MaterialExtend materialExtend = new MaterialExtend();
+                    materialExtend.setId(meList.get(i).getId());
+                    if(i==0) {
+                        materialExtend.setDefaultFlag("1"); //默认
+                    } else {
+                        materialExtend.setDefaultFlag("0"); //非默认
+                    }
+                    this.updateMaterialExtend(materialExtend);
+                }
+            }
+        }
+        return null;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertMaterialExtend(MaterialExtend materialExtend)throws Exception {
+        User user = userService.getCurrentUser();
+        materialExtend.setDeleteFlag(BusinessConstants.DELETE_FLAG_EXISTS);
+        materialExtend.setCreateTime(new Date());
+        materialExtend.setUpdateTime(new Date().getTime());
+        materialExtend.setCreateSerial(user.getLoginName());
+        materialExtend.setUpdateSerial(user.getLoginName());
+        int result =0;
+        try{
+            result= materialExtendMapper.insertSelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateMaterialExtend(MaterialExtend materialExtend) throws Exception{
+        User user = userService.getCurrentUser();
+        materialExtend.setUpdateTime(System.currentTimeMillis());
+        materialExtend.setUpdateSerial(user.getLoginName());
+        int res =0;
+        try{
+            res= materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return res;
+    }
+
+    public int checkIsBarCodeExist(Long id, String barCode)throws Exception {
+        MaterialExtendExample example = new MaterialExtendExample();
+        MaterialExtendExample.Criteria criteria = example.createCriteria();
+        criteria.andBarCodeEqualTo(barCode);
+        if (id > 0) {
+            criteria.andIdNotEqualTo(id).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        } else {
+            criteria.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        }
+        List<MaterialExtend> list =null;
+        try{
+            list = materialExtendMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteMaterialExtend(Long id, HttpServletRequest request)throws Exception {
+        int result =0;
+        MaterialExtend materialExtend = new MaterialExtend();
+        materialExtend.setId(id);
+        materialExtend.setDeleteFlag(BusinessConstants.DELETE_FLAG_DELETED);
+        Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
+        User user = userService.getUser(userId);
+        materialExtend.setUpdateTime(new Date().getTime());
+        materialExtend.setUpdateSerial(user.getLoginName());
+        try{
+            result= materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialExtendByIds(String ids, HttpServletRequest request) throws Exception{
+        String [] idArray=ids.split(",");
+        int result = 0;
+        try{
+            result = materialExtendMapperEx.batchDeleteMaterialExtendByIds(idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int insertMaterialExtend(JSONObject obj, HttpServletRequest request) throws Exception{
+        MaterialExtend materialExtend = JSONObject.parseObject(obj.toJSONString(), MaterialExtend.class);
+        int result=0;
+        try{
+            result = materialExtendMapper.insertSelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int updateMaterialExtend(JSONObject obj, HttpServletRequest request)throws Exception {
+        MaterialExtend materialExtend = JSONObject.parseObject(obj.toJSONString(), MaterialExtend.class);
+        int result=0;
+        try{
+            result = materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<MaterialExtend> getMaterialExtendByTenantAndTime(Long tenantId, Long lastTime, Long syncNum)throws Exception {
+        List<MaterialExtend> list=new ArrayList<MaterialExtend>();
+        try{
+            //先获取最大的时间戳,再查两个时间戳之间的数据,这样同步能够防止丢失数据(应为时间戳有重复)
+            Long maxTime = materialExtendMapperEx.getMaxTimeByTenantAndTime(tenantId, lastTime, syncNum);
+            if(tenantId!=null && lastTime!=null && maxTime!=null) {
+                MaterialExtendExample example = new MaterialExtendExample();
+                example.createCriteria().andTenantIdEqualTo(tenantId)
+                        .andUpdateTimeGreaterThan(lastTime)
+                        .andUpdateTimeLessThanOrEqualTo(maxTime);
+                list=materialExtendMapper.selectByExample(example);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public Long selectIdByMaterialIdAndDefaultFlag(Long materialId, String defaultFlag) {
+        Long id = 0L;
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andDefaultFlagEqualTo(defaultFlag)
+                                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            id = list.get(0).getId();
+        }
+        return id;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public Long selectIdByMaterialIdAndBarCode(Long materialId, String barCode) {
+        Long id = 0L;
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andBarCodeEqualTo(barCode)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            id = list.get(0).getId();
+        }
+        return id;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public List<MaterialExtend> getListByMaterialIdAndDefaultFlagAndBarCode(Long materialId, String defaultFlag, String barCode) {
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andDefaultFlagEqualTo(defaultFlag).andBarCodeNotEqualTo(barCode)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        return materialExtendMapper.selectByExample(example);
+    }
+
+    public MaterialExtend getInfoByBarCode(String barCode)throws Exception {
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andBarCodeEqualTo(barCode)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            return list.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 商品的副条码和数据库里面的商品条码存在重复(除自身商品之外)
+     * @param manyBarCode
+     * @param barCode
+     * @return
+     */
+    public int getCountByManyBarCodeWithoutUs(String manyBarCode, String barCode) {
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andBarCodeEqualTo(manyBarCode).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            for(MaterialExtend me: list) {
+                List<MaterialExtend> basicMeList = materialExtendMapperEx.getBasicInfoByMid(me.getMaterialId());
+                for(MaterialExtend basicMe: basicMeList) {
+                    if(basicMe!=null && !barCode.equals(basicMe.getBarCode())) {
+                        return 1;
+                    }
+                }
+            }
+        }
+        return 0;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyComponent.java b/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyComponent.java
new file mode 100644
index 0000000..c3f6f79
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyComponent.java
@@ -0,0 +1,71 @@
+package com.jsh.erp.service.materialProperty;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "materialProperty_component")
+@MaterialPropertyResource
+public class MaterialPropertyComponent implements ICommonQuery {
+
+    @Resource
+    private MaterialPropertyService materialPropertyService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return materialPropertyService.getMaterialProperty(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getMaterialPropertyList(map);
+    }
+
+    private List<?> getMaterialPropertyList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String order = QueryUtils.order(map);
+        return materialPropertyService.select(name, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        return materialPropertyService.countMaterialProperty(name);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return materialPropertyService.insertMaterialProperty(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return materialPropertyService.updateMaterialProperty(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return materialPropertyService.deleteMaterialProperty(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return materialPropertyService.batchDeleteMaterialProperty(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return materialPropertyService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyResource.java b/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyResource.java
new file mode 100644
index 0000000..613c215
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.materialProperty;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "materialProperty")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MaterialPropertyResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyService.java b/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyService.java
new file mode 100644
index 0000000..0e061fc
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/materialProperty/MaterialPropertyService.java
@@ -0,0 +1,151 @@
+package com.jsh.erp.service.materialProperty;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.MaterialProperty;
+import com.jsh.erp.datasource.entities.MaterialPropertyExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.MaterialPropertyMapper;
+import com.jsh.erp.datasource.mappers.MaterialPropertyMapperEx;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class MaterialPropertyService {
+    private Logger logger = LoggerFactory.getLogger(MaterialPropertyService.class);
+
+    @Resource
+    private MaterialPropertyMapper materialPropertyMapper;
+
+    @Resource
+    private MaterialPropertyMapperEx materialPropertyMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+
+    public MaterialProperty getMaterialProperty(long id)throws Exception {
+        MaterialProperty result=null;
+        try{
+            result=materialPropertyMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<MaterialProperty> getMaterialProperty()throws Exception {
+        MaterialPropertyExample example = new MaterialPropertyExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialProperty>  list=null;
+        try{
+            list=materialPropertyMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<MaterialProperty> select(String name, int offset, int rows)throws Exception {
+        List<MaterialProperty>  list=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                list = materialPropertyMapperEx.selectByConditionMaterialProperty(name, offset, rows);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countMaterialProperty(String name)throws Exception {
+        Long  result=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = materialPropertyMapperEx.countsByMaterialProperty(name);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertMaterialProperty(JSONObject obj, HttpServletRequest request)throws Exception {
+        MaterialProperty materialProperty = JSONObject.parseObject(obj.toJSONString(), MaterialProperty.class);
+        int  result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = materialPropertyMapper.insertSelective(materialProperty);
+                logService.insertLog("商品属性",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(materialProperty.getNativeName()).toString(), request);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateMaterialProperty(JSONObject obj, HttpServletRequest request)throws Exception {
+        MaterialProperty materialProperty = JSONObject.parseObject(obj.toJSONString(), MaterialProperty.class);
+        int  result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = materialPropertyMapper.updateByPrimaryKeySelective(materialProperty);
+                logService.insertLog("商品属性",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(materialProperty.getNativeName()).toString(), request);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteMaterialProperty(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialPropertyByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialProperty(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteMaterialPropertyByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialPropertyByIds(String ids) throws Exception{
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int  result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = materialPropertyMapperEx.batchDeleteMaterialPropertyByIds(new Date(), userInfo == null ? null : userInfo.getId(), idArray);
+                logService.insertLog("商品属性",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(ids).toString(),
+                        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 0;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/msg/MsgComponent.java b/src/main/java/com/jsh/erp/service/msg/MsgComponent.java
new file mode 100644
index 0000000..92e1b6c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/msg/MsgComponent.java
@@ -0,0 +1,72 @@
+package com.jsh.erp.service.msg;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "msg_component")
+@MsgResource
+public class MsgComponent implements ICommonQuery {
+
+    @Resource
+    private MsgService msgService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return msgService.getMsg(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getMsgList(map);
+    }
+
+    private List<?> getMsgList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String order = QueryUtils.order(map);
+        String filter = QueryUtils.filter(map);
+        return msgService.select(name, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        return msgService.countMsg(name);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return msgService.insertMsg(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return msgService.updateMsg(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return msgService.deleteMsg(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return msgService.batchDeleteMsg(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return msgService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/msg/MsgResource.java b/src/main/java/com/jsh/erp/service/msg/MsgResource.java
new file mode 100644
index 0000000..b403bd6
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/msg/MsgResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.msg;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2019-9-7 22:52:35
+ */
+@ResourceInfo(value = "msg")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MsgResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/msg/MsgService.java b/src/main/java/com/jsh/erp/service/msg/MsgService.java
new file mode 100644
index 0000000..bbf5134
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/msg/MsgService.java
@@ -0,0 +1,336 @@
+package com.jsh.erp.service.msg;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.Msg;
+import com.jsh.erp.datasource.entities.MsgEx;
+import com.jsh.erp.datasource.entities.MsgExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.MsgMapper;
+import com.jsh.erp.datasource.mappers.MsgMapperEx;
+import com.jsh.erp.datasource.vo.DepotHeadVo4List;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static com.jsh.erp.utils.Tools.getCenternTime;
+
+@Service
+public class MsgService {
+    private Logger logger = LoggerFactory.getLogger(MsgService.class);
+    @Resource
+    private MsgMapper msgMapper;
+
+    @Resource
+    private MsgMapperEx msgMapperEx;
+
+    @Resource
+    private DepotHeadService depotHeadService;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private LogService logService;
+
+    public Msg getMsg(long id)throws Exception {
+        Msg result=null;
+        try{
+            result=msgMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return result;
+    }
+
+    public List<Msg> getMsg()throws Exception {
+        MsgExample example = new MsgExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Msg> list=null;
+        try{
+            list=msgMapper.selectByExample(example);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return list;
+    }
+
+    public List<MsgEx> select(String name, int offset, int rows)throws Exception {
+        List<MsgEx> list=null;
+        try{
+            User userInfo = userService.getCurrentUser();
+            if(!BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                list = msgMapperEx.selectByConditionMsg(userInfo.getId(), name, offset, rows);
+                if (null != list) {
+                    for (MsgEx msgEx : list) {
+                        if (msgEx.getCreateTime() != null) {
+                            msgEx.setCreateTimeStr(getCenternTime(msgEx.getCreateTime()));
+                        }
+                    }
+                }
+            }
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return list;
+    }
+
+    public Long countMsg(String name)throws Exception {
+        Long result=null;
+        try{
+            User userInfo = userService.getCurrentUser();
+            if(!BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                result = msgMapperEx.countsByMsg(userInfo.getId(), name);
+            }
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertMsg(JSONObject obj, HttpServletRequest request)throws Exception {
+        Msg msg = JSONObject.parseObject(obj.toJSONString(), Msg.class);
+        int result=0;
+        try{
+            User userInfo = userService.getCurrentUser();
+            if(!BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                msg.setCreateTime(new Date());
+                msg.setStatus("1");
+                result=msgMapper.insertSelective(msg);
+                logService.insertLog("消息",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(msg.getMsgTitle()).toString(), request);
+            }
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE, ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateMsg(JSONObject obj, HttpServletRequest request) throws Exception{
+        Msg msg = JSONObject.parseObject(obj.toJSONString(), Msg.class);
+        int result=0;
+        try{
+            result=msgMapper.updateByPrimaryKeySelective(msg);
+            logService.insertLog("消息",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(msg.getMsgTitle()).toString(), request);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE, ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteMsg(Long id, HttpServletRequest request)throws Exception {
+        int result=0;
+        try{
+            result=msgMapper.deleteByPrimaryKey(id);
+            logService.insertLog("消息",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(id).toString(), request);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE, ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMsg(String ids, HttpServletRequest request) throws Exception{
+        List<Long> idList = StringUtil.strToLongList(ids);
+        MsgExample example = new MsgExample();
+        example.createCriteria().andIdIn(idList);
+        int result=0;
+        try{
+            result=msgMapper.deleteByExample(example);
+            logService.insertLog("消息", "批量删除,id集:" + ids, request);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE, ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        MsgExample example = new MsgExample();
+        example.createCriteria().andIdNotEqualTo(id).andMsgTitleEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Msg> list=null;
+        try{
+            list= msgMapper.selectByExample(example);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return list==null?0:list.size();
+    }
+
+    /**
+     * create by: qiankunpingtai
+     *  逻辑删除角色信息
+     * create time: 2019/3/28 15:44
+     * @Param: ids
+     * @return int
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMsgByIds(String ids) throws Exception{
+        logService.insertLog("序列号",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(ids).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            result=msgMapperEx.batchDeleteMsgByIds(idArray);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE, ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+        return result;
+    }
+
+    public List<MsgEx> getMsgByStatus(String status)throws Exception {
+        List<MsgEx> resList=new ArrayList<>();
+        try{
+            User userInfo = userService.getCurrentUser();
+            if(!BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                MsgExample example = new MsgExample();
+                example.createCriteria().andStatusEqualTo(status).andUserIdEqualTo(userInfo.getId())
+                        .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                example.setOrderByClause("id desc");
+                List<Msg> list = msgMapper.selectByExample(example);
+                if (null != list) {
+                    for (Msg msg : list) {
+                        if (msg.getCreateTime() != null) {
+                            MsgEx msgEx = new MsgEx();
+                            msgEx.setId(msg.getId());
+                            msgEx.setMsgTitle(msg.getMsgTitle());
+                            msgEx.setMsgContent(msg.getMsgContent());
+                            msgEx.setStatus(msg.getStatus());
+                            msgEx.setType(msg.getType());
+                            msgEx.setCreateTimeStr(Tools.getCenternTime(msg.getCreateTime()));
+                            resList.add(msgEx);
+                        }
+                    }
+                }
+            }
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return resList;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void batchUpdateStatus(String ids, String status) throws Exception{
+        List<Long> idList = StringUtil.strToLongList(ids);
+        Msg msg = new Msg();
+        msg.setStatus(status);
+        MsgExample example = new MsgExample();
+        example.createCriteria().andIdIn(idList);
+        try{
+            msgMapper.updateByExampleSelective(msg, example);
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE, ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+    }
+
+    public Long getMsgCountByStatus(String status)throws Exception {
+        Long result=null;
+        try{
+            User userInfo=userService.getCurrentUser();
+            if(!BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                result = msgMapperEx.getMsgCountByStatus(status, userInfo.getId());
+            }
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return result;
+    }
+
+    public Integer getMsgCountByType(String type)throws Exception {
+        int msgCount = 0;
+        try{
+            User userInfo = userService.getCurrentUser();
+            if(!BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                MsgExample example = new MsgExample();
+                example.createCriteria().andTypeEqualTo(type).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                List<Msg> list = msgMapper.selectByExample(example);
+                msgCount = list.size();
+            }
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_READ_FAIL_CODE, ExceptionConstants.DATA_READ_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE,
+                    ExceptionConstants.DATA_READ_FAIL_MSG);
+        }
+        return msgCount;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void readAllMsg() throws Exception{
+        try{
+            User userInfo = userService.getCurrentUser();
+            if(!BusinessConstants.DEFAULT_MANAGER.equals(userInfo.getLoginName())) {
+                Msg msg = new Msg();
+                msg.setStatus("2");
+                MsgExample example = new MsgExample();
+                example.createCriteria();
+                msgMapper.updateByExampleSelective(msg, example);
+            }
+        }catch(Exception e){
+            logger.error("异常码[{}],异常提示[{}],异常[{}]",
+                    ExceptionConstants.DATA_WRITE_FAIL_CODE, ExceptionConstants.DATA_WRITE_FAIL_MSG,e);
+            throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE,
+                    ExceptionConstants.DATA_WRITE_FAIL_MSG);
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelComponent.java b/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelComponent.java
new file mode 100644
index 0000000..a24bfba
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelComponent.java
@@ -0,0 +1,67 @@
+package com.jsh.erp.service.orgaUserRel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.organization.OrganizationResource;
+import com.jsh.erp.service.organization.OrganizationService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/11 18:10
+ */
+@Service(value = "orgaUserRel_component")
+@OrgaUserRelResource
+public class OrgaUserRelComponent implements ICommonQuery {
+    @Resource
+    private OrgaUserRelService orgaUserRelService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return orgaUserRelService.getOrgaUserRel(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> parameterMap)throws Exception {
+        return getOrgaUserRelList(parameterMap);
+    }
+    private List<?> getOrgaUserRelList(Map<String, String> map)throws Exception {
+        return null;
+    }
+    @Override
+    public Long counts(Map<String, String> parameterMap)throws Exception {
+        return null;
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return orgaUserRelService.insertOrgaUserRel(obj,request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return orgaUserRelService.updateOrgaUserRel(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return orgaUserRelService.deleteOrgaUserRel(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return orgaUserRelService.batchDeleteOrgaUserRel(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 0;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelResource.java b/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelResource.java
new file mode 100644
index 0000000..a12ce1f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelResource.java
@@ -0,0 +1,19 @@
+package com.jsh.erp.service.orgaUserRel;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * Description
+ *  机构用户关系
+ * @Author: cjl
+ * @Date: 2019/3/11 18:11
+ */
+@ResourceInfo(value = "orgaUserRel")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OrgaUserRelResource {
+
+}
diff --git a/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelService.java b/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelService.java
new file mode 100644
index 0000000..3dec263
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/orgaUserRel/OrgaUserRelService.java
@@ -0,0 +1,221 @@
+package com.jsh.erp.service.orgaUserRel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.OrgaUserRel;
+import com.jsh.erp.datasource.entities.OrgaUserRelExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.OrgaUserRelMapper;
+import com.jsh.erp.datasource.mappers.OrgaUserRelMapperEx;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.organization.OrganizationService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/11 18:11
+ */
+@Service
+public class OrgaUserRelService {
+    private Logger logger = LoggerFactory.getLogger(OrganizationService.class);
+
+    @Resource
+    private OrgaUserRelMapper orgaUserRelMapper;
+    @Resource
+    private OrgaUserRelMapperEx orgaUserRelMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private OrganizationService organizationService;
+    @Resource
+    private LogService logService;
+
+    public OrgaUserRel getOrgaUserRel(long id) throws Exception{
+        return orgaUserRelMapper.selectByPrimaryKey(id);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertOrgaUserRel(JSONObject obj, HttpServletRequest request) throws Exception{
+        OrgaUserRel orgaUserRel = JSONObject.parseObject(obj.toJSONString(), OrgaUserRel.class);
+        int result=0;
+        try{
+            result=orgaUserRelMapper.insertSelective(orgaUserRel);
+            logService.insertLog("用户与机构关系", BusinessConstants.LOG_OPERATION_TYPE_ADD, request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateOrgaUserRel(JSONObject obj, HttpServletRequest request) throws Exception{
+        OrgaUserRel orgaUserRel = JSONObject.parseObject(obj.toJSONString(), OrgaUserRel.class);
+        int result=0;
+        try{
+            result=orgaUserRelMapper.updateByPrimaryKeySelective(orgaUserRel);
+            logService.insertLog("用户与机构关系",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(orgaUserRel.getId()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteOrgaUserRel(Long id, HttpServletRequest request)throws Exception {
+        int result=0;
+        try{
+            result=orgaUserRelMapper.deleteByPrimaryKey(id);
+            logService.insertLog("用户与机构关系",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(id).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteOrgaUserRel(String ids, HttpServletRequest request)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        OrgaUserRelExample example = new OrgaUserRelExample();
+        example.createCriteria().andIdIn(idList);
+        int result=0;
+        try{
+            result=orgaUserRelMapper.deleteByExample(example);
+            logService.insertLog("用户与机构关系", "批量删除,id集:" + ids, request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    /**
+     * create by: cjl
+     * description:
+     *  新增机构用户关联关系,反显id
+     * create time: 2019/3/12 9:40
+     * @Param: orgaUserRel
+     * @return void
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public OrgaUserRel addOrgaUserRel(OrgaUserRel orgaUserRel) throws Exception{
+        Date date = new Date();
+        User userInfo=userService.getCurrentUser();
+        //创建时间
+        if(orgaUserRel.getCreateTime()==null){
+            orgaUserRel.setCreateTime(date);
+        }
+        //创建人
+        if(orgaUserRel.getCreator()==null){
+            orgaUserRel.setCreator(userInfo==null?null:userInfo.getId());
+        }
+        //更新时间
+        if(orgaUserRel.getUpdateTime()==null){
+            orgaUserRel.setUpdateTime(date);
+        }
+        //更新人
+        if(orgaUserRel.getUpdater()==null){
+            orgaUserRel.setUpdater(userInfo==null?null:userInfo.getId());
+        }
+        orgaUserRel.setDeleteFlag(BusinessConstants.DELETE_FLAG_EXISTS);
+        int result=0;
+        try{
+            result=orgaUserRelMapperEx.addOrgaUserRel(orgaUserRel);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        if(result>0){
+            return orgaUserRel;
+        }
+        return null;
+    }
+    /**
+     * create by: cjl
+     * description:
+     *  更新机构用户关联关系
+     * create time: 2019/3/12 9:40
+     * @Param: orgaUserRel
+     * @return void
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public OrgaUserRel updateOrgaUserRel(OrgaUserRel orgaUserRel) throws Exception{
+        User userInfo=userService.getCurrentUser();
+        //更新时间
+        if(orgaUserRel.getUpdateTime()==null){
+            orgaUserRel.setUpdateTime(new Date());
+        }
+        //更新人
+        if(orgaUserRel.getUpdater()==null){
+            orgaUserRel.setUpdater(userInfo==null?null:userInfo.getId());
+        }
+        int result=0;
+        try{
+            result=orgaUserRelMapperEx.updateOrgaUserRel(orgaUserRel);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        if(result>0){
+            return orgaUserRel;
+        }
+        return null;
+    }
+
+    /**
+     * 根据用户id获取用户id列表
+     * @param userId
+     * @return
+     * @throws Exception
+     */
+    public String getUserIdListByUserId(Long userId) throws Exception{
+        String users = "";
+        OrgaUserRelExample example = new OrgaUserRelExample();
+        example.createCriteria().andUserIdEqualTo(userId);
+        List<OrgaUserRel> list = orgaUserRelMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            OrgaUserRel our = list.get(0);
+            List<Long> userIdList = getUserIdListByOrgId(our.getOrgaId());
+            for(Long u: userIdList){
+                users = users + u + ",";
+            }
+            if(users.length()>0){
+                users = users.substring(0,users.length()-1);
+            }
+        }
+        return users;
+    }
+
+    /**
+     * 根据组织id获取所属的用户id列表(包含组织的递归)
+     * @param orgId
+     * @return
+     */
+    public List<Long> getUserIdListByOrgId(Long orgId) {
+        List<Long> orgIdList = organizationService.getOrgIdByParentId(orgId);
+        List<Long> userIdList = new ArrayList<Long>();
+        OrgaUserRelExample example = new OrgaUserRelExample();
+        if(orgIdList!=null && orgIdList.size()>0) {
+            example.createCriteria().andOrgaIdIn(orgIdList).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        } else {
+            example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        }
+        List<OrgaUserRel> list = orgaUserRelMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            for(OrgaUserRel our: list) {
+                userIdList.add(our.getUserId());
+            }
+        }
+        return  userIdList;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/organization/OrganizationComponent.java b/src/main/java/com/jsh/erp/service/organization/OrganizationComponent.java
new file mode 100644
index 0000000..5768131
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/organization/OrganizationComponent.java
@@ -0,0 +1,68 @@
+package com.jsh.erp.service.organization;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/6 15:09
+ */
+@Service(value = "organization_component")
+@OrganizationResource
+public class OrganizationComponent implements ICommonQuery {
+    @Resource
+    private OrganizationService organizationService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return organizationService.getOrganization(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> parameterMap)throws Exception {
+        return getOrganizationList(parameterMap);
+    }
+    private List<?> getOrganizationList(Map<String, String> map)throws Exception {
+        return null;
+    }
+    @Override
+    public Long counts(Map<String, String> parameterMap)throws Exception {
+        return null;
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return organizationService.insertOrganization(obj,request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return organizationService.updateOrganization(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return organizationService.deleteOrganization(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return organizationService.batchDeleteOrganization(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return organizationService.checkIsNameExist(id, name);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/organization/OrganizationResource.java b/src/main/java/com/jsh/erp/service/organization/OrganizationResource.java
new file mode 100644
index 0000000..f84d766
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/organization/OrganizationResource.java
@@ -0,0 +1,18 @@
+package com.jsh.erp.service.organization;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * Description
+ *  机构
+ * @Author: cjl
+ * @Date: 2019/3/6 15:10
+ */
+@ResourceInfo(value = "organization")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OrganizationResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/organization/OrganizationService.java b/src/main/java/com/jsh/erp/service/organization/OrganizationService.java
new file mode 100644
index 0000000..09dd15f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/organization/OrganizationService.java
@@ -0,0 +1,262 @@
+package com.jsh.erp.service.organization;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.MaterialProperty;
+import com.jsh.erp.datasource.entities.Organization;
+import com.jsh.erp.datasource.entities.OrganizationExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.OrganizationMapper;
+import com.jsh.erp.datasource.mappers.OrganizationMapperEx;
+import com.jsh.erp.datasource.vo.TreeNode;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/3/6 15:10
+ */
+@Service
+public class OrganizationService {
+    private Logger logger = LoggerFactory.getLogger(OrganizationService.class);
+
+    @Resource
+    private OrganizationMapper organizationMapper;
+    @Resource
+    private OrganizationMapperEx organizationMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+
+    public Organization getOrganization(long id) throws Exception {
+        return organizationMapper.selectByPrimaryKey(id);
+    }
+
+    public List<Organization> getOrganizationListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Organization> list = new ArrayList<>();
+        try{
+            OrganizationExample example = new OrganizationExample();
+            example.createCriteria().andIdIn(idList);
+            list = organizationMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertOrganization(JSONObject obj, HttpServletRequest request)throws Exception {
+        Organization organization = JSONObject.parseObject(obj.toJSONString(), Organization.class);
+        organization.setCreateTime(new Date());
+        organization.setUpdateTime(new Date());
+        int result=0;
+        try{
+            result=organizationMapper.insertSelective(organization);
+            logService.insertLog("机构",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(organization.getOrgAbr()).toString(),request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateOrganization(JSONObject obj, HttpServletRequest request)throws Exception {
+        Organization organization = JSONObject.parseObject(obj.toJSONString(), Organization.class);
+        organization.setUpdateTime(new Date());
+        int result=0;
+        try{
+            result=organizationMapperEx.editOrganization(organization);
+            logService.insertLog("机构",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(organization.getOrgAbr()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteOrganization(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteOrganizationByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteOrganization(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteOrganizationByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteOrganizationByIds(String ids) throws Exception{
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<Organization> list = getOrganizationListByIds(ids);
+        for(Organization organization: list){
+            sb.append("[").append(organization.getOrgAbr()).append("]");
+        }
+        logService.insertLog("机构", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        List <Organization> organList = organizationMapperEx.getOrganizationByParentIds(idArray);
+        if(organList!=null && organList.size()>0) {
+            //如果存在子机构则不能删除
+            logger.error("异常码[{}],异常提示[{}]",
+                    ExceptionConstants.ORGANIZATION_CHILD_NOT_ALLOWED_DELETE_CODE,ExceptionConstants.ORGANIZATION_CHILD_NOT_ALLOWED_DELETE_MSG);
+            throw new BusinessRunTimeException(ExceptionConstants.ORGANIZATION_CHILD_NOT_ALLOWED_DELETE_CODE,
+                    ExceptionConstants.ORGANIZATION_CHILD_NOT_ALLOWED_DELETE_MSG);
+        } else {
+            result=organizationMapperEx.batchDeleteOrganizationByIds(
+                    new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        OrganizationExample example = new OrganizationExample();
+        example.createCriteria().andIdNotEqualTo(id).andOrgAbrEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Organization> list=null;
+        try{
+            list= organizationMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public List<TreeNode> getOrganizationTree(Long id)throws Exception {
+        List<TreeNode> list=null;
+        try{
+            list=organizationMapperEx.getNodeTree(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Organization> findById(Long id) throws Exception{
+        OrganizationExample example = new OrganizationExample();
+        example.createCriteria().andIdEqualTo(id);
+        List<Organization> list=null;
+        try{
+            list=organizationMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Organization> findByParentId(Long parentId)throws Exception {
+        List<Organization> list=null;
+        if(parentId!=null){
+            OrganizationExample example = new OrganizationExample();
+            example.createCriteria().andIdEqualTo(parentId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            try{
+                list=organizationMapper.selectByExample(example);
+            }catch(Exception e){
+                JshException.readFail(logger, e);
+            }
+        }
+        return list;
+    }
+
+    public List<Organization> findByOrgNo(String orgNo)throws Exception {
+        OrganizationExample example = new OrganizationExample();
+        example.createCriteria().andOrgNoEqualTo(orgNo).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Organization> list=null;
+        try{
+            list=organizationMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+    /**
+     * create by: cjl
+     * description:
+     *  检查机构编号是否已经存在
+     * create time: 2019/3/7 10:01
+     * @Param: orgNo
+     * @return void
+     */
+    public void checkOrgNoIsExists(String orgNo,Long id)throws Exception {
+        List<Organization> orgList=findByOrgNo(orgNo);
+        if(orgList!=null&&orgList.size()>0){
+            if(orgList.size()>1){
+                logger.error("异常码[{}],异常提示[{}],参数,orgNo[{}]",
+                        ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_CODE,ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_MSG,orgNo);
+                //获取的数据条数大于1,机构编号已存在
+                throw new BusinessRunTimeException(ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_CODE,
+                        ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_MSG);
+            }
+            if(id!=null){
+                if(!orgList.get(0).getId().equals(id)){
+                    //数据条数等于1,但是和编辑的数据的id不相同
+                    logger.error("异常码[{}],异常提示[{}],参数,orgNo[{}],id[{}]",
+                            ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_CODE,ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_MSG,orgNo,id);
+                    throw new BusinessRunTimeException(ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_CODE,
+                            ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_MSG);
+                }
+            }else{
+                logger.error("异常码[{}],异常提示[{}],参数,orgNo[{}]",
+                        ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_CODE,ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_MSG,orgNo);
+                //数据条数等于1,但此时是新增
+                throw new BusinessRunTimeException(ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_CODE,
+                        ExceptionConstants.ORGANIZATION_NO_ALREADY_EXISTS_MSG);
+            }
+        }
+
+    }
+
+    /**
+     * 根据父级id递归获取子集组织id
+     * @return
+     */
+    public List<Long> getOrgIdByParentId(Long orgId) {
+        List<Long> idList = new ArrayList<>();
+        OrganizationExample example = new OrganizationExample();
+        example.createCriteria().andIdEqualTo(orgId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Organization> orgList = organizationMapper.selectByExample(example);
+        if(orgList!=null && orgList.size()>0) {
+            idList.add(orgId);
+            getOrgIdByParentNo(idList, orgList.get(0).getId());
+        }
+        return idList;
+    }
+
+    /**
+     * 根据组织编号递归获取下级编号
+     * @param id
+     * @return
+     */
+    public void getOrgIdByParentNo(List<Long> idList,Long id) {
+        OrganizationExample example = new OrganizationExample();
+        example.createCriteria().andParentIdEqualTo(id).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Organization> orgList = organizationMapper.selectByExample(example);
+        if(orgList!=null && orgList.size()>0) {
+            for(Organization o: orgList) {
+                idList.add(o.getId());
+                getOrgIdByParentNo(idList, o.getId());
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/person/PersonComponent.java b/src/main/java/com/jsh/erp/service/person/PersonComponent.java
new file mode 100644
index 0000000..b7c8946
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/person/PersonComponent.java
@@ -0,0 +1,75 @@
+package com.jsh.erp.service.person;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.depot.DepotResource;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "person_component")
+@PersonResource
+public class PersonComponent implements ICommonQuery {
+
+    @Resource
+    private PersonService personService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return personService.getPerson(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getPersonList(map);
+    }
+
+    private List<?> getPersonList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String type = StringUtil.getInfo(search, "type");
+        String order = QueryUtils.order(map);
+        return personService.select(name, type, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String type = StringUtil.getInfo(search, "type");
+        return personService.countPerson(name, type);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return personService.insertPerson(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return personService.updatePerson(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return personService.deletePerson(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return personService.batchDeletePerson(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return personService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/person/PersonResource.java b/src/main/java/com/jsh/erp/service/person/PersonResource.java
new file mode 100644
index 0000000..eb49668
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/person/PersonResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.person;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "person")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PersonResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/person/PersonService.java b/src/main/java/com/jsh/erp/service/person/PersonService.java
new file mode 100644
index 0000000..41cac6c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/person/PersonService.java
@@ -0,0 +1,255 @@
+package com.jsh.erp.service.person;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.AccountHead;
+import com.jsh.erp.datasource.entities.DepotHead;
+import com.jsh.erp.datasource.entities.Person;
+import com.jsh.erp.datasource.entities.PersonExample;
+import com.jsh.erp.datasource.mappers.AccountHeadMapperEx;
+import com.jsh.erp.datasource.mappers.DepotHeadMapperEx;
+import com.jsh.erp.datasource.mappers.PersonMapper;
+import com.jsh.erp.datasource.mappers.PersonMapperEx;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class PersonService {
+    private Logger logger = LoggerFactory.getLogger(PersonService.class);
+
+    @Resource
+    private PersonMapper personMapper;
+
+    @Resource
+    private PersonMapperEx personMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+    @Resource
+    private AccountHeadMapperEx accountHeadMapperEx;
+    @Resource
+    private DepotHeadMapperEx depotHeadMapperEx;
+
+    public Person getPerson(long id)throws Exception {
+        Person result=null;
+        try{
+            result=personMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Person> getPersonListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Person> list = new ArrayList<>();
+        try{
+            PersonExample example = new PersonExample();
+            example.createCriteria().andIdIn(idList);
+            list = personMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Person> getPerson()throws Exception {
+        PersonExample example = new PersonExample();
+        example.createCriteria().andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Person> list=null;
+        try{
+            list=personMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Person> select(String name, String type, int offset, int rows)throws Exception {
+        List<Person> list=null;
+        try{
+            list=personMapperEx.selectByConditionPerson(name, type, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countPerson(String name, String type)throws Exception {
+        Long result=null;
+        try{
+            result=personMapperEx.countsByPerson(name, type);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertPerson(JSONObject obj, HttpServletRequest request)throws Exception {
+        Person person = JSONObject.parseObject(obj.toJSONString(), Person.class);
+        int result=0;
+        try{
+            person.setEnabled(true);
+            result=personMapper.insertSelective(person);
+            logService.insertLog("经手人",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(person.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updatePerson(JSONObject obj, HttpServletRequest request)throws Exception {
+        Person person = JSONObject.parseObject(obj.toJSONString(), Person.class);
+        int result=0;
+        try{
+            result=personMapper.updateByPrimaryKeySelective(person);
+            logService.insertLog("经手人",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(person.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deletePerson(Long id, HttpServletRequest request)throws Exception {
+        return batchDeletePersonByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeletePerson(String ids, HttpServletRequest request) throws Exception{
+        return batchDeletePersonByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeletePersonByIds(String ids)throws Exception {
+        int result =0;
+        String [] idArray=ids.split(",");
+        //校验财务主表	jsh_accounthead
+        List<AccountHead> accountHeadList =null;
+        try{
+            accountHeadList=accountHeadMapperEx.getAccountHeadListByHandsPersonIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(accountHeadList!=null&&accountHeadList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,HandsPersonIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //校验单据主表	jsh_depot_head
+        List<DepotHead> depotHeadList =null;
+        try{
+            depotHeadList=depotHeadMapperEx.getDepotHeadListByCreator(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(depotHeadList!=null&&depotHeadList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,HandsPersonIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //记录日志
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<Person> list = getPersonListByIds(ids);
+        for(Person person: list){
+            sb.append("[").append(person.getName()).append("]");
+        }
+        logService.insertLog("经手人", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        //删除经手人
+        try{
+            result=personMapperEx.batchDeletePersonByIds(idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name) throws Exception{
+        PersonExample example = new PersonExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Person> list =null;
+        try{
+            list=personMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public Map<Long,String> getPersonMap() throws Exception {
+        List<Person> personList = getPerson();
+        Map<Long,String> personMap = new HashMap<>();
+        for(Person person : personList){
+            personMap.put(person.getId(), person.getName());
+        }
+        return personMap;
+    }
+
+    public String getPersonByMapAndIds(Map<Long,String> personMap, String personIds)throws Exception {
+        List<Long> ids = StringUtil.strToLongList(personIds);
+        StringBuffer sb = new StringBuffer();
+        for(Long id: ids){
+            sb.append(personMap.get(id) + " ");
+        }
+        return sb.toString();
+    }
+
+    public List<Person> getPersonByType(String type)throws Exception {
+        PersonExample example = new PersonExample();
+        example.createCriteria().andTypeEqualTo(type).andEnabledEqualTo(true)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Person> list =null;
+        try{
+            list=personMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("经手人",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ENABLED).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> personIds = StringUtil.strToLongList(ids);
+        Person person = new Person();
+        person.setEnabled(status);
+        PersonExample example = new PersonExample();
+        example.createCriteria().andIdIn(personIds);
+        int result=0;
+        try{
+            result = personMapper.updateByExampleSelective(person, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigComponent.java b/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigComponent.java
new file mode 100644
index 0000000..1c3553a
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigComponent.java
@@ -0,0 +1,70 @@
+package com.jsh.erp.service.platformConfig;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "platformConfig_component")
+@PlatformConfigResource
+public class PlatformConfigComponent implements ICommonQuery {
+
+    @Resource
+    private PlatformConfigService platformConfigService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return platformConfigService.getPlatformConfig(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getPlatformConfigList(map);
+    }
+
+    private List<?> getPlatformConfigList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String platformKey = StringUtil.getInfo(search, "platformKey");
+        return platformConfigService.select(platformKey, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String platformKey = StringUtil.getInfo(search, "platformKey");
+        return platformConfigService.countPlatformConfig(platformKey);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return platformConfigService.insertPlatformConfig(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return platformConfigService.updatePlatformConfig(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return platformConfigService.deletePlatformConfig(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return platformConfigService.batchDeletePlatformConfig(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 0;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigResource.java b/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigResource.java
new file mode 100644
index 0000000..4bb4aa9
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.platformConfig;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2020-10-16 22:26:27
+ */
+@ResourceInfo(value = "platformConfig")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PlatformConfigResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigService.java b/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigService.java
new file mode 100644
index 0000000..337a928
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/platformConfig/PlatformConfigService.java
@@ -0,0 +1,196 @@
+package com.jsh.erp.service.platformConfig;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.PlatformConfig;
+import com.jsh.erp.datasource.entities.PlatformConfigExample;
+import com.jsh.erp.datasource.mappers.PlatformConfigMapper;
+import com.jsh.erp.datasource.mappers.PlatformConfigMapperEx;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@Service
+public class PlatformConfigService {
+    private Logger logger = LoggerFactory.getLogger(PlatformConfigService.class);
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private PlatformConfigMapper platformConfigMapper;
+
+    @Resource
+    private PlatformConfigMapperEx platformConfigMapperEx;
+
+    public PlatformConfig getPlatformConfig(long id)throws Exception {
+        PlatformConfig result=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = platformConfigMapper.selectByPrimaryKey(id);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<PlatformConfig> getPlatformConfig()throws Exception {
+        PlatformConfigExample example = new PlatformConfigExample();
+        example.createCriteria();
+        List<PlatformConfig> list=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                list = platformConfigMapper.selectByExample(example);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<PlatformConfig> select(String platformKey, int offset, int rows)throws Exception {
+        List<PlatformConfig> list=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                list = platformConfigMapperEx.selectByConditionPlatformConfig(platformKey, offset, rows);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countPlatformConfig(String platformKey)throws Exception {
+        Long result=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = platformConfigMapperEx.countsByPlatformConfig(platformKey);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertPlatformConfig(JSONObject obj, HttpServletRequest request) throws Exception{
+        PlatformConfig platformConfig = JSONObject.parseObject(obj.toJSONString(), PlatformConfig.class);
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = platformConfigMapper.insertSelective(platformConfig);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updatePlatformConfig(JSONObject obj, HttpServletRequest request) throws Exception{
+        PlatformConfig platformConfig = JSONObject.parseObject(obj.toJSONString(), PlatformConfig.class);
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = platformConfigMapper.updateByPrimaryKeySelective(platformConfig);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deletePlatformConfig(Long id, HttpServletRequest request)throws Exception {
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = platformConfigMapper.deleteByPrimaryKey(id);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeletePlatformConfig(String ids, HttpServletRequest request)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        PlatformConfigExample example = new PlatformConfigExample();
+        example.createCriteria().andIdIn(idList);
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = platformConfigMapper.deleteByExample(example);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int updatePlatformConfigByKey(String platformKey, String platformValue)throws Exception {
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                PlatformConfig platformConfig = new PlatformConfig();
+                platformConfig.setPlatformValue(platformValue);
+                PlatformConfigExample example = new PlatformConfigExample();
+                example.createCriteria().andPlatformKeyEqualTo(platformKey);
+                result = platformConfigMapper.updateByExampleSelective(platformConfig, example);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public PlatformConfig getInfoByKey(String platformKey)throws Exception {
+        PlatformConfig platformConfig = new PlatformConfig();
+        try{
+            if(platformKey.contains("aliOss") || platformKey.contains("weixin")) {
+                platformConfig = null;
+            } else {
+                PlatformConfigExample example = new PlatformConfigExample();
+                example.createCriteria().andPlatformKeyEqualTo(platformKey);
+                List<PlatformConfig> list=platformConfigMapper.selectByExample(example);
+                if(list!=null && list.size()>0){
+                    platformConfig = list.get(0);
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return platformConfig;
+    }
+
+    /**
+     * 根据key查询平台信息-内部专用方法
+     * @param platformKey
+     * @return
+     * @throws Exception
+     */
+    public PlatformConfig getPlatformConfigByKey(String platformKey)throws Exception {
+        PlatformConfig platformConfig = new PlatformConfig();
+        try{
+            PlatformConfigExample example = new PlatformConfigExample();
+            example.createCriteria().andPlatformKeyEqualTo(platformKey);
+            List<PlatformConfig> list=platformConfigMapper.selectByExample(example);
+            if(list!=null && list.size()>0){
+                platformConfig = list.get(0);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return platformConfig;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/redis/RedisService.java b/src/main/java/com/jsh/erp/service/redis/RedisService.java
new file mode 100644
index 0000000..5de7464
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/redis/RedisService.java
@@ -0,0 +1,153 @@
+package com.jsh.erp.service.redis;
+
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Description
+ *
+ * @author jisheng hua
+ * @Date: 2021/1/28 18:10
+ */
+@Component
+public class RedisService {
+
+    @Resource
+    public RedisTemplate redisTemplate;
+
+    public static final String ACCESS_TOKEN = "X-Access-Token";
+
+    @Autowired(required = false)
+    public void setRedisTemplate(RedisTemplate redisTemplate) {
+        RedisSerializer stringSerializer = new StringRedisSerializer();
+        redisTemplate.setKeySerializer(stringSerializer);
+        redisTemplate.setValueSerializer(stringSerializer);
+        redisTemplate.setHashKeySerializer(stringSerializer);
+        redisTemplate.setHashValueSerializer(stringSerializer);
+        this.redisTemplate = redisTemplate;
+    }
+
+    /**
+     * @author jisheng hua
+     * description:
+     *  从session中获取信息
+     *@date: 2021/1/28 18:10
+     * @Param: request
+     * @Param: key
+     * @return Object
+     */
+    public Object getObjectFromSessionByKey(HttpServletRequest request, String key){
+        Object obj=null;
+        if(request==null){
+            return null;
+        }
+        String token = request.getHeader(ACCESS_TOKEN);
+        if(token!=null) {
+            //开启redis,用户数据放在redis中,从redis中获取
+            if(redisTemplate.opsForHash().hasKey(token,key)){
+                //redis中存在,拿出来使用
+                obj=redisTemplate.opsForHash().get(token,key);
+                redisTemplate.expire(token, BusinessConstants.MAX_SESSION_IN_SECONDS, TimeUnit.SECONDS);
+            }
+        }
+        return obj;
+    }
+
+    /**
+     * 获得缓存的基本对象。
+     *
+     * @param key 缓存键值
+     * @return 缓存键值对应的数据
+     */
+    public <T> T getCacheObject(final String key)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        return operation.get(key);
+    }
+
+    /**
+     * @author jisheng hua
+     * description:
+     *  将信息放入session或者redis中
+     *@date: 2021/1/28 18:10
+     * @Param: request
+     * @Param: key
+     * @Param: obj
+     * @return
+     */
+    public void storageObjectBySession(String token, String key, Object obj) {
+        //开启redis,用户数据放到redis中
+        redisTemplate.opsForHash().put(token, key, obj.toString());
+        redisTemplate.expire(token, BusinessConstants.MAX_SESSION_IN_SECONDS, TimeUnit.SECONDS);
+    }
+
+    /**
+     * @author jisheng hua
+     *  description:
+     *  将信息放入session或者redis中
+     * @date: 2024/5/28 20:10
+     * @return
+     */
+    public void storageCaptchaObject(String verifyKey, String codeNum) {
+        //把验证码放到redis中
+        redisTemplate.opsForValue().set(verifyKey, codeNum, BusinessConstants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
+    }
+
+    /**
+     * 删除单个对象
+     *
+     * @param key
+     */
+    public boolean deleteObject(final String key)
+    {
+        return redisTemplate.delete(key);
+    }
+
+    /**
+     * @author jisheng hua
+     * description:
+     *  将信息从session或者redis中移除
+     *@date: 2021/1/28 18:10
+     * @Param: request
+     * @Param: key
+     * @Param: obj
+     * @return
+     */
+    public void deleteObjectBySession(HttpServletRequest request, String key){
+        if(request!=null){
+            String token = request.getHeader(ACCESS_TOKEN);
+            if(StringUtil.isNotEmpty(token)){
+                //开启redis,用户数据放在redis中,从redis中删除
+                redisTemplate.opsForHash().delete(token, key);
+            }
+        }
+    }
+
+    /**
+     * @author jisheng hua
+     * 将信息从redis中移除,比对user和ip
+     * @param userId
+     * @param clientIp
+     */
+    public void deleteObjectByUserAndIp(Long userId, String clientIp){
+        Set<String> tokens = redisTemplate.keys("*");
+        for(String token : tokens) {
+            Object userIdValue = redisTemplate.opsForHash().get(token, "userId");
+            Object clientIpValue = redisTemplate.opsForHash().get(token, "clientIp");
+            if(userIdValue!=null && clientIpValue!=null && userIdValue.equals(userId.toString()) && clientIpValue.equals(clientIp)) {
+                redisTemplate.opsForHash().delete(token, "userId");
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/role/RoleComponent.java b/src/main/java/com/jsh/erp/service/role/RoleComponent.java
new file mode 100644
index 0000000..af9f08b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/role/RoleComponent.java
@@ -0,0 +1,72 @@
+package com.jsh.erp.service.role;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "role_component")
+@RoleResource
+public class RoleComponent implements ICommonQuery {
+
+    @Resource
+    private RoleService roleService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return roleService.getRole(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getRoleList(map);
+    }
+
+    private List<?> getRoleList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String description = StringUtil.getInfo(search, "description");
+        return roleService.select(name, description, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String description = StringUtil.getInfo(search, "description");
+        return roleService.countRole(name, description);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return roleService.insertRole(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return roleService.updateRole(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return roleService.deleteRole(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return roleService.batchDeleteRole(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return roleService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/role/RoleResource.java b/src/main/java/com/jsh/erp/service/role/RoleResource.java
new file mode 100644
index 0000000..330cdee
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/role/RoleResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.role;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "role")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RoleResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/role/RoleService.java b/src/main/java/com/jsh/erp/service/role/RoleService.java
new file mode 100644
index 0000000..c21c977
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/role/RoleService.java
@@ -0,0 +1,316 @@
+package com.jsh.erp.service.role;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.Role;
+import com.jsh.erp.datasource.entities.RoleEx;
+import com.jsh.erp.datasource.entities.RoleExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.RoleMapper;
+import com.jsh.erp.datasource.mappers.RoleMapperEx;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class RoleService {
+    private Logger logger = LoggerFactory.getLogger(RoleService.class);
+    @Resource
+    private RoleMapper roleMapper;
+
+    @Resource
+    private RoleMapperEx roleMapperEx;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+
+    //超管的专用角色
+    private static Long MANAGE_ROLE_ID = 4L;
+
+    public Role getRole(long id)throws Exception {
+        Role result=null;
+        try{
+            result=roleMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Role> getRoleListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Role> list = new ArrayList<>();
+        try{
+            RoleExample example = new RoleExample();
+            example.createCriteria().andIdIn(idList);
+            list = roleMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Role> allList()throws Exception {
+        RoleExample example = new RoleExample();
+        example.createCriteria().andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Role> list=null;
+        try{
+            list=roleMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Role> tenantRoleList() {
+        List<Role> list=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                RoleExample example = new RoleExample();
+                example.createCriteria().andEnabledEqualTo(true).andTenantIdIsNull().andIdNotEqualTo(MANAGE_ROLE_ID)
+                        .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                example.setOrderByClause("sort asc, id asc");
+                list=roleMapper.selectByExample(example);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<RoleEx> select(String name, String description, int offset, int rows)throws Exception {
+        List<RoleEx> list=null;
+        try{
+            list=roleMapperEx.selectByConditionRole(name, description, offset, rows);
+            for(RoleEx roleEx: list) {
+                String priceLimit = roleEx.getPriceLimit();
+                if(StringUtil.isNotEmpty(priceLimit)) {
+                    String priceLimitStr = priceLimit
+                        .replace("1", "屏蔽首页采购价")
+                        .replace("2", "屏蔽首页零售价")
+                        .replace("3", "屏蔽首页销售价")
+                        .replace("4", "屏蔽单据采购价")
+                        .replace("5", "屏蔽单据零售价")
+                        .replace("6", "屏蔽单据销售价");
+                    roleEx.setPriceLimitStr(priceLimitStr);
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countRole(String name, String description)throws Exception {
+        Long result=null;
+        try{
+            result=roleMapperEx.countsByRole(name, description);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertRole(JSONObject obj, HttpServletRequest request)throws Exception {
+        Role role = JSONObject.parseObject(obj.toJSONString(), Role.class);
+        int result=0;
+        try{
+            role.setEnabled(true);
+            result=roleMapper.insertSelective(role);
+            logService.insertLog("角色",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(role.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateRole(JSONObject obj, HttpServletRequest request) throws Exception{
+        Role role = JSONObject.parseObject(obj.toJSONString(), Role.class);
+        int result=0;
+        try{
+            result=roleMapper.updateByPrimaryKeySelective(role);
+            logService.insertLog("角色",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(role.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteRole(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteRoleByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteRole(String ids, HttpServletRequest request) throws Exception{
+        return batchDeleteRoleByIds(ids);
+    }
+
+    public int checkIsNameExist(Long id, String name) throws Exception{
+        RoleExample example = new RoleExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Role> list =null;
+        try{
+            list=roleMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public List<Role> findUserRole()throws Exception{
+        RoleExample example = new RoleExample();
+        example.setOrderByClause("Id");
+        example.createCriteria().andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Role> list=null;
+        try{
+            list=roleMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+    /**
+     * create by: qiankunpingtai
+     *  逻辑删除角色信息
+     * create time: 2019/3/28 15:44
+     * @Param: ids
+     * @return int
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteRoleByIds(String ids) throws Exception{
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<Role> list = getRoleListByIds(ids);
+        for(Role role: list){
+            sb.append("[").append(role.getName()).append("]");
+        }
+        logService.insertLog("角色", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            result=roleMapperEx.batchDeleteRoleByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public Role getRoleWithoutTenant(Long roleId) {
+        return roleMapperEx.getRoleWithoutTenant(roleId);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("角色",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ENABLED).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> roleIds = StringUtil.strToLongList(ids);
+        Role role = new Role();
+        role.setEnabled(status);
+        RoleExample example = new RoleExample();
+        example.createCriteria().andIdIn(roleIds);
+        int result=0;
+        try{
+            result = roleMapper.updateByExampleSelective(role, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 根据权限进行屏蔽价格-首页
+     * @param price
+     * @param type
+     * @return
+     */
+    public Object parseHomePriceByLimit(BigDecimal price, String type, String priceLimit, String emptyInfo, HttpServletRequest request) throws Exception {
+        if(StringUtil.isNotEmpty(priceLimit)) {
+            if("buy".equals(type) && priceLimit.contains("1")) {
+                return emptyInfo;
+            }
+            if("retail".equals(type) && priceLimit.contains("2")) {
+                return emptyInfo;
+            }
+            if("sale".equals(type) && priceLimit.contains("3")) {
+                return emptyInfo;
+            }
+        }
+        return price;
+    }
+
+    /**
+     * 根据权限进行屏蔽价格-单据
+     * @param price
+     * @param billCategory
+     * @param priceLimit
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    public BigDecimal parseBillPriceByLimit(BigDecimal price, String billCategory, String priceLimit, HttpServletRequest request) throws Exception {
+        if(StringUtil.isNotEmpty(priceLimit)) {
+            if("buy".equals(billCategory) && priceLimit.contains("4")) {
+                return BigDecimal.ZERO;
+            }
+            if("retail".equals(billCategory) && priceLimit.contains("5")) {
+                return BigDecimal.ZERO;
+            }
+            if("sale".equals(billCategory) && priceLimit.contains("6")) {
+                return BigDecimal.ZERO;
+            }
+        }
+        return price;
+    }
+
+    /**
+     * 根据权限进行屏蔽价格-物料
+     * @param price
+     * @param type
+     * @return
+     */
+    public Object parseMaterialPriceByLimit(BigDecimal price, String type, String emptyInfo, HttpServletRequest request) throws Exception {
+        Long userId = userService.getUserId(request);
+        String priceLimit = userService.getRoleTypeByUserId(userId).getPriceLimit();
+        if(StringUtil.isNotEmpty(priceLimit)) {
+            if("buy".equals(type) && priceLimit.contains("4")) {
+                return emptyInfo;
+            }
+            if("retail".equals(type) && priceLimit.contains("5")) {
+                return emptyInfo;
+            }
+            if("sale".equals(type) && priceLimit.contains("6")) {
+                return emptyInfo;
+            }
+        }
+        return price;
+    }
+
+    public String getCurrentPriceLimit(HttpServletRequest request) throws Exception {
+        Long userId = userService.getUserId(request);
+        return userService.getRoleTypeByUserId(userId).getPriceLimit();
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/sequence/SequenceComponent.java b/src/main/java/com/jsh/erp/service/sequence/SequenceComponent.java
new file mode 100644
index 0000000..85abd74
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/sequence/SequenceComponent.java
@@ -0,0 +1,74 @@
+package com.jsh.erp.service.sequence;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @Author: jishenghua
+ * @Date: 2021/3/16 16:33
+ */
+@Service(value = "sequence_component")
+@SequenceResource
+public class SequenceComponent implements ICommonQuery {
+    @Resource
+    private SequenceService sequenceService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return sequenceService.getSequence(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getSequenceList(map);
+    }
+
+    private List<?> getSequenceList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        return sequenceService.select(name,QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        return sequenceService.countSequence(name);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return sequenceService.insertSequence(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return sequenceService.updateSequence(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return sequenceService.deleteSequence(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return sequenceService.batchDeleteSequence(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name) throws Exception{
+        return sequenceService.checkIsNameExist(id, name);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/sequence/SequenceResource.java b/src/main/java/com/jsh/erp/service/sequence/SequenceResource.java
new file mode 100644
index 0000000..21e62c4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/sequence/SequenceResource.java
@@ -0,0 +1,18 @@
+package com.jsh.erp.service.sequence;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * Description
+ *
+ * @Author: jishenghua
+ * @Date: 2021/3/16 16:33
+ */
+@ResourceInfo(value = "sequence")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SequenceResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/sequence/SequenceService.java b/src/main/java/com/jsh/erp/service/sequence/SequenceService.java
new file mode 100644
index 0000000..fbfdb75
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/sequence/SequenceService.java
@@ -0,0 +1,100 @@
+package com.jsh.erp.service.sequence;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.*;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @Author: jishenghua
+ * @Date: 2021/3/16 16:33
+ */
+@Service
+public class SequenceService {
+    private Logger logger = LoggerFactory.getLogger(SequenceService.class);
+
+    @Resource
+    private SequenceMapperEx sequenceMapperEx;
+
+    public SerialNumber getSequence(long id)throws Exception {
+        return null;
+    }
+
+    public List<SerialNumberEx> select(String name, Integer offset, Integer rows)throws Exception {
+        return null;
+    }
+
+    public Long countSequence(String name)throws Exception {
+        return null;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertSequence(JSONObject obj, HttpServletRequest request)throws Exception {
+        return 0;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateSequence(JSONObject obj, HttpServletRequest request) throws Exception{
+        return 0;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteSequence(Long id, HttpServletRequest request)throws Exception {
+        return 0;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteSequence(String ids, HttpServletRequest request)throws Exception {
+        return 0;
+    }
+
+    public int checkIsNameExist(Long id, String serialNumber)throws Exception {
+        return 0;
+    }
+
+    /**
+     * 创建一个唯一的序列号
+     * */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public String buildOnlyNumber()throws Exception{
+        Long buildOnlyNumber=null;
+        synchronized (this){
+            try{
+                sequenceMapperEx.updateBuildOnlyNumber(); //编号+1
+                buildOnlyNumber= sequenceMapperEx.getBuildOnlyNumber(BusinessConstants.DEPOT_NUMBER_SEQ);
+            }catch(Exception e){
+                JshException.writeFail(logger, e);
+            }
+        }
+        if(buildOnlyNumber<BusinessConstants.SEQ_TO_STRING_MIN_LENGTH){
+            StringBuffer sb=new StringBuffer(buildOnlyNumber.toString());
+            int len=BusinessConstants.SEQ_TO_STRING_MIN_LENGTH.toString().length()-sb.length();
+            for(int i=0;i<len;i++){
+                sb.insert(0,BusinessConstants.SEQ_TO_STRING_LESS_INSERT);
+            }
+            return sb.toString();
+        }else{
+            return buildOnlyNumber.toString();
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java
new file mode 100644
index 0000000..e5ce5f9
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java
@@ -0,0 +1,78 @@
+package com.jsh.erp.service.serialNumber;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.material.MaterialResource;
+import com.jsh.erp.service.material.MaterialService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @Author: cjl
+ * @Date: 2019/1/21 16:33
+ */
+@Service(value = "serialNumber_component")
+@SerialNumberResource
+public class SerialNumberComponent implements ICommonQuery {
+    @Resource
+    private SerialNumberService serialNumberService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return serialNumberService.getSerialNumber(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getSerialNumberList(map);
+    }
+
+    private List<?> getSerialNumberList(Map<String, String> map) throws Exception{
+        String search = map.get(Constants.SEARCH);
+        String serialNumber = StringUtil.getInfo(search, "serialNumber");
+        String materialName = StringUtil.getInfo(search, "materialName");
+        return serialNumberService.select(serialNumber,materialName,QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String serialNumber = StringUtil.getInfo(search, "serialNumber");
+        String materialName = StringUtil.getInfo(search, "materialName");
+        return serialNumberService.countSerialNumber(serialNumber, materialName);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return serialNumberService.insertSerialNumber(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return serialNumberService.updateSerialNumber(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return serialNumberService.deleteSerialNumber(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return serialNumberService.batchDeleteSerialNumber(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String serialNumber) throws Exception{
+        return serialNumberService.checkIsNameExist(id, serialNumber);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java
new file mode 100644
index 0000000..210df41
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java
@@ -0,0 +1,18 @@
+package com.jsh.erp.service.serialNumber;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * Description
+ *
+ * @Author: jishenghua
+ * @Date: 2019/1/21 16:33
+ */
+@ResourceInfo(value = "serialNumber")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SerialNumberResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java
new file mode 100644
index 0000000..dc532b8
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java
@@ -0,0 +1,404 @@
+package com.jsh.erp.service.serialNumber;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.*;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.material.MaterialService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class SerialNumberService {
+    private Logger logger = LoggerFactory.getLogger(SerialNumberService.class);
+
+    @Resource
+    private SerialNumberMapper serialNumberMapper;
+    @Resource
+    private SerialNumberMapperEx serialNumberMapperEx;
+    @Resource
+    private MaterialMapperEx materialMapperEx;
+    @Resource
+    private MaterialService materialService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+
+
+    public SerialNumber getSerialNumber(long id)throws Exception {
+        SerialNumber result=null;
+        try{
+            result=serialNumberMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<SerialNumber> getSerialNumberListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<SerialNumber> list = new ArrayList<>();
+        try{
+            SerialNumberExample example = new SerialNumberExample();
+            example.createCriteria().andIdIn(idList);
+            list = serialNumberMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<SerialNumber> getSerialNumber()throws Exception {
+        SerialNumberExample example = new SerialNumberExample();
+        List<SerialNumber> list=null;
+        try{
+            list=serialNumberMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<SerialNumberEx> select(String serialNumber, String materialName, Integer offset, Integer rows)throws Exception {
+        return null;
+
+    }
+
+    public Long countSerialNumber(String serialNumber,String materialName)throws Exception {
+        return null;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertSerialNumber(JSONObject obj, HttpServletRequest request)throws Exception {
+        int result=0;
+        try{
+            SerialNumberEx serialNumberEx = JSONObject.parseObject(obj.toJSONString(), SerialNumberEx.class);
+            /**处理商品id*/
+            serialNumberEx.setMaterialId(getSerialNumberMaterialIdByBarCode(serialNumberEx.getMaterialCode()));
+            //删除标记,默认未删除
+            serialNumberEx.setDeleteFlag(BusinessConstants.DELETE_FLAG_EXISTS);
+            //已卖出,默认未否
+            serialNumberEx.setIsSell(BusinessConstants.IS_SELL_HOLD);
+            Date date=new Date();
+            serialNumberEx.setCreateTime(date);
+            serialNumberEx.setUpdateTime(date);
+            User userInfo=userService.getCurrentUser();
+            serialNumberEx.setCreator(userInfo==null?null:userInfo.getId());
+            serialNumberEx.setUpdater(userInfo==null?null:userInfo.getId());
+            result = serialNumberMapperEx.addSerialNumber(serialNumberEx);
+            logService.insertLog("序列号",BusinessConstants.LOG_OPERATION_TYPE_ADD,
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateSerialNumber(JSONObject obj, HttpServletRequest request) throws Exception{
+        SerialNumberEx serialNumberEx = JSONObject.parseObject(obj.toJSONString(), SerialNumberEx.class);
+        int result=0;
+        try{
+            serialNumberEx.setMaterialId(getSerialNumberMaterialIdByBarCode(serialNumberEx.getMaterialCode()));
+            Date date=new Date();
+            serialNumberEx.setUpdateTime(date);
+            User userInfo=userService.getCurrentUser();
+            serialNumberEx.setUpdater(userInfo==null?null:userInfo.getId());
+            result = serialNumberMapperEx.updateSerialNumber(serialNumberEx);
+            logService.insertLog("序列号",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(serialNumberEx.getId()).toString(),
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteSerialNumber(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteSerialNumberByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteSerialNumber(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteSerialNumberByIds(ids);
+    }
+
+    /**
+     *  逻辑删除序列号信息
+     * create time: 2019/3/27 17:43
+     * @Param: ids
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteSerialNumberByIds(String ids) throws Exception{
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<SerialNumber> list = getSerialNumberListByIds(ids);
+        for(SerialNumber serialNumber: list){
+            sb.append("[").append(serialNumber.getSerialNumber()).append("]");
+        }
+        logService.insertLog("序列号", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            result = serialNumberMapperEx.batchDeleteSerialNumberByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String serialNumber)throws Exception {
+        SerialNumberExample example = new SerialNumberExample();
+        example.createCriteria().andIdNotEqualTo(id).andSerialNumberEqualTo(serialNumber).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<SerialNumber> list=null;
+        try{
+            list=serialNumberMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    /**
+     *  根据商品名称判断商品名称是否有效
+     * @Param: materialName
+     * @return Long 满足使用条件的商品的id
+     */
+    public Long checkMaterialName(String materialName)throws Exception{
+        if(StringUtil.isNotEmpty(materialName)) {
+            List<Material> mlist=null;
+            try{
+                mlist = materialMapperEx.findByMaterialName(materialName);
+            }catch(Exception e){
+                JshException.readFail(logger, e);
+            }
+            if (mlist == null || mlist.size() < 1) {
+                //商品名称不存在
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_EXISTS_CODE,
+                        ExceptionConstants.MATERIAL_NOT_EXISTS_MSG);
+            }
+            if (mlist.size() > 1) {
+                //商品信息不唯一
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ONLY_CODE,
+                        ExceptionConstants.MATERIAL_NOT_ONLY_MSG);
+
+            }
+            //获得唯一商品
+            if (BusinessConstants.ENABLE_SERIAL_NUMBER_NOT_ENABLED.equals(mlist.get(0).getEnableSerialNumber())) {
+                //商品未开启序列号
+                throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ENABLE_SERIAL_NUMBER_CODE,
+                        ExceptionConstants.MATERIAL_NOT_ENABLE_SERIAL_NUMBER_MSG);
+            }
+            return mlist.get(0).getId();
+        }
+        return null;
+    }
+
+    /**
+     *  根据商品名称判断给商品添加序列号是否可行
+     *  1、根据商品名称必须查询到唯一的商品
+     *  2、该商品必须已经启用序列号
+     *  3、该商品已绑定序列号数量小于商品现有库存
+     *  用商品的库存去限制序列号的添加有点不合乎道理,去掉此限制
+     * @return Long 满足使用条件的商品的id
+     */
+    public Long getSerialNumberMaterialIdByBarCode(String materialCode)throws Exception{
+        if(StringUtil.isNotEmpty(materialCode)){
+            //计算商品库存和目前占用的可用序列号数量关系
+            //库存=入库-出库
+            //入库数量
+            Long materialId = 0L;
+            List<MaterialVo4Unit> list = materialService.getMaterialByBarCode(materialCode);
+            if(list!=null && list.size()>0) {
+                materialId = list.get(0).getId();
+            }
+            return materialId;
+        }
+        return null;
+    }
+
+    /**
+     * 出库时判断序列号库存是否足够,
+     * 同时将对应的序列号绑定单据
+     */
+    public void checkAndUpdateSerialNumber(DepotItem depotItem, String outBillNo,User userInfo, String snList) throws Exception{
+        if(depotItem!=null){
+            sellSerialNumber(depotItem.getMaterialId(), outBillNo, snList,userInfo);
+        }
+    }
+
+    /**
+     * 出售序列号
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void sellSerialNumber(Long materialId, String outBillNo, String snList, User user) throws Exception{
+        //将中文的逗号批量替换为英文逗号
+        snList = snList.replaceAll(",",",");
+        String [] snArray=snList.split(",");
+        for (String sn : snArray) {
+            int isNotSellCount = serialNumberMapperEx.getIsNotSellCountByParam(materialId, sn);
+            if (isNotSellCount == 0) {
+                //如果序列号不存在或者已售出则进行提示,不再进行后续的出售操作
+                throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_NOT_EXISTS_CODE,
+                        String.format(ExceptionConstants.SERIAL_NUMBERE_NOT_EXISTS_MSG, sn));
+            }
+        }
+        serialNumberMapperEx.sellSerialNumber(materialId, outBillNo, snArray, new Date(), user == null ? null : user.getId());
+    }
+
+    /**
+     * 赎回序列号
+     * @Param: materialId
+     * @Param: depotheadId
+     * @Param: isSell 赎回'0'
+     * @Param: Count 卖出或者赎回的数量
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int cancelSerialNumber(Long materialId, String outBillNo,int count,User user) throws Exception{
+        int result=0;
+        try{
+            result = serialNumberMapperEx.cancelSerialNumber(materialId,outBillNo,count,new Date(),user==null?null:user.getId());
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 批量添加序列号,最多500个
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batAddSerialNumber(String materialCode, String serialNumberPrefix, Integer batAddTotal, String remark)throws Exception {
+        int result=0;
+        try {
+            if (StringUtil.isNotEmpty(materialCode)) {
+                //查询商品id
+                Long materialId = getSerialNumberMaterialIdByBarCode(materialCode);
+                List<SerialNumberEx> list = null;
+                //当前用户
+                User userInfo = userService.getCurrentUser();
+                Long userId = userInfo == null ? null : userInfo.getId();
+                Date date = null;
+                Long million = null;
+                synchronized (this) {
+                    date = new Date();
+                    million = date.getTime();
+                }
+                int insertNum = 0;
+                StringBuffer prefixBuf = new StringBuffer(serialNumberPrefix).append(million);
+                list = new ArrayList<SerialNumberEx>();
+                int forNum = BusinessConstants.BATCH_INSERT_MAX_NUMBER >= batAddTotal ? batAddTotal : BusinessConstants.BATCH_INSERT_MAX_NUMBER;
+                for (int i = 0; i < forNum; i++) {
+                    insertNum++;
+                    SerialNumberEx each = new SerialNumberEx();
+                    each.setMaterialId(materialId);
+                    each.setCreator(userId);
+                    each.setCreateTime(date);
+                    each.setUpdater(userId);
+                    each.setUpdateTime(date);
+                    each.setRemark(remark);
+                    each.setSerialNumber(new StringBuffer(prefixBuf.toString()).append(insertNum).toString());
+                    list.add(each);
+                }
+                result = serialNumberMapperEx.batAddSerialNumber(list);
+                logService.insertLog("序列号",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_BATCH_ADD).append(batAddTotal).append(BusinessConstants.LOG_DATA_UNIT).toString(),
+                        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            }
+        } catch (Exception e) {
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<SerialNumberEx> getEnableSerialNumberList(String number, String name, Long depotId, String barCode, Integer offset, Integer rows)throws Exception {
+        List<SerialNumberEx> list =null;
+        try{
+            list = serialNumberMapperEx.getEnableSerialNumberList(StringUtil.toNull(number), StringUtil.toNull(name), depotId, barCode, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long getEnableSerialNumberCount(String number, String name, Long depotId, String barCode)throws Exception {
+        Long count = 0L;
+        try{
+            count = serialNumberMapperEx.getEnableSerialNumberCount(StringUtil.toNull(number), StringUtil.toNull(name), depotId, barCode);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return count;
+    }
+
+    public void addSerialNumberByBill(String type, String subType, String inBillNo, Long materialId, Long depotId, BigDecimal inPrice, String snList) throws Exception {
+        //录入序列号的时候不能和库里面的重复-入库
+        if ((BusinessConstants.SUB_TYPE_PURCHASE.equals(subType) ||
+                BusinessConstants.SUB_TYPE_OTHER.equals(subType) ||
+                BusinessConstants.SUB_TYPE_SALES_RETURN.equals(subType)||
+                BusinessConstants.SUB_TYPE_RETAIL_RETURN.equals(subType)) &&
+                BusinessConstants.DEPOTHEAD_TYPE_IN.equals(type)) {
+            //将中文的逗号批量替换为英文逗号
+            snList = snList.replaceAll(",", ",");
+            List<String> snArr = StringUtil.strToStringList(snList);
+            for (String sn : snArr) {
+                List<SerialNumber> list = new ArrayList<>();
+                SerialNumberExample example = new SerialNumberExample();
+                example.createCriteria().andMaterialIdEqualTo(materialId).andSerialNumberEqualTo(sn.trim()).andIsSellEqualTo("0")
+                        .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                list = serialNumberMapper.selectByExample(example);
+                //判断如果不存在重复序列号就新增
+                if (list == null || list.size() == 0) {
+                    SerialNumber serialNumber = new SerialNumber();
+                    serialNumber.setMaterialId(materialId);
+                    serialNumber.setDepotId(depotId);
+                    serialNumber.setSerialNumber(sn);
+                    serialNumber.setInPrice(inPrice);
+                    Date date = new Date();
+                    serialNumber.setCreateTime(date);
+                    serialNumber.setUpdateTime(date);
+                    User userInfo = userService.getCurrentUser();
+                    serialNumber.setCreator(userInfo == null ? null : userInfo.getId());
+                    serialNumber.setUpdater(userInfo == null ? null : userInfo.getId());
+                    serialNumber.setInBillNo(inBillNo);
+                    serialNumberMapper.insertSelective(serialNumber);
+                } else {
+                    if(!inBillNo.equals(list.get(0).getInBillNo())) {
+                        throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_CODE,
+                                String.format(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_MSG, sn));
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 直接删除序列号
+     * @param example
+     */
+    public void deleteByExample(SerialNumberExample example) {
+        serialNumberMapper.deleteByExample(example);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/supplier/SupplierComponent.java b/src/main/java/com/jsh/erp/service/supplier/SupplierComponent.java
new file mode 100644
index 0000000..506d49c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/supplier/SupplierComponent.java
@@ -0,0 +1,78 @@
+package com.jsh.erp.service.supplier;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.depot.DepotResource;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "supplier_component")
+@SupplierResource
+public class SupplierComponent implements ICommonQuery {
+
+    @Resource
+    private SupplierService supplierService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return supplierService.getSupplier(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getSupplierList(map);
+    }
+
+    private List<?> getSupplierList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String supplier = StringUtil.getInfo(search, "supplier");
+        String type = StringUtil.getInfo(search, "type");
+        String phonenum = StringUtil.getInfo(search, "phonenum");
+        String telephone = StringUtil.getInfo(search, "telephone");
+        return supplierService.select(supplier, type, phonenum, telephone, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String supplier = StringUtil.getInfo(search, "supplier");
+        String type = StringUtil.getInfo(search, "type");
+        String phonenum = StringUtil.getInfo(search, "phonenum");
+        String telephone = StringUtil.getInfo(search, "telephone");
+        return supplierService.countSupplier(supplier, type, phonenum, telephone);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return supplierService.insertSupplier(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return supplierService.updateSupplier(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return supplierService.deleteSupplier(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return supplierService.batchDeleteSupplier(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return supplierService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/supplier/SupplierResource.java b/src/main/java/com/jsh/erp/service/supplier/SupplierResource.java
new file mode 100644
index 0000000..c1cbe5d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/supplier/SupplierResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.supplier;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "supplier")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SupplierResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/supplier/SupplierService.java b/src/main/java/com/jsh/erp/service/supplier/SupplierService.java
new file mode 100644
index 0000000..f6b21ea
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/supplier/SupplierService.java
@@ -0,0 +1,682 @@
+package com.jsh.erp.service.supplier;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.*;
+import com.jsh.erp.datasource.vo.DepotHeadVo4StatementAccount;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.accountHead.AccountHeadService;
+import com.jsh.erp.service.depotHead.DepotHeadService;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.BaseResponseInfo;
+import com.jsh.erp.utils.ExcelUtils;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import jxl.Sheet;
+import jxl.Workbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+@Service
+public class SupplierService {
+    private Logger logger = LoggerFactory.getLogger(SupplierService.class);
+
+    @Resource
+    private SupplierMapper supplierMapper;
+
+    @Resource
+    private SupplierMapperEx supplierMapperEx;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private AccountHeadMapperEx accountHeadMapperEx;
+    @Resource
+    private DepotHeadMapperEx depotHeadMapperEx;
+    @Resource
+    private AccountItemMapperEx accountItemMapperEx;
+    @Resource
+    private DepotHeadService depotHeadService;
+    @Resource
+    private UserBusinessService userBusinessService;
+    @Resource
+    private UserBusinessMapper userBusinessMapper;
+
+    public Supplier getSupplier(long id)throws Exception {
+        Supplier result=null;
+        try{
+            result=supplierMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Supplier> getSupplierListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Supplier> list = new ArrayList<>();
+        try{
+            SupplierExample example = new SupplierExample();
+            example.createCriteria().andIdIn(idList);
+            list = supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Supplier> getSupplier()throws Exception {
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Supplier> list=null;
+        try{
+            list=supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Supplier> select(String supplier, String type, String phonenum, String telephone, int offset, int rows) throws Exception{
+        List<Supplier> resList = new ArrayList<Supplier>();
+        try{
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            List<Supplier> list = supplierMapperEx.selectByConditionSupplier(supplier, type, phonenum, telephone, creatorArray, offset, rows);
+            for(Supplier s : list) {
+                Integer supplierId = s.getId().intValue();
+                String beginTime = Tools.getYearBegin();
+                String endTime = Tools.getCenternTime(new Date());
+                BigDecimal sum = BigDecimal.ZERO;
+                String supplierType = type;
+                String inOutType = "";
+                String subType = "";
+                String typeBack = "";
+                String subTypeBack = "";
+                String billType = "";
+                if (("供应商").equals(supplierType)) {
+                    inOutType = "入库";
+                    subType = "采购";
+                    typeBack = "出库";
+                    subTypeBack = "采购退货";
+                    billType = "付款";
+                } else if (("客户").equals(supplierType)) {
+                    inOutType = "出库";
+                    subType = "销售";
+                    typeBack = "入库";
+                    subTypeBack = "销售退货";
+                    billType = "收款";
+                }
+                List<DepotHeadVo4StatementAccount> saList = depotHeadService.getStatementAccount(beginTime, endTime, supplierId, null,
+                        1, supplierType, inOutType, subType, typeBack, subTypeBack, billType, null, null);
+                if(saList.size()>0) {
+                    DepotHeadVo4StatementAccount item = saList.get(0);
+                    //期初 = 起始期初金额+上期欠款金额-上期退货的欠款金额-上期收付款
+                    BigDecimal preNeed = item.getBeginNeed().add(item.getPreDebtMoney()).subtract(item.getPreReturnDebtMoney()).subtract(item.getPreBackMoney());
+                    item.setPreNeed(preNeed);
+                    //实际欠款 = 本期欠款-本期退货的欠款金额
+                    BigDecimal realDebtMoney = item.getDebtMoney().subtract(item.getReturnDebtMoney());
+                    item.setDebtMoney(realDebtMoney);
+                    //期末 = 期初+实际欠款-本期收款
+                    BigDecimal allNeedGet = preNeed.add(realDebtMoney).subtract(item.getBackMoney());
+                    sum = sum.add(allNeedGet);
+                }
+                if(("客户").equals(s.getType())) {
+                    s.setAllNeedGet(sum);
+                } else if(("供应商").equals(s.getType())) {
+                    s.setAllNeedPay(sum);
+                }
+                resList.add(s);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return resList;
+    }
+
+    public Long countSupplier(String supplier, String type, String phonenum, String telephone) throws Exception{
+        Long result=null;
+        try{
+            String [] creatorArray = depotHeadService.getCreatorArray();
+            result=supplierMapperEx.countsBySupplier(supplier, type, phonenum, telephone, creatorArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertSupplier(JSONObject obj, HttpServletRequest request)throws Exception {
+        Supplier supplier = JSONObject.parseObject(obj.toJSONString(), Supplier.class);
+        int result=0;
+        try{
+            supplier.setEnabled(true);
+            User userInfo=userService.getCurrentUser();
+            supplier.setCreator(userInfo==null?null:userInfo.getId());
+            result=supplierMapper.insertSelective(supplier);
+            //新增客户时给当前用户自动授权
+            setUserCustomerPermission(request, supplier);
+            logService.insertLog("商家",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(supplier.getSupplier()).toString(),request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateSupplier(JSONObject obj, HttpServletRequest request)throws Exception {
+        Supplier supplier = JSONObject.parseObject(obj.toJSONString(), Supplier.class);
+        if(supplier.getBeginNeedPay() == null) {
+            supplier.setBeginNeedPay(BigDecimal.ZERO);
+        }
+        if(supplier.getBeginNeedGet() == null) {
+            supplier.setBeginNeedGet(BigDecimal.ZERO);
+        }
+        int result=0;
+        try{
+            result=supplierMapper.updateByPrimaryKeySelective(supplier);
+            logService.insertLog("商家",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(supplier.getSupplier()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteSupplier(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteSupplierByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteSupplier(String ids, HttpServletRequest request) throws Exception{
+        return batchDeleteSupplierByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteSupplierByIds(String ids)throws Exception {
+        int result=0;
+        String [] idArray=ids.split(",");
+        //校验财务主表	jsh_accounthead
+        List<AccountHead> accountHeadList=null;
+        try{
+            accountHeadList = accountHeadMapperEx.getAccountHeadListByOrganIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(accountHeadList!=null&&accountHeadList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,OrganIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //校验单据主表	jsh_depot_head
+        List<DepotHead> depotHeadList=null;
+        try{
+            depotHeadList = depotHeadMapperEx.getDepotHeadListByOrganIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(depotHeadList!=null&&depotHeadList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,OrganIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //记录日志
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<Supplier> list = getSupplierListByIds(ids);
+        for(Supplier supplier: list){
+            sb.append("[").append(supplier.getSupplier()).append("]");
+        }
+        logService.insertLog("商家", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        //校验通过执行删除操作
+        try{
+            result = supplierMapperEx.batchDeleteSupplierByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andIdNotEqualTo(id).andSupplierEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Supplier> list=null;
+        try{
+            list= supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public int checkIsNameAndTypeExist(Long id, String name, String type)throws Exception {
+        name = name == null? "": name;
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andIdNotEqualTo(id).andSupplierEqualTo(name).andTypeEqualTo(type)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Supplier> list=null;
+        try{
+            list= supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    /**
+     * 更新会员的预付款
+     * @param supplierId
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateAdvanceIn(Long supplierId) {
+        try{
+            //查询会员在收预付款单据的总金额
+            BigDecimal financialAllPrice = accountHeadMapperEx.getFinancialAllPriceByOrganId(supplierId);
+            //查询会员在零售出库单据的总金额
+            BigDecimal billAllPrice = depotHeadMapperEx.getBillAllPriceByOrganId(supplierId);
+            Supplier supplier = new Supplier();
+            supplier.setId(supplierId);
+            supplier.setAdvanceIn(financialAllPrice.subtract(billAllPrice));
+            supplierMapper.updateByPrimaryKeySelective(supplier);
+        } catch (Exception e){
+            JshException.writeFail(logger, e);
+        }
+    }
+
+    public List<Supplier> findBySelectCus()throws Exception {
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andTypeLike("客户").andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Supplier> list=null;
+        try{
+            list = supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Supplier> findBySelectSup()throws Exception {
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andTypeLike("供应商").andEnabledEqualTo(true)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Supplier> list=null;
+        try{
+            list = supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Supplier> findBySelectRetail()throws Exception {
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andTypeLike("会员").andEnabledEqualTo(true)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Supplier> list=null;
+        try{
+            list = supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Supplier> findById(Long supplierId)throws Exception {
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andIdEqualTo(supplierId)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Supplier> list=null;
+        try{
+            list = supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("商家",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ENABLED).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> supplierIds = StringUtil.strToLongList(ids);
+        Supplier supplier = new Supplier();
+        supplier.setEnabled(status);
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andIdIn(supplierIds);
+        int result=0;
+        try{
+            result = supplierMapper.updateByExampleSelective(supplier, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Supplier> findUserCustomer()throws Exception{
+        SupplierExample example = new SupplierExample();
+        example.createCriteria().andTypeEqualTo("客户")
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        example.setOrderByClause("sort asc, id desc");
+        List<Supplier> list=null;
+        try{
+            list = supplierMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Supplier> findByAll(String supplier, String type, String phonenum, String telephone) throws Exception{
+        List<Supplier> list=null;
+        try{
+            list = supplierMapperEx.findByAll(supplier, type, phonenum, telephone);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Map<String, Object> getBeginNeedByOrganId(Long organId) throws Exception {
+        Supplier supplier = getSupplier(organId);
+        Map<String, Object> map = new HashMap<>();
+        BigDecimal needDebt = BigDecimal.ZERO;
+        if("供应商".equals(supplier.getType())) {
+            needDebt = supplier.getBeginNeedPay();
+        } else if("客户".equals(supplier.getType())) {
+            needDebt = supplier.getBeginNeedGet();
+        }
+        BigDecimal finishDebt = accountItemMapperEx.getFinishDebtByOrganId(organId).abs();
+        BigDecimal eachAmount = BigDecimal.ZERO;
+        if(needDebt != null) {
+            eachAmount = needDebt.subtract(finishDebt);
+        }
+        //应收欠款
+        map.put("needDebt", needDebt);
+        //已收欠款
+        map.put("finishDebt", finishDebt);
+        //本次收款
+        map.put("eachAmount", eachAmount);
+        return map;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void importVendor(MultipartFile file, HttpServletRequest request) throws Exception{
+        String type = "供应商";
+        User userInfo = userService.getCurrentUser();
+        Workbook workbook = Workbook.getWorkbook(file.getInputStream());
+        Sheet src = workbook.getSheet(0);
+        //'名称', '联系人', '手机号码', '联系电话', '电子邮箱', '传真', '期初应付', '纳税人识别号', '税率(%)', '开户行', '账号', '地址', '备注', '排序', '状态'
+        List<Supplier> sList = new ArrayList<>();
+        for (int i = 2; i < src.getRows(); i++) {
+            String supplierName = ExcelUtils.getContent(src, i, 0);
+            String enabled = ExcelUtils.getContent(src, i, 14);
+            if(StringUtil.isNotEmpty(supplierName) && StringUtil.isNotEmpty(enabled)) {
+                Supplier s = new Supplier();
+                s.setType(type);
+                s.setSupplier(supplierName);
+                s.setContacts(ExcelUtils.getContent(src, i, 1));
+                s.setTelephone(ExcelUtils.getContent(src, i, 2));
+                s.setPhoneNum(ExcelUtils.getContent(src, i, 3));
+                s.setEmail(ExcelUtils.getContent(src, i, 4));
+                s.setFax(ExcelUtils.getContent(src, i, 5));
+                s.setBeginNeedPay(parseBigDecimalEx(ExcelUtils.getContent(src, i, 6)));
+                s.setTaxNum(ExcelUtils.getContent(src, i, 7));
+                s.setTaxRate(parseBigDecimalEx(ExcelUtils.getContent(src, i, 8)));
+                s.setBankName(ExcelUtils.getContent(src, i, 9));
+                s.setAccountNumber(ExcelUtils.getContent(src, i, 10));
+                s.setAddress(ExcelUtils.getContent(src, i, 11));
+                s.setDescription(ExcelUtils.getContent(src, i, 12));
+                s.setSort(ExcelUtils.getContent(src, i, 13));
+                s.setCreator(userInfo==null?null:userInfo.getId());
+                s.setEnabled("1".equals(enabled));
+                sList.add(s);
+            }
+        }
+        importExcel(sList, type, request);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void importCustomer(MultipartFile file, HttpServletRequest request) throws Exception{
+        String type = "客户";
+        User userInfo = userService.getCurrentUser();
+        Workbook workbook = Workbook.getWorkbook(file.getInputStream());
+        Sheet src = workbook.getSheet(0);
+        //'名称', '联系人', '手机号码', '联系电话', '电子邮箱', '传真', '期初应收', '纳税人识别号', '税率(%)', '开户行', '账号', '地址', '备注', '排序', '状态'
+        List<Supplier> sList = new ArrayList<>();
+        for (int i = 2; i < src.getRows(); i++) {
+            String supplierName = ExcelUtils.getContent(src, i, 0);
+            String enabled = ExcelUtils.getContent(src, i, 14);
+            if(StringUtil.isNotEmpty(supplierName) && StringUtil.isNotEmpty(enabled)) {
+                Supplier s = new Supplier();
+                s.setType(type);
+                s.setSupplier(supplierName);
+                s.setContacts(ExcelUtils.getContent(src, i, 1));
+                s.setTelephone(ExcelUtils.getContent(src, i, 2));
+                s.setPhoneNum(ExcelUtils.getContent(src, i, 3));
+                s.setEmail(ExcelUtils.getContent(src, i, 4));
+                s.setFax(ExcelUtils.getContent(src, i, 5));
+                s.setBeginNeedGet(parseBigDecimalEx(ExcelUtils.getContent(src, i, 6)));
+                s.setTaxNum(ExcelUtils.getContent(src, i, 7));
+                s.setTaxRate(parseBigDecimalEx(ExcelUtils.getContent(src, i, 8)));
+                s.setBankName(ExcelUtils.getContent(src, i, 9));
+                s.setAccountNumber(ExcelUtils.getContent(src, i, 10));
+                s.setAddress(ExcelUtils.getContent(src, i, 11));
+                s.setDescription(ExcelUtils.getContent(src, i, 12));
+                s.setSort(ExcelUtils.getContent(src, i, 13));
+                s.setCreator(userInfo==null?null:userInfo.getId());
+                s.setEnabled("1".equals(enabled));
+                sList.add(s);
+            }
+        }
+        importExcel(sList, type, request);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void importMember(MultipartFile file, HttpServletRequest request) throws Exception{
+        String type = "会员";
+        User userInfo = userService.getCurrentUser();
+        Workbook workbook = Workbook.getWorkbook(file.getInputStream());
+        Sheet src = workbook.getSheet(0);
+        //'名称', '联系人', '手机号码', '联系电话', '电子邮箱', '备注', '排序', '状态'
+        List<Supplier> sList = new ArrayList<>();
+        for (int i = 2; i < src.getRows(); i++) {
+            String supplierName = ExcelUtils.getContent(src, i, 0);
+            String enabled = ExcelUtils.getContent(src, i, 7);
+            if(StringUtil.isNotEmpty(supplierName) && StringUtil.isNotEmpty(enabled)) {
+                Supplier s = new Supplier();
+                s.setType(type);
+                s.setSupplier(supplierName);
+                s.setContacts(ExcelUtils.getContent(src, i, 1));
+                s.setTelephone(ExcelUtils.getContent(src, i, 2));
+                s.setPhoneNum(ExcelUtils.getContent(src, i, 3));
+                s.setEmail(ExcelUtils.getContent(src, i, 4));
+                s.setDescription(ExcelUtils.getContent(src, i, 5));
+                s.setSort(ExcelUtils.getContent(src, i, 6));
+                s.setCreator(userInfo==null?null:userInfo.getId());
+                s.setEnabled("1".equals(enabled));
+                sList.add(s);
+            }
+        }
+        importExcel(sList, type, request);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public BaseResponseInfo importExcel(List<Supplier> mList, String type, HttpServletRequest request) throws Exception {
+        logService.insertLog(type,
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_IMPORT).append(mList.size()).append(BusinessConstants.LOG_DATA_UNIT).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        BaseResponseInfo info = new BaseResponseInfo();
+        Map<String, Object> data = new HashMap<>();
+        try {
+            for(Supplier supplier: mList) {
+                SupplierExample example = new SupplierExample();
+                example.createCriteria().andSupplierEqualTo(supplier.getSupplier()).andTypeEqualTo(type).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                List<Supplier> list= supplierMapper.selectByExample(example);
+                if(list.size() <= 0) {
+                    supplierMapper.insertSelective(supplier);
+                    //新增客户时给当前用户自动授权
+                    setUserCustomerPermission(request, supplier);
+                } else {
+                    Long id = list.get(0).getId();
+                    supplier.setId(id);
+                    supplierMapper.updateByPrimaryKeySelective(supplier);
+                }
+            }
+            info.code = 200;
+            data.put("message", "成功");
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            info.code = 500;
+            data.put("message", e.getMessage());
+        }
+        info.data = data;
+        return info;
+    }
+
+    public BigDecimal parseBigDecimalEx(String str)throws Exception{
+        if(!StringUtil.isEmpty(str)) {
+            return new BigDecimal(str);
+        } else {
+            return null;
+        }
+    }
+
+    public File exportExcel(List<Supplier> dataList, String type) throws Exception {
+        if("供应商".equals(type)) {
+            return exportExcelVendorOrCustomer(dataList, type);
+        } else if("客户".equals(type)) {
+            return exportExcelVendorOrCustomer(dataList, type);
+        } else {
+            //会员
+            String[] names = {"会员卡号*", "联系人", "手机号码", "联系电话", "电子邮箱", "备注", "排序", "状态*"};
+            String title = "信息内容";
+            List<String[]> objects = new ArrayList<String[]>();
+            if (null != dataList) {
+                for (Supplier s : dataList) {
+                    String[] objs = new String[names.length];
+                    objs[0] = s.getSupplier();
+                    objs[1] = s.getContacts();
+                    objs[2] = s.getTelephone();
+                    objs[3] = s.getPhoneNum();
+                    objs[4] = s.getEmail();
+                    objs[5] = s.getDescription();
+                    objs[6] = s.getSort();
+                    objs[7] = s.getEnabled() ? "1" : "0";
+                    objects.add(objs);
+                }
+            }
+            return ExcelUtils.exportObjectsOneSheet(title, "*导入时本行内容请勿删除,切记!", names, title, objects);
+        }
+    }
+
+    private File exportExcelVendorOrCustomer(List<Supplier> dataList, String type) throws Exception {
+        String beginNeedStr = "";
+        if("供应商".equals(type)) {
+            beginNeedStr = "期初应付";
+        } else if("客户".equals(type)) {
+            beginNeedStr = "期初应收";
+        }
+        String[] names = {"名称*", "联系人", "手机号码", "联系电话", "电子邮箱", "传真", beginNeedStr,
+                "纳税人识别号", "税率(%)", "开户行", "账号", "地址", "备注", "排序", "状态*"};
+        String title = "信息内容";
+        List<String[]> objects = new ArrayList<String[]>();
+        if (null != dataList) {
+            for (Supplier s : dataList) {
+                String[] objs = new String[names.length];
+                objs[0] = s.getSupplier();
+                objs[1] = s.getContacts();
+                objs[2] = s.getTelephone();
+                objs[3] = s.getPhoneNum();
+                objs[4] = s.getEmail();
+                objs[5] = s.getFax();
+                if(("客户").equals(s.getType())) {
+                    objs[6] = s.getBeginNeedGet() == null? "" : s.getBeginNeedGet().setScale(2,BigDecimal.ROUND_HALF_UP).toString();
+                } else if(("供应商").equals(s.getType())) {
+                    objs[6] = s.getBeginNeedPay() == null? "" : s.getBeginNeedPay().setScale(2,BigDecimal.ROUND_HALF_UP).toString();
+                }
+                objs[7] = s.getTaxNum();
+                objs[8] = s.getTaxRate() == null? "" : s.getTaxRate().setScale(2,BigDecimal.ROUND_HALF_UP).toString();
+                objs[9] = s.getBankName();
+                objs[10] = s.getAccountNumber();
+                objs[11] = s.getAddress();
+                objs[12] = s.getDescription();
+                objs[13] = s.getSort();
+                objs[14] = s.getEnabled() ? "1" : "0";
+                objects.add(objs);
+            }
+        }
+        return ExcelUtils.exportObjectsOneSheet(title, "*导入时本行内容请勿删除,切记!", names, title, objects);
+    }
+
+    /**
+     * 新增客户时给当前用户自动授权
+     * @param request
+     * @param supplier
+     * @throws Exception
+     */
+    private void setUserCustomerPermission(HttpServletRequest request, Supplier supplier) throws Exception {
+        if("客户".equals(supplier.getType())) {
+            Long userId = userService.getUserId(request);
+            Supplier sInfo = supplierMapperEx.getSupplierByNameAndType(supplier.getSupplier(), supplier.getType());
+            String ubKey = "[" + sInfo.getId() + "]";
+            List<UserBusiness> ubList = userBusinessService.getBasicData(userId.toString(), "UserCustomer");
+            if(ubList ==null || ubList.size() == 0) {
+                JSONObject ubObj = new JSONObject();
+                ubObj.put("type", "UserCustomer");
+                ubObj.put("keyId", userId);
+                ubObj.put("value", ubKey);
+                UserBusiness userBusiness = JSONObject.parseObject(ubObj.toJSONString(), UserBusiness.class);
+                userBusinessMapper.insertSelective(userBusiness);
+            } else {
+                UserBusiness ubInfo = ubList.get(0);
+                JSONObject ubObj = new JSONObject();
+                ubObj.put("id", ubInfo.getId());
+                ubObj.put("type", ubInfo.getType());
+                ubObj.put("keyId", ubInfo.getKeyId());
+                ubObj.put("value", ubInfo.getValue() + ubKey);
+                UserBusiness userBusiness = JSONObject.parseObject(ubObj.toJSONString(), UserBusiness.class);
+                userBusinessMapper.updateByPrimaryKeySelective(userBusiness);
+            }
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetAdvanceIn(String ids) throws Exception {
+        int res = 0;
+        List<Long> idList = StringUtil.strToLongList(ids);
+        for(Long sId: idList) {
+            updateAdvanceIn(sId);
+            res = 1;
+        }
+        return res;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigComponent.java b/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigComponent.java
new file mode 100644
index 0000000..c695d83
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigComponent.java
@@ -0,0 +1,73 @@
+package com.jsh.erp.service.systemConfig;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.systemConfig.SystemConfigResource;
+import com.jsh.erp.service.systemConfig.SystemConfigService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "systemConfig_component")
+@SystemConfigResource
+public class SystemConfigComponent implements ICommonQuery {
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return systemConfigService.getSystemConfig(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getSystemConfigList(map);
+    }
+
+    private List<?> getSystemConfigList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String companyName = StringUtil.getInfo(search, "companyName");
+        String order = QueryUtils.order(map);
+        return systemConfigService.select(companyName, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String companyName = StringUtil.getInfo(search, "companyName");
+        return systemConfigService.countSystemConfig(companyName);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return systemConfigService.insertSystemConfig(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return systemConfigService.updateSystemConfig(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return systemConfigService.deleteSystemConfig(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return systemConfigService.batchDeleteSystemConfig(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return systemConfigService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigResource.java b/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigResource.java
new file mode 100644
index 0000000..ac5f6a4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.systemConfig;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "systemConfig")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SystemConfigResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigService.java b/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigService.java
new file mode 100644
index 0000000..7ec3edb
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/systemConfig/SystemConfigService.java
@@ -0,0 +1,666 @@
+package com.jsh.erp.service.systemConfig;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.oss.ClientException;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.OSSException;
+import com.aliyun.oss.model.CopyObjectResult;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.SystemConfig;
+import com.jsh.erp.datasource.entities.SystemConfigExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.SystemConfigMapper;
+import com.jsh.erp.datasource.mappers.SystemConfigMapperEx;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.platformConfig.PlatformConfigService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.ExcelUtils;
+import com.jsh.erp.utils.FileUtils;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.imageio.stream.ImageOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.file.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class SystemConfigService {
+    private Logger logger = LoggerFactory.getLogger(SystemConfigService.class);
+
+    @Resource
+    private SystemConfigMapper systemConfigMapper;
+    @Resource
+    private SystemConfigMapperEx systemConfigMapperEx;
+    @Resource
+    private PlatformConfigService platformConfigService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+
+    @Value(value="${file.uploadType}")
+    private Long fileUploadType;
+
+    @Value(value="${file.path}")
+    private String filePath;
+
+    private static String DELETED = "deleted";
+
+    public SystemConfig getSystemConfig(long id)throws Exception {
+        SystemConfig result=null;
+        try{
+            result=systemConfigMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<SystemConfig> getSystemConfig()throws Exception {
+        SystemConfigExample example = new SystemConfigExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<SystemConfig> list=null;
+        try{
+            list=systemConfigMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+    public List<SystemConfig> select(String companyName, int offset, int rows)throws Exception {
+        List<SystemConfig> list=null;
+        try{
+            list=systemConfigMapperEx.selectByConditionSystemConfig(companyName, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countSystemConfig(String companyName)throws Exception {
+        Long result=null;
+        try{
+            result=systemConfigMapperEx.countsBySystemConfig(companyName);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertSystemConfig(JSONObject obj, HttpServletRequest request) throws Exception{
+        SystemConfig systemConfig = JSONObject.parseObject(obj.toJSONString(), SystemConfig.class);
+        int result=0;
+        try{
+            result=systemConfigMapper.insertSelective(systemConfig);
+            String logInfo = StringUtil.isNotEmpty(systemConfig.getCompanyName())?systemConfig.getCompanyName():"配置信息";
+            logService.insertLogWithUserId(userService.getCurrentUser().getId(), userService.getCurrentUser().getTenantId(), "系统配置",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(logInfo).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateSystemConfig(JSONObject obj, HttpServletRequest request) throws Exception{
+        SystemConfig systemConfig = JSONObject.parseObject(obj.toJSONString(), SystemConfig.class);
+        int result=0;
+        try{
+            result = systemConfigMapper.updateByPrimaryKeySelective(systemConfig);
+            String logInfo = StringUtil.isNotEmpty(systemConfig.getCompanyName())?systemConfig.getCompanyName():"配置信息";
+            logService.insertLogWithUserId(userService.getCurrentUser().getId(), userService.getCurrentUser().getTenantId(), "系统配置",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(logInfo).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteSystemConfig(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteSystemConfigByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteSystemConfig(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteSystemConfigByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteSystemConfigByIds(String ids)throws Exception {
+        logService.insertLog("系统配置",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(ids).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            result = systemConfigMapperEx.batchDeleteSystemConfigByIds(new Date(), userInfo == null ? null : userInfo.getId(), idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name) throws Exception{
+        SystemConfigExample example = new SystemConfigExample();
+        example.createCriteria().andIdNotEqualTo(id).andCompanyNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<SystemConfig> list =null;
+        try{
+            list=systemConfigMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    /**
+     * 本地文件上传
+     * @param mf 文件
+     * @param bizPath  自定义路径
+     * @return
+     */
+    public String uploadLocal(MultipartFile mf, String bizPath, HttpServletRequest request) throws Exception {
+        try {
+            if(StringUtil.isEmpty(bizPath)){
+                bizPath = "";
+            }
+            // Validate bizPath to prevent directory traversal
+            if (bizPath.contains("..") || bizPath.contains("/")) {
+                throw new IllegalArgumentException("Invalid bizPath");
+            }
+            String token = request.getHeader("X-Access-Token");
+            Long tenantId = Tools.getTenantIdByToken(token);
+            bizPath = bizPath + File.separator + tenantId;
+            String ctxPath = filePath;
+            String fileName = null;
+            File file = new File(ctxPath + File.separator + bizPath + File.separator );
+            if (!file.exists()) {
+                file.mkdirs();// 创建文件根目录
+            }
+            String orgName = mf.getOriginalFilename();// 获取文件名
+            orgName = FileUtils.getFileName(orgName);
+
+            // Validate file extension to allow only specific types
+            String[] allowedExtensions = {".gif", ".jpg", ".jpeg", ".png", ".pdf", ".txt",".doc",".docx",".xls",".xlsx",
+                    ".ppt",".pptx",".zip",".rar",".mp3",".mp4",".avi"};
+            boolean isValidExtension = false;
+            for (String ext : allowedExtensions) {
+                if (orgName.toLowerCase().endsWith(ext)) {
+                    isValidExtension = true;
+                    break;
+                }
+            }
+            if (!isValidExtension) {
+                throw new IllegalArgumentException("Invalid file type");
+            }
+
+            if(orgName.contains(".")){
+                fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
+            }else{
+                fileName = orgName+ "_" + System.currentTimeMillis();
+            }
+            String savePath = file.getPath() + File.separator + fileName;
+            File savefile = new File(savePath);
+            FileCopyUtils.copy(mf.getBytes(), savefile);
+
+            // 返回路径
+            String dbpath = null;
+            if(StringUtil.isNotEmpty(bizPath)){
+                dbpath = bizPath + File.separator + fileName;
+            }else{
+                dbpath = fileName;
+            }
+            if (dbpath.contains("\\")) {
+                dbpath = dbpath.replace("\\", "/");
+            }
+            return dbpath;
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+        }
+        return "";
+    }
+
+    /**
+     * 阿里Oss文件上传
+     * @param mf 文件
+     * @param bizPath  自定义路径
+     * @return
+     */
+    public String uploadAliOss(MultipartFile mf, String bizPath, HttpServletRequest request) throws Exception {
+        if(StringUtil.isEmpty(bizPath)){
+            bizPath = "";
+        }
+        // Validate bizPath to prevent directory traversal
+        if (bizPath.contains("..") || bizPath.contains("/")) {
+            throw new IllegalArgumentException("Invalid bizPath");
+        }
+        String token = request.getHeader("X-Access-Token");
+        Long tenantId = Tools.getTenantIdByToken(token);
+        bizPath = bizPath + "/" + tenantId;
+        String endpoint = platformConfigService.getPlatformConfigByKey("aliOss_endpoint").getPlatformValue();
+        String accessKeyId = platformConfigService.getPlatformConfigByKey("aliOss_accessKeyId").getPlatformValue();
+        String accessKeySecret = platformConfigService.getPlatformConfigByKey("aliOss_accessKeySecret").getPlatformValue();
+        String bucketName = platformConfigService.getPlatformConfigByKey("aliOss_bucketName").getPlatformValue();
+        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
+        String fileName = "";
+        String orgName = mf.getOriginalFilename();// 获取文件名
+        orgName = FileUtils.getFileName(orgName);
+
+        // Validate file extension to allow only specific types
+        String[] allowedExtensions = {".gif", ".jpg", ".jpeg", ".png", ".pdf", ".txt",".doc",".docx",".xls",".xlsx",
+                ".ppt",".pptx",".zip",".rar",".mp3",".mp4",".avi"};
+        boolean isValidExtension = false;
+        for (String ext : allowedExtensions) {
+            if (orgName.toLowerCase().endsWith(ext)) {
+                isValidExtension = true;
+                break;
+            }
+        }
+        if (!isValidExtension) {
+            throw new IllegalArgumentException("Invalid file type");
+        }
+
+        if(orgName.contains(".")){
+            fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
+        }else{
+            fileName = orgName+ "_" + System.currentTimeMillis();
+        }
+        String filePathStr = StringUtil.isNotEmpty(filePath)? filePath.substring(1):"";
+        String objectName = filePathStr + "/" + bizPath + "/" + fileName;
+        String smallObjectName = filePathStr + "-small/" + bizPath + "/" + fileName;
+        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
+        byte [] byteArr = mf.getBytes();
+
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+
+        try {
+            // 保存原文件
+            InputStream inputStream = new ByteArrayInputStream(byteArr);
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
+            ossClient.putObject(putObjectRequest);
+            // 如果是图片-保存缩略图
+            int index = fileName.lastIndexOf(".");
+            String ext = fileName.substring(index + 1);
+            if(ext.contains("gif") || ext.contains("jpg") || ext.contains("jpeg") || ext.contains("png")
+                    || ext.contains("GIF") || ext.contains("JPG") || ext.contains("JPEG") || ext.contains("PNG")) {
+                String fileUrl = getFileUrlAliOss(bizPath + "/" + fileName);
+                URL url = new URL(fileUrl);
+                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+                conn.setRequestMethod("GET");
+                conn.setConnectTimeout(5 * 1000);
+                InputStream imgInputStream = conn.getInputStream();// 通过输入流获取图片数据
+                BufferedImage smallImage = getImageMini(imgInputStream, 80);
+                ByteArrayOutputStream bs = new ByteArrayOutputStream();
+                ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
+                ImageIO.write(smallImage, ext, imOut);
+                InputStream isImg = new ByteArrayInputStream(bs.toByteArray());
+                PutObjectRequest putSmallObjectRequest = new PutObjectRequest(bucketName, smallObjectName, isImg);
+                ossClient.putObject(putSmallObjectRequest);
+            }
+            // 返回路径
+            return bizPath + "/" + fileName;
+        } catch (OSSException oe) {
+            logger.error("Caught an OSSException, which means your request made it to OSS, "
+                    + "but was rejected with an error response for some reason.");
+            logger.error("Error Message:" + oe.getErrorMessage());
+            logger.error("Error Code:" + oe.getErrorCode());
+            logger.error("Request ID:" + oe.getRequestId());
+            logger.error("Host ID:" + oe.getHostId());
+        } catch (ClientException ce) {
+            logger.error("Caught an ClientException, which means the client encountered "
+                    + "a serious internal problem while trying to communicate with OSS, "
+                    + "such as not being able to access the network.");
+            System.out.println("Error Message:" + ce.getMessage());
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+        return "";
+    }
+
+    public String getFileUrlLocal(String imgPath) {
+        return filePath + File.separator + imgPath;
+    }
+
+    public String getFileUrlAliOss(String imgPath) throws Exception {
+        String linkUrl = platformConfigService.getPlatformConfigByKey("aliOss_linkUrl").getPlatformValue();
+        return linkUrl + filePath + "/" + imgPath;
+    }
+
+    /**
+     * 逻辑删除文件
+     * @param pathList
+     */
+    public void deleteFileByPathList(List<String> pathList) throws Exception {
+        if(fileUploadType == 1) {
+            //本地
+            for(String pathStr: pathList) {
+                if(StringUtil.isNotEmpty(pathStr)) {
+                    String[] pathArr = pathStr.split(",");
+                    for (String path : pathArr) {
+                        // 提取文件的路径
+                        String pathDir = getDirByPath(path);
+                        if (StringUtil.isNotEmpty(pathDir)) {
+                            // 源文件路径
+                            Path sourcePath = Paths.get(filePath + File.separator + path);
+                            // 目标文件路径(注意这里是新文件的完整路径,包括文件名)
+                            Path targetPath = Paths.get(filePath + File.separator + DELETED + File.separator + path);
+                            try {
+                                File file = new File(filePath + File.separator + DELETED + File.separator + pathDir);
+                                if (!file.exists()) {
+                                    file.mkdirs();// 创建文件根目录
+                                }
+                                // 复制文件,如果目标文件已存在则替换它
+                                Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
+                                // 删除源文件
+                                Files.delete(sourcePath);
+                                logger.info("File copied successfully.");
+                            } catch (NoSuchFileException e) {
+                                logger.error("Source file not found: " + e.getMessage());
+                            } catch (IOException e) {
+                                logger.error("An I/O error occurred: " + e.getMessage());
+                            } catch (SecurityException e) {
+                                logger.error("No permission to copy file: " + e.getMessage());
+                            }
+                        }
+                    }
+                }
+            }
+        } else if(fileUploadType == 2) {
+            //oss
+            String endpoint = platformConfigService.getPlatformConfigByKey("aliOss_endpoint").getPlatformValue();
+            String accessKeyId = platformConfigService.getPlatformConfigByKey("aliOss_accessKeyId").getPlatformValue();
+            String accessKeySecret = platformConfigService.getPlatformConfigByKey("aliOss_accessKeySecret").getPlatformValue();
+            String bucketName = platformConfigService.getPlatformConfigByKey("aliOss_bucketName").getPlatformValue();
+            for(String pathStr: pathList) {
+                if(StringUtil.isNotEmpty(pathStr)) {
+                    String[] pathArr = pathStr.split(",");
+                    for (String path : pathArr) {
+                        if(StringUtil.isNotEmpty(path)) {
+                            // 创建OSSClient实例。
+                            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+                            try {
+                                String filePathStr = StringUtil.isNotEmpty(filePath) ? filePath.substring(1) : "";
+                                String sourceObjectKey = filePathStr + "/" + path;
+                                String sourceSmallObjectKey = filePathStr + "-small/" + path;
+                                String destinationObjectKey = DELETED + "/list/" + sourceObjectKey;
+                                String destinationSmallObjectKey = DELETED + "/list/" + sourceSmallObjectKey;
+                                this.copySourceToDest(ossClient, bucketName, sourceObjectKey, destinationObjectKey);
+                                this.copySourceToDest(ossClient, bucketName, sourceSmallObjectKey, destinationSmallObjectKey);
+                            } catch (Exception e) {
+                                logger.error(e.getMessage());
+                            } finally {
+                                // 关闭OSSClient。
+                                if (ossClient != null) {
+                                    ossClient.shutdown();
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     *
+     * @param ossClient
+     * @param bucketName
+     * @param sourceObjectKey 源文件路径,包括目录和文件名
+     * @param destinationObjectKey 目标文件路径,包括新目录和文件名
+     */
+    public void copySourceToDest(OSS ossClient, String bucketName, String sourceObjectKey, String destinationObjectKey) {
+        // 复制文件
+        CopyObjectResult copyResult = ossClient.copyObject(bucketName, sourceObjectKey, bucketName, destinationObjectKey);
+        // 确认复制成功
+        if (copyResult != null && copyResult.getETag() != null) {
+            logger.info("文件复制成功,ETag: " + copyResult.getETag());
+            // 删除源文件
+            ossClient.deleteObject(bucketName, sourceObjectKey);
+            logger.info("源文件已删除:" + sourceObjectKey);
+        } else {
+            logger.info("文件复制失败");
+        }
+    }
+
+    public String getDirByPath(String path) {
+        if(path.lastIndexOf("/")>-1) {
+            return path.substring(0, path.lastIndexOf("/"));
+        } else {
+            return null;
+        }
+    }
+
+    public BufferedImage getImageMini(InputStream inputStream, int w) throws Exception {
+        BufferedImage img = ImageIO.read(inputStream);
+        //获取图片的长和宽
+        int width = img.getWidth();
+        int height = img.getHeight();
+        int tempw = 0;
+        int temph = 0;
+        if(width>height){
+            tempw = w;
+            temph = height* w/width;
+        }else{
+            tempw = w*width/height;
+            temph = w;
+        }
+        Image _img = img.getScaledInstance(tempw, temph, Image.SCALE_DEFAULT);
+        BufferedImage image = new BufferedImage(tempw, temph, BufferedImage.TYPE_INT_RGB);
+        Graphics2D graphics = image.createGraphics();
+        graphics.drawImage(_img, 0, 0, null);
+        graphics.dispose();
+        return image;
+    }
+
+    /**
+     * 获取仓库开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getDepotFlag() throws Exception {
+        boolean depotFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getDepotFlag();
+            if(("1").equals(flag)) {
+                depotFlag = true;
+            }
+        }
+        return depotFlag;
+    }
+
+    /**
+     * 获取客户开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getCustomerFlag() throws Exception {
+        boolean customerFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getCustomerFlag();
+            if(("1").equals(flag)) {
+                customerFlag = true;
+            }
+        }
+        return customerFlag;
+    }
+
+    /**
+     * 获取负库存开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getMinusStockFlag() throws Exception {
+        boolean minusStockFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getMinusStockFlag();
+            if(("1").equals(flag)) {
+                minusStockFlag = true;
+            }
+        }
+        return minusStockFlag;
+    }
+
+    /**
+     * 获取更新单价开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getUpdateUnitPriceFlag() throws Exception {
+        boolean updateUnitPriceFlag = true;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getUpdateUnitPriceFlag();
+            if(("0").equals(flag)) {
+                updateUnitPriceFlag = false;
+            }
+        }
+        return updateUnitPriceFlag;
+    }
+
+    /**
+     * 获取超出关联单据开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getOverLinkBillFlag() throws Exception {
+        boolean overLinkBillFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getOverLinkBillFlag();
+            if(("1").equals(flag)) {
+                overLinkBillFlag = true;
+            }
+        }
+        return overLinkBillFlag;
+    }
+
+    /**
+     * 获取强审核开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getForceApprovalFlag() throws Exception {
+        boolean forceApprovalFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getForceApprovalFlag();
+            if(("1").equals(flag)) {
+                forceApprovalFlag = true;
+            }
+        }
+        return forceApprovalFlag;
+    }
+
+    /**
+     * 获取多级审核开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getMultiLevelApprovalFlag() throws Exception {
+        boolean multiLevelApprovalFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getMultiLevelApprovalFlag();
+            if(("1").equals(flag)) {
+                multiLevelApprovalFlag = true;
+            }
+        }
+        return multiLevelApprovalFlag;
+    }
+
+    /**
+     * 获取出入库管理开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getInOutManageFlag() throws Exception {
+        boolean inOutManageFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getInOutManageFlag();
+            if(("1").equals(flag)) {
+                inOutManageFlag = true;
+            }
+        }
+        return inOutManageFlag;
+    }
+
+    /**
+     * 获取移动平均价开关
+     * @return
+     * @throws Exception
+     */
+    public boolean getMoveAvgPriceFlag() throws Exception {
+        boolean moveAvgPriceFlag = false;
+        List<SystemConfig> list = getSystemConfig();
+        if(list.size()>0) {
+            String flag = list.get(0).getMoveAvgPriceFlag();
+            if(("1").equals(flag)) {
+                moveAvgPriceFlag = true;
+            }
+        }
+        return moveAvgPriceFlag;
+    }
+
+    /**
+     * Excel导出统一方法
+     * @param title
+     * @param head
+     * @param tip
+     * @param arr
+     * @param response
+     * @throws Exception
+     */
+    public void exportExcelByParam(String title, String head, String tip, JSONArray arr, HttpServletResponse response) throws Exception {
+        List<String> nameList = StringUtil.strToStringList(head);
+        String[] names = StringUtil.listToStringArray(nameList);
+        List<String[]> objects = new ArrayList<>();
+        if (null != arr) {
+            for (Object object: arr) {
+                List<Object> list = (List<Object>) object;
+                String[] objs = new String[names.length];
+                for (int i = 0; i < list.size(); i++) {
+                    if(null != list.get(i)) {
+                        objs[i] = list.get(i).toString();
+                    }
+                }
+                objects.add(objs);
+            }
+        }
+        File file = ExcelUtils.exportObjectsOneSheet(title, tip, names, title, objects);
+        ExcelUtils.downloadExcel(file, file.getName(), response);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/service/tenant/TenantComponent.java b/src/main/java/com/jsh/erp/service/tenant/TenantComponent.java
new file mode 100644
index 0000000..470a65e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/tenant/TenantComponent.java
@@ -0,0 +1,78 @@
+package com.jsh.erp.service.tenant;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.user.UserResource;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "tenant_component")
+@TenantResource
+public class TenantComponent implements ICommonQuery {
+
+    @Resource
+    private TenantService tenantService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return tenantService.getTenant(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getTenantList(map);
+    }
+
+    private List<?> getTenantList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String loginName = StringUtil.getInfo(search, "loginName");
+        String type = StringUtil.getInfo(search, "type");
+        String enabled = StringUtil.getInfo(search, "enabled");
+        String remark = StringUtil.getInfo(search, "remark");
+        return tenantService.select(loginName, type, enabled, remark, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String loginName = StringUtil.getInfo(search, "loginName");
+        String type = StringUtil.getInfo(search, "type");
+        String enabled = StringUtil.getInfo(search, "enabled");
+        String remark = StringUtil.getInfo(search, "remark");
+        return tenantService.countTenant(loginName, type, enabled, remark);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return tenantService.insertTenant(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return tenantService.updateTenant(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return tenantService.deleteTenant(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return tenantService.batchDeleteTenant(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return tenantService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/tenant/TenantResource.java b/src/main/java/com/jsh/erp/service/tenant/TenantResource.java
new file mode 100644
index 0000000..159e4e4
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/tenant/TenantResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.tenant;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2019-6-27 22:56:56
+ */
+@ResourceInfo(value = "tenant")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TenantResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/tenant/TenantService.java b/src/main/java/com/jsh/erp/service/tenant/TenantService.java
new file mode 100644
index 0000000..a41c408
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/tenant/TenantService.java
@@ -0,0 +1,223 @@
+package com.jsh.erp.service.tenant;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.Tenant;
+import com.jsh.erp.datasource.entities.TenantEx;
+import com.jsh.erp.datasource.entities.TenantExample;
+import com.jsh.erp.datasource.entities.UserEx;
+import com.jsh.erp.datasource.mappers.TenantMapper;
+import com.jsh.erp.datasource.mappers.TenantMapperEx;
+import com.jsh.erp.datasource.mappers.UserBusinessMapperEx;
+import com.jsh.erp.datasource.mappers.UserMapperEx;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class TenantService {
+    private Logger logger = LoggerFactory.getLogger(TenantService.class);
+
+    @Resource
+    private TenantMapper tenantMapper;
+
+    @Resource
+    private TenantMapperEx tenantMapperEx;
+
+    @Resource
+    private UserMapperEx userMapperEx;
+
+    @Resource
+    private UserBusinessMapperEx userBusinessMapperEx;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private LogService logService;
+
+    @Value("${manage.roleId}")
+    private Integer manageRoleId;
+
+    public Tenant getTenant(long id)throws Exception {
+        Tenant result=null;
+        try{
+            result=tenantMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Tenant> getTenant()throws Exception {
+        TenantExample example = new TenantExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Tenant> list=null;
+        try{
+            list=tenantMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<TenantEx> select(String loginName, String type, String enabled, String remark, int offset, int rows)throws Exception {
+        List<TenantEx> list= new ArrayList<>();
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                list = tenantMapperEx.selectByConditionTenant(loginName, type, enabled, remark, offset, rows);
+                if (null != list) {
+                    for (TenantEx tenantEx : list) {
+                        tenantEx.setCreateTimeStr(Tools.getCenternTime(tenantEx.getCreateTime()));
+                        tenantEx.setExpireTimeStr(Tools.getCenternTime(tenantEx.getExpireTime()));
+                    }
+                }
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countTenant(String loginName, String type, String enabled, String remark)throws Exception {
+        Long result=null;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = tenantMapperEx.countsByTenant(loginName, type, enabled, remark);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertTenant(JSONObject obj, HttpServletRequest request)throws Exception {
+        UserEx ue = JSONObject.parseObject(obj.toJSONString(), UserEx.class);
+        int result = 0;
+        try{
+            ue.setUsername(ue.getLoginName());
+            userService.checkLoginName(ue); //检查登录名
+            userService.registerUser(ue,manageRoleId,request);
+            result = 1;
+        } catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateTenant(JSONObject obj, HttpServletRequest request)throws Exception {
+        Tenant tenant = JSONObject.parseObject(obj.toJSONString(), Tenant.class);
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                //如果租户下的用户限制数量为1,则将该租户之外的用户全部禁用
+                if (1 == tenant.getUserNumLimit()) {
+                    userMapperEx.disableUserByLimit(tenant.getTenantId());
+                }
+                result = tenantMapper.updateByPrimaryKeySelective(tenant);
+                //更新租户对应的角色
+                if(obj.get("roleId")!=null) {
+                    String ubValue = "[" + obj.getString("roleId") + "]";
+                    userBusinessMapperEx.updateValueByTypeAndKeyId("UserRole", tenant.getTenantId().toString(), ubValue);
+                }
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteTenant(Long id, HttpServletRequest request)throws Exception {
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = tenantMapper.deleteByPrimaryKey(id);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteTenant(String ids, HttpServletRequest request)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        TenantExample example = new TenantExample();
+        example.createCriteria().andIdIn(idList);
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                result = tenantMapper.deleteByExample(example);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        TenantExample example = new TenantExample();
+        example.createCriteria().andIdNotEqualTo(id).andLoginNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Tenant> list=null;
+        try{
+            list= tenantMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    public Tenant getTenantByTenantId(long tenantId) {
+        Tenant tenant = new Tenant();
+        TenantExample example = new TenantExample();
+        example.createCriteria().andTenantIdEqualTo(tenantId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Tenant> list = tenantMapper.selectByExample(example);
+        if(list.size()>0) {
+            tenant = list.get(0);
+        }
+        return tenant;
+    }
+
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        int result=0;
+        try{
+            if(BusinessConstants.DEFAULT_MANAGER.equals(userService.getCurrentUser().getLoginName())) {
+                String statusStr = "";
+                if (status) {
+                    statusStr = "批量启用";
+                } else {
+                    statusStr = "批量禁用";
+                }
+                logService.insertLog("用户",
+                        new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(ids).append("-").append(statusStr).toString(),
+                        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+                List<Long> idList = StringUtil.strToLongList(ids);
+                Tenant tenant = new Tenant();
+                tenant.setEnabled(status);
+                TenantExample example = new TenantExample();
+                example.createCriteria().andIdIn(idList);
+                result = tenantMapper.updateByExampleSelective(tenant, example);
+            }
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/unit/UnitComponent.java b/src/main/java/com/jsh/erp/service/unit/UnitComponent.java
new file mode 100644
index 0000000..86a9f8b
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/unit/UnitComponent.java
@@ -0,0 +1,71 @@
+package com.jsh.erp.service.unit;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "unit_component")
+@UnitResource
+public class UnitComponent implements ICommonQuery {
+
+    @Resource
+    private UnitService unitService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return unitService.getUnit(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getUnitList(map);
+    }
+
+    private List<?> getUnitList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        String order = QueryUtils.order(map);
+        return unitService.select(name, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String name = StringUtil.getInfo(search, "name");
+        return unitService.countUnit(name);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return unitService.insertUnit(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return unitService.updateUnit(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return unitService.deleteUnit(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return unitService.batchDeleteUnit(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return unitService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/unit/UnitResource.java b/src/main/java/com/jsh/erp/service/unit/UnitResource.java
new file mode 100644
index 0000000..6a8229e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/unit/UnitResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.unit;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "unit")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface UnitResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/unit/UnitService.java b/src/main/java/com/jsh/erp/service/unit/UnitService.java
new file mode 100644
index 0000000..e66e12f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/unit/UnitService.java
@@ -0,0 +1,310 @@
+package com.jsh.erp.service.unit;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.Material;
+import com.jsh.erp.datasource.entities.Unit;
+import com.jsh.erp.datasource.entities.UnitExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.MaterialMapperEx;
+import com.jsh.erp.datasource.mappers.UnitMapper;
+import com.jsh.erp.datasource.mappers.UnitMapperEx;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class UnitService {
+    private Logger logger = LoggerFactory.getLogger(UnitService.class);
+
+    @Resource
+    private UnitMapper unitMapper;
+
+    @Resource
+    private UnitMapperEx unitMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private LogService logService;
+    @Resource
+    private MaterialMapperEx materialMapperEx;
+
+    public Unit getUnit(long id)throws Exception {
+        Unit result=null;
+        try{
+            result=unitMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<Unit> getUnitListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<Unit> list = new ArrayList<>();
+        try{
+            UnitExample example = new UnitExample();
+            example.createCriteria().andIdIn(idList);
+            list = unitMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Unit> getUnit()throws Exception {
+        UnitExample example = new UnitExample();
+        example.createCriteria().andEnabledEqualTo(true).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Unit> list=null;
+        try{
+            list=unitMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<Unit> select(String name, int offset, int rows)throws Exception {
+        List<Unit> list=null;
+        try{
+            list=unitMapperEx.selectByConditionUnit(name, offset, rows);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countUnit(String name)throws Exception {
+        Long result=null;
+        try{
+            result=unitMapperEx.countsByUnit(name);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertUnit(JSONObject obj, HttpServletRequest request)throws Exception {
+        Unit unit = JSONObject.parseObject(obj.toJSONString(), Unit.class);
+        int result=0;
+        try{
+            parseNameByUnit(unit);
+            unit.setEnabled(true);
+            result=unitMapper.insertSelective(unit);
+            logService.insertLog("多单位",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(unit.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateUnit(JSONObject obj, HttpServletRequest request)throws Exception {
+        Unit unit = JSONObject.parseObject(obj.toJSONString(), Unit.class);
+        int result=0;
+        try{
+            parseNameByUnit(unit);
+            result=unitMapper.updateByPrimaryKeySelective(unit);
+            if(unit.getRatioTwo()==null) {
+                unitMapperEx.updateRatioTwoById(unit.getId());
+            }
+            if(unit.getRatioThree()==null) {
+                unitMapperEx.updateRatioThreeById(unit.getId());
+            }
+            logService.insertLog("多单位",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(unit.getName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 根据单位信息生成名称的格式
+     * @param unit
+     */
+    private void parseNameByUnit(Unit unit) {
+        String unitName = unit.getBasicUnit() + "/" + "(" +  unit.getOtherUnit() + "=" + unit.getRatio().toString() + unit.getBasicUnit() + ")";
+        if(StringUtil.isNotEmpty(unit.getOtherUnitTwo()) && unit.getRatioTwo()!=null) {
+            unitName += "/" + "(" + unit.getOtherUnitTwo() + "=" + unit.getRatioTwo().toString() + unit.getBasicUnit() + ")";
+            if(StringUtil.isNotEmpty(unit.getOtherUnitThree()) && unit.getRatioThree()!=null) {
+                unitName += "/" + "(" + unit.getOtherUnitThree() + "=" + unit.getRatioThree().toString() + unit.getBasicUnit() + ")";
+            }
+        }
+        unit.setName(unitName);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteUnit(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteUnitByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteUnit(String ids, HttpServletRequest request) throws Exception{
+        return batchDeleteUnitByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteUnitByIds(String ids)throws Exception {
+        int result=0;
+        String [] idArray=ids.split(",");
+        //校验产品表	jsh_material
+        List<Material> materialList=null;
+        try{
+            materialList=materialMapperEx.getMaterialListByUnitIds(idArray);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        if(materialList!=null&&materialList.size()>0){
+            logger.error("异常码[{}],异常提示[{}],参数,UnitIds[{}]",
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,ExceptionConstants.DELETE_FORCE_CONFIRM_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.DELETE_FORCE_CONFIRM_CODE,
+                    ExceptionConstants.DELETE_FORCE_CONFIRM_MSG);
+        }
+        //记录日志
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<Unit> list = getUnitListByIds(ids);
+        for(Unit unit: list){
+            sb.append("[").append(unit.getName()).append("]");
+        }
+        logService.insertLog("多单位", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        //校验通过执行删除操作
+        try{
+            result=unitMapperEx.batchDeleteUnitByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        UnitExample example = new UnitExample();
+        example.createCriteria().andIdNotEqualTo(id).andNameEqualTo(name).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Unit> list=null;
+        try{
+            list=unitMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    /**
+     * 根据条件查询单位id
+     * @param basicUnit
+     * @param otherUnit
+     * @param ratio
+     * @return
+     */
+    public Long getUnitIdByParam(String basicUnit, String otherUnit, BigDecimal ratio){
+        Long unitId = null;
+        UnitExample example = new UnitExample();
+        example.createCriteria().andBasicUnitEqualTo(basicUnit).andOtherUnitEqualTo(otherUnit).andRatioEqualTo(ratio)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<Unit> list = unitMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            unitId = list.get(0).getId();
+        }
+        return unitId;
+    }
+
+    /**
+     * 根据多单位的比例进行库存换算(保留两位小数)
+     * @param stock
+     * @param unitInfo
+     * @param materialUnit
+     * @return
+     */
+    public BigDecimal parseStockByUnit(BigDecimal stock, Unit unitInfo, String materialUnit) {
+        if(materialUnit.equals(unitInfo.getOtherUnit()) && unitInfo.getRatio()!=null && unitInfo.getRatio().compareTo(BigDecimal.ZERO)!=0) {
+            stock = stock.divide(unitInfo.getRatio(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        if(materialUnit.equals(unitInfo.getOtherUnitTwo()) && unitInfo.getRatioTwo()!=null && unitInfo.getRatioTwo().compareTo(BigDecimal.ZERO)!=0) {
+            stock = stock.divide(unitInfo.getRatioTwo(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        if(materialUnit.equals(unitInfo.getOtherUnitThree()) && unitInfo.getRatioThree()!=null && unitInfo.getRatioThree().compareTo(BigDecimal.ZERO)!=0) {
+            stock = stock.divide(unitInfo.getRatioThree(),2,BigDecimal.ROUND_HALF_UP);
+        }
+        return stock;
+    }
+
+    /**
+     * 根据多单位的比例进行单价换算(保留两位小数),变大
+     * @param unitPrice
+     * @param unitInfo
+     * @param materialUnit
+     * @return
+     */
+    public BigDecimal parseUnitPriceByUnit(BigDecimal unitPrice, Unit unitInfo, String materialUnit) {
+        if (materialUnit.equals(unitInfo.getOtherUnit()) && unitInfo.getRatio() != null && unitInfo.getRatio().compareTo(BigDecimal.ZERO) != 0) {
+            unitPrice = unitPrice.multiply(unitInfo.getRatio());
+        }
+        if (materialUnit.equals(unitInfo.getOtherUnitTwo()) && unitInfo.getRatioTwo() != null && unitInfo.getRatioTwo().compareTo(BigDecimal.ZERO) != 0) {
+            unitPrice = unitPrice.multiply(unitInfo.getRatioTwo());
+        }
+        if (materialUnit.equals(unitInfo.getOtherUnitThree()) && unitInfo.getRatioThree() != null && unitInfo.getRatioThree().compareTo(BigDecimal.ZERO) != 0) {
+            unitPrice = unitPrice.multiply(unitInfo.getRatioThree());
+        }
+        return unitPrice;
+    }
+
+    /**
+     * 根据多单位的比例进行总金额换算(保留两位小数),变小
+     * @param allPrice
+     * @param unitInfo
+     * @param materialUnit
+     * @return
+     */
+    public BigDecimal parseAllPriceByUnit(BigDecimal allPrice, Unit unitInfo, String materialUnit) {
+        if (materialUnit.equals(unitInfo.getOtherUnit()) && unitInfo.getRatio() != null && unitInfo.getRatio().compareTo(BigDecimal.ZERO) != 0) {
+            allPrice = allPrice.divide(unitInfo.getRatio(), 2, BigDecimal.ROUND_HALF_UP);
+        }
+        if (materialUnit.equals(unitInfo.getOtherUnitTwo()) && unitInfo.getRatioTwo() != null && unitInfo.getRatioTwo().compareTo(BigDecimal.ZERO) != 0) {
+            allPrice = allPrice.divide(unitInfo.getRatioTwo(), 2, BigDecimal.ROUND_HALF_UP);
+        }
+        if (materialUnit.equals(unitInfo.getOtherUnitThree()) && unitInfo.getRatioThree() != null && unitInfo.getRatioThree().compareTo(BigDecimal.ZERO) != 0) {
+            allPrice = allPrice.divide(unitInfo.getRatioThree(), 2, BigDecimal.ROUND_HALF_UP);
+        }
+        return allPrice;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Boolean status, String ids)throws Exception {
+        logService.insertLog("多单位",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ENABLED).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        List<Long> unitIds = StringUtil.strToLongList(ids);
+        Unit unit = new Unit();
+        unit.setEnabled(status);
+        UnitExample example = new UnitExample();
+        example.createCriteria().andIdIn(unitIds);
+        int result=0;
+        try{
+            result = unitMapper.updateByExampleSelective(unit, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/user/UserComponent.java b/src/main/java/com/jsh/erp/service/user/UserComponent.java
new file mode 100644
index 0000000..4e10409
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/user/UserComponent.java
@@ -0,0 +1,73 @@
+package com.jsh.erp.service.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+@Service(value = "user_component")
+@UserResource
+public class UserComponent implements ICommonQuery {
+
+    @Resource
+    private UserService userService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return userService.getUser(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getUserList(map);
+    }
+
+    private List<?> getUserList(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String userName = StringUtil.getInfo(search, "userName");
+        String loginName = StringUtil.getInfo(search, "loginName");
+        String order = QueryUtils.order(map);
+        String filter = QueryUtils.filter(map);
+        return userService.select(userName, loginName, QueryUtils.offset(map), QueryUtils.rows(map));
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        String search = map.get(Constants.SEARCH);
+        String userName = StringUtil.getInfo(search, "userName");
+        String loginName = StringUtil.getInfo(search, "loginName");
+        return userService.countUser(userName, loginName);
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request)throws Exception {
+        return userService.insertUser(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return userService.updateUser(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return userService.deleteUser(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return userService.batchDeleteUser(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return userService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/user/UserResource.java b/src/main/java/com/jsh/erp/service/user/UserResource.java
new file mode 100644
index 0000000..e612858
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/user/UserResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.user;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "user")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface UserResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/user/UserService.java b/src/main/java/com/jsh/erp/service/user/UserService.java
new file mode 100644
index 0000000..e8b0190
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/user/UserService.java
@@ -0,0 +1,966 @@
+package com.jsh.erp.service.user;
+
+import com.jsh.erp.datasource.entities.*;
+import com.jsh.erp.datasource.mappers.TenantMapper;
+import com.jsh.erp.exception.BusinessParamCheckingException;
+import com.jsh.erp.service.functions.FunctionService;
+import com.jsh.erp.service.platformConfig.PlatformConfigService;
+import com.jsh.erp.service.redis.RedisService;
+import com.jsh.erp.service.role.RoleService;
+import com.jsh.erp.utils.HttpClient;
+import org.springframework.util.StringUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.mappers.UserMapper;
+import com.jsh.erp.datasource.mappers.UserMapperEx;
+import com.jsh.erp.datasource.vo.TreeNodeEx;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.orgaUserRel.OrgaUserRelService;
+import com.jsh.erp.service.tenant.TenantService;
+import com.jsh.erp.service.userBusiness.UserBusinessService;
+import com.jsh.erp.utils.ExceptionCodeConstants;
+import com.jsh.erp.utils.StringUtil;
+import com.jsh.erp.utils.Tools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+@Service
+public class UserService {
+    private Logger logger = LoggerFactory.getLogger(UserService.class);
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private TenantMapper tenantMapper;
+    @Resource
+    private UserMapperEx userMapperEx;
+    @Resource
+    private OrgaUserRelService orgaUserRelService;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private TenantService tenantService;
+    @Resource
+    private UserBusinessService userBusinessService;
+    @Resource
+    private RoleService roleService;
+    @Resource
+    private FunctionService functionService;
+    @Resource
+    private PlatformConfigService platformConfigService;
+    @Resource
+    private RedisService redisService;
+
+    @Value("${tenant.userNumLimit}")
+    private Integer userNumLimit;
+
+    @Value("${tenant.tryDayLimit}")
+    private Integer tryDayLimit;
+
+    public User getUser(long id)throws Exception {
+        User result=null;
+        try{
+            result=userMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<User> getUserListByIds(String ids)throws Exception {
+        List<Long> idList = StringUtil.strToLongList(ids);
+        List<User> list = new ArrayList<>();
+        try{
+            UserExample example = new UserExample();
+            example.createCriteria().andIdIn(idList);
+            list = userMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<User> getUser(HttpServletRequest request) throws Exception {
+        List<User> list=null;
+        try{
+            //先校验是否登录,然后才能查询用户数据
+            Long userId = this.getUserId(request);
+            if(userId!=null) {
+                UserExample example = new UserExample();
+                example.createCriteria().andStatusEqualTo(BusinessConstants.USER_STATUS_NORMAL).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+                list = userMapper.selectByExample(example);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<UserEx> select(String userName, String loginName, int offset, int rows)throws Exception {
+        List<UserEx> list=null;
+        try {
+            //先校验是否登录,然后才能查询用户数据
+            HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+            Long userId = this.getUserId(request);
+            if(userId!=null) {
+                list = userMapperEx.selectByConditionUser(userName, loginName, offset, rows);
+                for (UserEx ue : list) {
+                    String userType = "";
+                    if (ue.getId().equals(ue.getTenantId())) {
+                        userType = "租户";
+                    } else if (ue.getTenantId() == null) {
+                        userType = "超管";
+                    } else {
+                        userType = "普通";
+                    }
+                    ue.setUserType(userType);
+                    //是否经理
+                    String leaderFlagStr = "";
+                    if ("1".equals(ue.getLeaderFlag())) {
+                        leaderFlagStr = "是";
+                    } else {
+                        leaderFlagStr = "否";
+                    }
+                    ue.setLeaderFlagStr(leaderFlagStr);
+                }
+            }
+        } catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public Long countUser(String userName, String loginName)throws Exception {
+        Long result=null;
+        try{
+            result=userMapperEx.countsByUser(userName, loginName);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+    /**
+     * create by: cjl
+     * description:
+     * 添加事务控制
+     * create time: 2019/1/11 14:30
+     * @Param: beanJson
+     * @Param: request
+     * @return int
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertUser(JSONObject obj, HttpServletRequest request)throws Exception {
+        User user = JSONObject.parseObject(obj.toJSONString(), User.class);
+        String password = "123456";
+        //因密码用MD5加密,需要对密码进行转化
+        try {
+            password = Tools.md5Encryp(password);
+            user.setPassword(password);
+        } catch (NoSuchAlgorithmException e) {
+            logger.error(">>>>>>>>>>>>>>转化MD5字符串错误 :" + e.getMessage());
+        }
+        int result=0;
+        try{
+            result=userMapper.insertSelective(user);
+            logService.insertLog("用户",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_ADD).append(user.getLoginName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    /**
+     * create by: cjl
+     * description:
+     * 添加事务控制
+     * create time: 2019/1/11 14:31
+     * @Param: beanJson
+     * @Param: id
+     * @return int
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateUser(JSONObject obj, HttpServletRequest request) throws Exception{
+        User user = JSONObject.parseObject(obj.toJSONString(), User.class);
+        int result=0;
+        try{
+            result=userMapper.updateByPrimaryKeySelective(user);
+            logService.insertLog("用户",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(user.getLoginName()).toString(), request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    /**
+     * create by: cjl
+     * description:
+     * 添加事务控制
+     * create time: 2019/1/11 14:32
+     * @Param: user
+     * @return int
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateUserByObj(User user) throws Exception{
+        logService.insertLog("用户",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(user.getId()).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        int result=0;
+        try{
+            result=userMapper.updateByPrimaryKeySelective(user);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+    /**
+     * create by: cjl
+     * description:
+     *  添加事务控制
+     * create time: 2019/1/11 14:33
+     * @Param: md5Pwd
+     * @Param: id
+     * @return int
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int resetPwd(String md5Pwd, Long id) throws Exception{
+        int result=0;
+        logService.insertLog("用户",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(id).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User u = getUser(id);
+        String loginName = u.getLoginName();
+        if("admin".equals(loginName)){
+            logger.info("禁止重置超管密码");
+        } else {
+            User user = new User();
+            user.setId(id);
+            user.setPassword(md5Pwd);
+            try{
+                result=userMapper.updateByPrimaryKeySelective(user);
+            }catch(Exception e){
+                JshException.writeFail(logger, e);
+            }
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteUser(Long id, HttpServletRequest request)throws Exception {
+        return batDeleteUser(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteUser(String ids, HttpServletRequest request)throws Exception {
+        return batDeleteUser(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batDeleteUser(String ids) throws Exception{
+        int result=0;
+        StringBuffer sb = new StringBuffer();
+        sb.append(BusinessConstants.LOG_OPERATION_TYPE_DELETE);
+        List<User> list = getUserListByIds(ids);
+        for(User user: list){
+            if(user.getId().equals(user.getTenantId())) {
+                logger.error("异常码[{}],异常提示[{}],参数,ids:[{}]",
+                        ExceptionConstants.USER_LIMIT_TENANT_DELETE_CODE,ExceptionConstants.USER_LIMIT_TENANT_DELETE_MSG,ids);
+                throw new BusinessRunTimeException(ExceptionConstants.USER_LIMIT_TENANT_DELETE_CODE,
+                        ExceptionConstants.USER_LIMIT_TENANT_DELETE_MSG);
+            }
+            sb.append("[").append(user.getLoginName()).append("]");
+        }
+        logService.insertLog("用户", sb.toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        String[] idsArray =ids.split(",");
+        try{
+            result=userMapperEx.batDeleteOrUpdateUser(idsArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        if(result<1){
+            logger.error("异常码[{}],异常提示[{}],参数,ids:[{}]",
+                    ExceptionConstants.USER_DELETE_FAILED_CODE,ExceptionConstants.USER_DELETE_FAILED_MSG,ids);
+            throw new BusinessRunTimeException(ExceptionConstants.USER_DELETE_FAILED_CODE,
+                    ExceptionConstants.USER_DELETE_FAILED_MSG);
+        }
+        return result;
+    }
+
+    /**
+     * 校验验证码
+     * @param code 验证码
+     * @param uuid 唯一标识
+     * @return 结果
+     */
+    public void validateCaptcha(String code, String uuid) {
+        if(StringUtil.isNotEmpty(code) && StringUtil.isNotEmpty(uuid)) {
+            code = code.trim();
+            uuid = uuid.trim();
+            String verifyKey = BusinessConstants.CAPTCHA_CODE_KEY + uuid;
+            String captcha = redisService.getCacheObject(verifyKey);
+            redisService.deleteObject(verifyKey);
+            if (captcha == null) {
+                logger.error("异常码[{}],异常提示[{}]", ExceptionConstants.USER_JCAPTCHA_EXPIRE_CODE, ExceptionConstants.USER_JCAPTCHA_EXPIRE_MSG);
+                throw new BusinessRunTimeException(ExceptionConstants.USER_JCAPTCHA_EXPIRE_CODE, ExceptionConstants.USER_JCAPTCHA_EXPIRE_MSG);
+            }
+            if (!code.equalsIgnoreCase(captcha)) {
+                logger.error("异常码[{}],异常提示[{}]", ExceptionConstants.USER_JCAPTCHA_ERROR_CODE, ExceptionConstants.USER_JCAPTCHA_ERROR_MSG);
+                throw new BusinessRunTimeException(ExceptionConstants.USER_JCAPTCHA_ERROR_CODE, ExceptionConstants.USER_JCAPTCHA_ERROR_MSG);
+            }
+        } else {
+            logger.error("异常码[{}],异常提示[{}]", ExceptionConstants.USER_JCAPTCHA_EMPTY_CODE, ExceptionConstants.USER_JCAPTCHA_EMPTY_MSG);
+            throw new BusinessRunTimeException(ExceptionConstants.USER_JCAPTCHA_EMPTY_CODE, ExceptionConstants.USER_JCAPTCHA_EMPTY_MSG);
+        }
+    }
+
+    /**
+     * 用户登录
+     * @param loginName
+     * @param password
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    public Map<String, Object> login(String loginName, String password, HttpServletRequest request) throws Exception {
+        Map<String, Object> data = new HashMap<>();
+        String msgTip = "";
+        User user = null;
+        //判断用户是否已经登录过,登录过不再处理
+        Object userId = redisService.getObjectFromSessionByKey(request,"userId");
+        if (userId != null) {
+            logger.info("====用户已经登录过, login 方法调用结束====");
+            msgTip = "user already login";
+        }
+        //获取用户状态
+        int userStatus = -1;
+        try {
+            redisService.deleteObjectBySession(request,"userId");
+            userStatus = validateUser(loginName, password);
+        } catch (Exception e) {
+            logger.error(">>>>>>>>>>>>>用户  " + loginName + " 登录 login 方法 访问服务层异常====", e);
+            msgTip = "access service exception";
+        }
+        String token = UUID.randomUUID().toString().replaceAll("-", "") + "";
+        switch (userStatus) {
+            case ExceptionCodeConstants.UserExceptionCode.USER_NOT_EXIST:
+                msgTip = "user is not exist";
+                break;
+            case ExceptionCodeConstants.UserExceptionCode.USER_PASSWORD_ERROR:
+                msgTip = "user password error";
+                break;
+            case ExceptionCodeConstants.UserExceptionCode.BLACK_USER:
+                msgTip = "user is black";
+                break;
+            case ExceptionCodeConstants.UserExceptionCode.USER_ACCESS_EXCEPTION:
+                msgTip = "access service error";
+                break;
+            case ExceptionCodeConstants.UserExceptionCode.BLACK_TENANT:
+                msgTip = "tenant is black";
+                break;
+            case ExceptionCodeConstants.UserExceptionCode.EXPIRE_TENANT:
+                msgTip = "tenant is expire";
+                break;
+            case ExceptionCodeConstants.UserExceptionCode.USER_CONDITION_FIT:
+                msgTip = "user can login";
+                //验证通过 ,可以登录,放入session,记录登录日志
+                user = getUserByLoginName(loginName);
+                if(user.getTenantId()!=null) {
+                    token = token + "_" + user.getTenantId();
+                }
+                redisService.storageObjectBySession(token,"userId",user.getId());
+                break;
+            default:
+                break;
+        }
+        data.put("msgTip", msgTip);
+        if(user!=null){
+            //校验下密码是不是过于简单
+            boolean pwdSimple = false;
+            if(user.getPassword().equals(Tools.md5Encryp(BusinessConstants.USER_DEFAULT_PASSWORD))) {
+                pwdSimple = true;
+            }
+            user.setPassword(null);
+            redisService.storageObjectBySession(token,"clientIp", Tools.getLocalIp(request));
+            logService.insertLogWithUserId(user.getId(), user.getTenantId(), "用户",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_LOGIN).append(user.getLoginName()).toString(),
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            data.put("token", token);
+            data.put("user", user);
+            data.put("pwdSimple", pwdSimple);
+        }
+        return data;
+    }
+
+    public int validateUser(String loginName, String password) throws Exception {
+        /**默认是可以登录的*/
+        List<User> list = null;
+        try {
+            UserExample example = new UserExample();
+            example.createCriteria().andLoginNameEqualTo(loginName).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            list = userMapper.selectByExample(example);
+            if (null != list && list.size() == 0) {
+                return ExceptionCodeConstants.UserExceptionCode.USER_NOT_EXIST;
+            } else if(list.size() ==1) {
+                if(list.get(0).getStatus()!=0) {
+                    return ExceptionCodeConstants.UserExceptionCode.BLACK_USER;
+                }
+                Long tenantId = list.get(0).getTenantId();
+                Tenant tenant = tenantService.getTenantByTenantId(tenantId);
+                if(tenant!=null) {
+                    if(tenant.getEnabled()!=null && !tenant.getEnabled()) {
+                        return ExceptionCodeConstants.UserExceptionCode.BLACK_TENANT;
+                    }
+                    if(tenant.getExpireTime()!=null && tenant.getExpireTime().getTime()<System.currentTimeMillis()){
+                        return ExceptionCodeConstants.UserExceptionCode.EXPIRE_TENANT;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            logger.error(">>>>>>>>访问验证用户姓名是否存在后台信息异常", e);
+            return ExceptionCodeConstants.UserExceptionCode.USER_ACCESS_EXCEPTION;
+        }
+        try {
+            UserExample example = new UserExample();
+            example.createCriteria().andLoginNameEqualTo(loginName).andPasswordEqualTo(password)
+                    .andStatusEqualTo(BusinessConstants.USER_STATUS_NORMAL).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            list = userMapper.selectByExample(example);
+            if (null != list && list.size() == 0) {
+                return ExceptionCodeConstants.UserExceptionCode.USER_PASSWORD_ERROR;
+            }
+        } catch (Exception e) {
+            logger.error(">>>>>>>>>>访问验证用户密码后台信息异常", e);
+            return ExceptionCodeConstants.UserExceptionCode.USER_ACCESS_EXCEPTION;
+        }
+        return ExceptionCodeConstants.UserExceptionCode.USER_CONDITION_FIT;
+    }
+
+    public User getUserByLoginName(String loginName)throws Exception {
+        UserExample example = new UserExample();
+        example.createCriteria().andLoginNameEqualTo(loginName).andStatusEqualTo(BusinessConstants.USER_STATUS_NORMAL)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<User> list=null;
+        try{
+            list= userMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        User user =null;
+        if(list!=null&&list.size()>0){
+            user = list.get(0);
+        }
+        return user;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        UserExample example = new UserExample();
+        List<Byte> userStatus = new ArrayList<>();
+        userStatus.add(BusinessConstants.USER_STATUS_NORMAL);
+        example.createCriteria().andIdNotEqualTo(id).andLoginNameEqualTo(name).andStatusIn(userStatus)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<User> list=null;
+        try{
+            list= userMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+    /**
+     * create by: cjl
+     * description:
+     *  获取当前用户信息
+     * create time: 2019/1/24 10:01
+     * @Param:
+     * @return com.jsh.erp.datasource.entities.User
+     */
+    public User getCurrentUser()throws Exception{
+        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+        Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
+        return getUser(userId);
+    }
+
+    /**
+     * 根据用户名查询id
+     * @param loginName
+     * @return
+     */
+    public Long getIdByLoginName(String loginName) {
+        Long userId = 0L;
+        UserExample example = new UserExample();
+        example.createCriteria().andLoginNameEqualTo(loginName).andStatusEqualTo(BusinessConstants.USER_STATUS_NORMAL)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<User> list = userMapper.selectByExample(example);
+        if(list!=null) {
+            userId = list.get(0).getId();
+        }
+        return userId;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void addUserAndOrgUserRel(UserEx ue, HttpServletRequest request) throws Exception{
+        if(BusinessConstants.DEFAULT_MANAGER.equals(ue.getLoginName())) {
+            throw new BusinessRunTimeException(ExceptionConstants.USER_NAME_LIMIT_USE_CODE,
+                    ExceptionConstants.USER_NAME_LIMIT_USE_MSG);
+        } else {
+            logService.insertLog("用户",
+                    BusinessConstants.LOG_OPERATION_TYPE_ADD,
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            //检查用户名和登录名
+            checkLoginName(ue);
+            //新增用户信息
+            ue= this.addUser(ue);
+            if(ue==null){
+                logger.error("异常码[{}],异常提示[{}],参数,[{}]",
+                        ExceptionConstants.USER_ADD_FAILED_CODE,ExceptionConstants.USER_ADD_FAILED_MSG);
+                throw new BusinessRunTimeException(ExceptionConstants.USER_ADD_FAILED_CODE,
+                        ExceptionConstants.USER_ADD_FAILED_MSG);
+            }
+            //用户id,根据用户名查询id
+            Long userId = getIdByLoginName(ue.getLoginName());
+            if(ue.getRoleId()!=null){
+                JSONObject ubObj = new JSONObject();
+                ubObj.put("type", "UserRole");
+                ubObj.put("keyid", userId);
+                ubObj.put("value", "[" + ue.getRoleId() + "]");
+                userBusinessService.insertUserBusiness(ubObj, request);
+            }
+            if(ue.getOrgaId()==null){
+                //如果没有选择机构,就不建机构和用户的关联关系
+                return;
+            }
+            if(ue.getOrgaId()!=null && "1".equals(ue.getLeaderFlag())){
+                //检查当前机构是否存在经理
+                List<User> checkList = userMapperEx.getListByOrgaId(ue.getId(), ue.getOrgaId());
+                if(checkList.size()>0) {
+                    throw new BusinessRunTimeException(ExceptionConstants.USER_LEADER_IS_EXIST_CODE,
+                            ExceptionConstants.USER_LEADER_IS_EXIST_MSG);
+                }
+            }
+            //新增用户和机构关联关系
+            OrgaUserRel oul=new OrgaUserRel();
+            //机构id
+            oul.setOrgaId(ue.getOrgaId());
+            oul.setUserId(userId);
+            //用户在机构中的排序
+            oul.setUserBlngOrgaDsplSeq(ue.getUserBlngOrgaDsplSeq());
+            oul=orgaUserRelService.addOrgaUserRel(oul);
+            if(oul==null){
+                logger.error("异常码[{}],异常提示[{}],参数,[{}]",
+                        ExceptionConstants.ORGA_USER_REL_ADD_FAILED_CODE,ExceptionConstants.ORGA_USER_REL_ADD_FAILED_MSG);
+                throw new BusinessRunTimeException(ExceptionConstants.ORGA_USER_REL_ADD_FAILED_CODE,
+                        ExceptionConstants.ORGA_USER_REL_ADD_FAILED_MSG);
+            }
+        }
+    }
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public UserEx addUser(UserEx ue) throws Exception{
+        /**
+         * 新增用户默认设置
+         * 1、密码默认123456
+         * 2是否系统自带默认为非系统自带
+         * 3是否管理者默认为员工
+         * 4默认用户状态为正常
+         * */
+        ue.setPassword(Tools.md5Encryp(BusinessConstants.USER_DEFAULT_PASSWORD));
+        ue.setIsystem(BusinessConstants.USER_NOT_SYSTEM);
+        if(ue.getIsmanager()==null){
+            ue.setIsmanager(BusinessConstants.USER_NOT_MANAGER);
+        }
+        ue.setStatus(BusinessConstants.USER_STATUS_NORMAL);
+        int result=0;
+        try{
+            result= userMapper.insertSelective(ue);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        if(result>0){
+            return ue;
+        }
+        return null;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void registerUser(UserEx ue, Integer manageRoleId, HttpServletRequest request) throws Exception{
+        /**
+         * 多次创建事务,事物之间无法协同,应该在入口处创建一个事务以做协调
+         */
+        if(BusinessConstants.DEFAULT_MANAGER.equals(ue.getLoginName())) {
+            throw new BusinessRunTimeException(ExceptionConstants.USER_NAME_LIMIT_USE_CODE,
+                    ExceptionConstants.USER_NAME_LIMIT_USE_MSG);
+        } else {
+            ue.setPassword(ue.getPassword());
+            ue.setIsystem(BusinessConstants.USER_NOT_SYSTEM);
+            if (ue.getIsmanager() == null) {
+                ue.setIsmanager(BusinessConstants.USER_NOT_MANAGER);
+            }
+            ue.setStatus(BusinessConstants.USER_STATUS_NORMAL);
+            try{
+                userMapper.insertSelective(ue);
+                Long userId = getIdByLoginName(ue.getLoginName());
+                ue.setId(userId);
+            }catch(Exception e){
+                JshException.writeFail(logger, e);
+            }
+            //更新租户id
+            User user = new User();
+            user.setId(ue.getId());
+            user.setTenantId(ue.getId());
+            userService.updateUserTenant(user);
+            //新增用户与角色的关系
+            JSONObject ubObj = new JSONObject();
+            ubObj.put("type", "UserRole");
+            ubObj.put("keyid", ue.getId());
+            JSONArray ubArr = new JSONArray();
+            ubArr.add(manageRoleId);
+            ubObj.put("value", ubArr.toString());
+            ubObj.put("tenantId", ue.getId());
+            userBusinessService.insertUserBusiness(ubObj, null);
+            //创建租户信息
+            JSONObject tenantObj = new JSONObject();
+            tenantObj.put("tenantId", ue.getId());
+            tenantObj.put("loginName",ue.getLoginName());
+            tenantObj.put("userNumLimit", ue.getUserNumLimit());
+            tenantObj.put("expireTime", ue.getExpireTime());
+            tenantObj.put("remark", ue.getRemark());
+            Tenant tenant = JSONObject.parseObject(tenantObj.toJSONString(), Tenant.class);
+            tenant.setCreateTime(new Date());
+            if(tenant.getUserNumLimit()==null) {
+                tenant.setUserNumLimit(userNumLimit); //默认用户限制数量
+            }
+            if(tenant.getExpireTime()==null) {
+                tenant.setExpireTime(Tools.addDays(new Date(), tryDayLimit)); //租户允许试用的天数
+            }
+            tenantMapper.insertSelective(tenant);
+            logger.info("===============创建租户信息完成===============");
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateUserTenant(User user) throws Exception{
+        UserExample example = new UserExample();
+        example.createCriteria().andIdEqualTo(user.getId());
+        try{
+            userMapper.updateByPrimaryKeySelective(user);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public void updateUserAndOrgUserRel(UserEx ue, HttpServletRequest request) throws Exception{
+        if(BusinessConstants.DEFAULT_MANAGER.equals(ue.getLoginName())) {
+            throw new BusinessRunTimeException(ExceptionConstants.USER_NAME_LIMIT_USE_CODE,
+                    ExceptionConstants.USER_NAME_LIMIT_USE_MSG);
+        } else {
+            logService.insertLog("用户",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(ue.getId()).toString(),
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+            //检查用户名和登录名
+            checkLoginName(ue);
+            //更新用户信息
+            ue = this.updateUser(ue);
+            if (ue == null) {
+                logger.error("异常码[{}],异常提示[{}],参数,[{}]",
+                        ExceptionConstants.USER_EDIT_FAILED_CODE, ExceptionConstants.USER_EDIT_FAILED_MSG);
+                throw new BusinessRunTimeException(ExceptionConstants.USER_EDIT_FAILED_CODE,
+                        ExceptionConstants.USER_EDIT_FAILED_MSG);
+            }
+            if(ue.getRoleId()!=null){
+                JSONObject ubObj = new JSONObject();
+                ubObj.put("type", "UserRole");
+                ubObj.put("keyid", ue.getId());
+                ubObj.put("value", "[" + ue.getRoleId() + "]");
+                Long ubId = userBusinessService.checkIsValueExist("UserRole", ue.getId().toString());
+                if(ubId!=null) {
+                    ubObj.put("id", ubId);
+                    userBusinessService.updateUserBusiness(ubObj, request);
+                } else {
+                    userBusinessService.insertUserBusiness(ubObj, request);
+                }
+            }
+            if (ue.getOrgaId() == null) {
+                //如果没有选择机构,就不建机构和用户的关联关系
+                return;
+            }
+            if(ue.getOrgaId()!=null && "1".equals(ue.getLeaderFlag())){
+                //检查当前机构是否存在经理
+                List<User> checkList = userMapperEx.getListByOrgaId(ue.getId(), ue.getOrgaId());
+                if(checkList.size()>0) {
+                    throw new BusinessRunTimeException(ExceptionConstants.USER_LEADER_IS_EXIST_CODE,
+                            ExceptionConstants.USER_LEADER_IS_EXIST_MSG);
+                }
+            }
+            //更新用户和机构关联关系
+            OrgaUserRel oul = new OrgaUserRel();
+            //机构和用户关联关系id
+            oul.setId(ue.getOrgaUserRelId());
+            //机构id
+            oul.setOrgaId(ue.getOrgaId());
+            //用户id
+            oul.setUserId(ue.getId());
+            //用户在机构中的排序
+            oul.setUserBlngOrgaDsplSeq(ue.getUserBlngOrgaDsplSeq());
+            if (oul.getId() != null) {
+                //已存在机构和用户的关联关系,更新
+                oul = orgaUserRelService.updateOrgaUserRel(oul);
+            } else {
+                //不存在机构和用户的关联关系,新建
+                oul = orgaUserRelService.addOrgaUserRel(oul);
+            }
+            if (oul == null) {
+                logger.error("异常码[{}],异常提示[{}],参数,[{}]",
+                        ExceptionConstants.ORGA_USER_REL_EDIT_FAILED_CODE, ExceptionConstants.ORGA_USER_REL_EDIT_FAILED_MSG);
+                throw new BusinessRunTimeException(ExceptionConstants.ORGA_USER_REL_EDIT_FAILED_CODE,
+                        ExceptionConstants.ORGA_USER_REL_EDIT_FAILED_MSG);
+            }
+        }
+    }
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public UserEx updateUser(UserEx ue)throws Exception{
+        int result =0;
+        try{
+            result=userMapper.updateByPrimaryKeySelective(ue);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        if(result>0){
+            return ue;
+        }
+        return null;
+    }
+    /**
+     *  检查登录名不能重复
+     * create time: 2019/3/12 11:36
+     * @Param: userEx
+     * @return void
+     */
+    public void checkLoginName(UserEx userEx)throws Exception{
+        List<User> list=null;
+        if(userEx==null){
+            return;
+        }
+        Long userId=userEx.getId();
+        //检查登录名
+        if(!StringUtils.isEmpty(userEx.getLoginName())){
+            String loginName=userEx.getLoginName();
+            list=this.getUserListByloginName(loginName);
+            if(list!=null&&list.size()>0){
+                if(list.size()>1){
+                    //超过一条数据存在,该登录名已存在
+                    logger.error("异常码[{}],异常提示[{}],参数,loginName:[{}]",
+                            ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_CODE,ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_MSG,loginName);
+                    throw new BusinessRunTimeException(ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_CODE,
+                            ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_MSG);
+                }
+                //一条数据,新增时抛出异常,修改时和当前的id不同时抛出异常
+                if(list.size()==1){
+                    if(userId==null||(userId!=null&&!userId.equals(list.get(0).getId()))){
+                        logger.error("异常码[{}],异常提示[{}],参数,loginName:[{}]",
+                                ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_CODE,ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_MSG,loginName);
+                        throw new BusinessRunTimeException(ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_CODE,
+                                ExceptionConstants.USER_LOGIN_NAME_ALREADY_EXISTS_MSG);
+                    }
+                }
+            }
+        }
+    }
+    /**
+     * 通过登录名获取用户列表
+     * */
+    public List<User> getUserListByloginName(String loginName){
+        List<User> list =null;
+        try{
+            list=userMapperEx.getUserListByUserNameOrLoginName(null,loginName);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public List<TreeNodeEx> getOrganizationUserTree()throws Exception {
+        List<TreeNodeEx> list =null;
+        try{
+            list=userMapperEx.getNodeTree();
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    /**
+     * 根据用户id查询角色信息
+     * @param userId
+     * @return
+     */
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public Role getRoleTypeByUserId(long userId) throws Exception {
+        Role role = new Role();
+        List<UserBusiness> list = userBusinessService.getBasicData(String.valueOf(userId), "UserRole");
+        UserBusiness ub = null;
+        if(list.size() > 0) {
+            ub = list.get(0);
+            String values = ub.getValue();
+            String roleId = null;
+            if(values!=null) {
+                values = values.replaceAll("\\[\\]",",").replace("[","").replace("]","");
+            }
+            String [] valueArray=values.split(",");
+            if(valueArray.length>0) {
+                roleId = valueArray[0];
+            }
+            role = roleService.getRoleWithoutTenant(Long.parseLong(roleId));
+        }
+        return role;
+    }
+
+    /**
+     * 获取用户id
+     * @param request
+     * @return
+     */
+    public Long getUserId(HttpServletRequest request) throws Exception{
+        Object userIdObj = redisService.getObjectFromSessionByKey(request,"userId");
+        Long userId = null;
+        if(userIdObj != null) {
+            userId = Long.parseLong(userIdObj.toString());
+        }
+        return userId;
+    }
+
+    /**
+     * 用户的按钮权限
+     * @param userId
+     * @return
+     * @throws Exception
+     */
+    public JSONArray getBtnStrArrById(Long userId) throws Exception {
+        JSONArray btnStrArr = new JSONArray();
+        List<UserBusiness> userRoleList = userBusinessService.getBasicData(userId.toString(), "UserRole");
+        if(userRoleList!=null && userRoleList.size()>0) {
+            String roleValue = userRoleList.get(0).getValue();
+            if(StringUtil.isNotEmpty(roleValue) && roleValue.indexOf("[")>-1 && roleValue.indexOf("]")>-1){
+                roleValue = roleValue.replace("[", "").replace("]", ""); //角色id-单个
+                List<UserBusiness> roleFunctionsList = userBusinessService.getBasicData(roleValue, "RoleFunctions");
+                if(roleFunctionsList!=null && roleFunctionsList.size()>0) {
+                    String btnStr = roleFunctionsList.get(0).getBtnStr();
+                    if(StringUtil.isNotEmpty(btnStr)){
+                        btnStrArr = JSONArray.parseArray(btnStr);
+                    }
+                }
+            }
+        }
+        //将数组中的funId转为url
+        JSONArray btnStrWithUrlArr = new JSONArray();
+        if(btnStrArr.size()>0) {
+            List<Function> functionList = functionService.getFunction();
+            Map<Long, String> functionMap = new HashMap<>();
+            for (Function function: functionList) {
+                functionMap.put(function.getId(), function.getUrl());
+            }
+            for (Object obj : btnStrArr) {
+                JSONObject btnStrObj = JSONObject.parseObject(obj.toString());
+                Long funId = btnStrObj.getLong("funId");
+                JSONObject btnStrWithUrlObj = new JSONObject();
+                btnStrWithUrlObj.put("url", functionMap.get(funId));
+                btnStrWithUrlObj.put("btnStr", btnStrObj.getString("btnStr"));
+                btnStrWithUrlArr.add(btnStrWithUrlObj);
+            }
+        }
+        return btnStrWithUrlArr;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchSetStatus(Byte status, String ids, HttpServletRequest request)throws Exception {
+        int result=0;
+        List<User> list = getUserListByIds(ids);
+        //选中的用户的数量
+        int selectUserSize = list.size();
+        //查询启用状态的用户的数量
+        int enableUserSize = getUser(request).size();
+        User userInfo = userService.getCurrentUser();
+        Tenant tenant = tenantService.getTenantByTenantId(userInfo.getTenantId());
+        if(tenant!=null) {
+            if (selectUserSize + enableUserSize > tenant.getUserNumLimit() && status == 0) {
+                throw new BusinessParamCheckingException(ExceptionConstants.USER_ENABLE_OVER_LIMIT_FAILED_CODE,
+                        ExceptionConstants.USER_ENABLE_OVER_LIMIT_FAILED_MSG);
+            }
+        }
+        StringBuilder userStr = new StringBuilder();
+        List<Long> idList = new ArrayList<>();
+        for(User user: list) {
+            if(user.getId().equals(user.getTenantId())) {
+                //租户不能进行禁用
+            } else {
+                idList.add(user.getId());
+                userStr.append(user.getLoginName()).append(" ");
+            }
+        }
+        String statusStr ="";
+        if(status == 0) {
+            statusStr ="批量启用";
+        } else if(status == 2) {
+            statusStr ="批量禁用";
+        }
+        if(idList.size()>0) {
+            User user = new User();
+            user.setStatus(status);
+            UserExample example = new UserExample();
+            example.createCriteria().andIdIn(idList);
+            result = userMapper.updateByExampleSelective(user, example);
+            logService.insertLog("用户",
+                    new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(userStr).append("-").append(statusStr).toString(),
+                    ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        } else {
+            result = 1;
+        }
+        return result;
+    }
+
+    public User getUserByWeixinCode(String weixinCode) throws Exception {
+        String weixinUrl = platformConfigService.getPlatformConfigByKey("weixinUrl").getPlatformValue();
+        String weixinAppid = platformConfigService.getPlatformConfigByKey("weixinAppid").getPlatformValue();
+        String weixinSecret = platformConfigService.getPlatformConfigByKey("weixinSecret").getPlatformValue();
+        String url = weixinUrl + "?appid=" + weixinAppid + "&secret=" + weixinSecret + "&js_code=" + weixinCode
+                + "&grant_type=authorization_code";
+        JSONObject jsonObject = HttpClient.httpGet(url);
+        if(jsonObject!=null) {
+            String weixinOpenId = jsonObject.getString("openid");
+            if(StringUtil.isNotEmpty(weixinOpenId)) {
+                return userMapperEx.getUserByWeixinOpenId(weixinOpenId);
+            }
+        }
+        return null;
+    }
+
+    public int weixinBind(String loginName, String password, String weixinCode) throws Exception {
+        String weixinUrl = platformConfigService.getPlatformConfigByKey("weixinUrl").getPlatformValue();
+        String weixinAppid = platformConfigService.getPlatformConfigByKey("weixinAppid").getPlatformValue();
+        String weixinSecret = platformConfigService.getPlatformConfigByKey("weixinSecret").getPlatformValue();
+        String url = weixinUrl + "?appid=" + weixinAppid + "&secret=" + weixinSecret + "&js_code=" + weixinCode
+                + "&grant_type=authorization_code";
+        JSONObject jsonObject = HttpClient.httpGet(url);
+        if(jsonObject!=null) {
+            String weixinOpenId = jsonObject.getString("openid");
+            if(StringUtil.isNotEmpty(weixinOpenId)) {
+                return userMapperEx.updateUserWithWeixinOpenId(loginName, password, weixinOpenId);
+            }
+        }
+        return 0;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessComponent.java b/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessComponent.java
new file mode 100644
index 0000000..0c8d856
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessComponent.java
@@ -0,0 +1,69 @@
+package com.jsh.erp.service.userBusiness;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.service.ICommonQuery;
+import com.jsh.erp.service.depot.DepotResource;
+import com.jsh.erp.service.depot.DepotService;
+import com.jsh.erp.utils.Constants;
+import com.jsh.erp.utils.QueryUtils;
+import com.jsh.erp.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+@Service(value = "userBusiness_component")
+@UserBusinessResource
+public class UserBusinessComponent implements ICommonQuery {
+
+    @Resource
+    private UserBusinessService userBusinessService;
+
+    @Override
+    public Object selectOne(Long id) throws Exception {
+        return userBusinessService.getUserBusiness(id);
+    }
+
+    @Override
+    public List<?> select(Map<String, String> map)throws Exception {
+        return getUserBusinessList(map);
+    }
+
+    private List<?> getUserBusinessList(Map<String, String> map)throws Exception {
+        return null;
+    }
+
+    @Override
+    public Long counts(Map<String, String> map)throws Exception {
+        return BusinessConstants.DEFAULT_LIST_NULL_NUMBER;
+    }
+
+    @Override
+    public int insert(JSONObject obj, HttpServletRequest request) throws Exception {
+        return userBusinessService.insertUserBusiness(obj, request);
+    }
+
+    @Override
+    public int update(JSONObject obj, HttpServletRequest request)throws Exception {
+        return userBusinessService.updateUserBusiness(obj, request);
+    }
+
+    @Override
+    public int delete(Long id, HttpServletRequest request)throws Exception {
+        return userBusinessService.deleteUserBusiness(id, request);
+    }
+
+    @Override
+    public int deleteBatch(String ids, HttpServletRequest request)throws Exception {
+        return userBusinessService.batchDeleteUserBusiness(ids, request);
+    }
+
+    @Override
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return userBusinessService.checkIsNameExist(id, name);
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessResource.java b/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessResource.java
new file mode 100644
index 0000000..ce6ec4f
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessResource.java
@@ -0,0 +1,15 @@
+package com.jsh.erp.service.userBusiness;
+
+import com.jsh.erp.service.ResourceInfo;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+@ResourceInfo(value = "userBusiness")
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface UserBusinessResource {
+}
diff --git a/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessService.java b/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessService.java
new file mode 100644
index 0000000..a23821e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/service/userBusiness/UserBusinessService.java
@@ -0,0 +1,177 @@
+package com.jsh.erp.service.userBusiness;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.entities.UserBusiness;
+import com.jsh.erp.datasource.entities.UserBusinessExample;
+import com.jsh.erp.datasource.mappers.UserBusinessMapper;
+import com.jsh.erp.datasource.mappers.UserBusinessMapperEx;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.log.LogService;
+import com.jsh.erp.service.user.UserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class UserBusinessService {
+    private Logger logger = LoggerFactory.getLogger(UserBusinessService.class);
+
+    @Resource
+    private UserBusinessMapper userBusinessMapper;
+    @Resource
+    private UserBusinessMapperEx userBusinessMapperEx;
+    @Resource
+    private LogService logService;
+    @Resource
+    private UserService userService;
+
+    public UserBusiness getUserBusiness(long id)throws Exception {
+        UserBusiness result=null;
+        try{
+            result=userBusinessMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    public List<UserBusiness> getUserBusiness()throws Exception {
+        UserBusinessExample example = new UserBusinessExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<UserBusiness> list=null;
+        try{
+            list=userBusinessMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertUserBusiness(JSONObject obj, HttpServletRequest request) throws Exception {
+        UserBusiness userBusiness = JSONObject.parseObject(obj.toJSONString(), UserBusiness.class);
+        int result=0;
+        try{
+            String value = userBusiness.getValue();
+            String newValue = value.replaceAll(",","\\]\\[");
+            newValue = newValue.replaceAll("\\[0\\]","").replaceAll("\\[\\]","");
+            userBusiness.setValue(newValue);
+            result=userBusinessMapper.insertSelective(userBusiness);
+            logService.insertLog("关联关系", BusinessConstants.LOG_OPERATION_TYPE_ADD, request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateUserBusiness(JSONObject obj, HttpServletRequest request) throws Exception {
+        UserBusiness userBusiness = JSONObject.parseObject(obj.toJSONString(), UserBusiness.class);
+        int result=0;
+        try{
+            String value = userBusiness.getValue();
+            String newValue = value.replaceAll(",","\\]\\[");
+            newValue = newValue.replaceAll("\\[0\\]","").replaceAll("\\[\\]","");
+            userBusiness.setValue(newValue);
+            result=userBusinessMapper.updateByPrimaryKeySelective(userBusiness);
+            logService.insertLog("关联关系", BusinessConstants.LOG_OPERATION_TYPE_EDIT, request);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteUserBusiness(Long id, HttpServletRequest request)throws Exception {
+        return batchDeleteUserBusinessByIds(id.toString());
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteUserBusiness(String ids, HttpServletRequest request)throws Exception {
+        return batchDeleteUserBusinessByIds(ids);
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteUserBusinessByIds(String ids) throws Exception{
+        logService.insertLog("关联关系",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_DELETE).append(ids).toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        User userInfo=userService.getCurrentUser();
+        String [] idArray=ids.split(",");
+        int result=0;
+        try{
+            result=  userBusinessMapperEx.batchDeleteUserBusinessByIds(new Date(),userInfo==null?null:userInfo.getId(),idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    public int checkIsNameExist(Long id, String name)throws Exception {
+        return 1;
+    }
+
+    public List<UserBusiness> getBasicData(String keyId, String type)throws Exception{
+        List<UserBusiness> list=null;
+        try{
+            list= userBusinessMapperEx.getBasicDataByKeyIdAndType(keyId, type);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    public String getUBValueByTypeAndKeyId(String type, String keyId) throws Exception {
+        String ubValue = "";
+        List<UserBusiness> ubList = getBasicData(keyId, type);
+        if(ubList!=null && ubList.size()>0) {
+            ubValue = ubList.get(0).getValue();
+        }
+        return ubValue;
+    }
+
+    public Long checkIsValueExist(String type, String keyId)throws Exception {
+        UserBusinessExample example = new UserBusinessExample();
+        example.createCriteria().andTypeEqualTo(type).andKeyIdEqualTo(keyId)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<UserBusiness> list=null;
+        try{
+            list= userBusinessMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        Long id = null;
+        if(list!=null&&list.size() > 0) {
+            id = list.get(0).getId();
+        }
+        return id;
+    }
+
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateBtnStr(String keyId, String type, String btnStr) throws Exception{
+        logService.insertLog("关联关系",
+                new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append("角色的按钮权限").toString(),
+                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
+        UserBusiness userBusiness = new UserBusiness();
+        userBusiness.setBtnStr(btnStr);
+        UserBusinessExample example = new UserBusinessExample();
+        example.createCriteria().andKeyIdEqualTo(keyId).andTypeEqualTo(type);
+        int result=0;
+        try{
+            result=  userBusinessMapper.updateByExampleSelective(userBusiness, example);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/AnnotationUtils.java b/src/main/java/com/jsh/erp/utils/AnnotationUtils.java
new file mode 100644
index 0000000..f1b7373
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/AnnotationUtils.java
@@ -0,0 +1,28 @@
+package com.jsh.erp.utils;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Documented;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class AnnotationUtils {
+    public static <A extends Annotation> A getAnnotation(Class<?> cls, Class<A> annotationClass) {
+        A res = cls.getAnnotation(annotationClass);
+        if (res == null) {
+            for (Annotation annotation : cls.getAnnotations()) {
+                if (annotation instanceof Documented) {
+                    break;
+                }
+                res = getAnnotation(annotation.annotationType(), annotationClass);
+                if (res != null)
+                    break;
+            }
+        }
+        return res;
+    }
+
+    public static <T, A extends Annotation> A getAnnotation(T obj, Class<A> annotationClass) {
+        return getAnnotation(obj.getClass(), annotationClass);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/BaseResponseInfo.java b/src/main/java/com/jsh/erp/utils/BaseResponseInfo.java
new file mode 100644
index 0000000..807d0ea
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/BaseResponseInfo.java
@@ -0,0 +1,11 @@
+package com.jsh.erp.utils;
+
+public class BaseResponseInfo {
+	public int code;
+	public Object data;
+	
+	public BaseResponseInfo() {
+		code = 400;
+		data = null;
+	}
+}
diff --git a/src/main/java/com/jsh/erp/utils/ColumnPropertyUtil.java b/src/main/java/com/jsh/erp/utils/ColumnPropertyUtil.java
new file mode 100644
index 0000000..3d794f1
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ColumnPropertyUtil.java
@@ -0,0 +1,65 @@
+package com.jsh.erp.utils;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class ColumnPropertyUtil {
+
+    /**
+     * 将数据库字段转换成属性
+     */
+    public static String columnToProperty(String column) {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (StringUtil.isEmpty(column)) {
+            // 没必要转换
+            return "";
+        } else if (!column.contains("_")) {
+            // 不做转换
+            return column;
+        } else {
+            // 用下划线将原始字符串分割
+            String[] columns = column.split("_");
+            for (String columnSplit : columns) {
+                // 跳过原始字符串中开头、结尾的下换线或双重下划线
+                if (StringUtil.isEmpty(columnSplit)) {
+                    continue;
+                }
+                // 处理真正的驼峰片段
+                if (result.length() == 0) {
+                    // 第一个驼峰片段,全部字母都小写
+                    result.append(columnSplit.toLowerCase());
+                } else {
+                    // 其他的驼峰片段,首字母大写
+                    result.append(columnSplit.substring(0, 1).toUpperCase()).append(columnSplit.substring(1).toLowerCase());
+                }
+            }
+            return result.toString();
+        }
+
+    }
+
+
+    /**
+     * 驼峰转换下划线
+     */
+    public static String propertyToColumn(String property) {
+        if (StringUtil.isEmpty(property)) {
+            return "";
+        }
+        StringBuilder column = new StringBuilder();
+        column.append(property.substring(0, 1).toLowerCase());
+        for (int i = 1; i < property.length(); i++) {
+            String s = property.substring(i, i + 1);
+            // 在小写字母前添加下划线
+            if (!Character.isDigit(s.charAt(0)) && s.equals(s.toUpperCase())) {
+                column.append("_");
+            }
+            // 其他字符直接转成小写
+            column.append(s.toLowerCase());
+        }
+
+        return column.toString();
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/utils/ComputerInfo.java b/src/main/java/com/jsh/erp/utils/ComputerInfo.java
new file mode 100644
index 0000000..3cac6aa
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ComputerInfo.java
@@ -0,0 +1,137 @@
+package com.jsh.erp.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/*
+ * <取网卡物理地址--
+ * 1.在Windows,Linux系统下均可用;
+ * 2.通过ipconifg,ifconfig获得计算机信息;
+ * 3.再用模式匹配方式查找MAC地址,与操作系统的语言无关>
+ *
+ * //* Description: <取计算机名--从环境变量中取>
+ * abstract 限制继承/创建实例
+ */
+public abstract class ComputerInfo {
+    private static String macAddressStr = null;
+    private static String computerName = System.getenv().get("COMPUTERNAME");
+
+    private static final String[] windowsCommand = { "ipconfig", "/all" };
+    private static final String[] linuxCommand = { "/sbin/ifconfig", "-a" };
+    private static final Pattern macPattern = Pattern.compile(".*((:?[0-9a-f]{2}[-:]){5}[0-9a-f]{2}).*",
+            Pattern.CASE_INSENSITIVE);
+
+    /**
+     * 获取多个网卡地址
+     *
+     * @return
+     * @throws IOException
+     */
+    private final static List<String> getMacAddressList() throws IOException {
+        final ArrayList<String> macAddressList = new ArrayList<String>();
+        final String os = System.getProperty("os.name");
+        final String command[];
+
+        if (os.startsWith("Windows")) {
+            command = windowsCommand;
+        } else if (os.startsWith("Linux")) {
+            command = linuxCommand;
+        } else {
+            throw new IOException("Unknow operating system:" + os);
+        }
+        // 执行命令
+        final Process process = Runtime.getRuntime().exec(command);
+
+        BufferedReader bufReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+        for (String line = null; (line = bufReader.readLine()) != null;) {
+            Matcher matcher = macPattern.matcher(line);
+            if (matcher.matches()) {
+                macAddressList.add(matcher.group(1));
+                // macAddressList.add(matcher.group(1).replaceAll("[-:]",
+                // ""));//去掉MAC中的“-”
+            }
+        }
+
+        process.destroy();
+        bufReader.close();
+        return macAddressList;
+    }
+
+    /**
+     * 获取一个网卡地址(多个网卡时从中获取一个)
+     *
+     * @return
+     */
+    public static String getMacAddress() {
+        if (macAddressStr == null || macAddressStr.equals("")) {
+            StringBuffer sb = new StringBuffer(); // 存放多个网卡地址用,目前只取一个非0000000000E0隧道的值
+            try {
+                List<String> macList = getMacAddressList();
+                for (Iterator<String> iter = macList.iterator(); iter.hasNext();) {
+                    String amac = iter.next();
+                    if (!amac.equals("0000000000E0")) {
+                        sb.append(amac);
+                        break;
+                    }
+                }
+            } catch (IOException ignored) {
+            }
+
+            macAddressStr = sb.toString();
+
+        }
+
+        return macAddressStr;
+    }
+
+    /**
+     * 获取电脑名
+     *
+     * @return
+     */
+    public static String getComputerName() {
+        if (computerName == null || computerName.equals("")) {
+            computerName = System.getenv().get("COMPUTERNAME");
+        }
+        return computerName;
+    }
+
+    /**
+     * 获取客户端IP地址
+     *
+     * @return
+     */
+    public static String getIpAddrAndName() throws IOException {
+        return InetAddress.getLocalHost().toString();
+    }
+
+    /**
+     * 获取客户端IP地址
+     *
+     * @return
+     */
+    public static String getIpAddr() throws IOException {
+        return InetAddress.getLocalHost().getHostAddress().toString();
+    }
+
+    /**
+     * 限制创建实例
+     */
+    private ComputerInfo() {
+
+    }
+
+    public static void main(String[] args) throws IOException {
+        System.out.println(ComputerInfo.getMacAddress());
+        System.out.println(ComputerInfo.getComputerName());
+        System.out.println(ComputerInfo.getIpAddr());
+        System.out.println(ComputerInfo.getIpAddrAndName());
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/Constants.java b/src/main/java/com/jsh/erp/utils/Constants.java
new file mode 100644
index 0000000..e46cb62
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/Constants.java
@@ -0,0 +1,34 @@
+package com.jsh.erp.utils;
+
+import java.util.UUID;
+
+/**
+ * by jishenghua qq-752718920 2018-10-7 12:01:36
+ */
+public class Constants {
+
+    //查询参数
+    public final static String PAGE_SIZE = "pageSize";
+    public final static String CURRENT_PAGE = "currentPage";
+    public final static String ORDER = "order";
+    public final static String FILTER = "filter";
+    public final static String SPLIT = ",";
+    public final static String SEARCH = "search";
+    public final static String DEVICE_ID = "deviceId";
+    public final static String OFFSET = "offset";
+    public final static String ROWS = "rows";
+    public final static String IS_RECURSION = "isRecursion";
+    public final static String IS_RECURSION_VALUE = "1";
+    public final static String IS_QUERYBYNODEID = "isquerybyid";
+    public final static String IS_QUERYBYNODEID_VALUE = "1";
+
+    //级联类别
+    public final static String TYPE = "type";
+
+    //转发
+    public final static String TEAM = "team";
+
+    //增加了角色等级常量
+    public final static String LEVEL="level";
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/utils/ErpInfo.java b/src/main/java/com/jsh/erp/utils/ErpInfo.java
new file mode 100644
index 0000000..2e49d0e
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ErpInfo.java
@@ -0,0 +1,37 @@
+package com.jsh.erp.utils;
+
+/**
+ *
+ */
+public enum ErpInfo {
+    //通过构造传递参数
+    OK(200, "成功"),
+    BAD_REQUEST(400, "请求错误或参数错误"),
+    UNAUTHORIZED(401, "未认证用户"),
+    INVALID_VERIFY_CODE(461, "错误的验证码"),
+    ERROR(500, "服务内部错误"),
+    WARING_MSG(201, "提醒信息"),
+    REDIRECT(301, "session失效,重定向"),
+    FORWARD_REDIRECT(302, "转发请求session失效"),
+    FORWARD_FAILED(303, "转发请求失败!"),
+    TEST_USER(-1, "演示用户禁止操作");
+
+    public final int code;
+    public final String name;
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * 定义枚举构造函数
+     */
+    ErpInfo(int code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/ExcelUtils.java b/src/main/java/com/jsh/erp/utils/ExcelUtils.java
new file mode 100644
index 0000000..961fed7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ExcelUtils.java
@@ -0,0 +1,220 @@
+package com.jsh.erp.utils;
+
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import jxl.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.StringUtils;
+import jxl.format.*;
+import jxl.write.Label;
+import jxl.write.WritableCellFormat;
+import jxl.write.WritableFont;
+import jxl.write.WritableSheet;
+import jxl.write.WritableWorkbook;
+
+import javax.servlet.http.HttpServletResponse;
+
+@Slf4j
+public class ExcelUtils {
+
+	public static InputStream getPathByFileName(String template, String tmpFileName) {
+		File tmpFile = new File(template, tmpFileName);
+		InputStream path = null;
+		//判断文件或文件夹是否存在
+		if (tmpFile.exists()) {
+			try {
+				path = new FileInputStream(tmpFile);
+			} catch (FileNotFoundException e) {
+				log.error("", e);
+			}
+		}
+		return path;
+	}
+
+	/**
+	 * 导出excel,带多sheet
+	 *
+	 * @param wtwb
+	 * @param tip
+	 * @param names
+	 * @param title
+	 * @param index
+	 * @param objects
+	 * @return
+	 * @throws Exception
+	 */
+	public static void exportObjectsManySheet(WritableWorkbook wtwb, String tip,
+											  String[] names, String title, int index, List<String[]> objects) throws Exception {
+		WritableSheet sheet = wtwb.createSheet(title, index);
+		sheet.getSettings().setDefaultColumnWidth(12);
+
+		// 标题的格式-红色
+		WritableFont redWF = new WritableFont(WritableFont.ARIAL, 12,
+				WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE,
+				Colour.RED);
+		WritableCellFormat redWFFC = new WritableCellFormat(redWF);
+		redWFFC.setVerticalAlignment(VerticalAlignment.CENTRE);
+		redWFFC.setBorder(Border.ALL, BorderLineStyle.THIN);
+
+		// 标题的格式-黑色
+		WritableFont blackWF = new WritableFont(WritableFont.ARIAL, 12,
+				WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE,
+				Colour.BLACK);
+		WritableCellFormat blackWFFC = new WritableCellFormat(blackWF);
+		blackWFFC.setVerticalAlignment(VerticalAlignment.CENTRE);
+		blackWFFC.setBorder(Border.ALL, BorderLineStyle.THIN);
+
+		// 设置字体以及单元格格式
+		WritableFont wfont = new WritableFont(WritableFont.createFont("楷书"), 12);
+		WritableCellFormat format = new WritableCellFormat(wfont);
+		format.setAlignment(Alignment.LEFT);
+		format.setVerticalAlignment(VerticalAlignment.TOP);
+		format.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN);
+
+		// 第一行写入提示
+		if(com.jsh.erp.utils.StringUtil.isNotEmpty(tip) && tip.contains("*")) {
+			sheet.addCell(new Label(0, 0, tip, redWFFC));
+		} else {
+			sheet.addCell(new Label(0, 0, tip, blackWFFC));
+		}
+
+		// 第二行写入标题
+		for (int i = 0; i < names.length; i++) {
+			if(StringUtil.isNotEmpty(names[i]) && names[i].contains("*")) {
+				sheet.addCell(new Label(i, 1, names[i], redWFFC));
+			} else {
+				sheet.addCell(new Label(i, 1, names[i], blackWFFC));
+			}
+		}
+
+		// 其余行依次写入数据
+		int rowNum = 2;
+		for (int j = 0; j < objects.size(); j++) {
+			String[] obj = objects.get(j);
+			for (int h = 0; h < obj.length; h++) {
+				sheet.addCell(new Label(h, rowNum, obj[h], format));
+			}
+			rowNum = rowNum + 1;
+		}
+	}
+
+	/**
+	 * 导出excel,带单个sheet
+	 *
+	 * @param fileName
+	 * @param names
+	 * @param title
+	 * @param objects
+	 * @return
+	 * @throws Exception
+	 */
+	public static File exportObjectsOneSheet(String fileName, String tip,
+											 String[] names, String title, List<String[]> objects) throws Exception {
+		File excelFile = new File("/opt/"+ fileName);
+		WritableWorkbook wtwb = Workbook.createWorkbook(excelFile);
+		WritableSheet sheet = wtwb.createSheet(title, 0);
+		sheet.getSettings().setDefaultColumnWidth(12);
+
+		// 标题的格式-红色
+		WritableFont redWF = new WritableFont(WritableFont.ARIAL, 12,
+				WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED);
+		WritableCellFormat redWFFC = new WritableCellFormat(redWF);
+		redWFFC.setVerticalAlignment(VerticalAlignment.CENTRE);
+		redWFFC.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN);
+
+		// 标题的格式-黑色
+		WritableFont blackWF = new WritableFont(WritableFont.ARIAL, 12,
+				WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
+		WritableCellFormat blackWFFC = new WritableCellFormat(blackWF);
+		blackWFFC.setVerticalAlignment(VerticalAlignment.CENTRE);
+		blackWFFC.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN);
+
+		// 设置字体以及单元格格式
+		WritableFont wfont = new WritableFont(WritableFont.createFont("楷书"), 12);
+		WritableCellFormat format = new WritableCellFormat(wfont);
+		format.setAlignment(Alignment.LEFT);
+		format.setVerticalAlignment(VerticalAlignment.TOP);
+		format.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN);
+
+		// 第一行写入提示
+		if(StringUtil.isNotEmpty(tip) && tip.contains("*")) {
+			sheet.addCell(new Label(0, 0, tip, redWFFC));
+		} else {
+			sheet.addCell(new Label(0, 0, tip, blackWFFC));
+		}
+
+		// 第二行写入标题
+		for (int i = 0; i < names.length; i++) {
+			if(StringUtil.isNotEmpty(names[i]) && names[i].contains("*")) {
+				sheet.addCell(new Label(i, 1, names[i], redWFFC));
+			} else {
+				sheet.addCell(new Label(i, 1, names[i], blackWFFC));
+			}
+		}
+
+		// 其余行依次写入数据
+		int rowNum = 2;
+		for (int j = 0; j < objects.size(); j++) {
+			String[] obj = objects.get(j);
+			for (int h = 0; h < obj.length; h++) {
+				sheet.addCell(new Label(h, rowNum, obj[h], format));
+			}
+			rowNum = rowNum + 1;
+		}
+		wtwb.write();
+		wtwb.close();
+		return excelFile;
+	}
+
+	public static String getContent(Sheet src, int rowNum, int colNum) {
+		if(colNum < src.getRow(rowNum).length) {
+			return src.getRow(rowNum)[colNum].getContents().trim();
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * 获取真实的行数,剔除掉空白行
+	 * @param src
+	 * @return
+	 */
+	public static int getRightRows(Sheet src) {
+		int rsRows = src.getRows(); //行数
+		int rsCols = src.getColumns(); //列数
+		int nullCellNum;
+		int rightRows = rsRows;
+		for (int i = 1; i < rsRows; i++) { //统计行中为空的单元格数
+			nullCellNum = 0;
+			for (int j = 0; j < rsCols; j++) {
+				String val = src.getCell(j, i).getContents().trim();
+				if (StringUtils.isEmpty(val)) {
+					nullCellNum++;
+				}
+			}
+			if (nullCellNum >= rsCols) { //如果nullCellNum大于或等于总的列数
+				rightRows--; //行数减一
+			}
+		}
+		return rightRows;
+	}
+
+	public static void downloadExcel(File excelFile, String fileName, HttpServletResponse response) throws Exception{
+		response.setContentType("application/octet-stream");
+		fileName = new String(fileName.getBytes("gbk"),"ISO8859_1");
+		response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + ".xls" + "\"");
+		FileInputStream fis = new FileInputStream(excelFile);
+		OutputStream out = response.getOutputStream();
+
+		int SIZE = 1024 * 1024;
+		byte[] bytes = new byte[SIZE];
+		int LENGTH = -1;
+		while((LENGTH = fis.read(bytes)) != -1){
+			out.write(bytes,0,LENGTH);
+		}
+		out.flush();
+		fis.close();
+	}
+}
diff --git a/src/main/java/com/jsh/erp/utils/ExceptionCodeConstants.java b/src/main/java/com/jsh/erp/utils/ExceptionCodeConstants.java
new file mode 100644
index 0000000..63abf82
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ExceptionCodeConstants.java
@@ -0,0 +1,43 @@
+package com.jsh.erp.utils;
+
+public interface ExceptionCodeConstants {
+    /**
+     * 用户错误码定义
+     */
+    public class UserExceptionCode {
+        /**
+         * 用户不存在
+         */
+        public static final int USER_NOT_EXIST = 1;
+
+        /**
+         * 用户密码错误
+         */
+        public static final int USER_PASSWORD_ERROR = 2;
+
+        /**
+         * 用户被加入黑名单
+         */
+        public static final int BLACK_USER = 3;
+
+        /**
+         * 可以登录
+         */
+        public static final int USER_CONDITION_FIT = 4;
+
+        /**
+         * 访问数据库异常
+         */
+        public static final int USER_ACCESS_EXCEPTION = 5;
+
+        /**
+         * 租户被加入黑名单
+         */
+        public static final int BLACK_TENANT = 6;
+
+        /**
+         * 租户已经过期
+         */
+        public static final int EXPIRE_TENANT = 7;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/ExtJsonUtils.java b/src/main/java/com/jsh/erp/utils/ExtJsonUtils.java
new file mode 100644
index 0000000..55074a0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ExtJsonUtils.java
@@ -0,0 +1,141 @@
+package com.jsh.erp.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.ParserConfig;
+import com.alibaba.fastjson.parser.deserializer.ExtraProcessor;
+import com.alibaba.fastjson.parser.deserializer.FieldDeserializer;
+import com.alibaba.fastjson.serializer.*;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class ExtJsonUtils {
+    private static class NPFloatCodec extends FloatCodec {
+        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType) throws IOException {
+            SerializeWriter out = serializer.getWriter();
+
+            if (object == null) {
+                if (serializer.isEnabled(SerializerFeature.WriteNullNumberAsZero)) {
+                    out.write('0');
+                } else {
+                    out.writeNull();
+                }
+                return;
+            }
+
+            float floatValue = (Float) object;
+
+            if (Float.isNaN(floatValue)) {
+                out.writeNull();
+            } else if (Float.isInfinite(floatValue)) {
+                out.writeNull();
+            } else {
+                String floatText = Float.toString(floatValue);
+                out.write(floatText);
+
+                if (serializer.isEnabled(SerializerFeature.WriteClassName)) {
+                    out.write('F');
+                }
+            }
+        }
+    }
+
+    private static class NPDoubleSerializer extends DoubleSerializer {
+        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType) throws IOException {
+            SerializeWriter out = serializer.getWriter();
+
+            if (object == null) {
+                if (!serializer.isEnabled(SerializerFeature.WriteNullNumberAsZero)) {
+                    out.writeNull();
+                } else {
+                    out.write('0');
+                }
+                return;
+            }
+
+            double doubleValue = (Double) object;
+
+            if (Double.isNaN(doubleValue)) {
+                out.writeNull();
+            } else if (Double.isInfinite(doubleValue)) {
+                out.writeNull();
+            } else {
+                String doubleText;
+                doubleText = Double.toString(doubleValue);
+                out.append(doubleText);
+
+                if (serializer.isEnabled(SerializerFeature.WriteClassName)) {
+                    out.write('D');
+                }
+            }
+        }
+    }
+
+    private static final String EXT_NAME = "ext";
+
+    static class ExtFilter extends AfterFilter implements PropertyFilter {
+        static {
+            SerializeConfig.getGlobalInstance().put(Float.class, new NPFloatCodec());
+            SerializeConfig.getGlobalInstance().put(float.class, new NPFloatCodec());
+            SerializeConfig.getGlobalInstance().put(Double.class, new NPDoubleSerializer());
+            SerializeConfig.getGlobalInstance().put(double.class, new NPDoubleSerializer());
+        }
+
+        private Map<Object, JSONObject> map = new HashMap<>();
+
+        private Map<Object, Set<String>> ignoredKey = new HashMap<>();
+
+        @Override
+        public boolean apply(Object object, String name, Object value) {
+            if (name.equals(EXT_NAME) && value instanceof String) {
+                map.put(object, JSON.parseObject((String) value));
+                return false;
+            }
+            if (!map.containsKey(object)) {
+                ignoredKey.put(object, new HashSet<String>());
+            }
+            ignoredKey.get(object).add(name);
+//            if (value instanceof Float || value instanceof Double) {
+//                if (!floatMap.containsKey(object)) {
+//                    floatMap.put(object, new HashMap<String, Object>());
+//                }
+//                floatMap.get(object).put(name, value);
+//                return false;
+//            }
+            return true;
+        }
+
+        @Override
+        public void writeAfter(Object object) {
+            if (map.containsKey(object)) {
+                Set<String> ignoredKeys;
+                if (ignoredKey.containsKey(object)) {
+                    ignoredKeys = ignoredKey.get(object);
+                } else {
+                    ignoredKeys = new HashSet<>();
+                }
+                for (Map.Entry<String, Object> entry : map.get(object).entrySet()) {
+                    if (!ignoredKeys.contains(entry.getKey())) {
+                        writeKeyValue(entry.getKey(), entry.getValue());
+                    }
+                }
+            }
+        }
+    }
+
+    public static String toJSONString(Object object) {
+        return JSON.toJSONString(object, new ExtFilter());
+    }
+
+    public interface ExtExtractor {
+        String getExt(Object bean);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/FileUtils.java b/src/main/java/com/jsh/erp/utils/FileUtils.java
new file mode 100644
index 0000000..9a07132
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/FileUtils.java
@@ -0,0 +1,320 @@
+package com.jsh.erp.utils;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ *
+ * 文件处理工具类
+ *
+ */
+public class FileUtils {
+
+	/**
+	 * 功 能: 创建文件夹
+	 *
+	 * @param path
+	 *            参 数:要创建的文件夹名称
+	 * @return 返回值: 如果成功true;否则false 如:FileUtils.mkdir("/usr/apps/upload/");
+	 */
+	public static boolean makedir(String path) {
+		File file = new File(path);
+		if (!file.exists())
+			return file.mkdirs();
+		else
+			return true;
+	}
+
+	/**
+	 * 保存文件
+	 *
+	 * @param stream
+	 * @param path
+	 *            存放路径
+	 * @param filename
+	 *            文件名
+	 * @throws IOException
+	 */
+	public static void SaveFileFromInputStream(InputStream stream, String path, String filename)
+			throws IOException {
+		File file = new File(path);
+		boolean flag=true;
+		if(!file.exists()){
+			flag=file.mkdirs();
+		}
+		if(flag){
+			FileOutputStream fs = new FileOutputStream(new File(path+filename));
+			byte[] buffer = new byte[1024 * 1024];
+			int byteread = 0;
+			while ((byteread = stream.read(buffer)) != -1) {
+				fs.write(buffer, 0, byteread);
+				fs.flush();
+			}
+			fs.close();
+			stream.close();
+		}
+	}
+
+
+	/**
+	 * 列出某个目录下的所有文件,子目录不列出
+	 * @param folderPath:文件夹路径
+	 * @return
+	 */
+	public static List<String> listFile(String folderPath){
+		List<String> fileList = new ArrayList<String>(); //FileViewer.getListFiles(destPath, null, false);
+		File f = new File(folderPath);
+		File[] t = f.listFiles();
+		for(int i = 0; i < t.length; i++){
+			fileList.add(t[i].getAbsolutePath());
+		}
+		return fileList;
+	}
+
+
+	/**
+	 * 判断文件是否存在
+	 *
+	 * @param fileName
+	 * @return
+	 */
+	public static boolean exists(String fileName) {
+		File file = new File(fileName);
+		if (file.exists()) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * 获取文件扩展名
+	 *
+	 * @param fileName
+	 * @return
+	 * */
+	public static String getFileExtendName(String fileName) {
+		if (fileName == null) {
+			return "";
+		} else {
+			return fileName.substring(fileName.lastIndexOf(".") + 1, fileName
+					.length());
+		}
+	}
+
+	/**
+	 * 创建一个新文件,如果存在则报错
+	 *
+	 * @param filePath
+	 * @param fileName
+	 * @return
+	 */
+	public static void createFile(String filePath, String fileName)
+			throws RuntimeException {
+		String file = null;
+		if (filePath == null) {
+			file = fileName;
+		} else {
+			file = filePath + File.separator + fileName;
+		}
+		createFile(file);
+	}
+
+	/**
+	 * 创建一个新文件(含路径),如果存在则报错
+	 *
+	 * @param fileName
+	 *            含有路径的文件名
+	 * @return
+	 */
+	public static void createFile(String fileName) throws RuntimeException {
+		File f = new File(fileName);
+		if (f.exists()) {
+			throw new RuntimeException("FILE_EXIST_ERROR");
+		} else {
+			try {
+				File fileFolder = f.getParentFile();
+				if (!fileFolder.exists())
+					fileFolder.mkdirs();
+				f.createNewFile();
+			} catch (IOException ie) {
+				System.out.println("文件" + fileName + "创建失败:" + ie.getMessage());
+				throw new RuntimeException("FILE_CREATE_ERROR");
+			}
+		}
+	}
+
+
+	/**
+	 * 创建目录,如果存在则不创建
+	 *
+	 * @param path
+	 * @return 返回结果null则创建成功,否则返回的是错误信息
+	 * @return
+	 */
+	public static String createDir(String path, boolean isCreateSubPah) {
+		String msg = null;
+		File dir = new File(path);
+
+		if (dir == null) {
+			msg = "不能创建空目录";
+			return msg;
+		}
+		if (dir.isFile()) {
+			msg = "已有同名文件存在";
+			return msg;
+		}
+		if (!dir.exists()) {
+			if (isCreateSubPah && !dir.mkdirs()) {
+				msg = "目录创建失败,原因不明";
+			} else if (!dir.mkdir()) {
+				msg = "目录创建失败,原因不明";
+			}
+		}
+		return msg;
+	}
+
+	/**
+	 * 删除指定目录或文件。 如果要删除是目录,同时删除子目录下所有的文件
+	 *
+	 * @file:File 目录
+	 * */
+	public static void delFileOrFolder(String fileName) {
+		if (!exists(fileName))
+			return;
+		File file = new File(fileName);
+		delFileOrFolder(file);
+	}
+
+	/**
+	 * 删除指定目录或文件。 如果要删除是目录,同时删除子目录下所有的文件
+	 *
+	 * @file:File 目录
+	 * */
+	public static void delFileOrFolder(File file) {
+		if (!file.exists())
+			return;
+		if (file.isFile()) {
+			file.delete();
+		} else {
+			File[] sub = file.listFiles();
+			if (sub == null || sub.length <= 0) {
+				file.delete();
+			} else {
+				for (int i = 0; i < sub.length; i++) {
+					delFileOrFolder(sub[i]);
+				}
+				file.delete();
+			}
+		}
+	}
+
+	/**
+	 * 从Properties格式配置文件中获取所有参数并保存到HashMap中。
+	 * 配置中的key值即map表中的key值,如果配置文件保存时用的中文,则返回结果也会转成中文。
+	 *
+	 * @param file
+	 * @return
+	 * @throws IOException
+	 */
+	@SuppressWarnings("unchecked")
+	public static HashMap readPropertyFile(String file, String charsetName) throws IOException {
+		if (charsetName==null || charsetName.trim().length()==0){
+			charsetName="gbk";
+		}
+		HashMap map = new HashMap();
+		InputStream is =null;
+		if(file.startsWith("file:"))
+			is=new FileInputStream(new File(file.substring(5)));
+		else
+			is=FileUtils.class.getClassLoader().getResourceAsStream(file);
+		Properties properties = new Properties();
+		properties.load(is);
+		Enumeration en = properties.propertyNames();
+		while (en.hasMoreElements()) {
+			String key = (String) en.nextElement();
+			String code = new String(properties.getProperty(key).getBytes(
+					"ISO-8859-1"), charsetName);
+			map.put(key, code);
+		}
+		return map;
+	}
+	/**
+	 *
+	 * @param path
+	 *            文件路径
+	 * @param suffix
+	 *            后缀名
+	 * @param isdepth
+	 *            是否遍历子目录
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public static List getListFiles(String path, String suffix, boolean isdepth) {
+		File file = new File(path);
+		return FileUtils.listFile(file, suffix, isdepth);
+	}
+
+	/**
+	 * @param f
+	 * @param suffix:后缀名
+	 * @param isdepth:是否遍历子目录
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public static List listFile(File f, String suffix, boolean isdepth) {
+		// 是目录,同时需要遍历子目录
+		List<String> fileList = new ArrayList<String>();
+		if (f.isDirectory() && isdepth == true) {
+			File[] t = f.listFiles();
+			for (int i = 0; i < t.length; i++) {
+				listFile(t[i], suffix, isdepth);
+			}
+		} else {
+			String filePath = f.getAbsolutePath();
+
+			if (suffix != null) {
+				int begIndex = filePath.lastIndexOf(".");// 最后一个.(即后缀名前面的.)的索引
+				String tempsuffix = "";
+
+				if (begIndex != -1)// 防止是文件但却没有后缀名结束的文件
+				{
+					tempsuffix = filePath.substring(begIndex + 1, filePath
+							.length());
+				}
+
+				if (tempsuffix.equals(suffix)) {
+					fileList.add(filePath);
+				}
+			} else {
+				// 后缀名为null则为所有文件
+				fileList.add(filePath);
+			}
+
+		}
+
+		return fileList;
+	}
+
+	/**
+	 * 判断文件名是否带盘符,重新处理
+	 * @param fileName
+	 * @return
+	 */
+	public static String getFileName(String fileName){
+		//判断是否带有盘符信息
+		// Check for Unix-style path
+		int unixSep = fileName.lastIndexOf('/');
+		// Check for Windows-style path
+		int winSep = fileName.lastIndexOf('\\');
+		// Cut off at latest possible point
+		int pos = (winSep > unixSep ? winSep : unixSep);
+		if (pos != -1)  {
+			// Any sort of path separator found...
+			fileName = fileName.substring(pos + 1);
+		}
+		//替换上传文件名字的特殊字符
+		fileName = fileName.replace("=","").replace(",","").replace("&","");
+		return fileName;
+	}
+}
diff --git a/src/main/java/com/jsh/erp/utils/HttpClient.java b/src/main/java/com/jsh/erp/utils/HttpClient.java
new file mode 100644
index 0000000..b455df0
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/HttpClient.java
@@ -0,0 +1,88 @@
+package com.jsh.erp.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.EntityBuilder;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import static org.apache.http.HttpStatus.SC_OK;
+
+public final class HttpClient {
+    private static Logger logger = LoggerFactory.getLogger(HttpClient.class);
+
+    private static final RequestConfig REQUEST_CONFIG = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(10000).build();
+
+    /**
+     * 采用Get方式发送请求,获取响应数据
+     * @param url
+     * @return
+     */
+    public static JSONObject httpGet(String url){
+        CloseableHttpClient client = HttpClientBuilder.create().build();
+        HttpGet httpGet = new HttpGet(url);
+        httpGet.setConfig(REQUEST_CONFIG);
+        try {
+            CloseableHttpResponse chr = client.execute(httpGet);
+            int statusCode = chr.getStatusLine().getStatusCode();
+            if (SC_OK != statusCode) {
+                throw new RuntimeException(String.format("%s查询出现异常", url));
+            }
+            String entity = EntityUtils.toString(chr.getEntity(), StandardCharsets.UTF_8);
+            JSONObject object = JSONObject.parseObject(entity);
+            return object;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            throw new RuntimeException(String.format("%s", url) + "查询出现异常");
+        } finally {
+            try {
+                client.close();
+            } catch (IOException e) {
+                logger.error(e.getMessage(), e);
+            }
+        }
+    }
+
+    /**
+     * 采用Post方式发送请求,获取响应数据
+     *
+     * @param url        url地址
+     * @param param  参数值键值对的字符串
+     * @return
+     */
+    public static String httpPost(String url, String param) {
+        CloseableHttpClient client = HttpClientBuilder.create().build();
+        try {
+            HttpPost post = new HttpPost(url);
+            EntityBuilder builder = EntityBuilder.create();
+            builder.setContentType(ContentType.APPLICATION_JSON);
+            builder.setText(param);
+            post.setEntity(builder.build());
+
+            CloseableHttpResponse response = client.execute(post);
+            int statusCode = response.getStatusLine().getStatusCode();
+
+            HttpEntity entity = response.getEntity();
+            String data = EntityUtils.toString(entity, StandardCharsets.UTF_8);
+            logger.info("状态:"+statusCode+"数据:"+data);
+            return data;
+        } catch(Exception e){
+            throw new RuntimeException(e.getMessage());
+        } finally {
+            try{
+                client.close();
+            }catch(Exception ex){ }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/utils/JsonUtils.java b/src/main/java/com/jsh/erp/utils/JsonUtils.java
new file mode 100644
index 0000000..131684c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/JsonUtils.java
@@ -0,0 +1,22 @@
+package com.jsh.erp.utils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * Created by jishenghua 2018-5-11 09:48:08
+ *
+ * @author jishenghua
+ */
+public class JsonUtils {
+
+    public static JSONObject ok(){
+        JSONObject obj = new JSONObject();
+        JSONObject tmp = new JSONObject();
+        tmp.put("message", "成功");
+        obj.put("code", 200);
+        obj.put("data", tmp);
+        return obj;
+    }
+
+}
diff --git a/src/main/java/com/jsh/erp/utils/OrderUtils.java b/src/main/java/com/jsh/erp/utils/OrderUtils.java
new file mode 100644
index 0000000..b16c6ea
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/OrderUtils.java
@@ -0,0 +1,69 @@
+package com.jsh.erp.utils;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class OrderUtils {
+
+    /**
+     * 将指定字段排序
+     *
+     * @param orders 格式 属性名,排序方式 例如( name,asc或ip,desc)
+     * @return 排序字符串 例如:(name asc 或 ip desc)
+     */
+    public static String getOrderString(String orders) {
+        if (StringUtil.isNotEmpty(orders)) {
+            String[] splits = orders.split(Constants.SPLIT);
+            if (splits.length == 2) {
+                String column = ColumnPropertyUtil.propertyToColumn(splits[0]);
+                if (column.equals("audit_status")) {
+                    // TODO: 2015/12/24 这么处理不好,得相伴办法调整
+                    return "IF(`audit_status`=3,-1,`audit_status`) " + splits[1];
+                } else if (column.equals("create_time") || column.equals("modify_time")) {
+                    // TODO: 2015/12/24 这么处理不好,得相伴办法调整
+                    return column + " " + splits[1];
+                } else {
+                    return "convert(" + column + " using gbk) " + splits[1];
+                }
+            }
+        }
+        return "";
+    }
+
+    public static String getJoinTablesOrderString(String orders, String tableName) {
+        if (StringUtil.isNotEmpty(orders)) {
+            String[] splits = orders.split(Constants.SPLIT);
+            if (splits.length == 2) {
+                return "convert(" + tableName + "." + ColumnPropertyUtil.propertyToColumn(splits[0]) + " using gbk) " + splits[1];
+            }
+        }
+        return "";
+    }
+
+
+    /**
+     * 将指定字段排序
+     * inet_aton:mysql将IP 转成 long类别函数
+     *
+     * @param orders         格式 属性名,排序方式 例如( name,asc或ip,desc)
+     * @param ipPropertyName 如果需要按IP属性排序,需要将属性名传入(可不传)
+     * @return 排序字符串 例如:(name asc 或 ip desc)
+     */
+    public static String getOrderString(String orders, String... ipPropertyName) {
+        if (StringUtil.isNotEmpty(orders)) {
+            String[] splits = orders.split(Constants.SPLIT);
+            if (splits.length == 2) {
+                String column = ColumnPropertyUtil.propertyToColumn(splits[0]);
+                if (ipPropertyName != null && ipPropertyName.length > 0) {
+                    for (String ip : ipPropertyName) {
+                        if (ip.equals(column)) {
+                            return "inet_aton(" + column + ") " + splits[1];
+                        }
+                    }
+                }
+                return column + " " + splits[1];
+            }
+        }
+        return "";
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/PageQueryInfo.java b/src/main/java/com/jsh/erp/utils/PageQueryInfo.java
new file mode 100644
index 0000000..0283c8d
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/PageQueryInfo.java
@@ -0,0 +1,30 @@
+package com.jsh.erp.utils;
+
+import java.util.List;
+
+/**
+ * 分页查询结果
+ *
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class PageQueryInfo {
+
+    private Long total;
+    private List<?> rows;
+
+    public Long getTotal() {
+        return total;
+    }
+
+    public void setTotal(Long total) {
+        this.total = total;
+    }
+
+    public List<?> getRows() {
+        return rows;
+    }
+
+    public void setRows(List<?> rows) {
+        this.rows = rows;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/ParamUtils.java b/src/main/java/com/jsh/erp/utils/ParamUtils.java
new file mode 100644
index 0000000..ed0e685
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ParamUtils.java
@@ -0,0 +1,57 @@
+package com.jsh.erp.utils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class ParamUtils {
+    public static String getPageOffset(Integer currentPage, Integer pageSize) {
+        if (currentPage != null && pageSize != null) {
+            int offset = (currentPage - 1) * pageSize;
+            if (offset <= 0) {
+                return "0";
+            } else {
+                return new StringBuffer().append(offset).toString();
+            }
+        }
+        return null;
+    }
+    public static Integer getNumberPageOffset(Integer currentPage, Integer pageSize) {
+        if (currentPage != null && pageSize != null) {
+            int offset = (currentPage - 1) * pageSize;
+            if (offset <= 0) {
+                return 0;
+            } else {
+                return offset;
+            }
+        }
+        return null;
+    }
+    public static Integer getNumberPageRows(Integer currentPage, Integer pageSize) {
+        if (currentPage != null && pageSize != null) {
+            int rows = (currentPage) * pageSize;
+            if (rows <= 0) {
+                return 0;
+            } else {
+                return rows;
+            }
+        }
+        return null;
+    }
+
+    public static HashMap<String, String> requestToMap(HttpServletRequest request) {
+
+        HashMap<String, String> parameterMap = new HashMap<String, String>();
+        Enumeration<String> names = request.getParameterNames();
+        if (names != null) {
+            for (String name : Collections.list(names)) {
+                parameterMap.put(name, request.getParameter(name));
+            }
+        }
+        return parameterMap;
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/PinYinUtil.java b/src/main/java/com/jsh/erp/utils/PinYinUtil.java
new file mode 100644
index 0000000..4588b36
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/PinYinUtil.java
@@ -0,0 +1,52 @@
+package com.jsh.erp.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+
+/**
+ * @Author jishenghua
+ * @Date 2024-01-08 23:03
+ */
+@Slf4j
+public class PinYinUtil {
+
+    public static String getFirstLettersLo(String ChineseLanguage) {
+        return getFirstLetters(ChineseLanguage, HanyuPinyinCaseType.LOWERCASE);
+    }
+
+    public static String getFirstLetters(String chineseLanguage, HanyuPinyinCaseType caseType) {
+        char[] cl_chars = chineseLanguage.trim().toCharArray();
+        StringBuilder pinyin = new StringBuilder();
+        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+        // 输出拼音全部大写
+        defaultFormat.setCaseType(caseType);
+        // 不带声调
+        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+        try {
+            for (char cl_char : cl_chars) {
+                String str = String.valueOf(cl_char);
+                if (str.matches("[\u4e00-\u9fa5]+")) {
+                    // 如果字符是中文,则将中文转为汉语拼音,并取第一个字母
+                    pinyin.append(PinyinHelper.toHanyuPinyinStringArray(cl_char, defaultFormat)[0].substring(0, 1));
+                } else if (str.matches("[0-9]+")) {
+                    // 如果字符是数字,取数字
+                    pinyin.append(cl_char);
+                } else if (str.matches("[a-zA-Z]+")) {
+                    // 如果字符是字母,取字母
+                    pinyin.append(cl_char);
+                } else {
+                    // 否则不转换
+                    //如果是标点符号的话,带着
+                    pinyin.append(cl_char);
+                }
+            }
+        } catch (BadHanyuPinyinOutputFormatCombination e) {
+            log.error(chineseLanguage + "转拼音失败!", e);
+        }
+        return pinyin.toString();
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/QueryUtils.java b/src/main/java/com/jsh/erp/utils/QueryUtils.java
new file mode 100644
index 0000000..531b715
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/QueryUtils.java
@@ -0,0 +1,142 @@
+package com.jsh.erp.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.util.Assert;
+
+import java.util.List;
+import java.util.Map;
+
+import static com.jsh.erp.utils.Constants.CURRENT_PAGE;
+import static com.jsh.erp.utils.Constants.PAGE_SIZE;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class QueryUtils {
+    public static String filterSqlSpecialChar(String search) {
+        return search != null ? search
+                .replaceAll("_", "\\\\_")
+                .replaceAll("!", "\\\\!")
+                .replaceAll("\\[", "\\\\[")
+                .replaceAll("\\]", "\\\\]")
+                .replaceAll("\\^", "\\\\^") : null;
+    }
+
+    public static <T> T list2One(List<T> list, String label) {
+        Assert.notNull(label);
+        Assert.notEmpty(list, label + "对应的记录不存在");
+        Assert.isTrue(list.size() == 1, label + "对应的记录不止一个");
+        return list.get(0);
+    }
+
+    public static <T> T list2One(List<T> list, String label, T defaultValue) {
+        Assert.notNull(list);
+        Assert.notNull(label);
+        if (list.isEmpty())
+            return defaultValue;
+        else {
+            Assert.isTrue(list.size() == 1, label + "对应的记录不止一个");
+            return list.get(0);
+        }
+    }
+
+    public static List<String> search(Map<String, String> map) {
+        List<String> search = null;
+
+        String str = map.get(Constants.SEARCH);
+        if (StringUtil.isNotEmpty(str)) {
+            search = StringUtil.searchCondition(str);
+        }
+        return search;
+    }
+
+    public static int rows(Map<String, String> map) {
+        return Integer.parseInt(map.get(PAGE_SIZE));
+    }
+
+    public static int offset(Map<String, String> map) {
+        return (currentPage(map) - 1) * pageSize(map);
+    }
+
+    public static int pageSize(Map<String, String> map) {
+        return Integer.parseInt(map.get(PAGE_SIZE));
+    }
+
+    public static int currentPage(Map<String, String> map) {
+        int val = Integer.parseInt(map.get(CURRENT_PAGE));
+        if (val < 1)
+            throw new RuntimeException("当前页数目:" + val + " 必须大于0");
+        return val;
+    }
+
+    public static String order(Map<String, String> map) {
+        String orderString = OrderUtils.getOrderString(map.get(Constants.ORDER));
+        return orderString.trim().isEmpty() ? null : orderString;
+    }
+
+    public static Integer level(Map<String, String> map) {
+        String levelString = map.get(Constants.LEVEL);
+        return StringUtil.isEmpty(levelString) ? null : Integer.parseInt(levelString);
+    }
+
+    public static boolean isRecursion(Map<String, String> map) {
+        String isRecursion = map.get(Constants.IS_RECURSION);
+        return StringUtil.isNotEmpty(isRecursion) && Constants.IS_RECURSION_VALUE.equals(isRecursion);
+    }
+
+    public static int type(Map<String, String> map) {
+        return Integer.parseInt(map.get(Constants.TYPE));
+    }
+
+    public static String filter(Map<String, String> map) {
+        if (map.containsKey(Constants.FILTER)) {
+            JSONArray array = JSON.parseArray(map.get(Constants.FILTER));
+            if (array.isEmpty()) {
+                return null;
+            } else {
+                boolean first = true;
+                StringBuilder builder = new StringBuilder();
+                for (int idx = 0; idx < array.size(); ++idx) {
+                    JSONObject object = array.getJSONObject(idx);
+                    if (object.get("value") instanceof JSONArray) {
+
+                        JSONArray value = object.getJSONArray("value");
+
+                        if (!value.isEmpty()) {
+                            if (!first) {
+                                builder.append(" AND ");
+                            } else {
+                                first = false;
+                            }
+
+                            String key = object.getString("name");
+
+                            builder.append("(");
+
+                            builder.append("`").append(key).append("`");
+
+                            builder.append(" IN ");
+
+                            builder.append("(");
+
+                            for (int vidx = 0; vidx < value.size(); ++vidx) {
+                                if (vidx != 0) {
+                                    builder.append(",");
+                                }
+                                builder.append(value.getString(vidx));
+                            }
+                            builder.append(")");
+
+                            builder.append(")");
+                        }
+                    }
+                }
+                return builder.toString();
+            }
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/RandImageUtil.java b/src/main/java/com/jsh/erp/utils/RandImageUtil.java
new file mode 100644
index 0000000..f9ffd0c
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/RandImageUtil.java
@@ -0,0 +1,140 @@
+package com.jsh.erp.utils;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Base64;
+import java.util.Random;
+
+/**
+ * 登录验证码工具类
+ */
+public class RandImageUtil {
+
+    public static final String key = "JEECG_LOGIN_KEY";
+
+    /**
+     * 定义图形大小
+     */
+    private static final int width = 105;
+    /**
+     * 定义图形大小
+     */
+    private static final int height = 35;
+
+    /**
+     * 定义干扰线数量
+     */
+    private static final int count = 200;
+
+    /**
+     * 干扰线的长度=1.414*lineWidth
+     */
+    private static final int lineWidth = 2;
+
+    /**
+     * 图片格式
+     */
+    private static final String IMG_FORMAT = "JPEG";
+
+    /**
+     * base64 图片前缀
+     */
+    private static final String BASE64_PRE = "data:image/jpg;base64,";
+
+    /**
+     * 直接通过response 返回图片
+     * @param response
+     * @param resultCode
+     * @throws IOException
+     */
+    public static void generate(HttpServletResponse response, String resultCode) throws IOException {
+        BufferedImage image = getImageBuffer(resultCode);
+        // 输出图象到页面
+        ImageIO.write(image, IMG_FORMAT, response.getOutputStream());
+    }
+
+    /**
+     * 生成base64字符串
+     * @param resultCode
+     * @return
+     * @throws IOException
+     */
+    public static String generate(String resultCode) throws IOException {
+        BufferedImage image = getImageBuffer(resultCode);
+
+        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+        //写入流中
+        ImageIO.write(image, IMG_FORMAT, byteStream);
+        //转换成字节
+        byte[] bytes = byteStream.toByteArray();
+        //转换成base64串
+        String base64 = Base64.getEncoder().encodeToString(bytes).trim();
+        base64 = base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
+
+        //写到指定位置
+        //ImageIO.write(bufferedImage, "png", new File(""));
+
+        return BASE64_PRE+base64;
+    }
+
+    private static BufferedImage getImageBuffer(String resultCode){
+        // 在内存中创建图象
+        final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        // 获取图形上下文
+        final Graphics2D graphics = (Graphics2D) image.getGraphics();
+        // 设定背景颜色
+        graphics.setColor(Color.WHITE); // ---1
+        graphics.fillRect(0, 0, width, height);
+        // 设定边框颜色
+//		graphics.setColor(getRandColor(100, 200)); // ---2
+        graphics.drawRect(0, 0, width - 1, height - 1);
+
+        final Random random = new Random();
+        // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
+        for (int i = 0; i < count; i++) {
+            graphics.setColor(getRandColor(150, 200)); // ---3
+
+            final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内
+            final int y = random.nextInt(height - lineWidth - 1) + 1;
+            final int xl = random.nextInt(lineWidth);
+            final int yl = random.nextInt(lineWidth);
+            graphics.drawLine(x, y, x + xl, y + yl);
+        }
+        // 取随机产生的认证码
+        for (int i = 0; i < resultCode.length(); i++) {
+            // 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
+            // graphics.setColor(new Color(20 + random.nextInt(130), 20 + random
+            // .nextInt(130), 20 + random.nextInt(130)));
+            // 设置字体颜色
+            graphics.setColor(Color.BLACK);
+            // 设置字体样式
+//			graphics.setFont(new Font("Arial Black", Font.ITALIC, 18));
+            graphics.setFont(new Font("Times New Roman", Font.BOLD, 24));
+            // 设置字符,字符间距,上边距
+            graphics.drawString(String.valueOf(resultCode.charAt(i)), (23 * i) + 8, 26);
+        }
+        // 图象生效
+        graphics.dispose();
+        return image;
+    }
+
+    private static Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色
+        final Random random = new Random();
+        if (fc > 255) {
+            fc = 255;
+        }
+        if (bc > 255) {
+            bc = 255;
+        }
+
+        final int r = fc + random.nextInt(bc - fc);
+        final int g = fc + random.nextInt(bc - fc);
+        final int b = fc + random.nextInt(bc - fc);
+
+        return new Color(r, g, b);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/RegExpTools.java b/src/main/java/com/jsh/erp/utils/RegExpTools.java
new file mode 100644
index 0000000..95a4231
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/RegExpTools.java
@@ -0,0 +1,154 @@
+package com.jsh.erp.utils;
+
+import org.springframework.util.Assert;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Adm on 2015/12/14.
+ *
+ * @author yubiao
+ *         <p/>
+ *         mysql匹配正则表达式
+ */
+public class RegExpTools {
+    /**
+     * @param search 模糊匹配字符串数组
+     */
+    public static String regexp(List<String> search) {
+        if (search == null || search.isEmpty())
+            return null;
+        String regexp = "";
+        for (String s : search) {
+            if (!regexp.isEmpty()) {
+                regexp = regexp + "|";
+            }
+            regexp = regexp + ".*";
+            regexp = regexp + s.replaceAll("\\.", "\\\\.");
+            regexp = regexp + ".*";
+        }
+        return regexp;
+    }
+
+    /**
+     * @param key    json字段key
+     * @param search 模糊匹配字符串数组
+     *               json的mysql匹配正则表达式
+     */
+    public static String regexp(String key, List<String> search) {
+        if (search == null || search.isEmpty())
+            return null;
+        StringBuilder sb = new StringBuilder();
+        for (String s : search) {
+            if (sb.length() == 0) {
+                sb.append(".*\\\"").append(key).append("\\\":\\\"[a-zA-Z0-9]*(");
+            } else {
+                sb.append("|");
+            }
+            sb.append(s);
+        }
+        sb.append(")[a-zA-Z0-9]*\\\".*");
+        return sb.toString();
+    }
+
+    public static class RegExp {
+        public static final String ANY = ".*";
+        public static final String QUOTE = "\\\"";
+        public static final String LFT_PAREN = "(";
+        public static final String RHT_PAREN = ")";
+        public static final String COLON = ":";
+        public static final String OR = "|";
+
+        private final StringBuilder builder = new StringBuilder();
+
+        public RegExp any() {
+            builder.append(ANY);
+            return this;
+        }
+
+        public RegExp lftParen() {
+            builder.append(LFT_PAREN);
+            return this;
+        }
+
+        public RegExp rhtParen() {
+            builder.append(RHT_PAREN);
+            return this;
+        }
+
+        public RegExp colon() {
+            builder.append(COLON);
+            return this;
+
+        }
+
+        public RegExp quote() {
+            builder.append(QUOTE);
+            return this;
+        }
+
+        public RegExp quote(String str) {
+            Assert.notNull(str, "str为空");
+            builder.append(QUOTE).append(str).append(QUOTE);
+            return this;
+        }
+
+        public RegExp value(String str) {
+            Assert.notNull(str, "str为空");
+            builder.append(str);
+            return this;
+        }
+
+        public RegExp or() {
+            builder.append(OR);
+            return this;
+        }
+
+        public RegExp or(List<String> values) {
+            Assert.notEmpty(values, "values必须非空");
+            lftParen();
+            boolean first = true;
+            for (String value : values) {
+                if (first) {
+                    builder.append(value);
+                    first = false;
+                } else {
+                    builder.append(OR).append(value);
+                }
+            }
+            rhtParen();
+            return this;
+        }
+
+        @Override
+        public String toString() {
+            return builder.toString();
+        }
+
+        public static void main(String[] args) {
+            List<String> values = new ArrayList<String>();
+
+            values.add("310");
+            values.add(String.valueOf(2));
+            values.add(String.valueOf(3));
+
+            RegExp exp = new RegExp();
+
+            exp.any();
+            exp.quote("fullKbNum").colon()
+                    .quote()
+                    .value("[a-zA-Z0-9]*").or(values).value("[a-zA-Z0-9]*")
+                    .quote();
+            exp.or();
+            exp.quote("gbId[a-f0-9-]{36}").colon()
+                    .quote()
+                    .value("[0-9]*").or(values).value("[0-9]*")
+                    .quote();
+            exp.any();
+
+            System.out.println(exp);
+        }
+
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/ResponseCode.java b/src/main/java/com/jsh/erp/utils/ResponseCode.java
new file mode 100644
index 0000000..ea765f7
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ResponseCode.java
@@ -0,0 +1,24 @@
+package com.jsh.erp.utils;
+
+import com.alibaba.fastjson.annotation.JSONCreator;
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class ResponseCode {
+
+    public final int code;
+    public final Object data;
+
+    /**
+     *
+     * @param code
+     * @param data
+     */
+    @JSONCreator
+    public ResponseCode(@JSONField(name = "code") int code, @JSONField(name = "data")Object data) {
+        this.code = code;
+        this.data = data;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java b/src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java
new file mode 100644
index 0000000..2f7fee3
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java
@@ -0,0 +1,83 @@
+package com.jsh.erp.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.serializer.ValueFilter;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+
+public class ResponseJsonUtil {
+    public static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd");
+
+    static {
+        FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+    }
+
+    /**
+     * 响应过滤器
+     */
+    public static final class ResponseFilter extends ExtJsonUtils.ExtFilter implements ValueFilter {
+        @Override
+        public Object process(Object object, String name, Object value) {
+            if (name.equals("createTime") || name.equals("modifyTime")||name.equals("updateTime")) {
+                return value;
+            } else if (value instanceof Date) {
+                return FORMAT.format(value);
+            } else {
+                return value;
+            }
+        }
+    }
+
+    /**
+     *
+     * @param responseCode
+     * @return
+     */
+    public static String backJson4HttpApi(ResponseCode responseCode) {
+        if (responseCode != null) {
+            String result = JSON.toJSONString(responseCode, new ResponseFilter(),
+                    SerializerFeature.DisableCircularReferenceDetect,
+                    SerializerFeature.WriteNonStringKeyAsString);
+            result = result.replaceFirst("\"data\":\\{", "");
+            return result.substring(0, result.length() - 1);
+        }
+        return null;
+    }
+
+    /**
+     * 验证失败的json串
+     * @param code
+     * @return
+     */
+    public static String backJson4VerifyFailure(int code) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("message", "未通过验证");
+        return JSON.toJSONString(new ResponseCode(code, map), new ResponseFilter(),
+                SerializerFeature.DisableCircularReferenceDetect,
+                SerializerFeature.WriteNonStringKeyAsString);
+    }
+
+    /**
+     * 成功的json串
+     * @param responseCode
+     * @return
+     */
+    public static String backJson(ResponseCode responseCode) {
+        if (responseCode != null) {
+            return JSON.toJSONString(responseCode, new ResponseFilter(),
+                    SerializerFeature.DisableCircularReferenceDetect,
+                    SerializerFeature.WriteNonStringKeyAsString);
+        }
+        return null;
+    }
+
+    public static String returnJson(Map<String, Object> map, String message, int code) {
+        map.put("message", message);
+        return backJson(new ResponseCode(code, map));
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/StringUtil.java b/src/main/java/com/jsh/erp/utils/StringUtil.java
new file mode 100644
index 0000000..7937e31
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/StringUtil.java
@@ -0,0 +1,373 @@
+package com.jsh.erp.utils;
+
+import org.springframework.util.StringUtils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * @author jishenghua qq752718920  2018-10-7 15:26:27
+ */
+public class StringUtil {
+
+    private StringUtil() {
+
+    }
+
+    private static String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+    public final static String regex = "'|#|%|;|--| and | and|and | or | or|or | not | not|not " +
+            "| use | use|use | insert | insert|insert | delete | delete|delete | update | update|update " +
+            "| select | select|select | count | count|count | group | group|group | union | union|union " +
+            "| create | create|create | drop | drop|drop | truncate | truncate|truncate | alter | alter|alter " +
+            "| grant | grant|grant | execute | execute|execute | exec | exec|exec | xp_cmdshell | xp_cmdshell|xp_cmdshell " +
+            "| call | call|call | declare | declare|declare | source | source|source | sql | sql|sql ";
+
+    public static String filterNull(String str) {
+        if (str == null) {
+            return "";
+        } else {
+            return str.trim();
+        }
+    }
+
+    public static boolean stringEquels(String source,String target) {
+        if(isEmpty(source)||isEmpty(target)){
+            return false;
+        }else{
+            return source.equals(target);
+        }
+    }
+
+    public static boolean isEmpty(String str) {
+        return str == null || "".equals(str.trim());
+    }
+
+    public static boolean isNotEmpty(String str) {
+        return !isEmpty(str);
+    }
+
+    public static String getSysDate(String format) {
+        if (StringUtil.isEmpty(format)) {
+            format = DEFAULT_FORMAT;
+        }
+        SimpleDateFormat df = new SimpleDateFormat(format);
+        return df.format(new Date());
+    }
+
+    public static Date getDateByString(String date, String format) {
+        if (StringUtil.isEmpty(format)) {
+            format = DEFAULT_FORMAT;
+        }
+        if (StringUtil.isNotEmpty(date)) {
+            SimpleDateFormat sdf = new SimpleDateFormat(format);
+            try {
+                return sdf.parse(date);
+            } catch (ParseException e) {
+                throw new RuntimeException("转换为日期类型错误:DATE:" + date + "  FORMAT:" + format);
+            }
+        } else {
+            return null;
+        }
+    }
+
+    public static Date getDateByLongDate(Long millis) {
+        if (millis == null) {
+            return new Date();
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.setTimeInMillis(millis);
+        return cal.getTime();
+
+    }
+
+    public static UUID stringToUUID(String id) {
+        if (StringUtil.isNotEmpty(id)) {
+            return UUID.fromString(id);
+        } else {
+            return null;
+        }
+    }
+
+    public static Integer parseInteger(String str) {
+        if (StringUtil.isNotEmpty(str)) {
+            return Integer.parseInt(str);
+        } else {
+            return null;
+        }
+    }
+
+    public static Long parseStrLong(String str) {
+        if (StringUtil.isNotEmpty(str)) {
+            return Long.parseLong(str);
+        } else {
+            return null;
+        }
+    }
+
+    public static List<UUID> listToUUID(List<String> listStrs) {
+        if (listStrs != null && listStrs.size() > 0) {
+            List<UUID> uuidList = new ArrayList<UUID>();
+            for (String str : listStrs) {
+                uuidList.add(UUID.fromString(str));
+            }
+            return uuidList;
+        } else {
+            return null;
+        }
+    }
+
+    public static List<UUID> arrayToUUIDList(String[] uuids) {
+        if (uuids != null && uuids.length > 0) {
+            List<UUID> uuidList = new ArrayList<UUID>();
+            for (String str : uuids) {
+                uuidList.add(UUID.fromString(str));
+            }
+            return uuidList;
+        } else {
+            return null;
+        }
+    }
+
+    //是否是JSON
+    public static boolean containsAny(String str, String... flag) {
+        if (str != null) {
+            if (flag == null || flag.length == 0) {
+                flag = "[-{-}-]-,".split("-");
+            }
+            for (String s : flag) {
+                if (str.contains(s)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    public static String getModifyOrgOperateData(UUID resourceId, UUID orgId) {
+        if (resourceId != null && orgId != null) {
+            Map<UUID, UUID> map = new HashMap<UUID, UUID>();
+            map.put(resourceId, orgId);
+            return JSON.toJSONString(map);
+        }
+        return "";
+    }
+
+    public static String[] listToStringArray(List<String> list) {
+        if (list != null && !list.isEmpty()) {
+            return list.toArray(new String[list.size()]);
+        }
+        return new String[0];
+    }
+
+    public static Long[] listToLongArray(List<Long> list) {
+        if (list != null && !list.isEmpty()) {
+            return list.toArray(new Long[list.size()]);
+        }
+        return new Long[0];
+    }
+
+    public static List<String> stringToListArray(String[] strings) {
+        if (strings != null && strings.length > 0) {
+            return Arrays.asList(strings);
+        }
+        return new ArrayList<String>();
+    }
+
+    public static BigDecimal getArrSum(String[] strings) {
+        BigDecimal sum = BigDecimal.ZERO;
+        for(int i=0;i<strings.length;i++){
+            sum = sum.add(new BigDecimal(strings[i]));
+        }
+        return sum;
+    }
+
+    /**
+     * String字符串转成List<Long>数据格式
+     * String str = "1,2,3,4,5,6" -> List<Long> listLong [1,2,3,4,5,6];
+     *
+     * @param strArr
+     * @return
+     */
+    public static List<Long> strToLongList(String strArr) {
+        List<Long> idList=new ArrayList<Long>();
+        String[] d=strArr.split(",");
+        for (int i = 0, size = d.length; i < size; i++) {
+            if(d[i]!=null) {
+                idList.add(Long.parseLong(d[i]));
+            }
+        }
+        return idList;
+    }
+
+    /**
+     * String字符串转成List<BigDecimal>数据格式
+     * String str = "1,2,3,4,5,6" -> List<BigDecimal> listBigDecimal [1,2,3,4,5,6];
+     *
+     * @param strArr
+     * @return
+     */
+    public static List<BigDecimal> strToBigDecimalList(String strArr) {
+        List<BigDecimal> idList=new ArrayList<>();
+        String[] d=strArr.split(",");
+        for (int i = 0, size = d.length; i < size; i++) {
+            if(d[i]!=null) {
+                idList.add(new BigDecimal(d[i]));
+            }
+        }
+        return idList;
+    }
+
+    /**
+     * String字符串转成List<String>数据格式
+     * String str = "1,2,3,4,5,6" -> List<Long> listLong [1,2,3,4,5,6];
+     *
+     * @param strArr
+     * @return
+     */
+    public static List<String> strToStringList(String strArr) {
+        if(StringUtils.isEmpty(strArr)){
+            return null;
+        }
+        List<String> idList=new ArrayList<String>();
+        String[] d=strArr.split(",");
+        for (int i = 0, size = d.length; i < size; i++) {
+            if(d[i]!=null) {
+                idList.add(d[i].toString());
+            }
+        }
+        return idList;
+    }
+
+    public static List<String> searchCondition(String search) {
+        if (isEmpty(search)) {
+            return new ArrayList<String>();
+        }else{
+            //String[] split = search.split(" ");
+			String[] split = search.split("#");
+            return stringToListArray(split);
+        }
+    }
+
+    public static String getInfo(String search, String key){
+        String value = null;
+        if(StringUtil.isNotEmpty(search)) {
+            search = search.replace("{}","");
+            if(StringUtil.isNotEmpty(search)) {
+                JSONObject obj = JSONObject.parseObject(search);
+                if (obj.get(key) != null) {
+                    value = obj.getString(key).trim();
+                    if (value.equals("")) {
+                        value = null;
+                    }
+                } else {
+                    value = null;
+                }
+            }
+        }
+        return value;
+    }
+
+    public static String toNull(String value) {
+        if(isEmpty(value)) {
+            value = null;
+        } else {
+            value = value.trim();
+        }
+        return value;
+    }
+
+    public static boolean isExist(Object value) {
+        if(value!=null) {
+            String str = value.toString();
+            if("".equals(str.trim())) {
+                return false;
+            } else {
+                return true;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 判断对象是否为正整数
+     * @param value
+     * @return
+     */
+    public static boolean isPositiveLong(Object value) {
+        if(value!=null) {
+            String str = value.toString();
+            if(isNotEmpty(str)) {
+                if((str.matches("[0-9]+"))&&(Long.parseLong(str)>0)) {
+                    return true;
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 校验条码长度为4到40位
+     * @param value
+     * @return
+     */
+    public static boolean checkBarCodeLength(Object value) {
+        if(value!=null) {
+            String str = value.toString();
+            if(isNotEmpty(str)) {
+                if(str.length()>=4 && str.length()<=40 ) {
+                    return true;
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 判断对象是否为数字(含小数)
+     * @param str
+     * @return
+     */
+    public static boolean isPositiveBigDecimal(String str){
+        Pattern pattern = Pattern.compile("[0-9]*");
+        if(str.indexOf(".")>0){//判断是否有小数点
+            if(str.indexOf(".")==str.lastIndexOf(".") && str.split("\\.").length==2){ //判断是否只有一个小数点
+                return pattern.matcher(str.replace(".","")).matches();
+            }else {
+                return false;
+            }
+        }else {
+            return pattern.matcher(str).matches();
+        }
+    }
+
+    /**
+     * sql注入过滤,保障sql的安全执行
+     * @param originStr
+     * @return
+     */
+    public static String safeSqlParse(String originStr){
+        return originStr.replaceAll("(?i)" + regex, "");
+    }
+
+    public static void main(String[] args) {
+        int i = 10/3;
+        System.out.println(i);
+    }
+}
diff --git a/src/main/java/com/jsh/erp/utils/Tools.java b/src/main/java/com/jsh/erp/utils/Tools.java
new file mode 100644
index 0000000..4795531
--- /dev/null
+++ b/src/main/java/com/jsh/erp/utils/Tools.java
@@ -0,0 +1,691 @@
+package com.jsh.erp.utils;
+
+import org.springframework.util.StringUtils;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.net.UnknownHostException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * 工具类
+ *
+ * @author jishenghua  qq:7-5-2-7-1-8-9-2-0
+ */
+public class Tools {
+    /**
+     * 获得32位唯一序列号
+     *
+     * @return 32为ID字符串
+     */
+    public static String getUUID_32() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+
+    /**
+     * 获得当天时间,格式为yyyy-MM-dd
+     *
+     * @return 格式化后的日期格式
+     */
+    public static String getNow() {
+        return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+    }
+
+    /**
+     * 获取昨天的日期字符串
+     * @return
+     */
+    public static String getYesterday(){
+        Date date=new Date();//取时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        //把日期往后增加一天.整数往后推,负数往前移动(1:表示明天、-1:表示昨天,0:表示今天)
+        calendar.add(Calendar.DATE,-1);
+        //这个时间就是日期往前推一天的结果
+        date=calendar.getTime();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        return formatter.format(date);
+    }
+
+    /**
+     * 获取当年的第一天
+     * @return
+     */
+    public static String getYearBegin(){
+        String yearStr = new SimpleDateFormat("yyyy").format(new Date());
+        return yearStr + "-01-01";
+    }
+
+    /**
+     * 获取当年的最后一天
+     * @return
+     */
+    public static String getYearEnd(){
+        String yearStr = new SimpleDateFormat("yyyy").format(new Date());
+        return yearStr + "-12-31";
+    }
+
+    /**
+     * 获取当前月 yyyy-MM
+     *
+     * @return
+     */
+    public static String getCurrentMonth() {
+        return new SimpleDateFormat("yyyy-MM").format(new Date());
+    }
+
+    /**
+     * 获得指定时间,格式为yyyy-MM-dd HH:mm:ss或yyyy-MM-dd
+     *
+     * @return 格式化后的日期格式
+     */
+    public static String dateToStr(Date date, String format) {
+        if(date!=null) {
+            return new SimpleDateFormat(format).format(date);
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * 将日期的字符串格式转为时间格式
+     * @param dateString
+     * @return
+     * @throws ParseException
+     */
+    public static Date strToDate(String dateString) throws ParseException {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 日期格式
+        return formatter.parse(dateString); // 字符串转换为Date
+    }
+    /**
+     * 获取指定日期格式 yyyy-MM-dd
+     *
+     * @return
+     */
+    public static String parseDateToStr(Date date) {
+        if(date!=null) {
+            return new SimpleDateFormat("yyyy-MM-dd").format(date);
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * 获得当天时间,格式为yyyyMMddHHmmss
+     *
+     * @return 格式化后的日期格式
+     */
+    public static String getNow2(Date date) {
+        return new SimpleDateFormat("yyyyMMddHHmmss").format(date);
+    }
+
+    /**
+     * 获得当天时间,格式为yyyy-MM-dd HH:mm:ss
+     *
+     * @return 格式化后的日期格式
+     */
+    public static String getNow3() {
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+    }
+
+    /**
+     * 获得指定时间,格式为yyyy-MM-dd HH:mm:ss
+     *
+     * @return 格式化后的日期格式
+     */
+    public static String getCenternTime(Date date) {
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
+    }
+
+    public static String parseDayToTime(String day, String timeStr) {
+        if(StringUtil.isNotEmpty(day)){
+            return day + timeStr;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 获得指定时间,格式为mm:ss
+     *
+     * @return 格式化后的日期格式
+     */
+    public static String getTimeInfo(Date date) {
+        return new SimpleDateFormat("mm:ss").format(date);
+    }
+
+    /**
+     * 获取当前日期是星期几
+     * return 星期几
+     */
+    public static String getWeekDay() {
+        Calendar c = Calendar.getInstance(Locale.CHINA);
+        c.setTime(new Date());
+        int day = c.get(Calendar.DAY_OF_WEEK);
+        String weekDay = "";
+        switch (day) {
+            case 1:
+                weekDay = "星期日";
+                break;
+            case 2:
+                weekDay = "星期一";
+                break;
+            case 3:
+                weekDay = "星期二";
+                break;
+            case 4:
+                weekDay = "星期三";
+                break;
+            case 5:
+                weekDay = "星期四";
+                break;
+            case 6:
+                weekDay = "星期五";
+                break;
+            case 7:
+                weekDay = "星期六";
+                break;
+            default:
+                break;
+        }
+        return weekDay;
+    }
+
+    /**
+     * 判断字符串是否全部为数字
+     *
+     * @param checkStr
+     * @return boolean值
+     */
+    public static boolean checkStrIsNum(String checkStr) {
+        if (checkStr == null || checkStr.length() == 0)
+            return false;
+        return Pattern.compile("^[0-9]*.{1}[0-9]*$").matcher(checkStr).matches();
+//		 return Pattern.compile(":^[0-9]+(.[0-9])*$").matcher(checkStr).matches();
+    }
+
+    /**
+     * 获得前一天的时间
+     *
+     * @return 前一天日期
+     */
+    public static String getPreviousDate() {
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.DATE, -1);
+        return new SimpleDateFormat("yyyy-MM").format(cal.getTime());
+    }
+
+    /**
+     * 获取当前月份的前6个月(含当前月)
+     * @param size  月数
+     * @return
+     */
+    public static List<String> getLastMonths(int size) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        Calendar c = Calendar.getInstance();
+        c.setTime(new Date());
+        List<String> list = new ArrayList(size);
+        for (int i=0;i<size;i++) {
+            c.setTime(new Date());
+            c.add(Calendar.MONTH, -i);
+            Date m = c.getTime();
+            list.add(sdf.format(m));
+        }
+        Collections.reverse(list);
+        return list;
+    }
+
+    /**
+     * 截取字符串长度
+     *
+     * @param beforeStr
+     * @param cutLeng
+     * @return 截取后的字符串
+     */
+    public static String subStr(String beforeStr, int cutLeng) {
+        if (beforeStr.length() > cutLeng)
+            return beforeStr.substring(0, cutLeng) + "...";
+        return beforeStr;
+    }
+
+    /**
+     * 生成随机字符串,字母和数字混合
+     *
+     * @return 组合后的字符串 ^[0-9a-zA-Z]
+     */
+    public static String getRandomChar() {
+        //生成一个0、1、2的随机数字
+        int rand = (int) Math.round(Math.random() * 1);
+        long itmp = 0;
+        char ctmp = '\u0000';
+        switch (rand) {
+            //生成大写字母 + 1000以内数字
+            case 1:
+                itmp = Math.round(Math.random() * 25 + 65);
+                ctmp = (char) itmp;
+                return String.valueOf(ctmp) + (int) Math.random() * 1000;
+            //生成小写字母
+            case 2:
+                itmp = Math.round(Math.random() * 25 + 97);
+                ctmp = (char) itmp;
+                return String.valueOf(ctmp) + (int) Math.random() * 1000;
+            //生成数字
+            default:
+                itmp = Math.round(Math.random() * 1000);
+                return itmp + "";
+        }
+    }
+
+    /**
+     * 判断首字母以数字开头,字符串包括数字、字母%以及空格
+     *
+     * @param str 检查字符串
+     * @return 是否以数字开头
+     */
+    public static boolean CheckIsStartWithNum(String str) {
+        return Pattern.compile("^[0-9][a-zA-Z0-9%,\\s]*$").matcher(str).matches();
+    }
+
+    /**
+     * 判断首字母以","开头,字符串包括数字、字母%以及空格
+     *
+     * @param str 检查字符串
+     * @return 是否以数字开头
+     */
+    public static boolean CheckIsStartWithSpec(String str) {
+        return Pattern.compile("^[,][a-zA-Z0-9%,\\s]*$").matcher(str).matches();
+    }
+
+    /**
+     * 字符转码
+     *
+     * @param aValue
+     * @return
+     * @see 转码后的字符串
+     */
+    public static String encodeValue(String aValue) {
+        if (aValue.trim().length() == 0) {
+            return "";
+        }
+        String valueAfterTransCode = null;
+        try {
+            valueAfterTransCode = URLEncoder.encode(aValue, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.getMessage();
+        }
+        return valueAfterTransCode;
+    }
+
+    /**
+     * 字符转码
+     *
+     * @param aValue
+     * @return
+     * @see 转码后的字符串
+     */
+    public static String decodeValue(String aValue) {
+        if (aValue.trim().length() == 0) {
+            return "";
+        }
+        String valueAfterTransCode = null;
+        try {
+            valueAfterTransCode = URLDecoder.decode(aValue, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.getMessage();
+        }
+        return valueAfterTransCode;
+    }
+
+    /**
+     * 去除str中的'
+     *
+     * @param str
+     * @return 除去'后的字符串
+     * @see [类、类#方法、类#成员]
+     */
+    public static String afterDealStr(String str) {
+        return str.replace("'", "");
+    }
+
+    /**
+     * 从Request对象中获得客户端IP,处理了HTTP代理服务器和Nginx的反向代理截取了ip
+     *
+     * @param request
+     * @return ip
+     */
+    public static String getLocalIp(HttpServletRequest request) {
+        String remoteAddr = getIpAddr(request);
+        String forwarded = request.getHeader("X-Forwarded-For");
+        String realIp = request.getHeader("X-Real-IP");
+
+        String ip = null;
+        if (realIp == null) {
+            if (forwarded == null) {
+                ip = remoteAddr;
+            } else {
+                ip = remoteAddr + "/" + forwarded.split(",")[0];
+            }
+        } else {
+            if (realIp.equals(forwarded)) {
+                ip = realIp;
+            } else {
+                if (forwarded != null) {
+                    forwarded = forwarded.split(",")[0];
+                }
+                ip = realIp + "/" + forwarded;
+            }
+        }
+        return ip;
+    }
+    /**
+     * 获取访问者IP
+     *
+     * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。
+     *
+     * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割),
+     * 如果还不存在则调用Request .getRemoteAddr()。
+     *
+     * @param request
+     * @return
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = request.getHeader("X-Real-IP");
+        if (!StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) {
+            return ip;
+        }
+        ip = request.getHeader("X-Forwarded-For");
+        if (!StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) {
+            // 多次反向代理后会有多个IP值,第一个为真实IP。
+            int index = ip.indexOf(',');
+            if (index != -1) {
+                return ip.substring(0, index);
+            } else {
+                return ip;
+            }
+        } else {
+            return request.getRemoteAddr();
+        }
+    }
+
+    /**
+     * 转化前台批量传入的ID值
+     *
+     * @param data
+     * @return 转化后的ID值数组
+     */
+    public static int[] changeDataForm(String data) {
+        String[] dataStr = data.split(",");
+        int[] dataInt = new int[dataStr.length];
+        for (int i = 0; i < dataStr.length; i++)
+            dataInt[i] = Integer.parseInt(dataStr[i]);
+        return dataInt;
+    }
+
+    /**
+     * 写理财日志内容转化特殊字符
+     *
+     * @param str 需要转化的字符
+     * @return 转化后的字符
+     */
+    public static String htmlspecialchars(String str) {
+        str = str.replaceAll("&", "&amp;");
+        str = str.replaceAll("<", "&lt;");
+        str = str.replaceAll(">", "&gt;");
+        str = str.replaceAll("\"", "&quot;");
+        return str;
+    }
+
+    /**
+     * 根据消费日期获取消费月
+     *
+     * @param consumeDate 消费日期
+     * @return 返回消费月信息
+     */
+    public static String getConsumeMonth(String consumeDate) {
+        return consumeDate.substring(0, 7);
+    }
+
+    /**
+     * 获取当前日期的前XX个月
+     *
+     * @param beforeMonth
+     * @return 前XX个月字符串
+     */
+    public static String getBeforeMonth(int beforeMonth) {
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, -beforeMonth);
+        return new SimpleDateFormat("yyyy-MM").format(c.getTime());
+    }
+
+    /**
+     * 根据月份获取当月第一天
+     * @param monthTime
+     * @return
+     * @throws ParseException
+     */
+    public static String firstDayOfMonth(String monthTime) throws ParseException {
+        return monthTime + "-01";
+    }
+
+    /**
+     * 根据月份获取当月最后一天
+     * @param monthTime
+     * @return
+     * @throws ParseException
+     */
+    public static String lastDayOfMonth(String monthTime) throws ParseException {
+        Date date = new SimpleDateFormat("yyyy-MM").parse(monthTime);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.DAY_OF_MONTH, 1);
+        cal.roll(Calendar.DAY_OF_MONTH, -1);
+        return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
+    }
+
+    /**
+     * 获取email用户姓名
+     *
+     * @param emailAddress
+     */
+    public static String getEmailUserName(String emailAddress) {
+        return emailAddress.substring(0, emailAddress.lastIndexOf("@"));
+    }
+
+    /**
+     * 判断userTel是否合法,userTel只能是数字
+     *
+     * @param userTel
+     * @return true 合法 false不合法
+     */
+    public static boolean isTelNumber(String userTel) {
+        String reg_phone = "^(\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}$";
+        String reg_tel = "^(1[0-9][0-9]|1[0-9][0|3|6|8|9])\\d{8}$";
+        boolean b_phpne = Pattern.compile(reg_phone).matcher(userTel).matches();
+        boolean b_tel = Pattern.compile(reg_tel).matcher(userTel).matches();
+        return (b_phpne || b_tel);
+    }
+
+    /**
+     * 模糊判断电话号码是否合法,只能是数字
+     *
+     * @param userTel
+     * @return
+     */
+    public static boolean isTelNumberBySlur(String userTel) {
+        return Pattern.compile("^([\\s0-9]{0,12}$)").matcher(userTel).matches();
+    }
+
+    /**
+     * 获取当前时间的字符串类型
+     *
+     * @return 处理后的字符串类型
+     */
+    public static String getNowTime() {
+        return new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
+    }
+
+    /**
+     * 判断字符串中是否含有中文
+     *
+     * @param str
+     * @return
+     * @author jishenghua
+     */
+    public static boolean isContainsChinese(String str) {
+        return Pattern.compile("[\u4e00-\u9fa5]").matcher(str).matches();
+    }
+
+    /**
+     * 过滤html文件中的文本
+     *
+     * @param content
+     * @return过滤后的文本
+     */
+    public static String filterText(String content) {
+        return content.replace("/<(?:.|\\s)*?>/g", "");
+    }
+
+    /**
+     * 去掉字符串中所有符号,不论是全角,还是半角的,或是货币符号或者空格等
+     *
+     * @param s
+     * @return
+     * @author jishenghua
+     */
+    public static String removeSymbolForString(String s) {
+        StringBuffer buffer = new StringBuffer();
+        char[] chars = s.toCharArray();
+        for (int i = 0; i < chars.length; i++) {
+            if ((chars[i] >= 19968 && chars[i] <= 40869) || (chars[i] >= 97 && chars[i] <= 122) || (chars[i] >= 65 && chars[i] <= 90)) {
+                buffer.append(chars[i]);
+            }
+        }
+        return buffer.toString();
+    }
+
+    /**
+     * 获取一个字符串的MD5
+     *
+     * @param msg
+     * @return 加密后的MD5字符串
+     * @throws NoSuchAlgorithmException
+     */
+    public static String md5Encryp(String msg) throws NoSuchAlgorithmException {
+        // 生成一个MD5加密计算摘要
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        // 计算md5函数
+        md.update(msg.getBytes());
+        return new BigInteger(1, md.digest()).toString(16);
+    }
+
+    /**
+     * 判断是否插件URL 
+     *
+     * @return
+     */
+    public static boolean isPluginUrl(String url) {
+        if (url != null && (url.startsWith("/plugin"))) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 处理字符串null值
+     *
+     * @param beforeStr 处理前字符串
+     * @return 处理后的字符串
+     */
+    public static String dealNullStr(String beforeStr) {
+        if (null == beforeStr || beforeStr.length() == 0)
+            return "";
+        return beforeStr;
+    }
+
+    /**
+     * 根据token截取租户id
+     * @param token
+     * @return
+     */
+    public static Long getTenantIdByToken(String token) {
+        Long tenantId = 0L;
+        if(StringUtil.isNotEmpty(token) && token.indexOf("_")>-1) {
+            String[] tokenArr = token.split("_");
+            if (tokenArr.length == 2) {
+                tenantId = Long.parseLong(tokenArr[1]);
+            }
+        }
+        return tenantId;
+    }
+
+    /**
+     * 使用参数Format将字符串转为Date
+     *
+     * @param strDate
+     * @param pattern
+     * @return
+     * @throws ParseException
+     * @author jishenghua
+     */
+    public static Date parse(String strDate, String pattern)
+            throws ParseException {
+        return new SimpleDateFormat(pattern).parse(strDate);
+    }
+
+    public static Date addDays(Date date, int num) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date); //需要将date数据转移到Calender对象中操作
+        calendar.add(calendar.DATE, num);//把日期往后增加n天.正数往后推,负数往前移动
+        date=calendar.getTime();   //这个时间就是日期往后推一天的结果
+        return date;
+    }
+
+    /**
+     * 生成随机数字和字母组合
+     * @param length
+     * @return
+     */
+    public static String getCharAndNum(int length) {
+        Random random = new Random();
+        StringBuffer valSb = new StringBuffer();
+        String charStr = "0123456789abcdefghijklmnopqrstuvwxyz";
+        int charLength = charStr.length();
+        for (int i = 0; i < length; i++) {
+            int index = random.nextInt(charLength);
+            valSb.append(charStr.charAt(index));
+        }
+        return valSb.toString();
+    }
+
+    public static void main(String[] args) {
+        String aa = "的付的反对法的发的说法";
+        char[] bb = aa.toCharArray();
+        for (char c : bb) {
+            System.out.println(c);
+        }
+        System.out.println(getBeforeMonth(1));
+
+        try {
+            System.out.println(md5Encryp("guest"));
+            System.out.println(md5Encryp("admin"));
+        } catch (NoSuchAlgorithmException e) {
+            // TODO Auto-generated catch block
+        }
+
+        String value = "2333";
+        System.out.println(checkStrIsNum(value));
+
+        for (int i = 0; i < 100; i++) {
+            System.out.print(getRandomChar() + "  ||    ");
+        }
+    }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..3a46c2c
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,35 @@
+server.port=8888
+#登录超时-秒
+server.servlet.session.timeout=36000
+#服务路径
+server.servlet.context-path=/jshERP-boot
+#数据库连接
+spring.datasource.url=jdbc:mysql://47.96.225.205:3306/jsh_erp?useUnicode=true&characterEncoding=utf8&useCursorFetch=true&defaultFetchSize=500&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false
+spring.datasource.driverClassName=com.mysql.jdbc.Driver
+spring.datasource.username=root
+spring.datasource.password=CloudRoam
+#mybatis-plus配置
+mybatis-plus.mapper-locations=classpath:./mapper_xml/*.xml
+# Redis
+spring.redis.host=192.168.1.235
+spring.redis.port=6379
+spring.redis.password=123456
+#租户对应的角色id
+manage.roleId=10
+#租户允许创建的用户数
+tenant.userNumLimit=1000000
+#租户允许试用的天数
+tenant.tryDayLimit=3000
+#插件配置
+plugin.runMode=prod
+plugin.pluginPath=plugins
+plugin.pluginConfigFilePath=pluginConfig
+#文件上传方式 1-本机 2-oss
+file.uploadType=1
+#文件上传根目录
+file.path=/opt/jshERP/upload
+#文件上传临时路径
+server.tomcat.basedir=/opt/tmp/tomcat
+#文件上传限制(byte)
+spring.servlet.multipart.max-file-size=10485760
+spring.servlet.multipart.max-request-size=10485760
\ No newline at end of file
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..86291bb
--- /dev/null
+++ b/src/main/resources/logback-spring.xml
@@ -0,0 +1,34 @@
+<configuration>
+    <property name="LOG_FILE" value="${logs.home}/jshERP"/>
+    <property name="LOG_PATTERN" value="%d{yyyy/MM/dd-HH:mm:ss} %-5level [%thread] %logger - %msg%n"/>
+
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="TIME_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE}.log</file>
+        <encoder>
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxHistory>10</maxHistory>
+            <totalSizeCap>1GB</totalSizeCap>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+    </appender>
+
+    <root level="ERROR">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="TIME_FILE"/>
+    </root>
+    <logger name="com.jsh" additivity="false" level="DEBUG">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="TIME_FILE"/>
+    </logger>
+</configuration>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/AccountHeadMapper.xml b/src/main/resources/mapper_xml/AccountHeadMapper.xml
new file mode 100644
index 0000000..a13af4c
--- /dev/null
+++ b/src/main/resources/mapper_xml/AccountHeadMapper.xml
@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.AccountHeadMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.AccountHead">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="organ_id" jdbcType="BIGINT" property="organId" />
+    <result column="hands_person_id" jdbcType="BIGINT" property="handsPersonId" />
+    <result column="creator" jdbcType="BIGINT" property="creator" />
+    <result column="change_amount" jdbcType="DECIMAL" property="changeAmount" />
+    <result column="discount_money" jdbcType="DECIMAL" property="discountMoney" />
+    <result column="total_price" jdbcType="DECIMAL" property="totalPrice" />
+    <result column="account_id" jdbcType="BIGINT" property="accountId" />
+    <result column="bill_no" jdbcType="VARCHAR" property="billNo" />
+    <result column="bill_time" jdbcType="TIMESTAMP" property="billTime" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="file_name" jdbcType="VARCHAR" property="fileName" />
+    <result column="status" jdbcType="VARCHAR" property="status" />
+    <result column="source" jdbcType="VARCHAR" property="source" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, type, organ_id, hands_person_id, creator, change_amount, discount_money, total_price, 
+    account_id, bill_no, bill_time, remark, file_name, status, source, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.AccountHeadExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_account_head
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_account_head
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_account_head
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.AccountHeadExample">
+    delete from jsh_account_head
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.AccountHead">
+    insert into jsh_account_head (id, type, organ_id, 
+      hands_person_id, creator, change_amount, 
+      discount_money, total_price, account_id, 
+      bill_no, bill_time, remark, 
+      file_name, status, source, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{organId,jdbcType=BIGINT}, 
+      #{handsPersonId,jdbcType=BIGINT}, #{creator,jdbcType=BIGINT}, #{changeAmount,jdbcType=DECIMAL}, 
+      #{discountMoney,jdbcType=DECIMAL}, #{totalPrice,jdbcType=DECIMAL}, #{accountId,jdbcType=BIGINT}, 
+      #{billNo,jdbcType=VARCHAR}, #{billTime,jdbcType=TIMESTAMP}, #{remark,jdbcType=VARCHAR}, 
+      #{fileName,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{source,jdbcType=VARCHAR}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.AccountHead">
+    insert into jsh_account_head
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="organId != null">
+        organ_id,
+      </if>
+      <if test="handsPersonId != null">
+        hands_person_id,
+      </if>
+      <if test="creator != null">
+        creator,
+      </if>
+      <if test="changeAmount != null">
+        change_amount,
+      </if>
+      <if test="discountMoney != null">
+        discount_money,
+      </if>
+      <if test="totalPrice != null">
+        total_price,
+      </if>
+      <if test="accountId != null">
+        account_id,
+      </if>
+      <if test="billNo != null">
+        bill_no,
+      </if>
+      <if test="billTime != null">
+        bill_time,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="fileName != null">
+        file_name,
+      </if>
+      <if test="status != null">
+        status,
+      </if>
+      <if test="source != null">
+        source,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="organId != null">
+        #{organId,jdbcType=BIGINT},
+      </if>
+      <if test="handsPersonId != null">
+        #{handsPersonId,jdbcType=BIGINT},
+      </if>
+      <if test="creator != null">
+        #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="changeAmount != null">
+        #{changeAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="discountMoney != null">
+        #{discountMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="totalPrice != null">
+        #{totalPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="accountId != null">
+        #{accountId,jdbcType=BIGINT},
+      </if>
+      <if test="billNo != null">
+        #{billNo,jdbcType=VARCHAR},
+      </if>
+      <if test="billTime != null">
+        #{billTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="fileName != null">
+        #{fileName,jdbcType=VARCHAR},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="source != null">
+        #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.AccountHeadExample" resultType="java.lang.Long">
+    select count(*) from jsh_account_head
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_account_head
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.organId != null">
+        organ_id = #{record.organId,jdbcType=BIGINT},
+      </if>
+      <if test="record.handsPersonId != null">
+        hands_person_id = #{record.handsPersonId,jdbcType=BIGINT},
+      </if>
+      <if test="record.creator != null">
+        creator = #{record.creator,jdbcType=BIGINT},
+      </if>
+      <if test="record.changeAmount != null">
+        change_amount = #{record.changeAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="record.discountMoney != null">
+        discount_money = #{record.discountMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="record.totalPrice != null">
+        total_price = #{record.totalPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.accountId != null">
+        account_id = #{record.accountId,jdbcType=BIGINT},
+      </if>
+      <if test="record.billNo != null">
+        bill_no = #{record.billNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.billTime != null">
+        bill_time = #{record.billTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.fileName != null">
+        file_name = #{record.fileName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.status != null">
+        status = #{record.status,jdbcType=VARCHAR},
+      </if>
+      <if test="record.source != null">
+        source = #{record.source,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_account_head
+    set id = #{record.id,jdbcType=BIGINT},
+      type = #{record.type,jdbcType=VARCHAR},
+      organ_id = #{record.organId,jdbcType=BIGINT},
+      hands_person_id = #{record.handsPersonId,jdbcType=BIGINT},
+      creator = #{record.creator,jdbcType=BIGINT},
+      change_amount = #{record.changeAmount,jdbcType=DECIMAL},
+      discount_money = #{record.discountMoney,jdbcType=DECIMAL},
+      total_price = #{record.totalPrice,jdbcType=DECIMAL},
+      account_id = #{record.accountId,jdbcType=BIGINT},
+      bill_no = #{record.billNo,jdbcType=VARCHAR},
+      bill_time = #{record.billTime,jdbcType=TIMESTAMP},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      file_name = #{record.fileName,jdbcType=VARCHAR},
+      status = #{record.status,jdbcType=VARCHAR},
+      source = #{record.source,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.AccountHead">
+    update jsh_account_head
+    <set>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="organId != null">
+        organ_id = #{organId,jdbcType=BIGINT},
+      </if>
+      <if test="handsPersonId != null">
+        hands_person_id = #{handsPersonId,jdbcType=BIGINT},
+      </if>
+      <if test="creator != null">
+        creator = #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="changeAmount != null">
+        change_amount = #{changeAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="discountMoney != null">
+        discount_money = #{discountMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="totalPrice != null">
+        total_price = #{totalPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="accountId != null">
+        account_id = #{accountId,jdbcType=BIGINT},
+      </if>
+      <if test="billNo != null">
+        bill_no = #{billNo,jdbcType=VARCHAR},
+      </if>
+      <if test="billTime != null">
+        bill_time = #{billTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="fileName != null">
+        file_name = #{fileName,jdbcType=VARCHAR},
+      </if>
+      <if test="status != null">
+        status = #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="source != null">
+        source = #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.AccountHead">
+    update jsh_account_head
+    set type = #{type,jdbcType=VARCHAR},
+      organ_id = #{organId,jdbcType=BIGINT},
+      hands_person_id = #{handsPersonId,jdbcType=BIGINT},
+      creator = #{creator,jdbcType=BIGINT},
+      change_amount = #{changeAmount,jdbcType=DECIMAL},
+      discount_money = #{discountMoney,jdbcType=DECIMAL},
+      total_price = #{totalPrice,jdbcType=DECIMAL},
+      account_id = #{accountId,jdbcType=BIGINT},
+      bill_no = #{billNo,jdbcType=VARCHAR},
+      bill_time = #{billTime,jdbcType=TIMESTAMP},
+      remark = #{remark,jdbcType=VARCHAR},
+      file_name = #{fileName,jdbcType=VARCHAR},
+      status = #{status,jdbcType=VARCHAR},
+      source = #{source,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/AccountHeadMapperEx.xml b/src/main/resources/mapper_xml/AccountHeadMapperEx.xml
new file mode 100644
index 0000000..9877d9d
--- /dev/null
+++ b/src/main/resources/mapper_xml/AccountHeadMapperEx.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.AccountHeadMapperEx">
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.AccountHeadMapper.BaseResultMap" id="ResultMapEx" type="com.jsh.erp.datasource.entities.AccountHeadVo4ListEx">
+        <result column="OrganName" jdbcType="VARCHAR" property="organName" />
+        <result column="HandsPersonName" jdbcType="VARCHAR" property="handsPersonName" />
+        <result column="userName" jdbcType="VARCHAR" property="userName" />
+        <result column="AccountName" jdbcType="VARCHAR" property="accountName" />
+    </resultMap>
+
+    <select id="selectByConditionAccountHead" parameterType="com.jsh.erp.datasource.entities.AccountHeadExample" resultMap="ResultMapEx">
+        select distinct ah.*, s.supplier OrganName, p.Name HandsPersonName, u.username userName, a.Name AccountName
+        from jsh_account_head ah
+        left join jsh_account_item ai on ah.id=ai.header_id and ifnull(ai.delete_flag,'0') !='1'
+        left join jsh_depot_head dh on dh.id=ai.bill_id and ifnull(dh.delete_flag,'0') !='1'
+        left join jsh_supplier s on ah.organ_id=s.id and ifnull(s.delete_Flag,'0') !='1'
+        left join jsh_user u on ah.creator=u.id and ifnull(u.delete_flag,'0') !='1'
+        left join jsh_person p on ah.hands_person_id=p.id and ifnull(p.delete_Flag,'0') !='1'
+        left join jsh_account a on ah.account_id=a.id and ifnull(a.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="billNo != null">
+            <bind name="bindBillNo" value="'%'+billNo+'%'"/>
+            and ah.bill_no like #{bindBillNo}
+        </if>
+        <if test="type != null">
+            and ah.type=#{type}
+        </if>
+        <if test="beginTime != null">
+            and ah.bill_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="organId != null">
+            and ah.organ_id=#{organId}
+        </if>
+        <if test="handsPersonId != null">
+            and ah.hands_person_id=#{handsPersonId}
+        </if>
+        <if test="creator != null">
+            and ah.creator=#{creator}
+        </if>
+        <if test="creatorArray != null">
+            and ah.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="accountId != null">
+            and ah.account_id=#{accountId}
+        </if>
+        <if test="status != null and status != ''">
+            and ah.status=#{status}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and ah.remark like #{bindRemark}
+        </if>
+        <if test="number != null and number !=''">
+            <if test="number == 'QiChu'">
+                and ai.bill_id is null
+            </if>
+            <if test="number != 'QiChu'">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and dh.number like #{bindNumber}
+            </if>
+        </if>
+        and ifnull(ah.delete_flag,'0') !='1'
+        order by ah.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+
+    <select id="countsByAccountHead" resultType="java.lang.Long">
+        SELECT
+        COUNT(1) from
+        (select distinct ah.* FROM jsh_account_head ah
+        left join jsh_account_item ai on ah.id=ai.header_id and ifnull(ai.delete_flag,'0') !='1'
+        left join jsh_depot_head dh on dh.id=ai.bill_id and ifnull(dh.delete_flag,'0') !='1'
+        WHERE 1=1
+        <if test="billNo != null">
+            <bind name="bindBillNo" value="'%'+billNo+'%'"/>
+            and ah.bill_no like #{bindBillNo}
+        </if>
+        <if test="type != null">
+            and ah.type=#{type}
+        </if>
+        <if test="beginTime != null">
+            and ah.bill_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="organId != null">
+            and ah.organ_id=#{organId}
+        </if>
+        <if test="handsPersonId != null">
+            and ah.hands_person_id=#{handsPersonId}
+        </if>
+        <if test="creator != null">
+            and ah.creator=#{creator}
+        </if>
+        <if test="creatorArray != null">
+            and ah.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="accountId != null">
+            and ah.account_id=#{accountId}
+        </if>
+        <if test="status != null and status != ''">
+            and ah.status=#{status}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and ah.remark like #{bindRemark}
+        </if>
+        <if test="number != null and number !=''">
+            <if test="number == 'QiChu'">
+                and ai.bill_id is null
+            </if>
+            <if test="number != 'QiChu'">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and dh.number like #{bindNumber}
+            </if>
+        </if>
+        and ifnull(ah.delete_flag,'0') !='1') tb
+    </select>
+
+    <select id="getDetailByNumber" parameterType="com.jsh.erp.datasource.entities.AccountHeadExample" resultMap="ResultMapEx">
+        select ah.*, s.supplier OrganName, p.Name HandsPersonName, a.Name AccountName
+        from jsh_account_head ah
+        left join jsh_supplier s on ah.organ_id=s.id and ifnull(s.delete_Flag,'0') !='1'
+        left join jsh_person p on ah.hands_person_id=p.id and ifnull(p.delete_Flag,'0') !='1'
+        left join jsh_account a on ah.account_id=a.id and ifnull(a.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="billNo != null">
+            and ah.bill_no = #{billNo}
+        </if>
+        and ifnull(ah.delete_flag,'0') !='1'
+    </select>
+    <update id="batchDeleteAccountHeadByIds">
+        update jsh_account_head
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+    <select id="getAccountHeadListByAccountIds"  resultMap="com.jsh.erp.datasource.mappers.AccountHeadMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.AccountHeadMapper.Base_Column_List" />
+        from jsh_account_head
+        where 1=1
+        and account_id in (
+        <foreach collection="accountIds" item="accountId" separator=",">
+            #{accountId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getAccountHeadListByOrganIds"  resultMap="com.jsh.erp.datasource.mappers.AccountHeadMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.AccountHeadMapper.Base_Column_List" />
+        from jsh_account_head
+        where 1=1
+        and organ_id in (
+        <foreach collection="organIds" item="organId" separator=",">
+            #{organId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getAccountHeadListByHandsPersonIds"  resultMap="com.jsh.erp.datasource.mappers.AccountHeadMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.AccountHeadMapper.Base_Column_List" />
+        from jsh_account_head
+        where 1=1
+        and hands_person_id in (
+        <foreach collection="handsPersonIds" item="handsPersonId" separator=",">
+            #{handsPersonId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getFinancialBillNoByBillIdList" resultType="com.jsh.erp.datasource.entities.AccountItem">
+        select ai.bill_id from jsh_account_head ah
+        left join jsh_account_item ai on ah.id=ai.header_id and ifnull(ai.delete_flag,'0') !='1'
+        where 1=1
+        <if test="idList.size()>0">
+            and ai.bill_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and ifnull(ah.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getFinancialBillNoByBillId" resultType="com.jsh.erp.datasource.entities.AccountHead">
+        select ah.bill_no from jsh_account_head ah
+        left join jsh_account_item ai on ah.id=ai.header_id and ifnull(ai.delete_flag,'0') !='1'
+        where ai.bill_id=#{billId}
+        and ifnull(ah.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getFinancialAllPriceByOrganId" resultType="java.math.BigDecimal">
+        select ifnull(sum(ah.total_price),0) allPrice from jsh_account_head ah
+        where ah.organ_id=#{organId}
+        and ah.type = '收预付款'
+        and ifnull(ah.delete_flag,'0') !='1'
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/AccountItemMapper.xml b/src/main/resources/mapper_xml/AccountItemMapper.xml
new file mode 100644
index 0000000..3a40586
--- /dev/null
+++ b/src/main/resources/mapper_xml/AccountItemMapper.xml
@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.AccountItemMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.AccountItem">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="header_id" jdbcType="BIGINT" property="headerId" />
+    <result column="account_id" jdbcType="BIGINT" property="accountId" />
+    <result column="in_out_item_id" jdbcType="BIGINT" property="inOutItemId" />
+    <result column="bill_id" jdbcType="BIGINT" property="billId" />
+    <result column="need_debt" jdbcType="DECIMAL" property="needDebt" />
+    <result column="finish_debt" jdbcType="DECIMAL" property="finishDebt" />
+    <result column="each_amount" jdbcType="DECIMAL" property="eachAmount" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, header_id, account_id, in_out_item_id, bill_id, need_debt, finish_debt, each_amount, 
+    remark, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.AccountItemExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_account_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_account_item
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_account_item
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.AccountItemExample">
+    delete from jsh_account_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.AccountItem">
+    insert into jsh_account_item (id, header_id, account_id, 
+      in_out_item_id, bill_id, need_debt, 
+      finish_debt, each_amount, remark, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{headerId,jdbcType=BIGINT}, #{accountId,jdbcType=BIGINT}, 
+      #{inOutItemId,jdbcType=BIGINT}, #{billId,jdbcType=BIGINT}, #{needDebt,jdbcType=DECIMAL}, 
+      #{finishDebt,jdbcType=DECIMAL}, #{eachAmount,jdbcType=DECIMAL}, #{remark,jdbcType=VARCHAR}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.AccountItem">
+    insert into jsh_account_item
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="headerId != null">
+        header_id,
+      </if>
+      <if test="accountId != null">
+        account_id,
+      </if>
+      <if test="inOutItemId != null">
+        in_out_item_id,
+      </if>
+      <if test="billId != null">
+        bill_id,
+      </if>
+      <if test="needDebt != null">
+        need_debt,
+      </if>
+      <if test="finishDebt != null">
+        finish_debt,
+      </if>
+      <if test="eachAmount != null">
+        each_amount,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="headerId != null">
+        #{headerId,jdbcType=BIGINT},
+      </if>
+      <if test="accountId != null">
+        #{accountId,jdbcType=BIGINT},
+      </if>
+      <if test="inOutItemId != null">
+        #{inOutItemId,jdbcType=BIGINT},
+      </if>
+      <if test="billId != null">
+        #{billId,jdbcType=BIGINT},
+      </if>
+      <if test="needDebt != null">
+        #{needDebt,jdbcType=DECIMAL},
+      </if>
+      <if test="finishDebt != null">
+        #{finishDebt,jdbcType=DECIMAL},
+      </if>
+      <if test="eachAmount != null">
+        #{eachAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.AccountItemExample" resultType="java.lang.Long">
+    select count(*) from jsh_account_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_account_item
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.headerId != null">
+        header_id = #{record.headerId,jdbcType=BIGINT},
+      </if>
+      <if test="record.accountId != null">
+        account_id = #{record.accountId,jdbcType=BIGINT},
+      </if>
+      <if test="record.inOutItemId != null">
+        in_out_item_id = #{record.inOutItemId,jdbcType=BIGINT},
+      </if>
+      <if test="record.billId != null">
+        bill_id = #{record.billId,jdbcType=BIGINT},
+      </if>
+      <if test="record.needDebt != null">
+        need_debt = #{record.needDebt,jdbcType=DECIMAL},
+      </if>
+      <if test="record.finishDebt != null">
+        finish_debt = #{record.finishDebt,jdbcType=DECIMAL},
+      </if>
+      <if test="record.eachAmount != null">
+        each_amount = #{record.eachAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_account_item
+    set id = #{record.id,jdbcType=BIGINT},
+      header_id = #{record.headerId,jdbcType=BIGINT},
+      account_id = #{record.accountId,jdbcType=BIGINT},
+      in_out_item_id = #{record.inOutItemId,jdbcType=BIGINT},
+      bill_id = #{record.billId,jdbcType=BIGINT},
+      need_debt = #{record.needDebt,jdbcType=DECIMAL},
+      finish_debt = #{record.finishDebt,jdbcType=DECIMAL},
+      each_amount = #{record.eachAmount,jdbcType=DECIMAL},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.AccountItem">
+    update jsh_account_item
+    <set>
+      <if test="headerId != null">
+        header_id = #{headerId,jdbcType=BIGINT},
+      </if>
+      <if test="accountId != null">
+        account_id = #{accountId,jdbcType=BIGINT},
+      </if>
+      <if test="inOutItemId != null">
+        in_out_item_id = #{inOutItemId,jdbcType=BIGINT},
+      </if>
+      <if test="billId != null">
+        bill_id = #{billId,jdbcType=BIGINT},
+      </if>
+      <if test="needDebt != null">
+        need_debt = #{needDebt,jdbcType=DECIMAL},
+      </if>
+      <if test="finishDebt != null">
+        finish_debt = #{finishDebt,jdbcType=DECIMAL},
+      </if>
+      <if test="eachAmount != null">
+        each_amount = #{eachAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.AccountItem">
+    update jsh_account_item
+    set header_id = #{headerId,jdbcType=BIGINT},
+      account_id = #{accountId,jdbcType=BIGINT},
+      in_out_item_id = #{inOutItemId,jdbcType=BIGINT},
+      bill_id = #{billId,jdbcType=BIGINT},
+      need_debt = #{needDebt,jdbcType=DECIMAL},
+      finish_debt = #{finishDebt,jdbcType=DECIMAL},
+      each_amount = #{eachAmount,jdbcType=DECIMAL},
+      remark = #{remark,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/AccountItemMapperEx.xml b/src/main/resources/mapper_xml/AccountItemMapperEx.xml
new file mode 100644
index 0000000..db4b731
--- /dev/null
+++ b/src/main/resources/mapper_xml/AccountItemMapperEx.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.AccountItemMapperEx">
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.AccountItemMapper.BaseResultMap" id="ResultWithInfoExMap" type="com.jsh.erp.datasource.vo.AccountItemVo4List">
+        <result column="AccountName" jdbcType="VARCHAR" property="accountName" />
+        <result column="InOutItemName" jdbcType="VARCHAR" property="inOutItemName" />
+        <result column="billNumber" jdbcType="VARCHAR" property="billNumber" />
+    </resultMap>
+
+    <select id="selectByConditionAccountItem" parameterType="com.jsh.erp.datasource.entities.AccountItemExample" resultMap="com.jsh.erp.datasource.mappers.AccountItemMapper.BaseResultMap">
+        select *
+        FROM jsh_account_item
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null">
+            and type=#{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByAccountItem" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_account_item
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null">
+            and type=#{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getDetailList" parameterType="com.jsh.erp.datasource.entities.AccountItemExample" resultMap="ResultWithInfoExMap">
+        select ai.*,a.Name AccountName,ioi.Name InOutItemName, dh.number billNumber
+        from jsh_account_item ai left join jsh_account a on ai.account_id=a.id and ifnull(a.delete_Flag,'0') !='1'
+        left join jsh_in_out_item ioi on ai.in_out_item_id = ioi.id and ifnull(ioi.delete_Flag,'0') !='1'
+        left join jsh_depot_head dh on ai.bill_id = dh.id and ifnull(dh.delete_Flag,'0') !='1'
+        where ai.header_id = #{headerId}
+        and ifnull(ai.delete_flag,'0') !='1'
+        order by ai.id asc
+    </select>
+    <update id="batchDeleteAccountItemByIds">
+        update jsh_account_item
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+    <select id="getAccountItemListByAccountIds" resultMap="com.jsh.erp.datasource.mappers.AccountItemMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.AccountItemMapper.Base_Column_List" />
+        from jsh_account_item
+        where 1=1
+        and account_id in (
+        <foreach collection="accountIds" item="accountId" separator=",">
+            #{accountId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getAccountItemListByHeaderIds" resultMap="com.jsh.erp.datasource.mappers.AccountItemMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.AccountItemMapper.Base_Column_List" />
+        from jsh_account_item
+        where 1=1
+        and header_id in (
+        <foreach collection="headerIds" item="headerId" separator=",">
+            #{headerId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getAccountItemListByInOutItemIds" resultMap="com.jsh.erp.datasource.mappers.AccountItemMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.AccountItemMapper.Base_Column_List" />
+        from jsh_account_item
+        where 1=1
+        and in_out_item_id in (
+        <foreach collection="inOutItemIds" item="inOutItemId" separator=",">
+            #{inOutItemId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <update id="batchDeleteAccountItemByHeadIds">
+        update jsh_account_item
+        set delete_flag='1'
+        where 1=1
+        and header_id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <select id="getEachAmountByBillId" resultType="java.math.BigDecimal">
+        select
+        ifnull(sum(each_amount),0)
+        from jsh_account_item
+        where 1=1
+        <if test="billId != null">
+            and bill_id=#{billId}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getFinishDebtByOrganId" resultType="java.math.BigDecimal">
+        select ifnull(sum(ai.each_amount),0) from jsh_account_head ah
+        left join jsh_account_item ai on ah.id = ai.header_id and ifnull(ai.delete_flag,'0') !='1'
+        where ah.organ_id = #{organId}
+        and (ah.type = '收款' or ah.type = '付款')
+        and ai.bill_id is null
+        and ifnull(ah.delete_flag,'0') !='1'
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/AccountMapper.xml b/src/main/resources/mapper_xml/AccountMapper.xml
new file mode 100644
index 0000000..f5b8cd4
--- /dev/null
+++ b/src/main/resources/mapper_xml/AccountMapper.xml
@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.AccountMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Account">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="serial_no" jdbcType="VARCHAR" property="serialNo" />
+    <result column="initial_amount" jdbcType="DECIMAL" property="initialAmount" />
+    <result column="current_amount" jdbcType="DECIMAL" property="currentAmount" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="is_default" jdbcType="BIT" property="isDefault" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, name, serial_no, initial_amount, current_amount, remark, enabled, sort, is_default, 
+    tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.AccountExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_account
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_account
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_account
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.AccountExample">
+    delete from jsh_account
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Account">
+    insert into jsh_account (id, name, serial_no, 
+      initial_amount, current_amount, remark, 
+      enabled, sort, is_default, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{serialNo,jdbcType=VARCHAR}, 
+      #{initialAmount,jdbcType=DECIMAL}, #{currentAmount,jdbcType=DECIMAL}, #{remark,jdbcType=VARCHAR}, 
+      #{enabled,jdbcType=BIT}, #{sort,jdbcType=VARCHAR}, #{isDefault,jdbcType=BIT}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Account">
+    insert into jsh_account
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="serialNo != null">
+        serial_no,
+      </if>
+      <if test="initialAmount != null">
+        initial_amount,
+      </if>
+      <if test="currentAmount != null">
+        current_amount,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="isDefault != null">
+        is_default,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="serialNo != null">
+        #{serialNo,jdbcType=VARCHAR},
+      </if>
+      <if test="initialAmount != null">
+        #{initialAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="currentAmount != null">
+        #{currentAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="isDefault != null">
+        #{isDefault,jdbcType=BIT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.AccountExample" resultType="java.lang.Long">
+    select count(*) from jsh_account
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_account
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.serialNo != null">
+        serial_no = #{record.serialNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.initialAmount != null">
+        initial_amount = #{record.initialAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="record.currentAmount != null">
+        current_amount = #{record.currentAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.isDefault != null">
+        is_default = #{record.isDefault,jdbcType=BIT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_account
+    set id = #{record.id,jdbcType=BIGINT},
+      name = #{record.name,jdbcType=VARCHAR},
+      serial_no = #{record.serialNo,jdbcType=VARCHAR},
+      initial_amount = #{record.initialAmount,jdbcType=DECIMAL},
+      current_amount = #{record.currentAmount,jdbcType=DECIMAL},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      is_default = #{record.isDefault,jdbcType=BIT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Account">
+    update jsh_account
+    <set>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="serialNo != null">
+        serial_no = #{serialNo,jdbcType=VARCHAR},
+      </if>
+      <if test="initialAmount != null">
+        initial_amount = #{initialAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="currentAmount != null">
+        current_amount = #{currentAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="isDefault != null">
+        is_default = #{isDefault,jdbcType=BIT},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Account">
+    update jsh_account
+    set name = #{name,jdbcType=VARCHAR},
+      serial_no = #{serialNo,jdbcType=VARCHAR},
+      initial_amount = #{initialAmount,jdbcType=DECIMAL},
+      current_amount = #{currentAmount,jdbcType=DECIMAL},
+      remark = #{remark,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      sort = #{sort,jdbcType=VARCHAR},
+      is_default = #{isDefault,jdbcType=BIT},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/AccountMapperEx.xml b/src/main/resources/mapper_xml/AccountMapperEx.xml
new file mode 100644
index 0000000..b5ba9bb
--- /dev/null
+++ b/src/main/resources/mapper_xml/AccountMapperEx.xml
@@ -0,0 +1,527 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.AccountMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.AccountMapper.BaseResultMap" id="ResultListMap" type="com.jsh.erp.datasource.vo.AccountVo4List">
+        <result column="thisMonthAmount" jdbcType="VARCHAR" property="thisMonthAmount" />
+    </resultMap>
+
+    <resultMap id="ResultInOutList" type="com.jsh.erp.datasource.vo.AccountVo4InOutList">
+        <result column="Number" jdbcType="VARCHAR" property="number" />
+        <result column="newType" jdbcType="VARCHAR" property="type" />
+        <result column="fromType" jdbcType="VARCHAR" property="fromType" />
+        <result column="supplier" jdbcType="VARCHAR" property="supplierName" />
+        <result column="change_amount" jdbcType="DECIMAL" property="changeAmount" />
+        <result column="oTime" jdbcType="VARCHAR" property="operTime" />
+        <result column="AList" jdbcType="VARCHAR" property="aList" />
+        <result column="AMList" jdbcType="VARCHAR" property="amList" />
+    </resultMap>
+
+    <select id="getAccountByParam" resultType="com.jsh.erp.datasource.entities.Account">
+        select *
+        FROM jsh_account
+        where 1=1
+        <if test="name != null and name !=''">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="serialNo != null and serialNo !=''">
+            <bind name="bindSerialNo" value="'%'+serialNo+'%'"/>
+            and serial_no like #{bindSerialNo}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="selectByConditionAccount" parameterType="com.jsh.erp.datasource.entities.AccountExample" resultMap="ResultListMap">
+        select *
+        FROM jsh_account
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="serialNo != null and serialNo !=''">
+            <bind name="bindSerialNo" value="'%'+serialNo+'%'"/>
+            and serial_no like #{bindSerialNo}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc, id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="countsByAccount" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_account
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="serialNo != null and serialNo !=''">
+            <bind name="bindSerialNo" value="'%'+serialNo+'%'"/>
+            and serial_no like #{bindSerialNo}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getAccountSum" resultType="java.math.BigDecimal">
+        select ifnull(sum(dh.change_amount),0) from jsh_depot_head dh
+        where 1=1 and dh.pay_type != '预付款'
+        <if test="accountId != null">
+            and dh.account_id = #{accountId}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getAccountSumByHead" resultType="java.math.BigDecimal">
+        select ifnull(sum(ah.change_amount),0) from jsh_account_head ah
+        where 1=1
+        <if test="accountId != null">
+            and ah.account_id = #{accountId}
+        </if>
+        <if test="beginTime != null">
+            and ah.bill_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and ah.status = '1'
+        </if>
+        and ifnull(ah.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getAccountSumByDetail" resultType="java.math.BigDecimal">
+        select ifnull(sum(ai.each_amount),0) from jsh_account_head ah
+        left join jsh_account_item ai on ah.id = ai.header_id and ifnull(ai.delete_flag,'0') !='1'
+        where 1=1
+        <if test="accountId != null">
+            and ai.account_id = #{accountId}
+        </if>
+        <if test="beginTime != null">
+            and ah.bill_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and ah.status = '1'
+        </if>
+        and ifnull(ah.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getManyAccountSum" resultType="com.jsh.erp.datasource.entities.DepotHead">
+        select dh.account_id_list accountIdList, dh.account_money_list accountMoneyList from jsh_depot_head dh
+        where 1=1
+        <if test="accountId != null">
+            <bind name="bindAccountId" value="'%'+accountId+'%'"/>
+            and dh.account_id_list like #{bindAccountId}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getAccountSumByParam" resultType="com.jsh.erp.datasource.entities.AccountVo4Sum">
+        select a.id,
+            (select ifnull(sum(dh.change_amount),0) from jsh_depot_head dh
+            where 1=1 and dh.pay_type != '预付款'
+            and dh.account_id = a.id
+            <if test="beginTime != null">
+                and dh.oper_time >= #{beginTime}
+            </if>
+            <if test="endTime != null">
+                and dh.oper_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+            </if>
+            and ifnull(dh.delete_flag,'0') !='1') accountSum,
+            (select ifnull(sum(ah.change_amount),0) from jsh_account_head ah
+            where 1=1 and ah.account_id = a.id
+            <if test="beginTime != null">
+                and ah.bill_time >= #{beginTime}
+            </if>
+            <if test="endTime != null">
+                and ah.bill_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and ah.status = '1'
+            </if>
+            and ifnull(ah.delete_flag,'0') !='1') accountSumByHead,
+            (select ifnull(sum(ai.each_amount),0) from jsh_account_head ah
+            left join jsh_account_item ai on ah.id = ai.header_id and ifnull(ai.delete_flag,'0') !='1'
+            where 1=1 and ai.account_id = a.id
+            <if test="beginTime != null">
+                and ah.bill_time >= #{beginTime}
+            </if>
+            <if test="endTime != null">
+                and ah.bill_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and ah.status = '1'
+            </if>
+            and ifnull(ah.delete_flag,'0') !='1') accountSumByDetail
+        from jsh_account a
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and a.name like #{bindName}
+        </if>
+        <if test="serialNo != null and serialNo !=''">
+            <bind name="bindSerialNo" value="'%'+serialNo+'%'"/>
+            and a.serial_no like #{bindSerialNo}
+        </if>
+        and ifnull(a.delete_flag,'0') !='1'
+        order by a.sort asc, a.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="getManyAccountSumByParam" resultType="com.jsh.erp.datasource.entities.DepotHead">
+        select dh.account_id_list accountIdList, dh.account_money_list accountMoneyList
+        from jsh_depot_head dh
+        where 1=1
+        and dh.account_id_list !=''
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="findAccountInOutList" parameterType="com.jsh.erp.datasource.entities.AccountExample" resultMap="ResultInOutList">
+        <!--主表出入库涉及的账户 -->
+        select dh.number,concat(dh.sub_type,dh.type) as newType, 'bill' as fromType, s.supplier,dh.change_amount,date_format(dh.oper_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList
+        from jsh_depot_head dh left join jsh_supplier s on dh.organ_id = s.id and ifnull(s.delete_flag,'0') !='1'
+        where 1=1
+        <if test="accountId != null">
+            and dh.account_id=#{accountId}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(dh.change_amount, 0)!=0
+        and ifnull(dh.delete_flag,'0') !='1'
+        <!--主表收入和支出涉及的账户 -->
+        UNION ALL
+        select ah.bill_no,ah.type as newType, 'financial' as fromType, s.supplier,ah.change_amount,date_format(ah.bill_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList
+        from jsh_account_head ah left join jsh_supplier s on ah.organ_id=s.id and ifnull(s.delete_flag,'0') !='1'
+        where ah.type!='转账'
+        <if test="accountId != null">
+            and ah.account_id=#{accountId}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and ah.bill_no like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and ah.bill_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and ah.status = '1'
+        </if>
+        and ifnull(ah.change_amount, 0)!=0
+        and ifnull(ah.delete_flag,'0') !='1'
+        <!--明细中涉及的账户(收款,付款,收预付款) -->
+        UNION ALL
+        select ah.bill_no,ah.type as newType, 'financial' as fromType, s.supplier,ai.each_amount change_amount,date_format(ah.bill_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList
+        from jsh_account_head ah left join jsh_supplier s on ah.organ_id=s.id
+        left join jsh_account_item ai on ai.header_id=ah.id and ifnull(ai.delete_flag,'0') !='1'
+        where ah.type in ('收款','付款','收预付款')
+        <if test="accountId != null">
+            and ai.account_id=#{accountId}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and ah.bill_no like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and ah.bill_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and ah.status = '1'
+        </if>
+        and ifnull(ai.each_amount, 0)!=0
+        and ifnull(ah.delete_flag,'0') !='1'
+        <!--主表中转出的账户 -->
+        UNION ALL
+        select ah.bill_no,ah.type as newType, 'financial' as fromType, '' as sName,ah.change_amount,date_format(ah.bill_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList
+        from jsh_account_head ah
+        where ah.type='转账'
+        <if test="accountId != null">
+            and ah.account_id=#{accountId}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and ah.bill_no like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and ah.bill_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and ah.status = '1'
+        </if>
+        and ifnull(ah.change_amount, 0)!=0
+        and ifnull(ah.delete_flag,'0') !='1'
+        <!--明细中被转入的账户 -->
+        UNION ALL
+        select ah.bill_no,ah.type as newType, 'financial' as fromType, '' as sName,ai.each_amount change_amount,date_format(ah.bill_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList
+        from jsh_account_head ah left join jsh_account_item ai on ai.header_id=ah.id and ifnull(ai.delete_flag,'0') !='1'
+        where ah.type='转账'
+        <if test="accountId != null">
+            and ai.account_id=#{accountId}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and ah.bill_no like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and ah.bill_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and ah.bill_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and ah.status = '1'
+        </if>
+        and ifnull(ai.each_amount, 0)!=0
+        and ifnull(ah.delete_flag,'0') !='1'
+        <!--多账户的情况 -->
+        UNION ALL
+        select dh.number,concat(dh.sub_type,dh.type) as newType, 'bill' as fromType, s.supplier,dh.change_amount,date_format(dh.oper_time,'%Y-%m-%d %H:%i:%S') as oTime,
+        dh.account_id_list as AList,dh.account_money_list as AMList
+        from jsh_depot_head dh left join jsh_supplier s on dh.organ_id = s.id and ifnull(s.delete_flag,'0') !='1'
+        where 1=1
+        <if test="accountId != null">
+            <bind name="bindAccountId" value="'%'+accountId+'%'"/>
+            and dh.account_id_list like #{bindAccountId}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(dh.change_amount, 0)!=0
+        and ifnull(dh.delete_flag,'0') !='1'
+        ORDER BY oTime desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="findAccountInOutListCount" resultType="java.lang.Integer">
+        select sum(a) from
+        (
+            <!--主表出入库涉及的账户 -->
+            select count(1) a
+            from jsh_depot_head dh left join jsh_supplier s on dh.organ_id = s.id and ifnull(s.delete_flag,'0') !='1'
+            where 1=1
+            <if test="accountId != null">
+                and dh.account_id=#{accountId}
+            </if>
+            <if test="number != null and number !=''">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and dh.number like #{bindNumber}
+            </if>
+            <if test="beginTime != null and beginTime !=''">
+                and dh.oper_time >= #{beginTime}
+            </if>
+            <if test="endTime != null and endTime !=''">
+                and dh.oper_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+            </if>
+            and ifnull(dh.change_amount, 0)!=0
+            and ifnull(dh.delete_flag,'0') !='1'
+            <!--主表收入和支出涉及的账户 -->
+            UNION ALL
+            select count(1) a
+            from jsh_account_head ah left join jsh_supplier s on ah.organ_id=s.id and ifnull(s.delete_flag,'0') !='1'
+            where ah.type!='转账'
+            <if test="accountId != null">
+                and ah.account_id=#{accountId}
+            </if>
+            <if test="number != null and number !=''">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and ah.bill_no like #{bindNumber}
+            </if>
+            <if test="beginTime != null and beginTime !=''">
+                and ah.bill_time >= #{beginTime}
+            </if>
+            <if test="endTime != null and endTime !=''">
+                and ah.bill_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and ah.status = '1'
+            </if>
+            and ifnull(ah.change_amount, 0)!=0
+            and ifnull(ah.delete_flag,'0') !='1'
+            <!--明细中涉及的账户(收款,付款,收预付款) -->
+            UNION ALL
+            select count(1) a
+            from jsh_account_head ah left join jsh_supplier s on ah.organ_id=s.id
+            left join jsh_account_item ai on ai.header_id=ah.Id and ifnull(ai.delete_flag,'0') !='1'
+            where ah.Type in ('收款','付款','收预付款')
+            <if test="accountId != null">
+                and ai.account_id=#{accountId}
+            </if>
+            <if test="number != null and number !=''">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and ah.bill_no like #{bindNumber}
+            </if>
+            <if test="beginTime != null and beginTime !=''">
+                and ah.bill_time >= #{beginTime}
+            </if>
+            <if test="endTime != null and endTime !=''">
+                and ah.bill_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and ah.status = '1'
+            </if>
+            and ifnull(ai.each_amount, 0)!=0
+            and ifnull(ah.delete_flag,'0') !='1'
+            <!--主表中转出的账户 -->
+            UNION ALL
+            select count(1) a
+            from jsh_account_head ah
+            where ah.type='转账'
+            <if test="accountId != null">
+                and ah.account_id=#{accountId}
+            </if>
+            <if test="number != null and number !=''">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and ah.bill_no like #{bindNumber}
+            </if>
+            <if test="beginTime != null and beginTime !=''">
+                and ah.bill_time >= #{beginTime}
+            </if>
+            <if test="endTime != null and endTime !=''">
+                and ah.bill_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and ah.status = '1'
+            </if>
+            and ifnull(ah.change_amount, 0)!=0
+            and ifnull(ah.delete_flag,'0') !='1'
+            <!--明细中被转入的账户 -->
+            UNION ALL
+            select count(1) a
+            from jsh_account_head ah left join jsh_account_item ai on ai.header_id=ah.id and ifnull(ai.delete_flag,'0') !='1'
+            where ah.type='转账'
+            <if test="accountId != null">
+                and ai.account_id=#{accountId}
+            </if>
+            <if test="number != null and number !=''">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and ah.bill_no like #{bindNumber}
+            </if>
+            <if test="beginTime != null and beginTime !=''">
+                and ah.bill_time >= #{beginTime}
+            </if>
+            <if test="endTime != null and endTime !=''">
+                and ah.bill_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and ah.status = '1'
+            </if>
+            and ifnull(ai.each_amount, 0)!=0
+            and ifnull(ah.delete_flag,'0') !='1'
+            <!--多账户的情况 -->
+            UNION ALL
+            select count(1) a
+            from jsh_depot_head dh left join jsh_supplier s on dh.organ_id = s.id and ifnull(s.delete_flag,'0') !='1'
+            where 1=1
+            <if test="accountId != null">
+                <bind name="bindAccountId" value="'%'+accountId+'%'"/>
+                and dh.account_id_list like #{bindAccountId}
+            </if>
+            <if test="number != null and number !=''">
+                <bind name="bindNumber" value="'%'+number+'%'"/>
+                and dh.number like #{bindNumber}
+            </if>
+            <if test="beginTime != null and beginTime !=''">
+                and dh.oper_time >= #{beginTime}
+            </if>
+            <if test="endTime != null and endTime !=''">
+                and dh.oper_time &lt;= #{endTime}
+            </if>
+            <if test="forceFlag">
+                and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+            </if>
+            and ifnull(dh.change_amount, 0)!=0
+            and ifnull(dh.delete_flag,'0') !='1'
+        ) cc
+    </select>
+
+    <update id="batchDeleteAccountByIds">
+        update jsh_account
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/DepotHeadMapper.xml b/src/main/resources/mapper_xml/DepotHeadMapper.xml
new file mode 100644
index 0000000..db40af2
--- /dev/null
+++ b/src/main/resources/mapper_xml/DepotHeadMapper.xml
@@ -0,0 +1,638 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.DepotHeadMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.DepotHead">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="sub_type" jdbcType="VARCHAR" property="subType" />
+    <result column="default_number" jdbcType="VARCHAR" property="defaultNumber" />
+    <result column="number" jdbcType="VARCHAR" property="number" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="oper_time" jdbcType="TIMESTAMP" property="operTime" />
+    <result column="organ_id" jdbcType="BIGINT" property="organId" />
+    <result column="creator" jdbcType="BIGINT" property="creator" />
+    <result column="account_id" jdbcType="BIGINT" property="accountId" />
+    <result column="change_amount" jdbcType="DECIMAL" property="changeAmount" />
+    <result column="back_amount" jdbcType="DECIMAL" property="backAmount" />
+    <result column="total_price" jdbcType="DECIMAL" property="totalPrice" />
+    <result column="pay_type" jdbcType="VARCHAR" property="payType" />
+    <result column="bill_type" jdbcType="VARCHAR" property="billType" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="file_name" jdbcType="VARCHAR" property="fileName" />
+    <result column="sales_man" jdbcType="VARCHAR" property="salesMan" />
+    <result column="account_id_list" jdbcType="VARCHAR" property="accountIdList" />
+    <result column="account_money_list" jdbcType="VARCHAR" property="accountMoneyList" />
+    <result column="discount" jdbcType="DECIMAL" property="discount" />
+    <result column="discount_money" jdbcType="DECIMAL" property="discountMoney" />
+    <result column="discount_last_money" jdbcType="DECIMAL" property="discountLastMoney" />
+    <result column="other_money" jdbcType="DECIMAL" property="otherMoney" />
+    <result column="deposit" jdbcType="DECIMAL" property="deposit" />
+    <result column="status" jdbcType="VARCHAR" property="status" />
+    <result column="purchase_status" jdbcType="VARCHAR" property="purchaseStatus" />
+    <result column="source" jdbcType="VARCHAR" property="source" />
+    <result column="link_number" jdbcType="VARCHAR" property="linkNumber" />
+    <result column="link_apply" jdbcType="VARCHAR" property="linkApply" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, type, sub_type, default_number, number, create_time, oper_time, organ_id, creator, 
+    account_id, change_amount, back_amount, total_price, pay_type, bill_type, remark, 
+    file_name, sales_man, account_id_list, account_money_list, discount, discount_money, 
+    discount_last_money, other_money, deposit, status, purchase_status, source, link_number, 
+    link_apply, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.DepotHeadExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_depot_head
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_depot_head
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_depot_head
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.DepotHeadExample">
+    delete from jsh_depot_head
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.DepotHead">
+    insert into jsh_depot_head (id, type, sub_type, 
+      default_number, number, create_time, 
+      oper_time, organ_id, creator, 
+      account_id, change_amount, back_amount, 
+      total_price, pay_type, bill_type, 
+      remark, file_name, sales_man, 
+      account_id_list, account_money_list, discount, 
+      discount_money, discount_last_money, other_money, 
+      deposit, status, purchase_status, 
+      source, link_number, link_apply, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{subType,jdbcType=VARCHAR}, 
+      #{defaultNumber,jdbcType=VARCHAR}, #{number,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{operTime,jdbcType=TIMESTAMP}, #{organId,jdbcType=BIGINT}, #{creator,jdbcType=BIGINT}, 
+      #{accountId,jdbcType=BIGINT}, #{changeAmount,jdbcType=DECIMAL}, #{backAmount,jdbcType=DECIMAL}, 
+      #{totalPrice,jdbcType=DECIMAL}, #{payType,jdbcType=VARCHAR}, #{billType,jdbcType=VARCHAR}, 
+      #{remark,jdbcType=VARCHAR}, #{fileName,jdbcType=VARCHAR}, #{salesMan,jdbcType=VARCHAR}, 
+      #{accountIdList,jdbcType=VARCHAR}, #{accountMoneyList,jdbcType=VARCHAR}, #{discount,jdbcType=DECIMAL}, 
+      #{discountMoney,jdbcType=DECIMAL}, #{discountLastMoney,jdbcType=DECIMAL}, #{otherMoney,jdbcType=DECIMAL}, 
+      #{deposit,jdbcType=DECIMAL}, #{status,jdbcType=VARCHAR}, #{purchaseStatus,jdbcType=VARCHAR}, 
+      #{source,jdbcType=VARCHAR}, #{linkNumber,jdbcType=VARCHAR}, #{linkApply,jdbcType=VARCHAR}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.DepotHead">
+    insert into jsh_depot_head
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="subType != null">
+        sub_type,
+      </if>
+      <if test="defaultNumber != null">
+        default_number,
+      </if>
+      <if test="number != null">
+        number,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="operTime != null">
+        oper_time,
+      </if>
+      <if test="organId != null">
+        organ_id,
+      </if>
+      <if test="creator != null">
+        creator,
+      </if>
+      <if test="accountId != null">
+        account_id,
+      </if>
+      <if test="changeAmount != null">
+        change_amount,
+      </if>
+      <if test="backAmount != null">
+        back_amount,
+      </if>
+      <if test="totalPrice != null">
+        total_price,
+      </if>
+      <if test="payType != null">
+        pay_type,
+      </if>
+      <if test="billType != null">
+        bill_type,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="fileName != null">
+        file_name,
+      </if>
+      <if test="salesMan != null">
+        sales_man,
+      </if>
+      <if test="accountIdList != null">
+        account_id_list,
+      </if>
+      <if test="accountMoneyList != null">
+        account_money_list,
+      </if>
+      <if test="discount != null">
+        discount,
+      </if>
+      <if test="discountMoney != null">
+        discount_money,
+      </if>
+      <if test="discountLastMoney != null">
+        discount_last_money,
+      </if>
+      <if test="otherMoney != null">
+        other_money,
+      </if>
+      <if test="deposit != null">
+        deposit,
+      </if>
+      <if test="status != null">
+        status,
+      </if>
+      <if test="purchaseStatus != null">
+        purchase_status,
+      </if>
+      <if test="source != null">
+        source,
+      </if>
+      <if test="linkNumber != null">
+        link_number,
+      </if>
+      <if test="linkApply != null">
+        link_apply,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="subType != null">
+        #{subType,jdbcType=VARCHAR},
+      </if>
+      <if test="defaultNumber != null">
+        #{defaultNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="number != null">
+        #{number,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="operTime != null">
+        #{operTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="organId != null">
+        #{organId,jdbcType=BIGINT},
+      </if>
+      <if test="creator != null">
+        #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="accountId != null">
+        #{accountId,jdbcType=BIGINT},
+      </if>
+      <if test="changeAmount != null">
+        #{changeAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="backAmount != null">
+        #{backAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="totalPrice != null">
+        #{totalPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="payType != null">
+        #{payType,jdbcType=VARCHAR},
+      </if>
+      <if test="billType != null">
+        #{billType,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="fileName != null">
+        #{fileName,jdbcType=VARCHAR},
+      </if>
+      <if test="salesMan != null">
+        #{salesMan,jdbcType=VARCHAR},
+      </if>
+      <if test="accountIdList != null">
+        #{accountIdList,jdbcType=VARCHAR},
+      </if>
+      <if test="accountMoneyList != null">
+        #{accountMoneyList,jdbcType=VARCHAR},
+      </if>
+      <if test="discount != null">
+        #{discount,jdbcType=DECIMAL},
+      </if>
+      <if test="discountMoney != null">
+        #{discountMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="discountLastMoney != null">
+        #{discountLastMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="otherMoney != null">
+        #{otherMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="deposit != null">
+        #{deposit,jdbcType=DECIMAL},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="purchaseStatus != null">
+        #{purchaseStatus,jdbcType=VARCHAR},
+      </if>
+      <if test="source != null">
+        #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="linkNumber != null">
+        #{linkNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="linkApply != null">
+        #{linkApply,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.DepotHeadExample" resultType="java.lang.Long">
+    select count(*) from jsh_depot_head
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_depot_head
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.subType != null">
+        sub_type = #{record.subType,jdbcType=VARCHAR},
+      </if>
+      <if test="record.defaultNumber != null">
+        default_number = #{record.defaultNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.number != null">
+        number = #{record.number,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.operTime != null">
+        oper_time = #{record.operTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.organId != null">
+        organ_id = #{record.organId,jdbcType=BIGINT},
+      </if>
+      <if test="record.creator != null">
+        creator = #{record.creator,jdbcType=BIGINT},
+      </if>
+      <if test="record.accountId != null">
+        account_id = #{record.accountId,jdbcType=BIGINT},
+      </if>
+      <if test="record.changeAmount != null">
+        change_amount = #{record.changeAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="record.backAmount != null">
+        back_amount = #{record.backAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="record.totalPrice != null">
+        total_price = #{record.totalPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.payType != null">
+        pay_type = #{record.payType,jdbcType=VARCHAR},
+      </if>
+      <if test="record.billType != null">
+        bill_type = #{record.billType,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.fileName != null">
+        file_name = #{record.fileName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.salesMan != null">
+        sales_man = #{record.salesMan,jdbcType=VARCHAR},
+      </if>
+      <if test="record.accountIdList != null">
+        account_id_list = #{record.accountIdList,jdbcType=VARCHAR},
+      </if>
+      <if test="record.accountMoneyList != null">
+        account_money_list = #{record.accountMoneyList,jdbcType=VARCHAR},
+      </if>
+      <if test="record.discount != null">
+        discount = #{record.discount,jdbcType=DECIMAL},
+      </if>
+      <if test="record.discountMoney != null">
+        discount_money = #{record.discountMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="record.discountLastMoney != null">
+        discount_last_money = #{record.discountLastMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="record.otherMoney != null">
+        other_money = #{record.otherMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="record.deposit != null">
+        deposit = #{record.deposit,jdbcType=DECIMAL},
+      </if>
+      <if test="record.status != null">
+        status = #{record.status,jdbcType=VARCHAR},
+      </if>
+      <if test="record.purchaseStatus != null">
+        purchase_status = #{record.purchaseStatus,jdbcType=VARCHAR},
+      </if>
+      <if test="record.source != null">
+        source = #{record.source,jdbcType=VARCHAR},
+      </if>
+      <if test="record.linkNumber != null">
+        link_number = #{record.linkNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.linkApply != null">
+        link_apply = #{record.linkApply,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_depot_head
+    set id = #{record.id,jdbcType=BIGINT},
+      type = #{record.type,jdbcType=VARCHAR},
+      sub_type = #{record.subType,jdbcType=VARCHAR},
+      default_number = #{record.defaultNumber,jdbcType=VARCHAR},
+      number = #{record.number,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      oper_time = #{record.operTime,jdbcType=TIMESTAMP},
+      organ_id = #{record.organId,jdbcType=BIGINT},
+      creator = #{record.creator,jdbcType=BIGINT},
+      account_id = #{record.accountId,jdbcType=BIGINT},
+      change_amount = #{record.changeAmount,jdbcType=DECIMAL},
+      back_amount = #{record.backAmount,jdbcType=DECIMAL},
+      total_price = #{record.totalPrice,jdbcType=DECIMAL},
+      pay_type = #{record.payType,jdbcType=VARCHAR},
+      bill_type = #{record.billType,jdbcType=VARCHAR},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      file_name = #{record.fileName,jdbcType=VARCHAR},
+      sales_man = #{record.salesMan,jdbcType=VARCHAR},
+      account_id_list = #{record.accountIdList,jdbcType=VARCHAR},
+      account_money_list = #{record.accountMoneyList,jdbcType=VARCHAR},
+      discount = #{record.discount,jdbcType=DECIMAL},
+      discount_money = #{record.discountMoney,jdbcType=DECIMAL},
+      discount_last_money = #{record.discountLastMoney,jdbcType=DECIMAL},
+      other_money = #{record.otherMoney,jdbcType=DECIMAL},
+      deposit = #{record.deposit,jdbcType=DECIMAL},
+      status = #{record.status,jdbcType=VARCHAR},
+      purchase_status = #{record.purchaseStatus,jdbcType=VARCHAR},
+      source = #{record.source,jdbcType=VARCHAR},
+      link_number = #{record.linkNumber,jdbcType=VARCHAR},
+      link_apply = #{record.linkApply,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.DepotHead">
+    update jsh_depot_head
+    <set>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="subType != null">
+        sub_type = #{subType,jdbcType=VARCHAR},
+      </if>
+      <if test="defaultNumber != null">
+        default_number = #{defaultNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="number != null">
+        number = #{number,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="operTime != null">
+        oper_time = #{operTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="organId != null">
+        organ_id = #{organId,jdbcType=BIGINT},
+      </if>
+      <if test="creator != null">
+        creator = #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="accountId != null">
+        account_id = #{accountId,jdbcType=BIGINT},
+      </if>
+      <if test="changeAmount != null">
+        change_amount = #{changeAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="backAmount != null">
+        back_amount = #{backAmount,jdbcType=DECIMAL},
+      </if>
+      <if test="totalPrice != null">
+        total_price = #{totalPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="payType != null">
+        pay_type = #{payType,jdbcType=VARCHAR},
+      </if>
+      <if test="billType != null">
+        bill_type = #{billType,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="fileName != null">
+        file_name = #{fileName,jdbcType=VARCHAR},
+      </if>
+      <if test="salesMan != null">
+        sales_man = #{salesMan,jdbcType=VARCHAR},
+      </if>
+      <if test="accountIdList != null">
+        account_id_list = #{accountIdList,jdbcType=VARCHAR},
+      </if>
+      <if test="accountMoneyList != null">
+        account_money_list = #{accountMoneyList,jdbcType=VARCHAR},
+      </if>
+      <if test="discount != null">
+        discount = #{discount,jdbcType=DECIMAL},
+      </if>
+      <if test="discountMoney != null">
+        discount_money = #{discountMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="discountLastMoney != null">
+        discount_last_money = #{discountLastMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="otherMoney != null">
+        other_money = #{otherMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="deposit != null">
+        deposit = #{deposit,jdbcType=DECIMAL},
+      </if>
+      <if test="status != null">
+        status = #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="purchaseStatus != null">
+        purchase_status = #{purchaseStatus,jdbcType=VARCHAR},
+      </if>
+      <if test="source != null">
+        source = #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="linkNumber != null">
+        link_number = #{linkNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="linkApply != null">
+        link_apply = #{linkApply,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.DepotHead">
+    update jsh_depot_head
+    set type = #{type,jdbcType=VARCHAR},
+      sub_type = #{subType,jdbcType=VARCHAR},
+      default_number = #{defaultNumber,jdbcType=VARCHAR},
+      number = #{number,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      oper_time = #{operTime,jdbcType=TIMESTAMP},
+      organ_id = #{organId,jdbcType=BIGINT},
+      creator = #{creator,jdbcType=BIGINT},
+      account_id = #{accountId,jdbcType=BIGINT},
+      change_amount = #{changeAmount,jdbcType=DECIMAL},
+      back_amount = #{backAmount,jdbcType=DECIMAL},
+      total_price = #{totalPrice,jdbcType=DECIMAL},
+      pay_type = #{payType,jdbcType=VARCHAR},
+      bill_type = #{billType,jdbcType=VARCHAR},
+      remark = #{remark,jdbcType=VARCHAR},
+      file_name = #{fileName,jdbcType=VARCHAR},
+      sales_man = #{salesMan,jdbcType=VARCHAR},
+      account_id_list = #{accountIdList,jdbcType=VARCHAR},
+      account_money_list = #{accountMoneyList,jdbcType=VARCHAR},
+      discount = #{discount,jdbcType=DECIMAL},
+      discount_money = #{discountMoney,jdbcType=DECIMAL},
+      discount_last_money = #{discountLastMoney,jdbcType=DECIMAL},
+      other_money = #{otherMoney,jdbcType=DECIMAL},
+      deposit = #{deposit,jdbcType=DECIMAL},
+      status = #{status,jdbcType=VARCHAR},
+      purchase_status = #{purchaseStatus,jdbcType=VARCHAR},
+      source = #{source,jdbcType=VARCHAR},
+      link_number = #{linkNumber,jdbcType=VARCHAR},
+      link_apply = #{linkApply,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/DepotHeadMapperEx.xml b/src/main/resources/mapper_xml/DepotHeadMapperEx.xml
new file mode 100644
index 0000000..ef06682
--- /dev/null
+++ b/src/main/resources/mapper_xml/DepotHeadMapperEx.xml
@@ -0,0 +1,1488 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.DepotHeadMapperEx">
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.DepotHeadMapper.BaseResultMap" id="ResultMapEx" type="com.jsh.erp.datasource.vo.DepotHeadVo4List">
+        <result column="depotHeadType" jdbcType="VARCHAR" property="depotHeadType" />
+        <result column="OrganName" jdbcType="VARCHAR" property="organName" />
+        <result column="userName" jdbcType="VARCHAR" property="userName" />
+        <result column="AccountName" jdbcType="VARCHAR" property="accountName" />
+        <result column="contacts" jdbcType="VARCHAR" property="contacts" />
+        <result column="telephone" jdbcType="VARCHAR" property="telephone" />
+        <result column="address" jdbcType="VARCHAR" property="address" />
+    </resultMap>
+
+    <resultMap id="ResultWithInfoExMap" type="com.jsh.erp.datasource.vo.DepotHeadVo4InDetail">
+        <result column="number" jdbcType="VARCHAR" property="number" />
+        <result column="barCode" jdbcType="VARCHAR" property="barCode" />
+        <result column="mname" jdbcType="VARCHAR" property="mname" />
+        <result column="model" jdbcType="VARCHAR" property="model" />
+        <result column="standard" jdbcType="VARCHAR" property="standard" />
+        <result column="color" jdbcType="VARCHAR" property="color" />
+        <result column="brand" jdbcType="VARCHAR" property="brand" />
+        <result column="mfrs" jdbcType="VARCHAR" property="mfrs" />
+        <result column="unitPrice" jdbcType="DECIMAL" property="unitPrice" />
+        <result column="sku" jdbcType="VARCHAR" property="sku" />
+        <result column="operNumber" jdbcType="DECIMAL" property="operNumber" />
+        <result column="allPrice" jdbcType="DECIMAL" property="allPrice" />
+        <result column="taxRate" jdbcType="DECIMAL" property="taxRate" />
+        <result column="taxMoney" jdbcType="DECIMAL" property="taxMoney" />
+        <result column="taxLastMoney" jdbcType="DECIMAL" property="taxLastMoney" />
+        <result column="sname" jdbcType="VARCHAR" property="sname" />
+        <result column="dname" jdbcType="VARCHAR" property="dname" />
+        <result column="operTime" jdbcType="VARCHAR" property="operTime" />
+        <result column="newType" jdbcType="VARCHAR" property="newType" />
+    </resultMap>
+
+    <resultMap id="ResultInOutMaterialCount" type="com.jsh.erp.datasource.vo.DepotHeadVo4InOutMCount">
+        <result column="materialId" jdbcType="BIGINT" property="materialId" />
+        <result column="barCode" jdbcType="VARCHAR" property="barCode" />
+        <result column="mName" jdbcType="VARCHAR" property="mName" />
+        <result column="model" jdbcType="VARCHAR" property="model" />
+        <result column="standard" jdbcType="VARCHAR" property="standard" />
+        <result column="color" jdbcType="VARCHAR" property="color" />
+        <result column="brand" jdbcType="VARCHAR" property="brand" />
+        <result column="mfrs" jdbcType="VARCHAR" property="mfrs" />
+        <result column="categoryName" jdbcType="VARCHAR" property="categoryName" />
+        <result column="materialUnit" jdbcType="VARCHAR" property="materialUnit" />
+        <result column="numSum" jdbcType="DECIMAL" property="numSum" />
+        <result column="priceSum" jdbcType="DECIMAL" property="priceSum" />
+    </resultMap>
+
+    <resultMap id="ResultStatementAccount" type="com.jsh.erp.datasource.vo.DepotHeadVo4StatementAccount">
+        <result column="number" jdbcType="VARCHAR" property="number" />
+        <result column="type" jdbcType="VARCHAR" property="type" />
+        <result column="discount_last_money" jdbcType="DECIMAL" property="discountLastMoney" />
+        <result column="other_money" jdbcType="DECIMAL" property="otherMoney" />
+        <result column="change_amount" jdbcType="DECIMAL" property="changeAmount" />
+        <result column="supplierName" jdbcType="VARCHAR" property="supplierName" />
+        <result column="oTime" jdbcType="VARCHAR" property="oTime" />
+    </resultMap>
+
+    <select id="selectByConditionDepotHead" parameterType="com.jsh.erp.datasource.entities.DepotHeadExample" resultMap="ResultMapEx">
+        select jdh.*, s.supplier OrganName, u.username userName, a.name AccountName
+        from (select dh.id
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id = di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id = m.id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on di.material_extend_id = me.id and ifnull(me.delete_flag,'0') !='1'
+        where 1=1
+        <if test="type != null">
+            and dh.type=#{type}
+        </if>
+        <if test="subType != null">
+            and dh.sub_type=#{subType}
+        </if>
+        <if test="statusArray != null and statusArray !=''">
+            and dh.status in (
+            <foreach collection="statusArray" item="status" separator=",">
+                #{status}
+            </foreach>
+            )
+        </if>
+        <if test="purchaseStatusArray != null and purchaseStatusArray !=''">
+            and dh.purchase_status in (
+            <foreach collection="purchaseStatusArray" item="purchaseStatus" separator=",">
+                #{purchaseStatus}
+            </foreach>
+            )
+        </if>
+        <if test="number != null">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="linkApply != null">
+            <bind name="bindLinkApply" value="'%'+linkApply+'%'"/>
+            and dh.link_apply like #{bindLinkApply}
+        </if>
+        <if test="linkNumber != null">
+            <bind name="bindLinkNumber" value="'%'+linkNumber+'%'"/>
+            and dh.link_number like #{bindLinkNumber}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="organId != null">
+            and dh.organ_id=#{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        <if test="creator != null">
+            and dh.creator=#{creator}
+        </if>
+        <if test="depotId != null">
+            and di.depot_id=#{depotId}
+        </if>
+        <if test="depotArray != null and depotArray !=''">
+            and di.depot_id in (
+            <foreach collection="depotArray" item="depotId" separator=",">
+                #{depotId}
+            </foreach>
+            )
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="accountId != null">
+            <bind name="bindAccountId" value="'%'+accountId+'%'"/>
+            and (dh.account_id=#{accountId} or dh.account_id_list like #{bindAccountId})
+        </if>
+        <if test="hasDebt != null and hasDebt ==1">
+            and
+            (ifnull(dh.discount_last_money,0)+ifnull(dh.other_money,0)-ifnull(dh.deposit,0)-abs(ifnull(dh.change_amount,0))>0)
+        </if>
+        <if test="hasDebt != null and hasDebt ==0">
+            and
+            (ifnull(dh.discount_last_money,0)+ifnull(dh.other_money,0)-ifnull(dh.deposit,0)-abs(ifnull(dh.change_amount,0))=0)
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        group by dh.id
+        order by dh.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>) tb
+        left join jsh_depot_head jdh on jdh.id=tb.id and ifnull(jdh.delete_flag,'0') !='1'
+        left join jsh_supplier s on jdh.organ_id=s.id and ifnull(s.delete_flag,'0') !='1'
+        left join jsh_user u on jdh.creator=u.id
+        left join jsh_account a on jdh.account_id=a.id and ifnull(a.delete_flag,'0') !='1'
+        order by jdh.id desc
+    </select>
+
+    <select id="countsByDepotHead" resultType="java.lang.Long">
+        select
+        count(1) from
+        (select distinct dh.id from jsh_depot_head dh
+        left join jsh_depot_item di on dh.Id = di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id = m.Id and ifnull(m.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on di.material_extend_id = me.id and ifnull(me.delete_flag,'0') !='1'
+        WHERE 1=1
+        <if test="type != null">
+            and dh.type=#{type}
+        </if>
+        <if test="subType != null">
+            and dh.sub_type=#{subType}
+        </if>
+        <if test="statusArray != null and statusArray !=''">
+            and dh.status in (
+            <foreach collection="statusArray" item="status" separator=",">
+                #{status}
+            </foreach>
+            )
+        </if>
+        <if test="purchaseStatusArray != null and purchaseStatusArray !=''">
+            and dh.purchase_status in (
+            <foreach collection="purchaseStatusArray" item="purchaseStatus" separator=",">
+                #{purchaseStatus}
+            </foreach>
+            )
+        </if>
+        <if test="number != null">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="linkApply != null">
+            <bind name="bindLinkApply" value="'%'+linkApply+'%'"/>
+            and dh.link_apply like #{bindLinkApply}
+        </if>
+        <if test="linkNumber != null">
+            <bind name="bindLinkNumber" value="'%'+linkNumber+'%'"/>
+            and dh.link_number like #{bindLinkNumber}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="organId != null">
+            and dh.organ_id=#{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        <if test="creator != null">
+            and dh.creator=#{creator}
+        </if>
+        <if test="depotId != null">
+            and di.depot_id=#{depotId}
+        </if>
+        <if test="depotArray != null and depotArray !=''">
+            and di.depot_id in (
+            <foreach collection="depotArray" item="depotId" separator=",">
+                #{depotId}
+            </foreach>
+            )
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="accountId != null">
+            <bind name="bindAccountId" value="'%'+accountId+'%'"/>
+            and (dh.account_id=#{accountId} or dh.account_id_list like #{bindAccountId})
+        </if>
+        <if test="hasDebt != null and hasDebt ==1">
+            and (ifnull(dh.discount_last_money,0)+ifnull(dh.other_money,0)-ifnull(dh.deposit,0)-abs(ifnull(dh.change_amount,0))>0)
+        </if>
+        <if test="hasDebt != null and hasDebt ==0">
+            and (ifnull(dh.discount_last_money,0)+ifnull(dh.other_money,0)-ifnull(dh.deposit,0)-abs(ifnull(dh.change_amount,0))=0)
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and ifnull(dh.delete_Flag,'0') !='1') tb
+    </select>
+
+    <select id="findMaterialsListMapByHeaderIdList" resultType="com.jsh.erp.datasource.vo.MaterialsListVo">
+        select jsh_depot_item.header_id, group_concat(concat(jsh_material.name,' ',ifnull(jsh_material.standard,''),' ',
+            ifnull(jsh_material.model,''),' ',ifnull(jsh_material.color,''))) as materialsList
+        from jsh_depot_item
+        left join jsh_material on jsh_depot_item.material_id = jsh_material.Id and ifnull(jsh_material.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="idList.size()>0">
+            and jsh_depot_item.header_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and ifnull(jsh_depot_item.delete_flag,'0') !='1'
+        group by jsh_depot_item.header_id
+    </select>
+
+    <select id="getMaterialCountListByHeaderIdList" resultType="com.jsh.erp.datasource.vo.MaterialCountVo">
+        select header_id, sum(oper_number) materialCount from jsh_depot_item
+        where 1=1
+        <if test="idList.size()>0">
+            and header_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        group by header_id
+    </select>
+
+    <select id="findInOutDetail" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultWithInfoExMap">
+        select dh.number,me.bar_code barCode, m.name mname,m.model,m.standard,m.color,m.brand,m.mfrs,di.unit_price unitPrice,di.material_unit as mUnit, di.sku,
+        di.oper_number operNumber,di.all_price allPrice, ifnull(di.tax_rate,0) taxRate, ifnull(di.tax_money,0) taxMoney, ifnull(di.tax_last_money,0) taxLastMoney,
+        s.supplier sname,d.dname dname, date_format(dh.oper_time, '%Y-%m-%d') operTime, concat(dh.sub_type,dh.type) as newType,
+        concat_ws('  ',dh.remark,di.remark) as newRemark
+        from jsh_depot_head dh
+        left join jsh_depot_item di on di.header_id=dh.id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_supplier s on s.id=dh.organ_id and ifnull(s.delete_Flag,'0') !='1'
+        left join (select id,name as dName,delete_Flag from jsh_depot ) d on d.id=di.depot_id and ifnull(d.delete_Flag,'0') !='1'
+        where dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="oId != null">
+            and dh.organ_id = #{oId}
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="type != null">
+            and dh.type=#{type}
+        </if>
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and (dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            ) or dh.sub_type='采购退货' or dh.sub_type='零售' or dh.sub_type='其它')
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="creator != null">
+            and dh.creator=#{creator}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and dh.sub_type!='调拨'
+        and ifnull(dh.delete_flag,'0') !='1'
+        <if test="column == 'createTime'">
+            order by oper_time desc,number desc
+        </if>
+        <if test="column != 'createTime'">
+            order by ${column} ${order}
+        </if>
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="findInOutDetailCount" resultType="java.lang.Integer">
+        select count(1)
+        from jsh_depot_head dh
+        left join jsh_depot_item di on di.header_id=dh.id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_supplier s on s.id=dh.organ_id and ifnull(s.delete_Flag,'0') !='1'
+        left join (select id,name as dName,delete_Flag from jsh_depot) d on d.id=di.depot_id and ifnull(d.delete_Flag,'0') !='1'
+        where dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="oId != null">
+            and dh.organ_id = #{oId}
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="type != null">
+            and dh.type=#{type}
+        </if>
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and (dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            ) or dh.sub_type='采购退货' or dh.sub_type='零售' or dh.sub_type='其它')
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="creator != null">
+            and dh.creator=#{creator}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and dh.sub_type!='调拨'
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="findInOutDetailStatistic" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultWithInfoExMap">
+        select ifnull(sum(di.oper_number),0) operNumber, ifnull(sum(di.all_price),0) allPrice
+        from jsh_depot_head dh
+        left join jsh_depot_item di on di.header_id=dh.id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_supplier s on s.id=dh.organ_id and ifnull(s.delete_Flag,'0') !='1'
+        left join (select id,name as dName,delete_Flag from jsh_depot ) d on d.id=di.depot_id and ifnull(d.delete_Flag,'0') !='1'
+        where dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="oId != null">
+            and dh.organ_id = #{oId}
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="type != null">
+            and dh.type=#{type}
+        </if>
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and (dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            ) or dh.sub_type='采购退货' or dh.sub_type='零售' or dh.sub_type='其它')
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="creator != null">
+            and dh.creator=#{creator}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and dh.sub_type!='调拨'
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="findInOutMaterialCount" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultInOutMaterialCount">
+        select di.material_id materialId, me.bar_code barCode, m.name mName,m.model,m.standard,m.color,m.brand,m.mfrs,
+               mc.name categoryName,concat_ws('', m.unit, u.basic_unit) materialUnit,
+        sum(di.basic_number) numSum,
+        sum(di.all_price) priceSum
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_category mc on m.category_id=mc.Id and ifnull(mc.delete_flag,'0') !='1'
+        where me.default_flag=1
+        and (dh.type=#{type} or dh.sub_type='调拨') and dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="oId != null">
+            and dh.organ_id = #{oId}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and (dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            ) or dh.sub_type='采购退货' or dh.sub_type='零售' or dh.sub_type='其它')
+        </if>
+        <if test="depotList.size()>0">
+            <if test="type == '入库'">
+                and ((
+                dh.sub_type!='调拨' and di.depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                ) or (
+                dh.sub_type='调拨' and di.another_depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                ))
+            </if>
+            <if test="type == '出库'">
+                and di.depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        group by di.material_id
+        <if test="column == 'createTime'">
+            order by materialId desc
+        </if>
+        <if test="column != 'createTime'">
+            order by ${column} ${order}
+        </if>
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="findInOutMaterialCountTotal" resultType="java.lang.Integer">
+        select count(1) from
+        (select di.material_id from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id  and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_flag,'0') !='1'
+        where me.default_flag=1
+        and (dh.type=#{type} or dh.sub_type='调拨') and dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="oId != null">
+            and dh.organ_id = #{oId}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and (dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            ) or dh.sub_type='采购退货' or dh.sub_type='零售' or dh.sub_type='其它')
+        </if>
+        <if test="depotList.size()>0">
+            <if test="type == '入库'">
+                 and ((
+                 dh.sub_type!='调拨' and di.depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                 ) or (
+                 dh.sub_type='调拨' and di.another_depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                 ))
+            </if>
+            <if test="type == '出库'">
+                and di.depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        group by di.material_id) a
+    </select>
+
+    <select id="findInOutMaterialCountStatistic" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultInOutMaterialCount">
+        select ifnull(sum(di.basic_number),0) numSum, ifnull(sum(di.all_price),0) priceSum
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_category mc on m.category_id=mc.Id and ifnull(mc.delete_flag,'0') !='1'
+        where me.default_flag=1
+        and (dh.type=#{type} or dh.sub_type='调拨') and dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="oId != null">
+            and dh.organ_id = #{oId}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and (dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            ) or dh.sub_type='采购退货' or dh.sub_type='零售' or dh.sub_type='其它')
+        </if>
+        <if test="depotList.size()>0">
+            <if test="type == '入库'">
+                and ((
+                dh.sub_type!='调拨' and di.depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                ) or (
+                dh.sub_type='调拨' and di.another_depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                ))
+            </if>
+            <if test="type == '出库'">
+                and di.depot_id in
+                <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="findAllocationDetail" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultWithInfoExMap">
+        select dh.number,me.bar_code barCode, m.name mname,m.model,m.standard,m.color,m.brand,m.mfrs,di.unit_price unitPrice,di.material_unit as mUnit,
+               di.oper_number operNumber,di.all_price allPrice,sname, d.dName dname,date_format(dh.oper_time, '%Y-%m-%d') operTime,
+               concat(dh.sub_type,dh.type) as newType, concat_ws('  ',dh.remark,di.remark) as newRemark
+        from jsh_depot_head dh
+        left join jsh_depot_item di on di.header_id=dh.id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        left join (select id,name as dName,delete_Flag from jsh_depot ) d on d.id=di.depot_id and ifnull(d.delete_Flag,'0') !='1'
+        <!-- 调出仓库名查询 -->
+        left join (select id as aid,name as sname,delete_Flag as adelete_Flag from jsh_depot ) ddd on ddd.aid=di.another_depot_id and ifnull(ddd.adelete_Flag,'0') !='1'
+        where dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="depotFList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotFList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="depotList.size()>0">
+            and di.another_depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="subType != null">
+            and dh.sub_type=#{subType}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey} or dh.remark like #{bindKey})
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        <if test="column == 'createTime'">
+            order by oper_time desc,number desc
+        </if>
+        <if test="column != 'createTime'">
+            order by ${column} ${order}
+        </if>
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="findAllocationDetailCount" resultType="java.lang.Integer">
+        select count(1)
+        from jsh_depot_head dh
+        left join jsh_depot_item di on di.header_id=dh.id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        left join (select id,name as dName,delete_Flag from jsh_depot) d on d.id=di.depot_id and ifnull(d.delete_Flag,'0') !='1'
+        where dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="depotFList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotFList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="depotList.size()>0">
+            and di.another_depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="subType != null">
+            and dh.sub_type=#{subType}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey} or dh.remark like #{bindKey})
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="findAllocationStatistic" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultWithInfoExMap">
+        select ifnull(sum(di.oper_number),0) operNumber, ifnull(sum(di.all_price),0) allPrice
+        from jsh_depot_head dh
+        left join jsh_depot_item di on di.header_id=dh.id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        left join (select id,name as dName,delete_Flag from jsh_depot ) d on d.id=di.depot_id and ifnull(d.delete_Flag,'0') !='1'
+        <!-- 调出仓库名查询 -->
+        left join (select id as aid,name as sname,delete_Flag as adelete_Flag from jsh_depot ) ddd on ddd.aid=di.another_depot_id and ifnull(ddd.adelete_Flag,'0') !='1'
+        where dh.oper_time >=#{beginTime} and dh.oper_time &lt;=#{endTime}
+        <if test="depotFList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotFList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="depotList.size()>0">
+            and di.another_depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="subType != null">
+            and dh.sub_type=#{subType}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey} or dh.remark like #{bindKey})
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and (dh.remark like #{bindRemark} or di.remark like #{bindRemark})
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getStatementAccount" resultType="com.jsh.erp.datasource.vo.DepotHeadVo4StatementAccount">
+        select * from
+        (select s.id, s.supplier, s.contacts, s.telephone, s.phone_num, s.email,
+            -- 起始期初金额
+            (case when s.type='供应商' then ifnull(s.begin_need_pay,0) else ifnull(s.begin_need_get,0) end) begin_need,
+            -- 上期欠款金额
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{type} and dh.sub_type=#{subType}
+            and dh.oper_time &lt;= #{beginTime}
+            and ifnull(dh.delete_flag,'0') !='1') preDebtMoney,
+            -- 上期退货的欠款金额
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{typeBack} and dh.sub_type=#{subTypeBack}
+            and dh.oper_time &lt;= #{beginTime}
+            and ifnull(dh.delete_flag,'0') !='1') preReturnDebtMoney,
+            -- 上期收付款
+            (select (case when ah.type='收款' then ifnull(sum(ai.each_amount),0) else 0-ifnull(sum(ai.each_amount),0) end) from jsh_account_item ai
+            left join jsh_account_head ah on ai.header_id=ah.id and ifnull(ah.delete_flag,'0') !='1'
+            where ah.organ_id=s.id and ah.type=#{billType}
+            and ah.bill_time &lt;= #{beginTime}
+            and ifnull(ai.delete_flag,'0') !='1') preBackMoney,
+            -- 本期欠款
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{type} and dh.sub_type=#{subType}
+            and dh.oper_time>#{beginTime} and dh.oper_time &lt;= #{endTime}
+            and ifnull(dh.delete_flag,'0') !='1') debtMoney,
+            -- 本期退货的欠款金额
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{typeBack} and dh.sub_type=#{subTypeBack}
+            and dh.oper_time>#{beginTime} and dh.oper_time &lt;= #{endTime}
+            and ifnull(dh.delete_flag,'0') !='1') returnDebtMoney,
+            -- 本期收付款
+            (select (case when ah.type='收款' then ifnull(sum(ai.each_amount),0) else 0-ifnull(sum(ai.each_amount),0) end) from jsh_account_item ai
+            left join jsh_account_head ah on ai.header_id=ah.id and ifnull(ah.delete_flag,'0') !='1'
+            where ah.organ_id=s.id and ah.type=#{billType}
+            and ah.bill_time>#{beginTime} and ah.bill_time &lt;= #{endTime}
+            and ifnull(ai.delete_flag,'0') !='1') backMoney
+        from jsh_supplier s
+        where s.enabled=1
+        and s.type=#{supplierType}
+        <if test="organId != null">
+            and s.id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and s.id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        and ifnull(s.delete_flag,'0') !='1') tb
+        <if test="hasDebt == 1">
+            where begin_need+preDebtMoney-preReturnDebtMoney-preBackMoney+debtMoney-returnDebtMoney-backMoney!=0
+        </if>
+        <if test="hasDebt == 0">
+            where begin_need+preDebtMoney-preReturnDebtMoney-preBackMoney+debtMoney-returnDebtMoney-backMoney=0
+        </if>
+        order by begin_need+preDebtMoney-preReturnDebtMoney-preBackMoney+debtMoney-returnDebtMoney-backMoney desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="getStatementAccountCount" resultType="java.lang.Integer">
+        select count(1) from
+        (select s.id, s.supplier, s.contacts, s.telephone, s.phone_num, s.email,
+            -- 起始期初金额
+            (case when s.type='供应商' then ifnull(s.begin_need_pay,0) else ifnull(s.begin_need_get,0) end) begin_need,
+            -- 上期欠款金额
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{type} and dh.sub_type=#{subType}
+            and dh.oper_time &lt;= #{beginTime}
+            and ifnull(dh.delete_flag,'0') !='1') preDebtMoney,
+            -- 上期退货的欠款金额
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{typeBack} and dh.sub_type=#{subTypeBack}
+            and dh.oper_time &lt;= #{beginTime}
+            and ifnull(dh.delete_flag,'0') !='1') preReturnDebtMoney,
+            -- 上期收付款
+            (select (case when ah.type='收款' then ifnull(sum(ai.each_amount),0) else 0-ifnull(sum(ai.each_amount),0) end) from jsh_account_item ai
+            left join jsh_account_head ah on ai.header_id=ah.id and ifnull(ah.delete_flag,'0') !='1'
+            where ah.organ_id=s.id and ah.type=#{billType}
+            and ah.bill_time &lt;= #{beginTime}
+            and ifnull(ai.delete_flag,'0') !='1') preBackMoney,
+            -- 本期欠款
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{type} and dh.sub_type=#{subType}
+            and dh.oper_time>#{beginTime} and dh.oper_time &lt;= #{endTime}
+            and ifnull(dh.delete_flag,'0') !='1') debtMoney,
+            -- 本期退货的欠款金额
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{typeBack} and dh.sub_type=#{subTypeBack}
+            and dh.oper_time>#{beginTime} and dh.oper_time &lt;= #{endTime}
+            and ifnull(dh.delete_flag,'0') !='1') returnDebtMoney,
+            -- 本期收付款
+            (select (case when ah.type='收款' then ifnull(sum(ai.each_amount),0) else 0-ifnull(sum(ai.each_amount),0) end) from jsh_account_item ai
+            left join jsh_account_head ah on ai.header_id=ah.id and ifnull(ah.delete_flag,'0') !='1'
+            where ah.organ_id=s.id and ah.type=#{billType}
+            and ah.bill_time>#{beginTime} and ah.bill_time &lt;= #{endTime}
+            and ifnull(ai.delete_flag,'0') !='1') backMoney
+        from jsh_supplier s
+        where s.enabled=1
+        and s.type=#{supplierType}
+        <if test="organId != null">
+            and s.id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and s.id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        and ifnull(s.delete_flag,'0') !='1') tb
+        <if test="hasDebt == 1">
+            where begin_need+preDebtMoney-preReturnDebtMoney-preBackMoney+debtMoney-returnDebtMoney-backMoney!=0
+        </if>
+        <if test="hasDebt == 0">
+            where begin_need+preDebtMoney-preReturnDebtMoney-preBackMoney+debtMoney-returnDebtMoney-backMoney=0
+        </if>
+    </select>
+
+    <select id="getStatementAccountTotalPay" resultType="com.jsh.erp.datasource.vo.DepotHeadVo4StatementAccount">
+        select sum(begin_need) begin_need, sum(preDebtMoney) preDebtMoney, sum(preReturnDebtMoney) preReturnDebtMoney, sum(preBackMoney) preBackMoney,
+               sum(debtMoney) debtMoney, sum(returnDebtMoney) returnDebtMoney, sum(backMoney) backMoney from
+        (select s.id,
+            (case when s.type='供应商' then ifnull(s.begin_need_pay,0) else ifnull(s.begin_need_get,0) end) begin_need,
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{type} and dh.sub_type=#{subType}
+            and dh.oper_time &lt;= #{beginTime}
+            and ifnull(dh.delete_flag,'0') !='1') preDebtMoney,
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{typeBack} and dh.sub_type=#{subTypeBack}
+            and dh.oper_time &lt;= #{beginTime}
+            and ifnull(dh.delete_flag,'0') !='1') preReturnDebtMoney,
+            (select (case when ah.type='收款' then ifnull(sum(ai.each_amount),0) else 0-ifnull(sum(ai.each_amount),0) end) from jsh_account_item ai
+            left join jsh_account_head ah on ai.header_id=ah.id and ifnull(ah.delete_flag,'0') !='1'
+            where ah.organ_id=s.id and ah.type=#{billType}
+            and ah.bill_time &lt;= #{beginTime}
+            and ifnull(ai.delete_flag,'0') !='1') preBackMoney,
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{type} and dh.sub_type=#{subType}
+            and dh.oper_time>#{beginTime} and dh.oper_time &lt;= #{endTime}
+            and ifnull(dh.delete_flag,'0') !='1') debtMoney,
+            (select
+            ifnull(sum(dh.discount_last_money),0)+ifnull(sum(dh.other_money),0)-ifnull(sum(dh.deposit),0)-abs(ifnull(sum(dh.change_amount),0))
+            from jsh_depot_head dh
+            where dh.organ_id=s.id
+            and dh.type=#{typeBack} and dh.sub_type=#{subTypeBack}
+            and dh.oper_time>#{beginTime} and dh.oper_time &lt;= #{endTime}
+            and ifnull(dh.delete_flag,'0') !='1') returnDebtMoney,
+            (select (case when ah.type='收款' then ifnull(sum(ai.each_amount),0) else 0-ifnull(sum(ai.each_amount),0) end) from jsh_account_item ai
+            left join jsh_account_head ah on ai.header_id=ah.id and ifnull(ah.delete_flag,'0') !='1'
+            where ah.organ_id=s.id and ah.type=#{billType}
+            and ah.bill_time>#{beginTime} and ah.bill_time &lt;= #{endTime}
+            and ifnull(ai.delete_flag,'0') !='1') backMoney
+        from jsh_supplier s
+        where s.enabled=1
+        and s.type=#{supplierType}
+        <if test="organId != null">
+            and s.id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and s.id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        and ifnull(s.delete_flag,'0') !='1') tb
+        <if test="hasDebt == 1">
+            where begin_need+preDebtMoney-preReturnDebtMoney-preBackMoney+debtMoney-returnDebtMoney-backMoney!=0
+        </if>
+        <if test="hasDebt == 0">
+            where begin_need+preDebtMoney-preReturnDebtMoney-preBackMoney+debtMoney-returnDebtMoney-backMoney=0
+        </if>
+    </select>
+
+    <select id="getDetailByNumber" parameterType="com.jsh.erp.datasource.entities.DepotHeadExample" resultMap="ResultMapEx">
+        select dh.*, concat(dh.sub_type,dh.type) as depotHeadType, a.name AccountName,
+               s.supplier OrganName, s.contacts, s.telephone, s.address
+        from jsh_depot_head dh
+        left join jsh_supplier s on dh.organ_id=s.id and ifnull(s.delete_Flag,'0') !='1'
+        left join jsh_account a on dh.account_id=a.id and ifnull(a.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="number != null">
+            and dh.number=#{number}
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <update id="batchDeleteDepotHeadByIds">
+        update jsh_depot_head
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <select id="getDepotHeadListByAccountIds" resultMap="com.jsh.erp.datasource.mappers.DepotHeadMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.DepotHeadMapper.Base_Column_List" />
+        from jsh_depot_head
+        where 1=1
+        and account_id in (
+        <foreach collection="accountIds" item="accountId" separator=",">
+            #{accountId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getDepotHeadListByOrganIds" resultMap="com.jsh.erp.datasource.mappers.DepotHeadMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.DepotHeadMapper.Base_Column_List" />
+        from jsh_depot_head
+        where 1=1
+        and organ_id in (
+        <foreach collection="organIds" item="organId" separator=",">
+            #{organId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getDepotHeadListByCreator" resultMap="com.jsh.erp.datasource.mappers.DepotHeadMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.DepotHeadMapper.Base_Column_List" />
+        from jsh_depot_head
+        where 1=1
+        and creator in (
+        <foreach collection="creatorArray" item="creator" separator=",">
+            #{creator}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getBuyAndSaleStatisticsList" resultType="com.jsh.erp.datasource.vo.InOutPriceVo">
+        select distinct dh.id, dh.discount_last_money, dh.total_price, dh.type, dh.sub_type, dh.oper_time
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id = di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where di.id is not null
+        and (dh.type='入库' or dh.type='出库')
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <select id="debtList" parameterType="com.jsh.erp.datasource.entities.DepotHeadExample" resultMap="ResultMapEx">
+        select distinct dh.*, s.supplier OrganName, u.username userName
+        from jsh_depot_head dh
+        left join jsh_supplier s on dh.organ_id=s.id and ifnull(s.delete_Flag,'0') !='1'
+        left join jsh_user u on dh.creator=u.id and ifnull(u.delete_flag,'0') !='1'
+        left join jsh_depot_item di on dh.id = di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id = m.id and ifnull(m.delete_flag,'0') !='1'
+        where 1=1
+        and (dh.type='入库' or dh.type='出库')
+        and (dh.sub_type='采购' or dh.sub_type='销售' or dh.sub_type='采购退货' or dh.sub_type='销售退货')
+        <if test="organId != null">
+            and dh.organ_id = #{organId}
+        </if>
+        <if test="status != null">
+            and dh.status =#{status}
+        </if>
+        <if test="number != null">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (m.name like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey})
+        </if>
+        <if test="depotArray != null and depotArray !=''">
+            and di.depot_id in (
+            <foreach collection="depotArray" item="depotId" separator=",">
+                #{depotId}
+            </foreach>
+            )
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and (ifnull(abs(dh.change_amount),0)+(select ifnull(sum(abs(ai.each_amount)),0) from jsh_account_item ai where ai.bill_id=dh.id and ifnull(ai.delete_flag,'0') !='1'))
+        &lt; (ifnull(dh.discount_last_money,0) + ifnull(dh.other_money,0) - ifnull(dh.deposit,0))
+        and ifnull(dh.delete_flag,'0') !='1'
+        order by dh.oper_time desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="debtListCount" resultType="java.lang.Integer">
+        select count(1) from (
+        select distinct dh.*, s.supplier OrganName, u.username userName
+        from jsh_depot_head dh
+        left join jsh_supplier s on dh.organ_id=s.id and ifnull(s.delete_Flag,'0') !='1'
+        left join jsh_user u on dh.creator=u.id and ifnull(u.delete_flag,'0') !='1'
+        left join jsh_depot_item di on dh.id = di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id = m.id and ifnull(m.delete_flag,'0') !='1'
+        where 1=1
+        and (dh.type='入库' or dh.type='出库')
+        and (dh.sub_type='采购' or dh.sub_type='销售' or dh.sub_type='采购退货' or dh.sub_type='销售退货')
+        <if test="organId != null">
+            and dh.organ_id = #{organId}
+        </if>
+        <if test="status != null">
+            and dh.status =#{status}
+        </if>
+        <if test="number != null">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (m.name like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey})
+        </if>
+        <if test="depotArray != null and depotArray !=''">
+            and di.depot_id in (
+            <foreach collection="depotArray" item="depotId" separator=",">
+                #{depotId}
+            </foreach>
+            )
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and (ifnull(abs(dh.change_amount),0)+(select ifnull(sum(abs(ai.each_amount)),0) from jsh_account_item ai where ai.bill_id=dh.id and ifnull(ai.delete_flag,'0') !='1'))
+        &lt; (ifnull(dh.discount_last_money,0) + ifnull(dh.other_money,0) - ifnull(dh.deposit,0))
+        and ifnull(dh.delete_flag,'0') !='1' ) tb
+    </select>
+
+    <select id="getFinishDepositByNumberList" resultType="com.jsh.erp.datasource.vo.FinishDepositVo">
+        select dh.link_number number, ifnull(sum(dh.deposit),0) finishDeposit
+        from jsh_depot_head dh
+        where 1=1
+        <if test="numberList.size()>0">
+            and dh.link_number in
+            <foreach collection="numberList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        group by dh.link_number
+    </select>
+
+    <select id="getFinishDepositByNumberExceptCurrent" resultType="java.math.BigDecimal">
+        select ifnull(sum(dh.deposit),0)
+        from jsh_depot_head dh
+        where dh.link_number=#{linkNumber}
+        and dh.number!=#{number}
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+
+    <update id="setAccountIdToNull">
+        update jsh_depot_head dh set dh.account_id = null
+        where dh.id=#{id}
+        and ifnull(dh.delete_flag,'0') !='1'
+    </update>
+
+    <select id="getSerialNumberBySell" resultType="java.lang.Integer">
+        select count(s.id) from jsh_depot_head dh
+        left join jsh_serial_number s on dh.number=s.in_bill_no
+        where dh.number = #{number}
+        and (s.out_bill_no is not null or s.out_bill_no!='')
+    </select>
+
+    <select id="waitBillList" parameterType="com.jsh.erp.datasource.entities.DepotHeadExample" resultMap="ResultMapEx">
+        select jdh.*, s.supplier OrganName, u.username userName, a.name AccountName
+        from (select dh.id
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id = di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id = m.id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on di.material_extend_id = me.id and ifnull(me.delete_flag,'0') !='1'
+        where 1=1
+        <if test="type != null">
+            and dh.type=#{type}
+        </if>
+        <if test="subTypeArray != null and subTypeArray !=''">
+            and dh.sub_type in (
+            <foreach collection="subTypeArray" item="subType" separator=",">
+                #{subType}
+            </foreach>
+            )
+        </if>
+        <if test="statusArray != null and statusArray !=''">
+            and dh.status in (
+            <foreach collection="statusArray" item="status" separator=",">
+                #{status}
+            </foreach>
+            )
+        </if>
+        <if test="number != null">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.standard like #{bindKey} or m.model like
+            #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="depotArray != null and depotArray !=''">
+            and di.depot_id in (
+            <foreach collection="depotArray" item="depotId" separator=",">
+                #{depotId}
+            </foreach>
+            )
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        group by dh.id
+        order by dh.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>) tb
+        left join jsh_depot_head jdh on jdh.id=tb.id and ifnull(jdh.delete_flag,'0') !='1'
+        left join jsh_supplier s on jdh.organ_id=s.id and ifnull(s.delete_flag,'0') !='1'
+        left join jsh_user u on jdh.creator=u.id and ifnull(u.delete_flag,'0') !='1'
+        left join jsh_account a on jdh.account_id=a.id and ifnull(a.delete_flag,'0') !='1'
+    </select>
+
+    <select id="waitBillCount" resultType="java.lang.Long">
+        select
+        count(1) from
+        (select distinct dh.id from jsh_depot_head dh
+        left join jsh_depot_item di on dh.Id = di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id = m.Id and ifnull(m.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on di.material_extend_id = me.id and ifnull(me.delete_flag,'0') !='1'
+        WHERE 1=1
+        <if test="type != null">
+            and dh.type=#{type}
+        </if>
+        <if test="subTypeArray != null and subTypeArray !=''">
+            and dh.sub_type in (
+            <foreach collection="subTypeArray" item="subType" separator=",">
+                #{subType}
+            </foreach>
+            )
+        </if>
+        <if test="statusArray != null and statusArray !=''">
+            and dh.status in (
+            <foreach collection="statusArray" item="status" separator=",">
+                #{status}
+            </foreach>
+            )
+        </if>
+        <if test="number != null">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="depotArray != null and depotArray !=''">
+            and di.depot_id in (
+            <foreach collection="depotArray" item="depotId" separator=",">
+                #{depotId}
+            </foreach>
+            )
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and ifnull(dh.delete_Flag,'0') !='1') tb
+    </select>
+
+    <select id="getBillAllPriceByOrganId" resultType="java.math.BigDecimal">
+        select ifnull(sum(dh.total_price),0) allPrice from jsh_depot_head dh
+        where dh.organ_id=#{organId}
+        and dh.type = '出库'
+        and dh.sub_type = '零售'
+        and dh.pay_type = '预付款'
+        and ifnull(dh.delete_flag,'0') !='1'
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/DepotItemMapper.xml b/src/main/resources/mapper_xml/DepotItemMapper.xml
new file mode 100644
index 0000000..a75c577
--- /dev/null
+++ b/src/main/resources/mapper_xml/DepotItemMapper.xml
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.DepotItemMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.DepotItem">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="header_id" jdbcType="BIGINT" property="headerId" />
+    <result column="material_id" jdbcType="BIGINT" property="materialId" />
+    <result column="material_extend_id" jdbcType="BIGINT" property="materialExtendId" />
+    <result column="material_unit" jdbcType="VARCHAR" property="materialUnit" />
+    <result column="sku" jdbcType="VARCHAR" property="sku" />
+    <result column="oper_number" jdbcType="DECIMAL" property="operNumber" />
+    <result column="basic_number" jdbcType="DECIMAL" property="basicNumber" />
+    <result column="unit_price" jdbcType="DECIMAL" property="unitPrice" />
+    <result column="purchase_unit_price" jdbcType="DECIMAL" property="purchaseUnitPrice" />
+    <result column="tax_unit_price" jdbcType="DECIMAL" property="taxUnitPrice" />
+    <result column="all_price" jdbcType="DECIMAL" property="allPrice" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="depot_id" jdbcType="BIGINT" property="depotId" />
+    <result column="another_depot_id" jdbcType="BIGINT" property="anotherDepotId" />
+    <result column="tax_rate" jdbcType="DECIMAL" property="taxRate" />
+    <result column="tax_money" jdbcType="DECIMAL" property="taxMoney" />
+    <result column="tax_last_money" jdbcType="DECIMAL" property="taxLastMoney" />
+    <result column="material_type" jdbcType="VARCHAR" property="materialType" />
+    <result column="sn_list" jdbcType="VARCHAR" property="snList" />
+    <result column="batch_number" jdbcType="VARCHAR" property="batchNumber" />
+    <result column="expiration_date" jdbcType="TIMESTAMP" property="expirationDate" />
+    <result column="link_id" jdbcType="BIGINT" property="linkId" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, header_id, material_id, material_extend_id, material_unit, sku, oper_number, 
+    basic_number, unit_price, purchase_unit_price, tax_unit_price, all_price, remark, 
+    depot_id, another_depot_id, tax_rate, tax_money, tax_last_money, material_type, sn_list, 
+    batch_number, expiration_date, link_id, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_depot_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_depot_item
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_depot_item
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.DepotItemExample">
+    delete from jsh_depot_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.DepotItem">
+    insert into jsh_depot_item (id, header_id, material_id, 
+      material_extend_id, material_unit, sku, 
+      oper_number, basic_number, unit_price, 
+      purchase_unit_price, tax_unit_price, all_price, 
+      remark, depot_id, another_depot_id, 
+      tax_rate, tax_money, tax_last_money, 
+      material_type, sn_list, batch_number, 
+      expiration_date, link_id, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{headerId,jdbcType=BIGINT}, #{materialId,jdbcType=BIGINT}, 
+      #{materialExtendId,jdbcType=BIGINT}, #{materialUnit,jdbcType=VARCHAR}, #{sku,jdbcType=VARCHAR}, 
+      #{operNumber,jdbcType=DECIMAL}, #{basicNumber,jdbcType=DECIMAL}, #{unitPrice,jdbcType=DECIMAL}, 
+      #{purchaseUnitPrice,jdbcType=DECIMAL}, #{taxUnitPrice,jdbcType=DECIMAL}, #{allPrice,jdbcType=DECIMAL}, 
+      #{remark,jdbcType=VARCHAR}, #{depotId,jdbcType=BIGINT}, #{anotherDepotId,jdbcType=BIGINT}, 
+      #{taxRate,jdbcType=DECIMAL}, #{taxMoney,jdbcType=DECIMAL}, #{taxLastMoney,jdbcType=DECIMAL}, 
+      #{materialType,jdbcType=VARCHAR}, #{snList,jdbcType=VARCHAR}, #{batchNumber,jdbcType=VARCHAR}, 
+      #{expirationDate,jdbcType=TIMESTAMP}, #{linkId,jdbcType=BIGINT}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.DepotItem">
+    insert into jsh_depot_item
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="headerId != null">
+        header_id,
+      </if>
+      <if test="materialId != null">
+        material_id,
+      </if>
+      <if test="materialExtendId != null">
+        material_extend_id,
+      </if>
+      <if test="materialUnit != null">
+        material_unit,
+      </if>
+      <if test="sku != null">
+        sku,
+      </if>
+      <if test="operNumber != null">
+        oper_number,
+      </if>
+      <if test="basicNumber != null">
+        basic_number,
+      </if>
+      <if test="unitPrice != null">
+        unit_price,
+      </if>
+      <if test="purchaseUnitPrice != null">
+        purchase_unit_price,
+      </if>
+      <if test="taxUnitPrice != null">
+        tax_unit_price,
+      </if>
+      <if test="allPrice != null">
+        all_price,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="depotId != null">
+        depot_id,
+      </if>
+      <if test="anotherDepotId != null">
+        another_depot_id,
+      </if>
+      <if test="taxRate != null">
+        tax_rate,
+      </if>
+      <if test="taxMoney != null">
+        tax_money,
+      </if>
+      <if test="taxLastMoney != null">
+        tax_last_money,
+      </if>
+      <if test="materialType != null">
+        material_type,
+      </if>
+      <if test="snList != null">
+        sn_list,
+      </if>
+      <if test="batchNumber != null">
+        batch_number,
+      </if>
+      <if test="expirationDate != null">
+        expiration_date,
+      </if>
+      <if test="linkId != null">
+        link_id,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="headerId != null">
+        #{headerId,jdbcType=BIGINT},
+      </if>
+      <if test="materialId != null">
+        #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="materialExtendId != null">
+        #{materialExtendId,jdbcType=BIGINT},
+      </if>
+      <if test="materialUnit != null">
+        #{materialUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="sku != null">
+        #{sku,jdbcType=VARCHAR},
+      </if>
+      <if test="operNumber != null">
+        #{operNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="basicNumber != null">
+        #{basicNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="unitPrice != null">
+        #{unitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="purchaseUnitPrice != null">
+        #{purchaseUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="taxUnitPrice != null">
+        #{taxUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="allPrice != null">
+        #{allPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="depotId != null">
+        #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="anotherDepotId != null">
+        #{anotherDepotId,jdbcType=BIGINT},
+      </if>
+      <if test="taxRate != null">
+        #{taxRate,jdbcType=DECIMAL},
+      </if>
+      <if test="taxMoney != null">
+        #{taxMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="taxLastMoney != null">
+        #{taxLastMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="materialType != null">
+        #{materialType,jdbcType=VARCHAR},
+      </if>
+      <if test="snList != null">
+        #{snList,jdbcType=VARCHAR},
+      </if>
+      <if test="batchNumber != null">
+        #{batchNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="expirationDate != null">
+        #{expirationDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="linkId != null">
+        #{linkId,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultType="java.lang.Long">
+    select count(*) from jsh_depot_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_depot_item
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.headerId != null">
+        header_id = #{record.headerId,jdbcType=BIGINT},
+      </if>
+      <if test="record.materialId != null">
+        material_id = #{record.materialId,jdbcType=BIGINT},
+      </if>
+      <if test="record.materialExtendId != null">
+        material_extend_id = #{record.materialExtendId,jdbcType=BIGINT},
+      </if>
+      <if test="record.materialUnit != null">
+        material_unit = #{record.materialUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sku != null">
+        sku = #{record.sku,jdbcType=VARCHAR},
+      </if>
+      <if test="record.operNumber != null">
+        oper_number = #{record.operNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="record.basicNumber != null">
+        basic_number = #{record.basicNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="record.unitPrice != null">
+        unit_price = #{record.unitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.purchaseUnitPrice != null">
+        purchase_unit_price = #{record.purchaseUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.taxUnitPrice != null">
+        tax_unit_price = #{record.taxUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.allPrice != null">
+        all_price = #{record.allPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.depotId != null">
+        depot_id = #{record.depotId,jdbcType=BIGINT},
+      </if>
+      <if test="record.anotherDepotId != null">
+        another_depot_id = #{record.anotherDepotId,jdbcType=BIGINT},
+      </if>
+      <if test="record.taxRate != null">
+        tax_rate = #{record.taxRate,jdbcType=DECIMAL},
+      </if>
+      <if test="record.taxMoney != null">
+        tax_money = #{record.taxMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="record.taxLastMoney != null">
+        tax_last_money = #{record.taxLastMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="record.materialType != null">
+        material_type = #{record.materialType,jdbcType=VARCHAR},
+      </if>
+      <if test="record.snList != null">
+        sn_list = #{record.snList,jdbcType=VARCHAR},
+      </if>
+      <if test="record.batchNumber != null">
+        batch_number = #{record.batchNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.expirationDate != null">
+        expiration_date = #{record.expirationDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.linkId != null">
+        link_id = #{record.linkId,jdbcType=BIGINT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_depot_item
+    set id = #{record.id,jdbcType=BIGINT},
+      header_id = #{record.headerId,jdbcType=BIGINT},
+      material_id = #{record.materialId,jdbcType=BIGINT},
+      material_extend_id = #{record.materialExtendId,jdbcType=BIGINT},
+      material_unit = #{record.materialUnit,jdbcType=VARCHAR},
+      sku = #{record.sku,jdbcType=VARCHAR},
+      oper_number = #{record.operNumber,jdbcType=DECIMAL},
+      basic_number = #{record.basicNumber,jdbcType=DECIMAL},
+      unit_price = #{record.unitPrice,jdbcType=DECIMAL},
+      purchase_unit_price = #{record.purchaseUnitPrice,jdbcType=DECIMAL},
+      tax_unit_price = #{record.taxUnitPrice,jdbcType=DECIMAL},
+      all_price = #{record.allPrice,jdbcType=DECIMAL},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      depot_id = #{record.depotId,jdbcType=BIGINT},
+      another_depot_id = #{record.anotherDepotId,jdbcType=BIGINT},
+      tax_rate = #{record.taxRate,jdbcType=DECIMAL},
+      tax_money = #{record.taxMoney,jdbcType=DECIMAL},
+      tax_last_money = #{record.taxLastMoney,jdbcType=DECIMAL},
+      material_type = #{record.materialType,jdbcType=VARCHAR},
+      sn_list = #{record.snList,jdbcType=VARCHAR},
+      batch_number = #{record.batchNumber,jdbcType=VARCHAR},
+      expiration_date = #{record.expirationDate,jdbcType=TIMESTAMP},
+      link_id = #{record.linkId,jdbcType=BIGINT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.DepotItem">
+    update jsh_depot_item
+    <set>
+      <if test="headerId != null">
+        header_id = #{headerId,jdbcType=BIGINT},
+      </if>
+      <if test="materialId != null">
+        material_id = #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="materialExtendId != null">
+        material_extend_id = #{materialExtendId,jdbcType=BIGINT},
+      </if>
+      <if test="materialUnit != null">
+        material_unit = #{materialUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="sku != null">
+        sku = #{sku,jdbcType=VARCHAR},
+      </if>
+      <if test="operNumber != null">
+        oper_number = #{operNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="basicNumber != null">
+        basic_number = #{basicNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="unitPrice != null">
+        unit_price = #{unitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="purchaseUnitPrice != null">
+        purchase_unit_price = #{purchaseUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="taxUnitPrice != null">
+        tax_unit_price = #{taxUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="allPrice != null">
+        all_price = #{allPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="depotId != null">
+        depot_id = #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="anotherDepotId != null">
+        another_depot_id = #{anotherDepotId,jdbcType=BIGINT},
+      </if>
+      <if test="taxRate != null">
+        tax_rate = #{taxRate,jdbcType=DECIMAL},
+      </if>
+      <if test="taxMoney != null">
+        tax_money = #{taxMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="taxLastMoney != null">
+        tax_last_money = #{taxLastMoney,jdbcType=DECIMAL},
+      </if>
+      <if test="materialType != null">
+        material_type = #{materialType,jdbcType=VARCHAR},
+      </if>
+      <if test="snList != null">
+        sn_list = #{snList,jdbcType=VARCHAR},
+      </if>
+      <if test="batchNumber != null">
+        batch_number = #{batchNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="expirationDate != null">
+        expiration_date = #{expirationDate,jdbcType=TIMESTAMP},
+      </if>
+      <if test="linkId != null">
+        link_id = #{linkId,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.DepotItem">
+    update jsh_depot_item
+    set header_id = #{headerId,jdbcType=BIGINT},
+      material_id = #{materialId,jdbcType=BIGINT},
+      material_extend_id = #{materialExtendId,jdbcType=BIGINT},
+      material_unit = #{materialUnit,jdbcType=VARCHAR},
+      sku = #{sku,jdbcType=VARCHAR},
+      oper_number = #{operNumber,jdbcType=DECIMAL},
+      basic_number = #{basicNumber,jdbcType=DECIMAL},
+      unit_price = #{unitPrice,jdbcType=DECIMAL},
+      purchase_unit_price = #{purchaseUnitPrice,jdbcType=DECIMAL},
+      tax_unit_price = #{taxUnitPrice,jdbcType=DECIMAL},
+      all_price = #{allPrice,jdbcType=DECIMAL},
+      remark = #{remark,jdbcType=VARCHAR},
+      depot_id = #{depotId,jdbcType=BIGINT},
+      another_depot_id = #{anotherDepotId,jdbcType=BIGINT},
+      tax_rate = #{taxRate,jdbcType=DECIMAL},
+      tax_money = #{taxMoney,jdbcType=DECIMAL},
+      tax_last_money = #{taxLastMoney,jdbcType=DECIMAL},
+      material_type = #{materialType,jdbcType=VARCHAR},
+      sn_list = #{snList,jdbcType=VARCHAR},
+      batch_number = #{batchNumber,jdbcType=VARCHAR},
+      expiration_date = #{expirationDate,jdbcType=TIMESTAMP},
+      link_id = #{linkId,jdbcType=BIGINT},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/DepotItemMapperEx.xml b/src/main/resources/mapper_xml/DepotItemMapperEx.xml
new file mode 100644
index 0000000..e9fc550
--- /dev/null
+++ b/src/main/resources/mapper_xml/DepotItemMapperEx.xml
@@ -0,0 +1,1132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper  namespace="com.jsh.erp.datasource.mappers.DepotItemMapperEx">
+
+    <resultMap id="DetailByTypeAndMIdResultMap" type="com.jsh.erp.datasource.entities.DepotItemVo4DetailByTypeAndMId">
+        <result column="number" jdbcType="VARCHAR" property="number" />
+        <result column="bar_code" jdbcType="VARCHAR" property="barCode" />
+        <result column="material_name" jdbcType="VARCHAR" property="materialName" />
+        <result column="type" jdbcType="VARCHAR" property="type" />
+        <result column="sub_type" jdbcType="VARCHAR" property="subType" />
+        <result column="b_num" jdbcType="DECIMAL" property="bnum" />
+        <result column="unit_price" jdbcType="DECIMAL" property="unitPrice" />
+        <result column="all_price" jdbcType="DECIMAL" property="allPrice" />
+        <result column="material_unit" jdbcType="VARCHAR" property="materialUnit" />
+        <result column="depotName" jdbcType="VARCHAR" property="depotName" />
+        <result column="oTime" jdbcType="TIMESTAMP" property="otime" />
+    </resultMap>
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.DepotItemMapper.BaseResultMap" id="ResultAndMaterialMap" type="com.jsh.erp.datasource.entities.DepotItemVo4Material">
+        <result column="mName" jdbcType="VARCHAR" property="mname" />
+        <result column="mModel" jdbcType="VARCHAR" property="mmodel" />
+    </resultMap>
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.DepotItemMapper.BaseResultMap" id="ResultWithInfoExMap" type="com.jsh.erp.datasource.entities.DepotItemVo4WithInfoEx">
+        <result column="MName" jdbcType="VARCHAR" property="MName" />
+        <result column="MModel" jdbcType="VARCHAR" property="MModel" />
+        <result column="MaterialUnit" jdbcType="VARCHAR" property="MaterialUnit" />
+        <result column="MColor" jdbcType="VARCHAR" property="MColor" />
+        <result column="MStandard" jdbcType="VARCHAR" property="MStandard" />
+        <result column="MMfrs" jdbcType="VARCHAR" property="MMfrs" />
+        <result column="weight" jdbcType="VARCHAR" property="weight" />
+        <result column="position" jdbcType="VARCHAR" property="position" />
+        <result column="img_name" jdbcType="VARCHAR" property="imgName" />
+        <result column="MOtherField1" jdbcType="VARCHAR" property="MOtherField1" />
+        <result column="MOtherField2" jdbcType="VARCHAR" property="MOtherField2" />
+        <result column="MOtherField3" jdbcType="VARCHAR" property="MOtherField3" />
+        <result column="enable_serial_number" jdbcType="VARCHAR" property="enableSerialNumber" />
+        <result column="enable_batch_number" jdbcType="VARCHAR" property="enableBatchNumber" />
+        <result column="brand" jdbcType="VARCHAR" property="brand" />
+        <result column="DepotName" jdbcType="VARCHAR" property="DepotName" />
+        <result column="AnotherDepotName" jdbcType="VARCHAR" property="AnotherDepotName" />
+        <result column="barCode" jdbcType="VARCHAR" property="barCode" />
+        <result column="purchase_decimal" jdbcType="DECIMAL" property="purchaseDecimal" />
+    </resultMap>
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.DepotItemMapper.BaseResultMap" id="ResultByMaterial" type="com.jsh.erp.datasource.entities.DepotItemVo4WithInfoEx">
+        <result column="MId" jdbcType="VARCHAR" property="MId" />
+        <result column="bar_code" jdbcType="VARCHAR" property="barCode" />
+        <result column="MName" jdbcType="VARCHAR" property="MName" />
+        <result column="MMfrs" jdbcType="VARCHAR" property="MMfrs" />
+        <result column="MModel" jdbcType="VARCHAR" property="MModel" />
+        <result column="MStandard" jdbcType="VARCHAR" property="MStandard" />
+        <result column="MaterialUnit" jdbcType="VARCHAR" property="MaterialUnit" />
+        <result column="MOtherField1" jdbcType="VARCHAR" property="MOtherField1" />
+        <result column="MOtherField2" jdbcType="VARCHAR" property="MOtherField2" />
+        <result column="MOtherField3" jdbcType="VARCHAR" property="MOtherField3" />
+        <result column="unit_id" jdbcType="BIGINT" property="unitId" />
+        <result column="unit_name" jdbcType="VARCHAR" property="unitName" />
+        <result column="MColor" jdbcType="VARCHAR" property="MColor" />
+        <result column="brand" jdbcType="VARCHAR" property="brand" />
+        <result column="purchase_decimal" jdbcType="DECIMAL" property="purchaseDecimal" />
+        <result column="currentUnitPrice" jdbcType="DECIMAL" property="currentUnitPrice" />
+    </resultMap>
+
+    <resultMap id="ResultStockWarningCount" type="com.jsh.erp.datasource.vo.DepotItemStockWarningCount">
+        <result column="MId" jdbcType="VARCHAR" property="MId" />
+        <result column="bar_code" jdbcType="VARCHAR" property="barCode" />
+        <result column="MName" jdbcType="VARCHAR" property="MName" />
+        <result column="MMfrs" jdbcType="VARCHAR" property="MMfrs" />
+        <result column="MModel" jdbcType="VARCHAR" property="MModel" />
+        <result column="MStandard" jdbcType="VARCHAR" property="MStandard" />
+        <result column="MColor" jdbcType="VARCHAR" property="MColor" />
+        <result column="brand" jdbcType="VARCHAR" property="brand" />
+        <result column="MaterialUnit" jdbcType="VARCHAR" property="MaterialUnit" />
+        <result column="MOtherField1" jdbcType="VARCHAR" property="MOtherField1" />
+        <result column="MOtherField2" jdbcType="VARCHAR" property="MOtherField2" />
+        <result column="MOtherField3" jdbcType="VARCHAR" property="MOtherField3" />
+        <result column="unit_name" jdbcType="VARCHAR" property="unitName" />
+        <result column="current_number" jdbcType="DECIMAL" property="currentNumber" />
+        <result column="low_safe_stock" jdbcType="DECIMAL" property="lowSafeStock" />
+        <result column="high_safe_stock" jdbcType="DECIMAL" property="highSafeStock" />
+    </resultMap>
+
+    <resultMap id="stockMap" type="com.jsh.erp.datasource.vo.DepotItemVo4Stock">
+        <result column="inTotal" jdbcType="DECIMAL" property="inTotal" />
+        <result column="outTotal" jdbcType="DECIMAL" property="outTotal" />
+        <result column="transfInTotal" jdbcType="DECIMAL" property="transfInTotal" />
+        <result column="transfOutTotal" jdbcType="DECIMAL" property="transfOutTotal" />
+        <result column="assemInTotal" jdbcType="DECIMAL" property="assemInTotal" />
+        <result column="assemOutTotal" jdbcType="DECIMAL" property="assemOutTotal" />
+        <result column="disAssemInTotal" jdbcType="DECIMAL" property="disAssemInTotal" />
+        <result column="disAssemOutTotal" jdbcType="DECIMAL" property="disAssemOutTotal" />
+    </resultMap>
+
+    <resultMap id="batchNumberListMap" type="com.jsh.erp.datasource.vo.DepotItemVoBatchNumberList">
+        <result column="id" jdbcType="VARCHAR" property="id" />
+        <result column="bar_code" jdbcType="VARCHAR" property="barCode" />
+        <result column="name" jdbcType="VARCHAR" property="name" />
+        <result column="standard" jdbcType="VARCHAR" property="standard" />
+        <result column="model" jdbcType="VARCHAR" property="model" />
+        <result column="unit_id" jdbcType="BIGINT" property="unitId" />
+        <result column="commodity_unit" jdbcType="VARCHAR" property="commodityUnit" />
+        <result column="batch_number" jdbcType="VARCHAR" property="batchNumber" />
+        <result column="expiration_date" jdbcType="TIMESTAMP" property="expirationDate" />
+        <result column="total_num" jdbcType="VARCHAR" property="totalNum" />
+    </resultMap>
+
+    <resultMap id="materialSumMap" type="com.jsh.erp.datasource.entities.DepotItemVo4MaterialAndSum">
+        <result column="material_extend_id" jdbcType="VARCHAR" property="materialExtendId" />
+        <result column="oper_number" jdbcType="VARCHAR" property="operNumber" />
+    </resultMap>
+
+    <select id="selectByConditionDepotItem" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="com.jsh.erp.datasource.mappers.DepotItemMapper.BaseResultMap">
+        select *
+        FROM jsh_depot_item
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null">
+            and type = #{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="countsByDepotItem" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_depot_item
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null">
+            and type = #{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="findDetailByDepotIdsAndMaterialIdList" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="DetailByTypeAndMIdResultMap">
+        select tb.number, tb.bar_code, tb.material_name, tb.type, tb.sub_type, tb.b_num, tb.unit_price,
+        ifnull(tb.b_num*tb.unit_price,0) as all_price, tb.material_unit, tb.depotName, tb.oTime from
+        (select dh.number,me.bar_code,m.name material_name,dh.type,dh.sub_type,
+        case
+            when type='入库' then ifnull(di.basic_number,0)
+            when type='出库' then 0-ifnull(di.basic_number,0)
+            when dh.sub_type='组装单' and di.material_type='组合件' then ifnull(di.basic_number,0)
+            when dh.sub_type='组装单' and di.material_type='普通子件' then 0-ifnull(di.basic_number,0)
+            when dh.sub_type='拆卸单' and di.material_type='普通子件' then ifnull(di.basic_number,0)
+            when dh.sub_type='拆卸单' and di.material_type='组合件' then 0-ifnull(di.basic_number,0)
+            when dh.sub_type='盘点复盘' then ifnull(di.basic_number,0)
+            else 0
+        end
+        as b_num, di.unit_price, di.material_unit,
+        (select name from jsh_depot d where d.id=di.depot_id and ifnull(d.delete_flag,'0') !='1') as depotName,
+        date_format(dh.oper_time,'%Y-%m-%d %H:%i:%S') as oTime
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id=m.id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        where (dh.type!='其它'
+        or (dh.type='其它' and dh.sub_type='组装单')
+        or (dh.type='其它' and dh.sub_type='拆卸单')
+        or (dh.type='其它' and dh.sub_type='盘点复盘'))
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        <if test="depotIdArray != null and depotIdArray.length>0">
+            and di.depot_id in (
+            <foreach collection="depotIdArray" item="depotId" separator=",">#{depotId}</foreach>
+            )
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="sku != null and sku !=''">
+            and di.sku = #{sku}
+        </if>
+        <if test="batchNumber != null and batchNumber !=''">
+            and di.batch_number = #{batchNumber}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and di.material_id = #{mId}
+        and ifnull(dh.delete_flag,'0') !='1'
+        union all
+        --单独构造记录:调拨入库
+        select dh.number,me.bar_code,m.name material_name,dh.type,dh.sub_type,
+        ifnull(di.basic_number,0) as b_num, di.unit_price, di.material_unit,
+        (select concat(name,'[调入]') from jsh_depot d where d.id=di.another_depot_id and ifnull(d.delete_flag,'0') !='1') as depotName,
+        date_format(dh.oper_time,'%Y-%m-%d %H:%i:%S') as oTime
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        left join jsh_material m on di.material_id=m.id and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id and ifnull(me.delete_Flag,'0') !='1'
+        where dh.type='出库' and dh.sub_type='调拨'
+        <if test="depotIdArray != null and depotIdArray.length>0">
+            and di.another_depot_id in (
+            <foreach collection="depotIdArray" item="depotId" separator=",">#{depotId}</foreach>
+            )
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="sku != null and sku !=''">
+            and di.sku = #{sku}
+        </if>
+        <if test="batchNumber != null and batchNumber !=''">
+            and di.batch_number = #{batchNumber}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and di.material_id = #{mId}
+        and ifnull(dh.delete_flag,'0') !='1') tb
+        order by tb.oTime desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="findDetailByDepotIdsAndMaterialIdCount" resultType="java.lang.Long">
+        select count(tb.number) from
+        (select dh.number from jsh_depot_head dh
+        left JOIN jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where (dh.type!='其它'
+        or (dh.type='其它' and dh.sub_type='组装单')
+        or (dh.type='其它' and dh.sub_type='拆卸单')
+        or (dh.type='其它' and dh.sub_type='盘点复盘'))
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        <if test="depotIdArray != null and depotIdArray.length>0">
+            and di.depot_id in (
+            <foreach collection="depotIdArray" item="depotId" separator=",">#{depotId}</foreach>
+            )
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="sku != null and sku !=''">
+            and di.sku = #{sku}
+        </if>
+        <if test="batchNumber != null and batchNumber !=''">
+            and di.batch_number = #{batchNumber}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and di.material_id =#{mId}
+        and ifnull(dh.delete_flag,'0') !='1'
+        union all
+        --单独构造记录:调拨入库
+        select dh.number from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where dh.type='出库' and dh.sub_type='调拨'
+        <if test="depotIdArray != null and depotIdArray.length>0">
+            and di.another_depot_id in (
+            <foreach collection="depotIdArray" item="depotId" separator=",">#{depotId}</foreach>
+            )
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="sku != null and sku !=''">
+            and di.sku = #{sku}
+        </if>
+        <if test="batchNumber != null and batchNumber !=''">
+            and di.batch_number = #{batchNumber}
+        </if>
+        <if test="number != null and number !=''">
+            <bind name="bindNumber" value="'%'+number+'%'"/>
+            and dh.number like #{bindNumber}
+        </if>
+        <if test="beginTime != null and beginTime !=''">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null and endTime !=''">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and di.material_id = #{mId}
+        and ifnull(dh.delete_flag,'0') !='1') tb
+    </select>
+
+    <select id="getDetailList" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultWithInfoExMap">
+        select di.*,m.name MName,m.model MModel,m.unit MaterialUnit,m.color MColor,m.standard MStandard,m.mfrs MMfrs,m.weight, m.position, m.img_name,
+        m.other_field1 MOtherField1,m.other_field2 MOtherField2,m.other_field3 MOtherField3,m.enable_serial_number, m.enable_batch_number,
+        m.brand, dp1.name DepotName,dp2.name AnotherDepotName, me.bar_code barCode, me.purchase_decimal
+        from jsh_depot_item di
+        left join jsh_material m on di.material_id=m.id  and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id  and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_depot dp1 on di.depot_id=dp1.id and ifnull(dp1.delete_Flag,'0') !='1'
+        left join jsh_depot dp2 on di.another_depot_id=dp2.id and ifnull(dp2.delete_Flag,'0') !='1'
+        where di.header_id = #{headerId}
+        and ifnull(di.delete_flag,'0') !='1'
+        order by di.id asc
+    </select>
+
+    <select id="getBillDetailListByIds" resultType="com.jsh.erp.datasource.entities.DepotItemVo4WithInfoEx">
+        select di.*,m.name MName,m.model MModel,m.unit MaterialUnit,m.color MColor,m.standard MStandard,m.mfrs MMfrs,m.weight, m.position, m.img_name,
+        m.other_field1 MOtherField1,m.other_field2 MOtherField2,m.other_field3 MOtherField3,m.enable_serial_number, m.enable_batch_number,
+        m.brand, dp1.name DepotName,dp2.name AnotherDepotName, me.bar_code barCode, me.purchase_decimal
+        from jsh_depot_item di
+        left join jsh_material m on di.material_id=m.id  and ifnull(m.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id  and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_depot dp1 on di.depot_id=dp1.id and ifnull(dp1.delete_Flag,'0') !='1'
+        left join jsh_depot dp2 on di.another_depot_id=dp2.id and ifnull(dp2.delete_Flag,'0') !='1'
+        where ifnull(di.delete_flag,'0') !='1'
+        and di.header_id in
+        <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        order by di.header_id desc, di.id asc
+    </select>
+
+    <select id="getInOutStock" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultByMaterial">
+        select m.id MId, me.bar_code, m.name MName, m.mfrs MMfrs, m.model MModel, m.standard MStandard, m.brand,
+        m.other_field1 MOtherField1,m.other_field2 MOtherField2,m.other_field3 MOtherField3,
+        concat_ws('', m.unit, u.basic_unit) MaterialUnit, m.color MColor, m.unit_id, u.name unit_name,
+        ifnull(me.purchase_decimal,0) purchase_decimal, ifnull(mcs.current_unit_price,0) currentUnitPrice
+        from jsh_material m
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_current_stock mcs on m.id = mcs.material_id and ifnull(mcs.delete_flag,'0') !='1'
+        left join jsh_depot_item di on di.material_id=m.id and ifnull(di.delete_Flag,'0') !='1'
+        left join jsh_depot_head dh on di.header_id=dh.id and ifnull(dh.delete_flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        where 1=1 and me.default_flag=1
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="categoryIdList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryIdList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        group by m.id
+        order by m.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="getInOutStockCount" resultType="java.lang.Integer">
+        select count(1) from (select m.id
+        from jsh_material m
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_depot_item di on di.material_id=m.id and ifnull(di.delete_Flag,'0') !='1'
+        left join jsh_depot_head dh on di.header_id=dh.id and ifnull(dh.delete_flag,'0') !='1'
+        where 1=1 and me.default_flag=1
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="categoryIdList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryIdList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        group by m.id) cc
+    </select>
+
+    <select id="getListWithBuyOrSale" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultByMaterial">
+        select m.id MId, me.bar_code, m.name MName, m.mfrs MMfrs, m.model MModel, m.standard MStandard,
+        m.other_field1 MOtherField1,m.other_field2 MOtherField2,m.other_field3 MOtherField3,
+        concat_ws('', m.unit, u.basic_unit) MaterialUnit, m.color MColor, m.brand, u.name unit_name
+        from jsh_material m
+        left join jsh_depot_item di on di.material_id=m.id  and ifnull(di.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id  and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_depot_head dh on di.header_id=dh.id  and ifnull(dh.delete_flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="billType =='buy'">
+            and (dh.sub_type = '采购' or dh.sub_type = '采购退货')
+        </if>
+        <if test="billType =='sale'">
+            and (dh.sub_type = '销售' or dh.sub_type = '销售退货')
+        </if>
+        <if test="billType =='retail'">
+            and (dh.sub_type = '零售' or dh.sub_type = '零售退货')
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organId != null">
+            and dh.organ_id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        group by m.id
+        order by m.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="getListWithBuyOrSaleCount" resultType="java.lang.Integer">
+        select count(1) from (select m.id
+        from jsh_material m
+        left join jsh_depot_item di on di.material_id=m.id  and ifnull(m.delete_Flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id  and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_depot_head dh on di.header_id=dh.id  and ifnull(dh.delete_flag,'0') !='1'
+        where 1=1
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="billType =='buy'">
+            and (dh.sub_type = '采购' or dh.sub_type = '采购退货')
+        </if>
+        <if test="billType =='sale'">
+            and (dh.sub_type = '销售' or dh.sub_type = '销售退货')
+        </if>
+        <if test="billType =='retail'">
+            and (dh.sub_type = '零售' or dh.sub_type = '零售退货')
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time >= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organId != null">
+            and dh.organ_id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(di.delete_flag,'0') !='1'
+        group by m.id) cc
+    </select>
+
+    <select id="buyOrSaleNumber" resultType="java.math.BigDecimal">
+        select ifnull(sum(basic_number),0) as BasicNumber from jsh_depot_item di,jsh_depot_head dh
+        where di.header_id = dh.id
+        and dh.type=#{type} and dh.sub_type=#{subType}
+        and dh.oper_time &gt;= #{beginTime}
+        and dh.oper_time &lt;= #{endTime}
+        and di.material_id =#{MId}
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organId != null">
+            and dh.organ_id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        and ifnull(di.delete_flag,'0') !='1'
+    </select>
+
+    <select id="buyOrSalePrice" resultType="java.math.BigDecimal">
+        select ifnull(sum(all_price),0) as AllPrice from jsh_depot_item di,jsh_depot_head dh
+        where di.header_id = dh.id
+        and dh.type=#{type} and dh.sub_type=#{subType}
+        and dh.oper_time &gt;= #{beginTime}
+        and dh.oper_time &lt;= #{endTime}
+        <if test="MId != null">
+            and di.material_id =#{MId}
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organId != null">
+            and dh.organ_id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        and ifnull(di.delete_flag,'0') !='1'
+    </select>
+
+    <select id="buyOrSalePriceTotal" resultType="java.math.BigDecimal">
+        select ifnull(sum(di.all_price),0) as AllPrice
+        from jsh_depot_item di
+        left join jsh_depot_head dh on dh.id=di.header_id and ifnull(dh.delete_flag,'0') !='1'
+        left join jsh_material_extend me on me.id=di.material_extend_id  and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_Flag,'0') !='1'
+        where ifnull(di.delete_flag,'0') !='1'
+        and dh.type=#{type} and dh.sub_type=#{subType}
+        and dh.oper_time &gt;= #{beginTime}
+        and dh.oper_time &lt;= #{endTime}
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey})
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        <if test="organId != null">
+            and dh.organ_id = #{organId}
+        </if>
+        <if test="organArray != null and organArray !=''">
+            and dh.organ_id in (
+            <foreach collection="organArray" item="organId" separator=",">
+                #{organId}
+            </foreach>
+            )
+        </if>
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+    </select>
+
+    <select id="inOrOutPriceList" resultType="com.jsh.erp.datasource.vo.InOutPriceVo">
+        select distinct dh.id, dh.discount_last_money, dh.total_price, dh.type, dh.sub_type, dh.oper_time
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id = di.header_id and ifnull(di.delete_flag,'0') != '1'
+        where di.id is not null
+        and (dh.type='入库' or dh.type='出库')
+        and dh.oper_time &gt;= #{beginTime}
+        and dh.oper_time &lt;= #{endTime}
+        <if test="forceFlag">
+            and (dh.status = '1' or dh.status = '2' or dh.status = '3')
+        </if>
+        <if test="creatorArray != null">
+            and dh.creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and ifnull(dh.delete_flag,'0') != '1'
+    </select>
+
+    <select id="getSkuStockCheckSumByDepotList"  resultType="java.math.BigDecimal">
+        select ifnull(sum(di.basic_number),0) stockCheckSum from jsh_depot_head dh
+        left JOIN jsh_depot_item di on dh.id=di.header_id
+        where 1=1
+        <if test="meId != null">
+            and di.material_extend_id=#{meId}
+        </if>
+        and dh.sub_type='盘点复盘'
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        and ifnull(di.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getStockCheckSumByDepotList"  resultType="java.math.BigDecimal">
+        select ifnull(sum(di.basic_number),0) stockCheckSum from jsh_depot_head dh
+        left JOIN jsh_depot_item di on dh.id=di.header_id
+        where 1=1
+        <if test="mId != null">
+            and di.material_id=#{mId}
+        </if>
+        and dh.sub_type='盘点复盘'
+        <if test="depotList.size()>0">
+            and di.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        and ifnull(di.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getSkuStockByParamWithDepotList" resultMap="stockMap">
+        select
+        sum(case when dh.type='入库' <include refid="inOutManageParam" /> <include refid="depotParam" /> then di.basic_number else 0 end) as inTotal,
+        sum(case when dh.type='出库' and dh.sub_type!='调拨' <include refid="inOutManageParam" /> <include refid="depotParam" /> then di.basic_number else 0 end) as outTotal,
+        sum(case when dh.sub_type='调拨' <include refid="anotherDepotParam" /> then di.basic_number else 0 end) as transfInTotal,
+        sum(case when dh.sub_type='调拨' <include refid="depotParam" /> then di.basic_number else 0 end) as transfOutTotal,
+        sum(case when dh.sub_type='组装单' and di.material_type='组合件' <include refid="depotParam" /> then di.basic_number else 0 end) as assemInTotal,
+        sum(case when dh.sub_type='组装单' and di.material_type='普通子件' <include refid="depotParam" /> then di.basic_number else 0 end) as assemOutTotal,
+        sum(case when dh.sub_type='拆卸单' and di.material_type='普通子件' <include refid="depotParam" /> then di.basic_number else 0 end) as disAssemInTotal,
+        sum(case when dh.sub_type='拆卸单' and di.material_type='组合件' <include refid="depotParam" /> then di.basic_number else 0 end) as disAssemOutTotal
+        from
+        jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where 1=1
+        and ifnull(dh.delete_flag,'0') !='1'
+        and di.material_extend_id=#{meId}
+        and ifnull(di.sku,'') !=''
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+    </select>
+
+    <select id="getStockByParamWithDepotList" resultMap="stockMap">
+        select
+        sum(case when dh.type='入库' <include refid="inOutManageParam" /> <include refid="depotParam" /> then di.basic_number else 0 end) as inTotal,
+        sum(case when dh.type='出库' and dh.sub_type!='调拨' <include refid="inOutManageParam" /> <include refid="depotParam" /> then di.basic_number else 0 end) as outTotal,
+        sum(case when dh.sub_type='调拨' <include refid="anotherDepotParam" /> then di.basic_number else 0 end) as transfInTotal,
+        sum(case when dh.sub_type='调拨' <include refid="depotParam" /> then di.basic_number else 0 end) as transfOutTotal,
+        sum(case when dh.sub_type='组装单' and di.material_type='组合件' <include refid="depotParam" /> then di.basic_number else 0 end) as assemInTotal,
+        sum(case when dh.sub_type='组装单' and di.material_type='普通子件' <include refid="depotParam" /> then di.basic_number else 0 end) as assemOutTotal,
+        sum(case when dh.sub_type='拆卸单' and di.material_type='普通子件' <include refid="depotParam" /> then di.basic_number else 0 end) as disAssemInTotal,
+        sum(case when dh.sub_type='拆卸单' and di.material_type='组合件' <include refid="depotParam" /> then di.basic_number else 0 end) as disAssemOutTotal
+        from
+        jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where 1=1
+        and ifnull(dh.delete_flag,'0') !='1'
+        and di.material_id=#{mId}
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="beginTime != null">
+            and dh.oper_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and dh.oper_time &lt;= #{endTime}
+        </if>
+    </select>
+
+    <sql id="inOutManageParam">
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+    </sql>
+
+    <sql id="depotParam">
+        <if test="depotList.size()>0">
+            and di.depot_id in <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">#{item}</foreach>
+        </if>
+    </sql>
+
+    <sql id="anotherDepotParam">
+        <if test="depotList.size()>0">
+            and di.another_depot_id in <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">#{item}</foreach>
+        </if>
+    </sql>
+
+    <select id="findDepotItemListBydepotheadId"  resultType="com.jsh.erp.datasource.entities.DepotItem">
+        select
+        dep.id,dep.header_id,dep.material_id,dep.material_unit,dep.oper_number,
+        dep.basic_number,dep.unit_price,dep.tax_unit_price,dep.all_price,dep.remark,
+        dep.depot_id,dep.another_depot_id,dep.tax_rate,
+        dep.tax_money,dep.tax_last_money,dep.material_type
+        from jsh_depot_item dep,jsh_material mat
+        where 1=1
+        <if test="depotheadId != null">
+           and dep.header_id = #{depotheadId}
+        </if>
+            and dep.material_id=mat.id
+        <if test="enableSerialNumber != null">
+           and mat.enable_serial_number = #{enableSerialNumber}
+        </if>
+        and ifnull(dep.delete_flag,'0') !='1'
+        and ifnull(mat.delete_flag,'0') !='1'
+    </select>
+
+    <update id="batchDeleteDepotItemByDepotHeadIds">
+        update jsh_depot_item
+        set delete_flag='1'
+        where 1=1
+        and header_id in
+        (
+        <foreach collection="depotheadIds" item="depotheadId" separator=",">
+            #{depotheadId}
+        </foreach>
+        )
+    </update>
+
+    <update id="batchDeleteDepotItemByIds">
+        update jsh_depot_item
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <select id="getDepotItemListListByDepotIds" resultMap="com.jsh.erp.datasource.mappers.DepotItemMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.DepotItemMapper.Base_Column_List" />
+        from jsh_depot_item
+        where 1=1
+        and depot_id in (
+        <foreach collection="depotIds" item="depotId" separator=",">
+            #{depotId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getDepotItemListListByMaterialIds" resultMap="com.jsh.erp.datasource.mappers.DepotItemMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.DepotItemMapper.Base_Column_List" />
+        from jsh_depot_item
+        where 1=1
+        and material_id in (
+        <foreach collection="materialIds" item="materialId" separator=",">
+            #{materialId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="findStockWarningCount" parameterType="com.jsh.erp.datasource.entities.DepotItemExample" resultMap="ResultStockWarningCount">
+        select m.id MId, m.name MName, me.bar_code, m.mfrs MMfrs, m.model MModel, m.standard MStandard,m.color MColor, m.brand,
+        m.other_field1 MOtherField1,m.other_field2 MOtherField2,m.other_field3 MOtherField3,d.name depotName,
+        m.unit MaterialUnit, u.basic_unit unit_name,mcs.current_number,
+        mis.low_safe_stock, mis.high_safe_stock
+        from jsh_material m
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_initial_stock mis on mis.material_id=m.id and ifnull(mis.delete_Flag,'0') !='1'
+        left join jsh_material_current_stock mcs on mcs.material_id=m.id and ifnull(mcs.delete_Flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        left join jsh_depot d on d.id=mis.depot_id and ifnull(u.delete_flag,'0') !='1'
+        where 1=1
+        and me.default_flag=1
+        and ifnull(m.delete_flag,'0') !='1'
+        and mis.depot_id=mcs.depot_id
+        and ((ifnull(mis.low_safe_stock,0)!=0 and mcs.current_number &lt; ifnull(mis.low_safe_stock,0))
+            or (ifnull(mis.high_safe_stock,0)!=0 and mcs.current_number > ifnull(mis.high_safe_stock,0)))
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="depotList.size()>0">
+            and mis.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by depotName asc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="findStockWarningCountTotal" resultType="java.lang.Integer">
+        select count(1) from
+        (select m.id
+        from jsh_material m
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_initial_stock mis on mis.material_id=m.id and ifnull(mis.delete_Flag,'0') !='1'
+        left join jsh_material_current_stock mcs on mcs.material_id=m.id and ifnull(mcs.delete_Flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        left join jsh_depot d on d.id=mis.depot_id and ifnull(u.delete_flag,'0') !='1'
+        where 1=1
+        and me.default_flag=1
+        and ifnull(m.delete_flag,'0') !='1'
+        and mis.depot_id=mcs.depot_id
+        and ((ifnull(mis.low_safe_stock,0)!=0 and mcs.current_number &lt; ifnull(mis.low_safe_stock,0))
+            or (ifnull(mis.high_safe_stock,0)!=0 and mcs.current_number > ifnull(mis.high_safe_stock,0)))
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        <if test="depotList.size()>0">
+            and mis.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="categoryList.size()>0">
+            and m.category_id in
+            <foreach collection="categoryList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        ) tb
+    </select>
+
+    <select id="getFinishNumber" resultType="java.math.BigDecimal">
+        select ifnull(sum(di.basic_number),0) from jsh_depot_item di
+        where di.material_extend_id=#{meId}
+        and di.link_id=#{linkId}
+        and ifnull(di.delete_flag,'0') !='1'
+        and di.header_id
+        in
+        (
+        select dh.id from jsh_depot_head dh
+        where 1=1
+        <if test="noType == 'normal'">
+            and dh.link_number=#{linkStr}
+        </if>
+        <if test="noType == 'apply'">
+            and dh.link_apply=#{linkStr}
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        <if test="goToType != null and goToType !=''">
+            and dh.sub_type=#{goToType}
+        </if>
+        )
+    </select>
+
+    <select id="getRealFinishNumber" resultType="java.math.BigDecimal">
+        select ifnull(sum(di.basic_number),0) from jsh_depot_item di
+        where di.material_extend_id=#{meId}
+        and di.link_id=#{linkId}
+        and ifnull(di.delete_flag,'0') !='1'
+        and di.header_id
+        in
+        (
+        select dh.id from jsh_depot_head dh
+        where
+        dh.id!=#{currentHeaderId}
+        <if test="linkType == 'normal'">
+            and dh.link_number=#{linkStr}
+        </if>
+        <if test="linkType == 'apply'">
+            and dh.link_apply=#{linkStr}
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        <if test="goToType != null and goToType !=''">
+            and dh.sub_type=#{goToType}
+        </if>
+        )
+    </select>
+
+    <select id="getBatchNumberList" resultMap="batchNumberListMap">
+        select id, bar_code, name, standard, model, unit_id,
+        commodity_unit, batch_number, expiration_date, sum(basic_number) total_num from
+        (select di.batch_number id, me.bar_code, m.name, m.standard, m.model, m.unit_id,
+         me.commodity_unit, di.batch_number,di.expiration_date,
+         di.basic_number*(case dh.type when '入库' then 1 when '出库' then -1 end) as basic_number
+        from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id
+        left join jsh_material m on m.id=di.material_id and ifnull(m.delete_flag, '0') != '1'
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_flag,'0') !='1'
+        where me.bar_code= #{barCode}
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and di.batch_number like #{bindName}
+        </if>
+        <if test="depotId != null">
+            and di.depot_id= #{depotId}
+        </if>
+        <if test="batchNumber != null">
+            and di.batch_number= #{batchNumber}
+        </if>
+        <if test="number != null">
+            and dh.number!= #{number}
+        </if>
+        <if test="forceFlag">
+            and dh.status = '1'
+        </if>
+        <if test="inOutManageFlag">
+            and (dh.sub_type!='采购' and dh.sub_type!='采购退货' and dh.sub_type!='销售' and dh.sub_type!='销售退货')
+        </if>
+        and m.enable_batch_number =1
+        and di.delete_flag!=1) tb
+        group by batch_number
+        order by expiration_date asc
+    </select>
+
+    <select id="getCountByMaterialAndDepot" resultType="java.lang.Long">
+        select count(1) from jsh_depot_item di
+        where di.material_id=#{mId} and di.depot_id=#{depotId}
+        and ifnull(di.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getLinkBillDetailMaterialSum" resultMap="materialSumMap">
+        select di.material_extend_id, sum(di.oper_number) oper_number from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where dh.number=#{linkStr}
+          and ifnull(dh.delete_flag,'0') !='1'
+        group by di.material_extend_id
+    </select>
+
+    <select id="getBatchBillDetailMaterialSum" resultMap="materialSumMap">
+        select di.material_extend_id, sum(di.oper_number) oper_number from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where dh.type=#{type}
+        <if test="linkType == 'normal'">
+            and dh.link_number=#{linkStr}
+        </if>
+        <if test="linkType == 'apply'">
+            and dh.link_apply=#{linkStr}
+        </if>
+        and ifnull(dh.delete_flag,'0') !='1'
+        group by di.material_extend_id
+    </select>
+
+    <select id="getCountByMaterialAndBatchNumber" resultType="java.lang.Long">
+        select count(di.id) from
+        jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where 1=1
+        and ifnull(dh.delete_flag,'0') !='1'
+        and di.material_extend_id=#{meId}
+        and di.batch_number=#{batchNumber}
+    </select>
+
+    <select id="getDepotItemByBatchNumber" resultType="com.jsh.erp.datasource.entities.DepotItem">
+        select di.* from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where 1=1
+        and ifnull(dh.delete_flag,'0') !='1'
+        and di.material_extend_id = #{materialExtendId}
+        and di.batch_number = #{batchNumber}
+        and dh.type = '入库'
+    </select>
+
+    <select id="getBillItemByParam" resultType="com.jsh.erp.datasource.entities.MaterialVo4Unit">
+        select m.id, m.name, m.standard, m.model, me.id meId,me.commodity_unit commodityUnit,
+        me.purchase_decimal purchaseDecimal, me.wholesale_decimal wholesaleDecimal, me.bar_code mBarCode, me.sku
+        from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="barCodes != null">
+            and me.bar_code in (${barCodes})
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        order by m.id desc
+    </select>
+
+    <select id="getCurrentStockByParam" resultType="java.math.BigDecimal">
+        select sum(ifnull(current_number,0))
+        from jsh_material_current_stock
+        where 1=1
+        <if test="depotId != null">
+            and depot_id = ${depotId}
+        </if>
+        <if test="mId != null">
+            and material_id = ${mId}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getLastUnitPriceByParam" resultType="java.math.BigDecimal">
+        select di.unit_price from jsh_depot_head dh
+        left join jsh_depot_item di on dh.id=di.header_id and ifnull(di.delete_flag,'0') !='1'
+        where dh.organ_id = #{organId}
+        and di.material_extend_id = #{meId}
+        and dh.type = #{type} and dh.sub_type = #{subType}
+        and ifnull(dh.delete_flag,'0') !='1'
+        order by dh.id desc, di.id desc
+        limit 0,1
+    </select>
+
+</mapper>
diff --git a/src/main/resources/mapper_xml/DepotMapper.xml b/src/main/resources/mapper_xml/DepotMapper.xml
new file mode 100644
index 0000000..d4a6c69
--- /dev/null
+++ b/src/main/resources/mapper_xml/DepotMapper.xml
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.DepotMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Depot">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="address" jdbcType="VARCHAR" property="address" />
+    <result column="warehousing" jdbcType="DECIMAL" property="warehousing" />
+    <result column="truckage" jdbcType="DECIMAL" property="truckage" />
+    <result column="type" jdbcType="INTEGER" property="type" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="principal" jdbcType="BIGINT" property="principal" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_Flag" jdbcType="VARCHAR" property="deleteFlag" />
+    <result column="is_default" jdbcType="BIT" property="isDefault" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, name, address, warehousing, truckage, type, sort, remark, principal, enabled, 
+    tenant_id, delete_Flag, is_default
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.DepotExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_depot
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_depot
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_depot
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.DepotExample">
+    delete from jsh_depot
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Depot">
+    insert into jsh_depot (id, name, address, 
+      warehousing, truckage, type, 
+      sort, remark, principal, 
+      enabled, tenant_id, delete_Flag, 
+      is_default)
+    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, 
+      #{warehousing,jdbcType=DECIMAL}, #{truckage,jdbcType=DECIMAL}, #{type,jdbcType=INTEGER}, 
+      #{sort,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{principal,jdbcType=BIGINT}, 
+      #{enabled,jdbcType=BIT}, #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR}, 
+      #{isDefault,jdbcType=BIT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Depot">
+    insert into jsh_depot
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="address != null">
+        address,
+      </if>
+      <if test="warehousing != null">
+        warehousing,
+      </if>
+      <if test="truckage != null">
+        truckage,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="principal != null">
+        principal,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_Flag,
+      </if>
+      <if test="isDefault != null">
+        is_default,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="address != null">
+        #{address,jdbcType=VARCHAR},
+      </if>
+      <if test="warehousing != null">
+        #{warehousing,jdbcType=DECIMAL},
+      </if>
+      <if test="truckage != null">
+        #{truckage,jdbcType=DECIMAL},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=INTEGER},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="principal != null">
+        #{principal,jdbcType=BIGINT},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="isDefault != null">
+        #{isDefault,jdbcType=BIT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.DepotExample" resultType="java.lang.Long">
+    select count(*) from jsh_depot
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_depot
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.address != null">
+        address = #{record.address,jdbcType=VARCHAR},
+      </if>
+      <if test="record.warehousing != null">
+        warehousing = #{record.warehousing,jdbcType=DECIMAL},
+      </if>
+      <if test="record.truckage != null">
+        truckage = #{record.truckage,jdbcType=DECIMAL},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=INTEGER},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.principal != null">
+        principal = #{record.principal,jdbcType=BIGINT},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_Flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.isDefault != null">
+        is_default = #{record.isDefault,jdbcType=BIT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_depot
+    set id = #{record.id,jdbcType=BIGINT},
+      name = #{record.name,jdbcType=VARCHAR},
+      address = #{record.address,jdbcType=VARCHAR},
+      warehousing = #{record.warehousing,jdbcType=DECIMAL},
+      truckage = #{record.truckage,jdbcType=DECIMAL},
+      type = #{record.type,jdbcType=INTEGER},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      principal = #{record.principal,jdbcType=BIGINT},
+      enabled = #{record.enabled,jdbcType=BIT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_Flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      is_default = #{record.isDefault,jdbcType=BIT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Depot">
+    update jsh_depot
+    <set>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="address != null">
+        address = #{address,jdbcType=VARCHAR},
+      </if>
+      <if test="warehousing != null">
+        warehousing = #{warehousing,jdbcType=DECIMAL},
+      </if>
+      <if test="truckage != null">
+        truckage = #{truckage,jdbcType=DECIMAL},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=INTEGER},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="principal != null">
+        principal = #{principal,jdbcType=BIGINT},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_Flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="isDefault != null">
+        is_default = #{isDefault,jdbcType=BIT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Depot">
+    update jsh_depot
+    set name = #{name,jdbcType=VARCHAR},
+      address = #{address,jdbcType=VARCHAR},
+      warehousing = #{warehousing,jdbcType=DECIMAL},
+      truckage = #{truckage,jdbcType=DECIMAL},
+      type = #{type,jdbcType=INTEGER},
+      sort = #{sort,jdbcType=VARCHAR},
+      remark = #{remark,jdbcType=VARCHAR},
+      principal = #{principal,jdbcType=BIGINT},
+      enabled = #{enabled,jdbcType=BIT},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_Flag = #{deleteFlag,jdbcType=VARCHAR},
+      is_default = #{isDefault,jdbcType=BIT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/DepotMapperEx.xml b/src/main/resources/mapper_xml/DepotMapperEx.xml
new file mode 100644
index 0000000..a40d699
--- /dev/null
+++ b/src/main/resources/mapper_xml/DepotMapperEx.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.DepotMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.DepotMapper.BaseResultMap" id="ResultMapEx" type="com.jsh.erp.datasource.entities.DepotEx">
+        <result column="principalName" jdbcType="VARCHAR" property="principalName" />
+    </resultMap>
+
+    <select id="selectByConditionDepot" parameterType="com.jsh.erp.datasource.entities.DepotExample" resultMap="ResultMapEx">
+        select dep.*,usr.username as principalName
+        FROM jsh_depot dep
+        left join jsh_user usr on usr.id=dep.principal and ifnull(usr.status,'0') not in('1','2')
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and dep.name like #{bindName}
+        </if>
+        <if test="type != null">
+            and dep.type=#{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and dep.remark like #{bindRemark}
+        </if>
+        and ifnull(dep.delete_Flag,'0') !='1'
+        order by dep.sort asc, dep.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByDepot" resultType="java.lang.Long">
+        SELECT
+        COUNT(dep.id)
+        FROM jsh_depot dep
+        left join jsh_user usr on usr.id=dep.principal and ifnull(usr.status,'0') not in('1','2')
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and dep.name like #{bindName}
+        </if>
+        <if test="type != null">
+            and dep.type=#{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and dep.remark like #{bindRemark}
+        </if>
+        and ifnull(dep.delete_Flag,'0') !='1'
+    </select>
+
+    <update id="batchDeleteDepotByIds">
+        update jsh_depot
+        set delete_Flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/FunctionMapper.xml b/src/main/resources/mapper_xml/FunctionMapper.xml
new file mode 100644
index 0000000..0f1f2fc
--- /dev/null
+++ b/src/main/resources/mapper_xml/FunctionMapper.xml
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.FunctionMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Function">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="number" jdbcType="VARCHAR" property="number" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="parent_number" jdbcType="VARCHAR" property="parentNumber" />
+    <result column="url" jdbcType="VARCHAR" property="url" />
+    <result column="component" jdbcType="VARCHAR" property="component" />
+    <result column="state" jdbcType="BIT" property="state" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="push_btn" jdbcType="VARCHAR" property="pushBtn" />
+    <result column="icon" jdbcType="VARCHAR" property="icon" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, number, name, parent_number, url, component, state, sort, enabled, type, push_btn, 
+    icon, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.FunctionExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_function
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_function
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_function
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.FunctionExample">
+    delete from jsh_function
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Function">
+    insert into jsh_function (id, number, name, 
+      parent_number, url, component, 
+      state, sort, enabled, type, 
+      push_btn, icon, delete_flag
+      )
+    values (#{id,jdbcType=BIGINT}, #{number,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, 
+      #{parentNumber,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR}, #{component,jdbcType=VARCHAR}, 
+      #{state,jdbcType=BIT}, #{sort,jdbcType=VARCHAR}, #{enabled,jdbcType=BIT}, #{type,jdbcType=VARCHAR}, 
+      #{pushBtn,jdbcType=VARCHAR}, #{icon,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=VARCHAR}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Function">
+    insert into jsh_function
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="number != null">
+        number,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="parentNumber != null">
+        parent_number,
+      </if>
+      <if test="url != null">
+        url,
+      </if>
+      <if test="component != null">
+        component,
+      </if>
+      <if test="state != null">
+        state,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="pushBtn != null">
+        push_btn,
+      </if>
+      <if test="icon != null">
+        icon,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="number != null">
+        #{number,jdbcType=VARCHAR},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="parentNumber != null">
+        #{parentNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="component != null">
+        #{component,jdbcType=VARCHAR},
+      </if>
+      <if test="state != null">
+        #{state,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="pushBtn != null">
+        #{pushBtn,jdbcType=VARCHAR},
+      </if>
+      <if test="icon != null">
+        #{icon,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.FunctionExample" resultType="java.lang.Long">
+    select count(*) from jsh_function
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_function
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.number != null">
+        number = #{record.number,jdbcType=VARCHAR},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.parentNumber != null">
+        parent_number = #{record.parentNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.url != null">
+        url = #{record.url,jdbcType=VARCHAR},
+      </if>
+      <if test="record.component != null">
+        component = #{record.component,jdbcType=VARCHAR},
+      </if>
+      <if test="record.state != null">
+        state = #{record.state,jdbcType=BIT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.pushBtn != null">
+        push_btn = #{record.pushBtn,jdbcType=VARCHAR},
+      </if>
+      <if test="record.icon != null">
+        icon = #{record.icon,jdbcType=VARCHAR},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_function
+    set id = #{record.id,jdbcType=BIGINT},
+      number = #{record.number,jdbcType=VARCHAR},
+      name = #{record.name,jdbcType=VARCHAR},
+      parent_number = #{record.parentNumber,jdbcType=VARCHAR},
+      url = #{record.url,jdbcType=VARCHAR},
+      component = #{record.component,jdbcType=VARCHAR},
+      state = #{record.state,jdbcType=BIT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      type = #{record.type,jdbcType=VARCHAR},
+      push_btn = #{record.pushBtn,jdbcType=VARCHAR},
+      icon = #{record.icon,jdbcType=VARCHAR},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Function">
+    update jsh_function
+    <set>
+      <if test="number != null">
+        number = #{number,jdbcType=VARCHAR},
+      </if>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="parentNumber != null">
+        parent_number = #{parentNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        url = #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="component != null">
+        component = #{component,jdbcType=VARCHAR},
+      </if>
+      <if test="state != null">
+        state = #{state,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="pushBtn != null">
+        push_btn = #{pushBtn,jdbcType=VARCHAR},
+      </if>
+      <if test="icon != null">
+        icon = #{icon,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Function">
+    update jsh_function
+    set number = #{number,jdbcType=VARCHAR},
+      name = #{name,jdbcType=VARCHAR},
+      parent_number = #{parentNumber,jdbcType=VARCHAR},
+      url = #{url,jdbcType=VARCHAR},
+      component = #{component,jdbcType=VARCHAR},
+      state = #{state,jdbcType=BIT},
+      sort = #{sort,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      type = #{type,jdbcType=VARCHAR},
+      push_btn = #{pushBtn,jdbcType=VARCHAR},
+      icon = #{icon,jdbcType=VARCHAR},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/FunctionMapperEx.xml b/src/main/resources/mapper_xml/FunctionMapperEx.xml
new file mode 100644
index 0000000..11fb1b4
--- /dev/null
+++ b/src/main/resources/mapper_xml/FunctionMapperEx.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.FunctionMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.FunctionMapper.BaseResultMap" id="ResultMapEx" type="com.jsh.erp.datasource.entities.FunctionEx">
+        <result column="parent_name" jdbcType="VARCHAR" property="parentName" />
+    </resultMap>
+    <select id="selectByConditionFunction" parameterType="com.jsh.erp.datasource.entities.FunctionExample"
+            resultMap="ResultMapEx">
+        select fa.*, fb.name parent_name
+        from jsh_function fa
+        left join jsh_function fb on fa.parent_number = fb.number
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and fa.name like #{bindName}
+        </if>
+        <if test="type != null">
+            and fa.type=#{type}
+        </if>
+        and ifnull(fa.delete_flag,'0') !='1'
+        order by fa.sort asc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByFunction" resultType="java.lang.Long">
+        select
+        count(fa.id)
+        from jsh_function fa
+        left join jsh_function fb on fa.parent_number = fb.number
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and fa.name like #{bindName}
+        </if>
+        <if test="type != null">
+            and fa.type=#{type}
+        </if>
+        and ifnull(fa.delete_flag,'0') !='1'
+    </select>
+    <update id="batchDeleteFunctionByIds">
+        update jsh_function
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/InOutItemMapper.xml b/src/main/resources/mapper_xml/InOutItemMapper.xml
new file mode 100644
index 0000000..1319e4b
--- /dev/null
+++ b/src/main/resources/mapper_xml/InOutItemMapper.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.InOutItemMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.InOutItem">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, name, type, remark, enabled, sort, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.InOutItemExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_in_out_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_in_out_item
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_in_out_item
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.InOutItemExample">
+    delete from jsh_in_out_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.InOutItem">
+    insert into jsh_in_out_item (id, name, type, 
+      remark, enabled, sort, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, 
+      #{remark,jdbcType=VARCHAR}, #{enabled,jdbcType=BIT}, #{sort,jdbcType=VARCHAR}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.InOutItem">
+    insert into jsh_in_out_item
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.InOutItemExample" resultType="java.lang.Long">
+    select count(*) from jsh_in_out_item
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_in_out_item
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_in_out_item
+    set id = #{record.id,jdbcType=BIGINT},
+      name = #{record.name,jdbcType=VARCHAR},
+      type = #{record.type,jdbcType=VARCHAR},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.InOutItem">
+    update jsh_in_out_item
+    <set>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.InOutItem">
+    update jsh_in_out_item
+    set name = #{name,jdbcType=VARCHAR},
+      type = #{type,jdbcType=VARCHAR},
+      remark = #{remark,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      sort = #{sort,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/InOutItemMapperEx.xml b/src/main/resources/mapper_xml/InOutItemMapperEx.xml
new file mode 100644
index 0000000..21e3b02
--- /dev/null
+++ b/src/main/resources/mapper_xml/InOutItemMapperEx.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.InOutItemMapperEx">
+    <select id="selectByConditionInOutItem" parameterType="com.jsh.erp.datasource.entities.InOutItemExample" resultMap="com.jsh.erp.datasource.mappers.InOutItemMapper.BaseResultMap">
+        select *
+        FROM jsh_in_out_item
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null">
+            and type=#{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc, id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByInOutItem" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_in_out_item
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null">
+            and type=#{type}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and remark like #{bindRemark}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <update id="batchDeleteInOutItemByIds">
+        update jsh_in_out_item
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/LogMapper.xml b/src/main/resources/mapper_xml/LogMapper.xml
new file mode 100644
index 0000000..dea4a16
--- /dev/null
+++ b/src/main/resources/mapper_xml/LogMapper.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.LogMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Log">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="user_id" jdbcType="BIGINT" property="userId" />
+    <result column="operation" jdbcType="VARCHAR" property="operation" />
+    <result column="client_ip" jdbcType="VARCHAR" property="clientIp" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="status" jdbcType="TINYINT" property="status" />
+    <result column="content" jdbcType="VARCHAR" property="content" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, user_id, operation, client_ip, create_time, status, content, tenant_id
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.LogExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_log
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_log
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_log
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.LogExample">
+    delete from jsh_log
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Log">
+    insert into jsh_log (id, user_id, operation, 
+      client_ip, create_time, status, 
+      content, tenant_id)
+    values (#{id,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{operation,jdbcType=VARCHAR}, 
+      #{clientIp,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{status,jdbcType=TINYINT}, 
+      #{content,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Log">
+    insert into jsh_log
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="userId != null">
+        user_id,
+      </if>
+      <if test="operation != null">
+        operation,
+      </if>
+      <if test="clientIp != null">
+        client_ip,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="status != null">
+        status,
+      </if>
+      <if test="content != null">
+        content,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="userId != null">
+        #{userId,jdbcType=BIGINT},
+      </if>
+      <if test="operation != null">
+        #{operation,jdbcType=VARCHAR},
+      </if>
+      <if test="clientIp != null">
+        #{clientIp,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=TINYINT},
+      </if>
+      <if test="content != null">
+        #{content,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.LogExample" resultType="java.lang.Long">
+    select count(*) from jsh_log
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_log
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.userId != null">
+        user_id = #{record.userId,jdbcType=BIGINT},
+      </if>
+      <if test="record.operation != null">
+        operation = #{record.operation,jdbcType=VARCHAR},
+      </if>
+      <if test="record.clientIp != null">
+        client_ip = #{record.clientIp,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.status != null">
+        status = #{record.status,jdbcType=TINYINT},
+      </if>
+      <if test="record.content != null">
+        content = #{record.content,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_log
+    set id = #{record.id,jdbcType=BIGINT},
+      user_id = #{record.userId,jdbcType=BIGINT},
+      operation = #{record.operation,jdbcType=VARCHAR},
+      client_ip = #{record.clientIp,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      status = #{record.status,jdbcType=TINYINT},
+      content = #{record.content,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Log">
+    update jsh_log
+    <set>
+      <if test="userId != null">
+        user_id = #{userId,jdbcType=BIGINT},
+      </if>
+      <if test="operation != null">
+        operation = #{operation,jdbcType=VARCHAR},
+      </if>
+      <if test="clientIp != null">
+        client_ip = #{clientIp,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="status != null">
+        status = #{status,jdbcType=TINYINT},
+      </if>
+      <if test="content != null">
+        content = #{content,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Log">
+    update jsh_log
+    set user_id = #{userId,jdbcType=BIGINT},
+      operation = #{operation,jdbcType=VARCHAR},
+      client_ip = #{clientIp,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      status = #{status,jdbcType=TINYINT},
+      content = #{content,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/LogMapperEx.xml b/src/main/resources/mapper_xml/LogMapperEx.xml
new file mode 100644
index 0000000..b975294
--- /dev/null
+++ b/src/main/resources/mapper_xml/LogMapperEx.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.LogMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.LogMapper.BaseResultMap" id="ResultExMap" type="com.jsh.erp.datasource.vo.LogVo4List">
+        <result column="userName" jdbcType="VARCHAR" property="userName" />
+        <result column="login_name" jdbcType="VARCHAR" property="loginName" />
+    </resultMap>
+
+    <select id="selectByConditionLog" parameterType="com.jsh.erp.datasource.entities.LogExample" resultMap="ResultExMap">
+        select l.*,u.login_name,u.username userName
+        FROM jsh_log l
+        left join jsh_user u on l.user_id = u.id
+        left join jsh_tenant t on l.tenant_id=t.tenant_id
+        where 1=1
+        <if test="operation != null">
+            <bind name="bindOperation" value="'%'+operation+'%'"/>
+            and l.operation like #{bindOperation}
+        </if>
+        <if test="userInfo != null">
+            <bind name="bindUserInfo" value="'%'+userInfo+'%'"/>
+            and (u.username like #{bindUserInfo} or u.login_name like #{bindUserInfo})
+        </if>
+        <if test="clientIp != null">
+            <bind name="bindClientIp" value="'%'+clientIp+'%'"/>
+            and l.client_ip like #{bindClientIp}
+        </if>
+        <if test="tenantLoginName != null">
+            and t.login_name = #{tenantLoginName}
+        </if>
+        <if test="tenantType != null">
+            and t.type = #{tenantType}
+        </if>
+        <if test="beginTime != null">
+            and l.create_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and l.create_time &lt;= #{endTime}
+        </if>
+        <if test="content != null">
+            <bind name="bindContent" value="'%'+content+'%'"/>
+            and l.content like #{bindContent}
+        </if>
+        order by l.create_time desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByLog" resultType="java.lang.Long">
+        SELECT
+        COUNT(1)
+        FROM jsh_log l
+        left join jsh_user u on l.user_id = u.id
+        left join jsh_tenant t on l.tenant_id=t.tenant_id
+        WHERE 1=1
+        <if test="operation != null">
+            <bind name="bindOperation" value="'%'+operation+'%'"/>
+            and l.operation like #{bindOperation}
+        </if>
+        <if test="userInfo != null">
+            <bind name="bindUserInfo" value="'%'+userInfo+'%'"/>
+            and (u.username like #{bindUserInfo} or u.login_name like #{bindUserInfo})
+        </if>
+        <if test="clientIp != null">
+            <bind name="bindClientIp" value="'%'+clientIp+'%'"/>
+            and l.client_ip like #{bindClientIp}
+        </if>
+        <if test="tenantLoginName != null">
+            and t.login_name = #{tenantLoginName}
+        </if>
+        <if test="tenantType != null">
+            and t.type = #{tenantType}
+        </if>
+        <if test="beginTime != null">
+            and l.create_time &gt;= #{beginTime}
+        </if>
+        <if test="endTime != null">
+            and l.create_time &lt;= #{endTime}
+        </if>
+        <if test="content != null">
+            <bind name="bindContent" value="'%'+content+'%'"/>
+            and l.content like #{bindContent}
+        </if>
+    </select>
+
+    <select id="getCountByIpAndDate" resultType="java.lang.Long">
+        select count(1) from jsh_log
+        where user_id=#{userId} and operation=#{moduleName} and client_ip=#{clientIp} and create_time=#{createTime}
+    </select>
+
+    <insert id="insertLogWithUserId" parameterType="com.jsh.erp.datasource.entities.Log">
+        insert into jsh_log (user_id, operation,
+                             client_ip, create_time, status,
+                             content, tenant_id)
+        values (#{userId,jdbcType=BIGINT}, #{operation,jdbcType=VARCHAR},
+                #{clientIp,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{status,jdbcType=TINYINT},
+                #{content,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT})
+    </insert>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialAttributeMapper.xml b/src/main/resources/mapper_xml/MaterialAttributeMapper.xml
new file mode 100644
index 0000000..addce50
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialAttributeMapper.xml
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialAttributeMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.MaterialAttribute">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="attribute_name" jdbcType="VARCHAR" property="attributeName" />
+    <result column="attribute_value" jdbcType="VARCHAR" property="attributeValue" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, attribute_name, attribute_value, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MaterialAttributeExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_material_attribute
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_material_attribute
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_material_attribute
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MaterialAttributeExample">
+    delete from jsh_material_attribute
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.MaterialAttribute">
+    insert into jsh_material_attribute (id, attribute_name, attribute_value, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{attributeName,jdbcType=VARCHAR}, #{attributeValue,jdbcType=VARCHAR}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.MaterialAttribute">
+    insert into jsh_material_attribute
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="attributeName != null">
+        attribute_name,
+      </if>
+      <if test="attributeValue != null">
+        attribute_value,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="attributeName != null">
+        #{attributeName,jdbcType=VARCHAR},
+      </if>
+      <if test="attributeValue != null">
+        #{attributeValue,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MaterialAttributeExample" resultType="java.lang.Long">
+    select count(*) from jsh_material_attribute
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_material_attribute
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.attributeName != null">
+        attribute_name = #{record.attributeName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.attributeValue != null">
+        attribute_value = #{record.attributeValue,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_material_attribute
+    set id = #{record.id,jdbcType=BIGINT},
+      attribute_name = #{record.attributeName,jdbcType=VARCHAR},
+      attribute_value = #{record.attributeValue,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.MaterialAttribute">
+    update jsh_material_attribute
+    <set>
+      <if test="attributeName != null">
+        attribute_name = #{attributeName,jdbcType=VARCHAR},
+      </if>
+      <if test="attributeValue != null">
+        attribute_value = #{attributeValue,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.MaterialAttribute">
+    update jsh_material_attribute
+    set attribute_name = #{attributeName,jdbcType=VARCHAR},
+      attribute_value = #{attributeValue,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialAttributeMapperEx.xml b/src/main/resources/mapper_xml/MaterialAttributeMapperEx.xml
new file mode 100644
index 0000000..cbe07a2
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialAttributeMapperEx.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialAttributeMapperEx">
+
+    <select id="selectByConditionMaterialAttribute" resultType="com.jsh.erp.datasource.entities.MaterialAttribute">
+        select * from jsh_material_attribute ma
+        where 1=1
+        <if test="attributeName != null">
+            <bind name="bindAttributeName" value="'%'+attributeName+'%'"/>
+            and ma.attribute_name like #{bindAttributeName}
+        </if>
+        and ifnull(ma.delete_flag,'0') !='1'
+        order by ma.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="countsByMaterialAttribute" resultType="java.lang.Long">
+        SELECT count(ma.id) from jsh_material_attribute ma
+        where 1=1
+        <if test="attributeName != null">
+            <bind name="bindAttributeName" value="'%'+attributeName+'%'"/>
+            and ma.attribute_name like #{bindAttributeName}
+        </if>
+        and ifnull(ma.delete_flag,'0') !='1'
+    </select>
+
+    <update id="batchDeleteMaterialAttributeByIds">
+        update jsh_material_attribute
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialCategoryMapper.xml b/src/main/resources/mapper_xml/MaterialCategoryMapper.xml
new file mode 100644
index 0000000..bb20f73
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialCategoryMapper.xml
@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialCategoryMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.MaterialCategory">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="category_level" jdbcType="SMALLINT" property="categoryLevel" />
+    <result column="parent_id" jdbcType="BIGINT" property="parentId" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="serial_no" jdbcType="VARCHAR" property="serialNo" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, name, category_level, parent_id, sort, serial_no, remark, create_time, update_time, 
+    tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MaterialCategoryExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_material_category
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_material_category
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_material_category
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MaterialCategoryExample">
+    delete from jsh_material_category
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.MaterialCategory">
+    insert into jsh_material_category (id, name, category_level, 
+      parent_id, sort, serial_no, 
+      remark, create_time, update_time, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{categoryLevel,jdbcType=SMALLINT}, 
+      #{parentId,jdbcType=BIGINT}, #{sort,jdbcType=VARCHAR}, #{serialNo,jdbcType=VARCHAR}, 
+      #{remark,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.MaterialCategory">
+    insert into jsh_material_category
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="categoryLevel != null">
+        category_level,
+      </if>
+      <if test="parentId != null">
+        parent_id,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="serialNo != null">
+        serial_no,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="categoryLevel != null">
+        #{categoryLevel,jdbcType=SMALLINT},
+      </if>
+      <if test="parentId != null">
+        #{parentId,jdbcType=BIGINT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="serialNo != null">
+        #{serialNo,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MaterialCategoryExample" resultType="java.lang.Long">
+    select count(*) from jsh_material_category
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_material_category
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.categoryLevel != null">
+        category_level = #{record.categoryLevel,jdbcType=SMALLINT},
+      </if>
+      <if test="record.parentId != null">
+        parent_id = #{record.parentId,jdbcType=BIGINT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.serialNo != null">
+        serial_no = #{record.serialNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_material_category
+    set id = #{record.id,jdbcType=BIGINT},
+      name = #{record.name,jdbcType=VARCHAR},
+      category_level = #{record.categoryLevel,jdbcType=SMALLINT},
+      parent_id = #{record.parentId,jdbcType=BIGINT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      serial_no = #{record.serialNo,jdbcType=VARCHAR},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.MaterialCategory">
+    update jsh_material_category
+    <set>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="categoryLevel != null">
+        category_level = #{categoryLevel,jdbcType=SMALLINT},
+      </if>
+      <if test="parentId != null">
+        parent_id = #{parentId,jdbcType=BIGINT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="serialNo != null">
+        serial_no = #{serialNo,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.MaterialCategory">
+    update jsh_material_category
+    set name = #{name,jdbcType=VARCHAR},
+      category_level = #{categoryLevel,jdbcType=SMALLINT},
+      parent_id = #{parentId,jdbcType=BIGINT},
+      sort = #{sort,jdbcType=VARCHAR},
+      serial_no = #{serialNo,jdbcType=VARCHAR},
+      remark = #{remark,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialCategoryMapperEx.xml b/src/main/resources/mapper_xml/MaterialCategoryMapperEx.xml
new file mode 100644
index 0000000..a11cdef
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialCategoryMapperEx.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialCategoryMapperEx">
+    <select id="selectByConditionMaterialCategory" parameterType="com.jsh.erp.datasource.entities.MaterialCategoryExample" resultMap="com.jsh.erp.datasource.mappers.MaterialCategoryMapper.BaseResultMap">
+        select *
+        FROM jsh_material_category
+        where 1=1
+        and ifnull(delete_flag,'0') !='1'
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="parentId != null">
+            and parent_id = #{parentId}
+        </if>
+        and Id !=1
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByMaterialCategory" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_material_category
+        WHERE 1=1
+        and ifnull(delete_flag,'0') !='1'
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="parentId != null">
+            and parent_id = #{parentId}
+        </if>
+        and Id !=1
+    </select>
+
+    <resultMap id="BaseTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
+        <result column="id" property="id"/>
+        <result column="id" property="key"/>
+        <result column="id" property="value"/>
+        <result column="name" property="title"/>
+        <collection column="{currentId=currentId,id=id}" property="children" javaType="java.util.ArrayList"
+                    ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
+    </resultMap>
+
+    <resultMap id="NextTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
+        <result column="id" property="id"/>
+        <result column="id" property="key"/>
+        <result column="id" property="value"/>
+        <result column="name" property="title"/>
+        <collection column="{currentId=currentId,id=id}" property="children" javaType="java.util.ArrayList"
+                    ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
+    </resultMap>
+
+    <resultMap id="ResultCategoryMapList" type="com.jsh.erp.datasource.entities.MaterialCategory">
+        <result column="id" jdbcType="BIGINT" property="id" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id, name
+    </sql>
+
+    <select id="getNextNodeTree" resultMap="NextTreeResultMap">
+        SELECT
+        <include refid="Base_Column_List"/>,#{currentId} as currentId
+        FROM jsh_material_category
+        WHERE parent_id = #{id}
+        <if test="currentId != null">
+            and id !=#{currentId}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc
+    </select>
+
+    <select id="getNodeTree" resultMap="BaseTreeResultMap">
+        SELECT
+        <include refid="Base_Column_List"/>,#{currentId} as currentId
+        FROM jsh_material_category
+        WHERE parent_id is null
+        and ifnull(delete_flag,'0') !='1'
+        <if test="currentId != null">
+            and id !=#{currentId}
+        </if>
+        order by sort asc
+    </select>
+    <insert id="addMaterialCategory" parameterType="com.jsh.erp.datasource.entities.MaterialCategory"
+            useGeneratedKeys="true" keyProperty="id" keyColumn="id">
+       insert into jsh_material_category
+        (name, category_level, parent_id, sort,status,serial_no,remark,
+        create_time, update_time)
+        values
+        (#{name},#{categoryLevel},#{parentId},#{sort},#{status},#{serialNo},#{remark},
+        #{createTime},#{updateTime}
+        )
+    </insert>
+    <update id="batchDeleteMaterialCategoryByIds">
+       update jsh_material_category
+       set update_time=#{updateTime},delete_flag='1'
+       where id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+       )
+    </update>
+    <update id="editMaterialCategory">
+       update jsh_material_category
+       set update_time=#{updateTime},
+        parent_id=#{parentId},sort=#{sort},serial_no=#{serialNo},
+        name=#{name},remark=#{remark}
+       where id =#{id}
+    </update>
+    <select  id="getMaterialCategoryBySerialNo" resultMap="com.jsh.erp.datasource.mappers.MaterialCategoryMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.MaterialCategoryMapper.Base_Column_List"/>
+        FROM jsh_material_category
+        where 1=1
+        and serial_no=#{serialNo}
+        <if test="id != null">
+            and id!=#{id}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getMaterialCategoryListByCategoryIds"  resultMap="com.jsh.erp.datasource.mappers.MaterialCategoryMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.MaterialCategoryMapper.Base_Column_List" />
+        from jsh_material_category
+        where 1=1
+        and parent_id in (
+        <foreach collection="parentIds" item="parentId" separator=",">
+            #{parentId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getListByParentId" resultMap="ResultCategoryMapList">
+        SELECT id FROM jsh_material_category
+        where 1=1
+        <if test="parentId != null and parentId !=''">
+            and parent_id = #{parentId}
+        </if>
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialCurrentStockMapper.xml b/src/main/resources/mapper_xml/MaterialCurrentStockMapper.xml
new file mode 100644
index 0000000..ab99fa8
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialCurrentStockMapper.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialCurrentStockMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.MaterialCurrentStock">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="material_id" jdbcType="BIGINT" property="materialId" />
+    <result column="depot_id" jdbcType="BIGINT" property="depotId" />
+    <result column="current_number" jdbcType="DECIMAL" property="currentNumber" />
+    <result column="current_unit_price" jdbcType="DECIMAL" property="currentUnitPrice" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, material_id, depot_id, current_number, current_unit_price, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MaterialCurrentStockExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_material_current_stock
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_material_current_stock
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_material_current_stock
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MaterialCurrentStockExample">
+    delete from jsh_material_current_stock
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.MaterialCurrentStock">
+    insert into jsh_material_current_stock (id, material_id, depot_id, 
+      current_number, current_unit_price, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{materialId,jdbcType=BIGINT}, #{depotId,jdbcType=BIGINT}, 
+      #{currentNumber,jdbcType=DECIMAL}, #{currentUnitPrice,jdbcType=DECIMAL}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.MaterialCurrentStock">
+    insert into jsh_material_current_stock
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="materialId != null">
+        material_id,
+      </if>
+      <if test="depotId != null">
+        depot_id,
+      </if>
+      <if test="currentNumber != null">
+        current_number,
+      </if>
+      <if test="currentUnitPrice != null">
+        current_unit_price,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="materialId != null">
+        #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="depotId != null">
+        #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="currentNumber != null">
+        #{currentNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="currentUnitPrice != null">
+        #{currentUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MaterialCurrentStockExample" resultType="java.lang.Long">
+    select count(*) from jsh_material_current_stock
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_material_current_stock
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.materialId != null">
+        material_id = #{record.materialId,jdbcType=BIGINT},
+      </if>
+      <if test="record.depotId != null">
+        depot_id = #{record.depotId,jdbcType=BIGINT},
+      </if>
+      <if test="record.currentNumber != null">
+        current_number = #{record.currentNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="record.currentUnitPrice != null">
+        current_unit_price = #{record.currentUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_material_current_stock
+    set id = #{record.id,jdbcType=BIGINT},
+      material_id = #{record.materialId,jdbcType=BIGINT},
+      depot_id = #{record.depotId,jdbcType=BIGINT},
+      current_number = #{record.currentNumber,jdbcType=DECIMAL},
+      current_unit_price = #{record.currentUnitPrice,jdbcType=DECIMAL},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.MaterialCurrentStock">
+    update jsh_material_current_stock
+    <set>
+      <if test="materialId != null">
+        material_id = #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="depotId != null">
+        depot_id = #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="currentNumber != null">
+        current_number = #{currentNumber,jdbcType=DECIMAL},
+      </if>
+      <if test="currentUnitPrice != null">
+        current_unit_price = #{currentUnitPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.MaterialCurrentStock">
+    update jsh_material_current_stock
+    set material_id = #{materialId,jdbcType=BIGINT},
+      depot_id = #{depotId,jdbcType=BIGINT},
+      current_number = #{currentNumber,jdbcType=DECIMAL},
+      current_unit_price = #{currentUnitPrice,jdbcType=DECIMAL},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialCurrentStockMapperEx.xml b/src/main/resources/mapper_xml/MaterialCurrentStockMapperEx.xml
new file mode 100644
index 0000000..dce7163
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialCurrentStockMapperEx.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialCurrentStockMapperEx">
+
+    <insert id="batchInsert" parameterType="java.util.List">
+        insert into jsh_material_current_stock (material_id, depot_id, current_number)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.materialId,jdbcType=BIGINT}, #{item.depotId,jdbcType=BIGINT},#{item.currentNumber,jdbcType=DECIMAL})
+        </foreach >
+    </insert>
+
+    <select id="getCurrentStockMapByIdList" resultType="com.jsh.erp.datasource.entities.MaterialCurrentStock">
+        select material_id, sum(current_number) current_number from jsh_material_current_stock
+        where 1=1
+        and ifnull(delete_flag,'0') !='1'
+        and material_id in
+        <foreach collection="materialIdList" item="materialId" index="index" separator="," open="(" close=")">
+            #{materialId}
+        </foreach>
+        group by material_id
+    </select>
+
+    <update id="updateUnitPriceByMId">
+        update jsh_material_current_stock set current_unit_price = #{currentUnitPrice}
+        where material_id = #{materialId}
+        and ifnull(delete_flag,'0') !='1'
+    </update>
+
+    <select id="getCurrentUnitPriceByMId" resultType="java.math.BigDecimal">
+        select ifnull(mcs.current_unit_price,0) as current_unit_price from jsh_material_current_stock mcs where mcs.material_id=#{materialId} limit 1
+    </select>
+
+    <update id="batchDeleteByDepots">
+        update jsh_material_current_stock
+        set delete_flag='1'
+        where 1=1
+        and depot_id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialExtendMapper.xml b/src/main/resources/mapper_xml/MaterialExtendMapper.xml
new file mode 100644
index 0000000..cac381c
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialExtendMapper.xml
@@ -0,0 +1,386 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialExtendMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.MaterialExtend">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="material_id" jdbcType="BIGINT" property="materialId" />
+    <result column="bar_code" jdbcType="VARCHAR" property="barCode" />
+    <result column="commodity_unit" jdbcType="VARCHAR" property="commodityUnit" />
+    <result column="sku" jdbcType="VARCHAR" property="sku" />
+    <result column="purchase_decimal" jdbcType="DECIMAL" property="purchaseDecimal" />
+    <result column="commodity_decimal" jdbcType="DECIMAL" property="commodityDecimal" />
+    <result column="wholesale_decimal" jdbcType="DECIMAL" property="wholesaleDecimal" />
+    <result column="low_decimal" jdbcType="DECIMAL" property="lowDecimal" />
+    <result column="default_flag" jdbcType="VARCHAR" property="defaultFlag" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="create_serial" jdbcType="VARCHAR" property="createSerial" />
+    <result column="update_serial" jdbcType="VARCHAR" property="updateSerial" />
+    <result column="update_time" jdbcType="BIGINT" property="updateTime" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_Flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, material_id, bar_code, commodity_unit, sku, purchase_decimal, commodity_decimal, 
+    wholesale_decimal, low_decimal, default_flag, create_time, create_serial, update_serial, 
+    update_time, tenant_id, delete_Flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MaterialExtendExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_material_extend
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_material_extend
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_material_extend
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MaterialExtendExample">
+    delete from jsh_material_extend
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.MaterialExtend">
+    insert into jsh_material_extend (id, material_id, bar_code, 
+      commodity_unit, sku, purchase_decimal, 
+      commodity_decimal, wholesale_decimal, low_decimal, 
+      default_flag, create_time, create_serial, 
+      update_serial, update_time, tenant_id, 
+      delete_Flag)
+    values (#{id,jdbcType=BIGINT}, #{materialId,jdbcType=BIGINT}, #{barCode,jdbcType=VARCHAR}, 
+      #{commodityUnit,jdbcType=VARCHAR}, #{sku,jdbcType=VARCHAR}, #{purchaseDecimal,jdbcType=DECIMAL}, 
+      #{commodityDecimal,jdbcType=DECIMAL}, #{wholesaleDecimal,jdbcType=DECIMAL}, #{lowDecimal,jdbcType=DECIMAL}, 
+      #{defaultFlag,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{createSerial,jdbcType=VARCHAR}, 
+      #{updateSerial,jdbcType=VARCHAR}, #{updateTime,jdbcType=BIGINT}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.MaterialExtend">
+    insert into jsh_material_extend
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="materialId != null">
+        material_id,
+      </if>
+      <if test="barCode != null">
+        bar_code,
+      </if>
+      <if test="commodityUnit != null">
+        commodity_unit,
+      </if>
+      <if test="sku != null">
+        sku,
+      </if>
+      <if test="purchaseDecimal != null">
+        purchase_decimal,
+      </if>
+      <if test="commodityDecimal != null">
+        commodity_decimal,
+      </if>
+      <if test="wholesaleDecimal != null">
+        wholesale_decimal,
+      </if>
+      <if test="lowDecimal != null">
+        low_decimal,
+      </if>
+      <if test="defaultFlag != null">
+        default_flag,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="createSerial != null">
+        create_serial,
+      </if>
+      <if test="updateSerial != null">
+        update_serial,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_Flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="materialId != null">
+        #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="barCode != null">
+        #{barCode,jdbcType=VARCHAR},
+      </if>
+      <if test="commodityUnit != null">
+        #{commodityUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="sku != null">
+        #{sku,jdbcType=VARCHAR},
+      </if>
+      <if test="purchaseDecimal != null">
+        #{purchaseDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="commodityDecimal != null">
+        #{commodityDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="wholesaleDecimal != null">
+        #{wholesaleDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="lowDecimal != null">
+        #{lowDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="defaultFlag != null">
+        #{defaultFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createSerial != null">
+        #{createSerial,jdbcType=VARCHAR},
+      </if>
+      <if test="updateSerial != null">
+        #{updateSerial,jdbcType=VARCHAR},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MaterialExtendExample" resultType="java.lang.Long">
+    select count(*) from jsh_material_extend
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_material_extend
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.materialId != null">
+        material_id = #{record.materialId,jdbcType=BIGINT},
+      </if>
+      <if test="record.barCode != null">
+        bar_code = #{record.barCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.commodityUnit != null">
+        commodity_unit = #{record.commodityUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sku != null">
+        sku = #{record.sku,jdbcType=VARCHAR},
+      </if>
+      <if test="record.purchaseDecimal != null">
+        purchase_decimal = #{record.purchaseDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="record.commodityDecimal != null">
+        commodity_decimal = #{record.commodityDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="record.wholesaleDecimal != null">
+        wholesale_decimal = #{record.wholesaleDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="record.lowDecimal != null">
+        low_decimal = #{record.lowDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="record.defaultFlag != null">
+        default_flag = #{record.defaultFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.createSerial != null">
+        create_serial = #{record.createSerial,jdbcType=VARCHAR},
+      </if>
+      <if test="record.updateSerial != null">
+        update_serial = #{record.updateSerial,jdbcType=VARCHAR},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=BIGINT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_Flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_material_extend
+    set id = #{record.id,jdbcType=BIGINT},
+      material_id = #{record.materialId,jdbcType=BIGINT},
+      bar_code = #{record.barCode,jdbcType=VARCHAR},
+      commodity_unit = #{record.commodityUnit,jdbcType=VARCHAR},
+      sku = #{record.sku,jdbcType=VARCHAR},
+      purchase_decimal = #{record.purchaseDecimal,jdbcType=DECIMAL},
+      commodity_decimal = #{record.commodityDecimal,jdbcType=DECIMAL},
+      wholesale_decimal = #{record.wholesaleDecimal,jdbcType=DECIMAL},
+      low_decimal = #{record.lowDecimal,jdbcType=DECIMAL},
+      default_flag = #{record.defaultFlag,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      create_serial = #{record.createSerial,jdbcType=VARCHAR},
+      update_serial = #{record.updateSerial,jdbcType=VARCHAR},
+      update_time = #{record.updateTime,jdbcType=BIGINT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_Flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.MaterialExtend">
+    update jsh_material_extend
+    <set>
+      <if test="materialId != null">
+        material_id = #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="barCode != null">
+        bar_code = #{barCode,jdbcType=VARCHAR},
+      </if>
+      <if test="commodityUnit != null">
+        commodity_unit = #{commodityUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="sku != null">
+        sku = #{sku,jdbcType=VARCHAR},
+      </if>
+      <if test="purchaseDecimal != null">
+        purchase_decimal = #{purchaseDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="commodityDecimal != null">
+        commodity_decimal = #{commodityDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="wholesaleDecimal != null">
+        wholesale_decimal = #{wholesaleDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="lowDecimal != null">
+        low_decimal = #{lowDecimal,jdbcType=DECIMAL},
+      </if>
+      <if test="defaultFlag != null">
+        default_flag = #{defaultFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createSerial != null">
+        create_serial = #{createSerial,jdbcType=VARCHAR},
+      </if>
+      <if test="updateSerial != null">
+        update_serial = #{updateSerial,jdbcType=VARCHAR},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_Flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.MaterialExtend">
+    update jsh_material_extend
+    set material_id = #{materialId,jdbcType=BIGINT},
+      bar_code = #{barCode,jdbcType=VARCHAR},
+      commodity_unit = #{commodityUnit,jdbcType=VARCHAR},
+      sku = #{sku,jdbcType=VARCHAR},
+      purchase_decimal = #{purchaseDecimal,jdbcType=DECIMAL},
+      commodity_decimal = #{commodityDecimal,jdbcType=DECIMAL},
+      wholesale_decimal = #{wholesaleDecimal,jdbcType=DECIMAL},
+      low_decimal = #{lowDecimal,jdbcType=DECIMAL},
+      default_flag = #{defaultFlag,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      create_serial = #{createSerial,jdbcType=VARCHAR},
+      update_serial = #{updateSerial,jdbcType=VARCHAR},
+      update_time = #{updateTime,jdbcType=BIGINT},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_Flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialExtendMapperEx.xml b/src/main/resources/mapper_xml/MaterialExtendMapperEx.xml
new file mode 100644
index 0000000..b1be40e
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialExtendMapperEx.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialExtendMapperEx" >
+    <resultMap extends="com.jsh.erp.datasource.mappers.MaterialExtendMapper.BaseResultMap" id="ResultMapList" type="com.jsh.erp.datasource.vo.MaterialExtendVo4List">
+
+    </resultMap>
+
+    <select id="getDetailList" parameterType="com.jsh.erp.datasource.entities.MaterialExtendExample" resultMap="ResultMapList">
+        select DISTINCT d.Id,d.bar_code,d.commodity_unit,d.sku,d.commodity_decimal,d.purchase_decimal,d.wholesale_decimal,d.low_decimal
+        from jsh_material_extend d
+        where d.material_id = #{materialId}
+        and ifnull(d.delete_Flag,'0') !='1'
+        order by d.default_flag desc,d.id asc
+    </select>
+
+    <select id="getMaxTimeByTenantAndTime" resultType="java.lang.Long">
+        select max(update_time) from
+        (
+        select update_time from jsh_material_extend
+        where 1=1
+        <if test="lastTime != null">
+            and update_time > #{lastTime}
+        </if>
+        order by update_time asc
+        <if test="syncNum != null">
+            limit 0,#{syncNum}
+        </if>
+        ) time_list
+    </select>
+
+    <select id="getListByMId" resultType="com.jsh.erp.datasource.entities.MaterialExtend">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.MaterialExtendMapper.Base_Column_List" />
+        from jsh_material_extend
+        where 1=1
+        and ifnull(delete_Flag,'0') !='1'
+        and material_id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+        group by material_id
+    </select>
+
+    <update id="batchDeleteMaterialExtendByIds">
+        update jsh_material_extend
+        set delete_Flag='1'
+        where 1=1
+        and ifnull(delete_Flag,'0') !='1'
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <update id="batchDeleteMaterialExtendByMIds">
+        update jsh_material_extend
+        set delete_Flag='1'
+        where 1=1
+        and ifnull(delete_Flag,'0') !='1'
+        and material_id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <update id="specialUpdatePrice" parameterType="com.jsh.erp.datasource.entities.MaterialExtend">
+        update jsh_material_extend
+        set purchase_decimal = #{purchaseDecimal,jdbcType=DECIMAL},
+            commodity_decimal = #{commodityDecimal,jdbcType=DECIMAL},
+            wholesale_decimal = #{wholesaleDecimal,jdbcType=DECIMAL},
+            low_decimal = #{lowDecimal,jdbcType=DECIMAL}
+        where id = #{id,jdbcType=BIGINT}
+        and ifnull(delete_flag,'0') !='1'
+    </update>
+
+    <select id="getBasicInfoByMid" resultType="com.jsh.erp.datasource.entities.MaterialExtend">
+        select * from jsh_material_extend
+        where material_id=#{materialId} and default_flag='1'
+        and ifnull(delete_Flag,'0') !='1'
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialInitialStockMapper.xml b/src/main/resources/mapper_xml/MaterialInitialStockMapper.xml
new file mode 100644
index 0000000..ea715db
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialInitialStockMapper.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialInitialStockMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.MaterialInitialStock">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="material_id" jdbcType="BIGINT" property="materialId" />
+    <result column="depot_id" jdbcType="BIGINT" property="depotId" />
+    <result column="number" jdbcType="DECIMAL" property="number" />
+    <result column="low_safe_stock" jdbcType="DECIMAL" property="lowSafeStock" />
+    <result column="high_safe_stock" jdbcType="DECIMAL" property="highSafeStock" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, material_id, depot_id, number, low_safe_stock, high_safe_stock, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MaterialInitialStockExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_material_initial_stock
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_material_initial_stock
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_material_initial_stock
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MaterialInitialStockExample">
+    delete from jsh_material_initial_stock
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.MaterialInitialStock">
+    insert into jsh_material_initial_stock (id, material_id, depot_id, 
+      number, low_safe_stock, high_safe_stock, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{materialId,jdbcType=BIGINT}, #{depotId,jdbcType=BIGINT}, 
+      #{number,jdbcType=DECIMAL}, #{lowSafeStock,jdbcType=DECIMAL}, #{highSafeStock,jdbcType=DECIMAL}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.MaterialInitialStock">
+    insert into jsh_material_initial_stock
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="materialId != null">
+        material_id,
+      </if>
+      <if test="depotId != null">
+        depot_id,
+      </if>
+      <if test="number != null">
+        number,
+      </if>
+      <if test="lowSafeStock != null">
+        low_safe_stock,
+      </if>
+      <if test="highSafeStock != null">
+        high_safe_stock,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="materialId != null">
+        #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="depotId != null">
+        #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="number != null">
+        #{number,jdbcType=DECIMAL},
+      </if>
+      <if test="lowSafeStock != null">
+        #{lowSafeStock,jdbcType=DECIMAL},
+      </if>
+      <if test="highSafeStock != null">
+        #{highSafeStock,jdbcType=DECIMAL},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MaterialInitialStockExample" resultType="java.lang.Long">
+    select count(*) from jsh_material_initial_stock
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_material_initial_stock
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.materialId != null">
+        material_id = #{record.materialId,jdbcType=BIGINT},
+      </if>
+      <if test="record.depotId != null">
+        depot_id = #{record.depotId,jdbcType=BIGINT},
+      </if>
+      <if test="record.number != null">
+        number = #{record.number,jdbcType=DECIMAL},
+      </if>
+      <if test="record.lowSafeStock != null">
+        low_safe_stock = #{record.lowSafeStock,jdbcType=DECIMAL},
+      </if>
+      <if test="record.highSafeStock != null">
+        high_safe_stock = #{record.highSafeStock,jdbcType=DECIMAL},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_material_initial_stock
+    set id = #{record.id,jdbcType=BIGINT},
+      material_id = #{record.materialId,jdbcType=BIGINT},
+      depot_id = #{record.depotId,jdbcType=BIGINT},
+      number = #{record.number,jdbcType=DECIMAL},
+      low_safe_stock = #{record.lowSafeStock,jdbcType=DECIMAL},
+      high_safe_stock = #{record.highSafeStock,jdbcType=DECIMAL},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.MaterialInitialStock">
+    update jsh_material_initial_stock
+    <set>
+      <if test="materialId != null">
+        material_id = #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="depotId != null">
+        depot_id = #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="number != null">
+        number = #{number,jdbcType=DECIMAL},
+      </if>
+      <if test="lowSafeStock != null">
+        low_safe_stock = #{lowSafeStock,jdbcType=DECIMAL},
+      </if>
+      <if test="highSafeStock != null">
+        high_safe_stock = #{highSafeStock,jdbcType=DECIMAL},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.MaterialInitialStock">
+    update jsh_material_initial_stock
+    set material_id = #{materialId,jdbcType=BIGINT},
+      depot_id = #{depotId,jdbcType=BIGINT},
+      number = #{number,jdbcType=DECIMAL},
+      low_safe_stock = #{lowSafeStock,jdbcType=DECIMAL},
+      high_safe_stock = #{highSafeStock,jdbcType=DECIMAL},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialInitialStockMapperEx.xml b/src/main/resources/mapper_xml/MaterialInitialStockMapperEx.xml
new file mode 100644
index 0000000..c96eb35
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialInitialStockMapperEx.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialInitialStockMapperEx">
+
+  <insert id="batchInsert" parameterType="java.util.List">
+      insert into jsh_material_initial_stock (material_id, depot_id, number)
+      values
+      <foreach collection="list" item="item" separator=",">
+        (#{item.materialId,jdbcType=BIGINT}, #{item.depotId,jdbcType=BIGINT},#{item.number,jdbcType=DECIMAL})
+      </foreach >
+  </insert>
+
+
+  <select id="getInitialStockMapByIdList" resultType="com.jsh.erp.datasource.entities.MaterialInitialStock">
+      select material_id, sum(number) number from jsh_material_initial_stock
+      where 1=1
+      and ifnull(delete_flag,'0') !='1'
+      and material_id in
+      <foreach collection="materialIdList" item="materialId" index="index" separator="," open="(" close=")">
+          #{materialId}
+      </foreach>
+      group by material_id
+  </select>
+
+  <select id="getListExceptZero" resultType="com.jsh.erp.datasource.entities.MaterialInitialStock">
+      select * from jsh_material_initial_stock where number!=0
+      and ifnull(delete_flag,'0') !='1'
+  </select>
+
+  <update id="batchDeleteByDepots">
+      update jsh_material_initial_stock
+      set delete_flag='1'
+      where 1=1
+      and depot_id in (
+      <foreach collection="ids" item="id" separator=",">
+        #{id}
+      </foreach>
+      )
+  </update>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialMapper.xml b/src/main/resources/mapper_xml/MaterialMapper.xml
new file mode 100644
index 0000000..7befbf0
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialMapper.xml
@@ -0,0 +1,512 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Material">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="category_id" jdbcType="BIGINT" property="categoryId" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="mfrs" jdbcType="VARCHAR" property="mfrs" />
+    <result column="model" jdbcType="VARCHAR" property="model" />
+    <result column="standard" jdbcType="VARCHAR" property="standard" />
+    <result column="brand" jdbcType="VARCHAR" property="brand" />
+    <result column="mnemonic" jdbcType="VARCHAR" property="mnemonic" />
+    <result column="color" jdbcType="VARCHAR" property="color" />
+    <result column="unit" jdbcType="VARCHAR" property="unit" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="img_name" jdbcType="VARCHAR" property="imgName" />
+    <result column="unit_id" jdbcType="BIGINT" property="unitId" />
+    <result column="expiry_num" jdbcType="INTEGER" property="expiryNum" />
+    <result column="weight" jdbcType="DECIMAL" property="weight" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="other_field1" jdbcType="VARCHAR" property="otherField1" />
+    <result column="other_field2" jdbcType="VARCHAR" property="otherField2" />
+    <result column="other_field3" jdbcType="VARCHAR" property="otherField3" />
+    <result column="enable_serial_number" jdbcType="VARCHAR" property="enableSerialNumber" />
+    <result column="enable_batch_number" jdbcType="VARCHAR" property="enableBatchNumber" />
+    <result column="position" jdbcType="VARCHAR" property="position" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, category_id, name, mfrs, model, standard, brand, mnemonic, color, unit, remark, 
+    img_name, unit_id, expiry_num, weight, enabled, other_field1, other_field2, other_field3, 
+    enable_serial_number, enable_batch_number, position, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_material
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_material
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_material
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MaterialExample">
+    delete from jsh_material
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Material">
+    insert into jsh_material (id, category_id, name, 
+      mfrs, model, standard, 
+      brand, mnemonic, color, 
+      unit, remark, img_name, 
+      unit_id, expiry_num, weight, 
+      enabled, other_field1, other_field2, 
+      other_field3, enable_serial_number, enable_batch_number, 
+      position, tenant_id, delete_flag
+      )
+    values (#{id,jdbcType=BIGINT}, #{categoryId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, 
+      #{mfrs,jdbcType=VARCHAR}, #{model,jdbcType=VARCHAR}, #{standard,jdbcType=VARCHAR}, 
+      #{brand,jdbcType=VARCHAR}, #{mnemonic,jdbcType=VARCHAR}, #{color,jdbcType=VARCHAR}, 
+      #{unit,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{imgName,jdbcType=VARCHAR}, 
+      #{unitId,jdbcType=BIGINT}, #{expiryNum,jdbcType=INTEGER}, #{weight,jdbcType=DECIMAL}, 
+      #{enabled,jdbcType=BIT}, #{otherField1,jdbcType=VARCHAR}, #{otherField2,jdbcType=VARCHAR}, 
+      #{otherField3,jdbcType=VARCHAR}, #{enableSerialNumber,jdbcType=VARCHAR}, #{enableBatchNumber,jdbcType=VARCHAR}, 
+      #{position,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Material">
+    insert into jsh_material
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="categoryId != null">
+        category_id,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="mfrs != null">
+        mfrs,
+      </if>
+      <if test="model != null">
+        model,
+      </if>
+      <if test="standard != null">
+        standard,
+      </if>
+      <if test="brand != null">
+        brand,
+      </if>
+      <if test="mnemonic != null">
+        mnemonic,
+      </if>
+      <if test="color != null">
+        color,
+      </if>
+      <if test="unit != null">
+        unit,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="imgName != null">
+        img_name,
+      </if>
+      <if test="unitId != null">
+        unit_id,
+      </if>
+      <if test="expiryNum != null">
+        expiry_num,
+      </if>
+      <if test="weight != null">
+        weight,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="otherField1 != null">
+        other_field1,
+      </if>
+      <if test="otherField2 != null">
+        other_field2,
+      </if>
+      <if test="otherField3 != null">
+        other_field3,
+      </if>
+      <if test="enableSerialNumber != null">
+        enable_serial_number,
+      </if>
+      <if test="enableBatchNumber != null">
+        enable_batch_number,
+      </if>
+      <if test="position != null">
+        position,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="categoryId != null">
+        #{categoryId,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="mfrs != null">
+        #{mfrs,jdbcType=VARCHAR},
+      </if>
+      <if test="model != null">
+        #{model,jdbcType=VARCHAR},
+      </if>
+      <if test="standard != null">
+        #{standard,jdbcType=VARCHAR},
+      </if>
+      <if test="brand != null">
+        #{brand,jdbcType=VARCHAR},
+      </if>
+      <if test="mnemonic != null">
+        #{mnemonic,jdbcType=VARCHAR},
+      </if>
+      <if test="color != null">
+        #{color,jdbcType=VARCHAR},
+      </if>
+      <if test="unit != null">
+        #{unit,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="imgName != null">
+        #{imgName,jdbcType=VARCHAR},
+      </if>
+      <if test="unitId != null">
+        #{unitId,jdbcType=BIGINT},
+      </if>
+      <if test="expiryNum != null">
+        #{expiryNum,jdbcType=INTEGER},
+      </if>
+      <if test="weight != null">
+        #{weight,jdbcType=DECIMAL},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="otherField1 != null">
+        #{otherField1,jdbcType=VARCHAR},
+      </if>
+      <if test="otherField2 != null">
+        #{otherField2,jdbcType=VARCHAR},
+      </if>
+      <if test="otherField3 != null">
+        #{otherField3,jdbcType=VARCHAR},
+      </if>
+      <if test="enableSerialNumber != null">
+        #{enableSerialNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="enableBatchNumber != null">
+        #{enableBatchNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="position != null">
+        #{position,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultType="java.lang.Long">
+    select count(*) from jsh_material
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_material
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.categoryId != null">
+        category_id = #{record.categoryId,jdbcType=BIGINT},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.mfrs != null">
+        mfrs = #{record.mfrs,jdbcType=VARCHAR},
+      </if>
+      <if test="record.model != null">
+        model = #{record.model,jdbcType=VARCHAR},
+      </if>
+      <if test="record.standard != null">
+        standard = #{record.standard,jdbcType=VARCHAR},
+      </if>
+      <if test="record.brand != null">
+        brand = #{record.brand,jdbcType=VARCHAR},
+      </if>
+      <if test="record.mnemonic != null">
+        mnemonic = #{record.mnemonic,jdbcType=VARCHAR},
+      </if>
+      <if test="record.color != null">
+        color = #{record.color,jdbcType=VARCHAR},
+      </if>
+      <if test="record.unit != null">
+        unit = #{record.unit,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.imgName != null">
+        img_name = #{record.imgName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.unitId != null">
+        unit_id = #{record.unitId,jdbcType=BIGINT},
+      </if>
+      <if test="record.expiryNum != null">
+        expiry_num = #{record.expiryNum,jdbcType=INTEGER},
+      </if>
+      <if test="record.weight != null">
+        weight = #{record.weight,jdbcType=DECIMAL},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.otherField1 != null">
+        other_field1 = #{record.otherField1,jdbcType=VARCHAR},
+      </if>
+      <if test="record.otherField2 != null">
+        other_field2 = #{record.otherField2,jdbcType=VARCHAR},
+      </if>
+      <if test="record.otherField3 != null">
+        other_field3 = #{record.otherField3,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enableSerialNumber != null">
+        enable_serial_number = #{record.enableSerialNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enableBatchNumber != null">
+        enable_batch_number = #{record.enableBatchNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.position != null">
+        position = #{record.position,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_material
+    set id = #{record.id,jdbcType=BIGINT},
+      category_id = #{record.categoryId,jdbcType=BIGINT},
+      name = #{record.name,jdbcType=VARCHAR},
+      mfrs = #{record.mfrs,jdbcType=VARCHAR},
+      model = #{record.model,jdbcType=VARCHAR},
+      standard = #{record.standard,jdbcType=VARCHAR},
+      brand = #{record.brand,jdbcType=VARCHAR},
+      mnemonic = #{record.mnemonic,jdbcType=VARCHAR},
+      color = #{record.color,jdbcType=VARCHAR},
+      unit = #{record.unit,jdbcType=VARCHAR},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      img_name = #{record.imgName,jdbcType=VARCHAR},
+      unit_id = #{record.unitId,jdbcType=BIGINT},
+      expiry_num = #{record.expiryNum,jdbcType=INTEGER},
+      weight = #{record.weight,jdbcType=DECIMAL},
+      enabled = #{record.enabled,jdbcType=BIT},
+      other_field1 = #{record.otherField1,jdbcType=VARCHAR},
+      other_field2 = #{record.otherField2,jdbcType=VARCHAR},
+      other_field3 = #{record.otherField3,jdbcType=VARCHAR},
+      enable_serial_number = #{record.enableSerialNumber,jdbcType=VARCHAR},
+      enable_batch_number = #{record.enableBatchNumber,jdbcType=VARCHAR},
+      position = #{record.position,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Material">
+    update jsh_material
+    <set>
+      <if test="categoryId != null">
+        category_id = #{categoryId,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="mfrs != null">
+        mfrs = #{mfrs,jdbcType=VARCHAR},
+      </if>
+      <if test="model != null">
+        model = #{model,jdbcType=VARCHAR},
+      </if>
+      <if test="standard != null">
+        standard = #{standard,jdbcType=VARCHAR},
+      </if>
+      <if test="brand != null">
+        brand = #{brand,jdbcType=VARCHAR},
+      </if>
+      <if test="mnemonic != null">
+        mnemonic = #{mnemonic,jdbcType=VARCHAR},
+      </if>
+      <if test="color != null">
+        color = #{color,jdbcType=VARCHAR},
+      </if>
+      <if test="unit != null">
+        unit = #{unit,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="imgName != null">
+        img_name = #{imgName,jdbcType=VARCHAR},
+      </if>
+      <if test="unitId != null">
+        unit_id = #{unitId,jdbcType=BIGINT},
+      </if>
+      <if test="expiryNum != null">
+        expiry_num = #{expiryNum,jdbcType=INTEGER},
+      </if>
+      <if test="weight != null">
+        weight = #{weight,jdbcType=DECIMAL},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="otherField1 != null">
+        other_field1 = #{otherField1,jdbcType=VARCHAR},
+      </if>
+      <if test="otherField2 != null">
+        other_field2 = #{otherField2,jdbcType=VARCHAR},
+      </if>
+      <if test="otherField3 != null">
+        other_field3 = #{otherField3,jdbcType=VARCHAR},
+      </if>
+      <if test="enableSerialNumber != null">
+        enable_serial_number = #{enableSerialNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="enableBatchNumber != null">
+        enable_batch_number = #{enableBatchNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="position != null">
+        position = #{position,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Material">
+    update jsh_material
+    set category_id = #{categoryId,jdbcType=BIGINT},
+      name = #{name,jdbcType=VARCHAR},
+      mfrs = #{mfrs,jdbcType=VARCHAR},
+      model = #{model,jdbcType=VARCHAR},
+      standard = #{standard,jdbcType=VARCHAR},
+      brand = #{brand,jdbcType=VARCHAR},
+      mnemonic = #{mnemonic,jdbcType=VARCHAR},
+      color = #{color,jdbcType=VARCHAR},
+      unit = #{unit,jdbcType=VARCHAR},
+      remark = #{remark,jdbcType=VARCHAR},
+      img_name = #{imgName,jdbcType=VARCHAR},
+      unit_id = #{unitId,jdbcType=BIGINT},
+      expiry_num = #{expiryNum,jdbcType=INTEGER},
+      weight = #{weight,jdbcType=DECIMAL},
+      enabled = #{enabled,jdbcType=BIT},
+      other_field1 = #{otherField1,jdbcType=VARCHAR},
+      other_field2 = #{otherField2,jdbcType=VARCHAR},
+      other_field3 = #{otherField3,jdbcType=VARCHAR},
+      enable_serial_number = #{enableSerialNumber,jdbcType=VARCHAR},
+      enable_batch_number = #{enableBatchNumber,jdbcType=VARCHAR},
+      position = #{position,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialMapperEx.xml b/src/main/resources/mapper_xml/MaterialMapperEx.xml
new file mode 100644
index 0000000..acf70c3
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialMapperEx.xml
@@ -0,0 +1,862 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.MaterialMapper.BaseResultMap" id="ResultMapList" type="com.jsh.erp.datasource.entities.MaterialVo4Unit">
+        <result column="unitName" jdbcType="VARCHAR" property="unitName" />
+        <result column="ratio" jdbcType="DECIMAL" property="ratio" />
+        <result column="categoryName" jdbcType="VARCHAR" property="categoryName" />
+        <result column="bar_code" jdbcType="VARCHAR" property="mBarCode" />
+        <result column="commodity_unit" jdbcType="VARCHAR" property="commodityUnit" />
+        <result column="purchase_decimal" jdbcType="VARCHAR" property="purchaseDecimal" />
+        <result column="commodity_decimal" jdbcType="VARCHAR" property="commodityDecimal" />
+        <result column="wholesale_decimal" jdbcType="VARCHAR" property="wholesaleDecimal" />
+        <result column="low_decimal" jdbcType="VARCHAR" property="lowDecimal" />
+        <result column="sku" jdbcType="VARCHAR" property="sku" />
+    </resultMap>
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.MaterialMapper.BaseResultMap" id="ResultMapListWithStock" type="com.jsh.erp.datasource.entities.MaterialVo4Unit">
+        <result column="unitName" jdbcType="VARCHAR" property="unitName" />
+        <result column="categoryName" jdbcType="VARCHAR" property="categoryName" />
+        <result column="mBarCode" jdbcType="VARCHAR" property="mBarCode" />
+        <result column="purchaseDecimal" jdbcType="VARCHAR" property="purchaseDecimal" />
+        <result column="currentUnitPrice" jdbcType="VARCHAR" property="currentUnitPrice" />
+        <result column="initialStock" jdbcType="DECIMAL" property="initialStock" />
+        <result column="currentStock" jdbcType="DECIMAL" property="currentStock" />
+        <result column="currentStockPrice" jdbcType="DECIMAL" property="currentStockPrice" />
+        <result column="currentStockMovePrice" jdbcType="DECIMAL" property="currentStockMovePrice" />
+        <result column="currentWeight" jdbcType="DECIMAL" property="currentWeight" />
+    </resultMap>
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.MaterialMapper.BaseResultMap" id="ResultAndUnitMap" type="com.jsh.erp.datasource.entities.MaterialVo4Unit">
+        <result column="meId" jdbcType="BIGINT" property="meId" />
+        <result column="unit_name" jdbcType="VARCHAR" property="unitName" />
+        <result column="sku" jdbcType="VARCHAR" property="sku" />
+    </resultMap>
+
+    <resultMap id="InitialStockWithMaterialMap" type="com.jsh.erp.datasource.entities.MaterialInitialStockWithMaterial">
+        <result column="material_id" jdbcType="BIGINT" property="materialId" />
+        <result column="number" jdbcType="DECIMAL" property="number" />
+    </resultMap>
+
+    <select id="selectByConditionMaterial" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultMapList">
+        select m.*,u.name unitName, mc.name categoryName, me.bar_code,
+        me.purchase_decimal, me.commodity_decimal, me.wholesale_decimal,me.low_decimal,me.sku
+        FROM jsh_material m
+        left JOIN jsh_material_extend me on m.id = me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left JOIN jsh_unit u on m.unit_id = u.id and ifnull(u.delete_Flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
+            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} or m.mfrs like #{bindKey})
+        </if>
+        <if test="standard != null and standard !=''">
+            <bind name="bindStandard" value="'%'+standard+'%'"/>
+            and m.standard like #{bindStandard}
+        </if>
+        <if test="model != null and model !=''">
+            <bind name="bindModel" value="'%'+model+'%'"/>
+            and m.model like #{bindModel}
+        </if>
+        <if test="color != null and color !=''">
+            <bind name="bindColor" value="'%'+color+'%'"/>
+            and m.color like #{bindColor}
+        </if>
+        <if test="brand != null and brand !=''">
+            <bind name="bindBrand" value="'%'+brand+'%'"/>
+            and m.brand like #{bindBrand}
+        </if>
+        <if test="mfrs != null and mfrs !=''">
+            <bind name="bindMfrs" value="'%'+mfrs+'%'"/>
+            and m.mfrs like #{bindMfrs}
+        </if>
+        <if test="materialOther != null and materialOther !=''">
+            <bind name="bindOther" value="'%'+materialOther+'%'"/>
+            and (m.other_field1 like #{bindOther} or m.other_field2 like #{bindOther} or m.other_field3 like #{bindOther})
+        </if>
+        <if test="weight != null and weight !=''">
+            and m.weight = #{weight}
+        </if>
+        <if test="expiryNum != null and expiryNum !=''">
+            and m.expiry_num = #{expiryNum}
+        </if>
+        <if test="enableSerialNumber != null and enableSerialNumber !=''">
+            and m.enable_serial_number = #{enableSerialNumber}
+        </if>
+        <if test="enableBatchNumber != null and enableBatchNumber !=''">
+            and m.enable_batch_number = #{enableBatchNumber}
+        </if>
+        <if test="position != null and position !=''">
+            <bind name="bindPosition" value="'%'+position+'%'"/>
+            and m.position like #{bindPosition}
+        </if>
+        <if test="enabled != null and enabled !=''">
+            and m.enabled = #{enabled}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and m.remark like #{bindRemark}
+        </if>
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        group by m.id
+        order by m.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="countsByMaterial" resultType="java.lang.Long">
+        SELECT
+        COUNT(m.id)
+        FROM jsh_material m
+        left JOIN jsh_material_extend me on m.id = me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left JOIN jsh_unit u on m.unit_id = u.id and ifnull(u.delete_Flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        WHERE 1=1
+        and me.default_flag=1
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
+            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} or m.mfrs like #{bindKey})
+        </if>
+        <if test="standard != null and standard !=''">
+            <bind name="bindStandard" value="'%'+standard+'%'"/>
+            and m.standard like #{bindStandard}
+        </if>
+        <if test="model != null and model !=''">
+            <bind name="bindModel" value="'%'+model+'%'"/>
+            and m.model like #{bindModel}
+        </if>
+        <if test="color != null and color !=''">
+            <bind name="bindColor" value="'%'+color+'%'"/>
+            and m.color like #{bindColor}
+        </if>
+        <if test="brand != null and brand !=''">
+            <bind name="bindBrand" value="'%'+brand+'%'"/>
+            and m.brand like #{bindBrand}
+        </if>
+        <if test="mfrs != null and mfrs !=''">
+            <bind name="bindMfrs" value="'%'+mfrs+'%'"/>
+            and m.mfrs like #{bindMfrs}
+        </if>
+        <if test="materialOther != null and materialOther !=''">
+            <bind name="bindOther" value="'%'+materialOther+'%'"/>
+            and (m.other_field1 like #{bindOther} or m.other_field2 like #{bindOther} or m.other_field3 like #{bindOther})
+        </if>
+        <if test="weight != null and weight !=''">
+            and m.weight = #{weight}
+        </if>
+        <if test="expiryNum != null and expiryNum !=''">
+            and m.expiry_num = #{expiryNum}
+        </if>
+        <if test="enableSerialNumber != null and enableSerialNumber !=''">
+            and m.enable_serial_number = #{enableSerialNumber}
+        </if>
+        <if test="enableBatchNumber != null and enableBatchNumber !=''">
+            and m.enable_batch_number = #{enableBatchNumber}
+        </if>
+        <if test="position != null and position !=''">
+            <bind name="bindPosition" value="'%'+position+'%'"/>
+            and m.position like #{bindPosition}
+        </if>
+        <if test="enabled != null and enabled !=''">
+            and m.enabled = #{enabled}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and m.remark like #{bindRemark}
+        </if>
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <insert id="insertSelectiveEx" parameterType="com.jsh.erp.datasource.entities.Material" useGeneratedKeys="true" keyProperty="id">
+        insert into jsh_material
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">
+                id,
+            </if>
+            <if test="categoryId != null">
+                category_id,
+            </if>
+            <if test="name != null">
+                name,
+            </if>
+            <if test="mfrs != null">
+                mfrs,
+            </if>
+            <if test="model != null">
+                model,
+            </if>
+            <if test="standard != null">
+                standard,
+            </if>
+            <if test="brand != null">
+                brand,
+            </if>
+            <if test="mnemonic != null">
+                mnemonic,
+            </if>
+            <if test="color != null">
+                color,
+            </if>
+            <if test="unit != null">
+                unit,
+            </if>
+            <if test="remark != null">
+                remark,
+            </if>
+            <if test="imgName != null">
+                img_name,
+            </if>
+            <if test="unitId != null">
+                unit_id,
+            </if>
+            <if test="expiryNum != null">
+                expiry_num,
+            </if>
+            <if test="weight != null">
+                weight,
+            </if>
+            <if test="enabled != null">
+                enabled,
+            </if>
+            <if test="otherField1 != null">
+                other_field1,
+            </if>
+            <if test="otherField2 != null">
+                other_field2,
+            </if>
+            <if test="otherField3 != null">
+                other_field3,
+            </if>
+            <if test="enableSerialNumber != null">
+                enable_serial_number,
+            </if>
+            <if test="enableBatchNumber != null">
+                enable_batch_number,
+            </if>
+            <if test="position != null">
+                position,
+            </if>
+            <if test="tenantId != null">
+                tenant_id,
+            </if>
+            <if test="deleteFlag != null">
+                delete_flag,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">
+                #{id,jdbcType=BIGINT},
+            </if>
+            <if test="categoryId != null">
+                #{categoryId,jdbcType=BIGINT},
+            </if>
+            <if test="name != null">
+                #{name,jdbcType=VARCHAR},
+            </if>
+            <if test="mfrs != null">
+                #{mfrs,jdbcType=VARCHAR},
+            </if>
+            <if test="model != null">
+                #{model,jdbcType=VARCHAR},
+            </if>
+            <if test="standard != null">
+                #{standard,jdbcType=VARCHAR},
+            </if>
+            <if test="brand != null">
+                #{brand,jdbcType=VARCHAR},
+            </if>
+            <if test="mnemonic != null">
+                #{mnemonic,jdbcType=VARCHAR},
+            </if>
+            <if test="color != null">
+                #{color,jdbcType=VARCHAR},
+            </if>
+            <if test="unit != null">
+                #{unit,jdbcType=VARCHAR},
+            </if>
+            <if test="remark != null">
+                #{remark,jdbcType=VARCHAR},
+            </if>
+            <if test="imgName != null">
+                #{imgName,jdbcType=VARCHAR},
+            </if>
+            <if test="unitId != null">
+                #{unitId,jdbcType=BIGINT},
+            </if>
+            <if test="expiryNum != null">
+                #{expiryNum,jdbcType=INTEGER},
+            </if>
+            <if test="weight != null">
+                #{weight,jdbcType=DECIMAL},
+            </if>
+            <if test="enabled != null">
+                #{enabled,jdbcType=BIT},
+            </if>
+            <if test="otherField1 != null">
+                #{otherField1,jdbcType=VARCHAR},
+            </if>
+            <if test="otherField2 != null">
+                #{otherField2,jdbcType=VARCHAR},
+            </if>
+            <if test="otherField3 != null">
+                #{otherField3,jdbcType=VARCHAR},
+            </if>
+            <if test="enableSerialNumber != null">
+                #{enableSerialNumber,jdbcType=VARCHAR},
+            </if>
+            <if test="enableBatchNumber != null">
+                #{enableBatchNumber,jdbcType=VARCHAR},
+            </if>
+            <if test="position != null">
+                #{position,jdbcType=VARCHAR},
+            </if>
+            <if test="tenantId != null">
+                #{tenantId,jdbcType=BIGINT},
+            </if>
+            <if test="deleteFlag != null">
+                #{deleteFlag,jdbcType=VARCHAR},
+            </if>
+        </trim>
+    </insert>
+
+    <select id="findUnitList" resultType="com.jsh.erp.datasource.entities.Unit">
+        select u.* from jsh_unit u
+        left join jsh_material m on m.unit_id=u.id and ifnull(m.delete_flag,'0') !='1'
+        where m.id = #{mId}
+        and ifnull(u.delete_flag,'0') !='1'
+    </select>
+
+    <select id="findById" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultAndUnitMap">
+        select m.*,u.name unit_name from jsh_material m
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_flag,'0') !='1'
+        where m.id = #{id}
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <select id="findByIdWithBarCode" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultAndUnitMap">
+        select m.*,u.name unit_name,me.bar_code m_bar_code, me.commodity_unit, me.purchase_decimal, me.commodity_decimal,
+        me.wholesale_decimal, me.low_decimal
+        from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        where me.id = #{meId}
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getMaterialByParam" resultType="com.jsh.erp.datasource.vo.MaterialVoSearch">
+        select me.bar_code, m.name, m.mnemonic, m.standard, m.model, m.color, me.commodity_unit unit
+        from jsh_material m
+        left join jsh_material_extend me on m.id = me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        where m.enabled=1 and me.id is not null
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey} or m.mnemonic like #{bindKey})
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        order by m.id desc, me.default_flag desc, me.id asc
+        limit 0,20
+    </select>
+
+    <select id="findBySelectWithBarCode" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultAndUnitMap">
+        select m.*,u.name unit_name,mc.name categoryName,me.bar_code m_bar_code,me.id meId,me.commodity_unit,me.sku from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        where m.enabled=1 and me.id is not null
+        <if test="q != null and q !=''">
+            <bind name="bindKey" value="'%'+q+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
+            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} or m.mfrs like #{bindKey})
+        </if>
+        <if test="standardOrModel != null and standardOrModel !=''">
+            <bind name="bindStandardOrModel" value="'%'+standardOrModel+'%'"/>
+            and (m.standard like #{bindStandardOrModel} or m.model like #{bindStandardOrModel})
+        </if>
+        <if test="color != null and color !=''">
+            <bind name="bindColor" value="'%'+color+'%'"/>
+            and m.color like #{bindColor}
+        </if>
+        <if test="brand != null and brand !=''">
+            <bind name="bindBrand" value="'%'+brand+'%'"/>
+            and m.brand like #{bindBrand}
+        </if>
+        <if test="mfrs != null and mfrs !=''">
+            <bind name="bindMfrs" value="'%'+mfrs+'%'"/>
+            and m.mfrs like #{bindMfrs}
+        </if>
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="enableSerialNumber != null and enableSerialNumber !=''">
+            and m.enable_serial_number = #{enableSerialNumber}
+        </if>
+        <if test="enableBatchNumber != null and enableBatchNumber !=''">
+            and m.enable_batch_number = #{enableBatchNumber}
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        ORDER BY m.id desc, me.default_flag desc, me.id asc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="findBySelectWithBarCodeCount" resultType="java.lang.Integer">
+        select count(1) from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        where m.enabled=1 and me.id is not null
+        <if test="q != null and q !=''">
+            <bind name="bindKey" value="'%'+q+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
+            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} or m.mfrs like #{bindKey})
+        </if>
+        <if test="standardOrModel != null and standardOrModel !=''">
+            <bind name="bindStandardOrModel" value="'%'+standardOrModel+'%'"/>
+            and (m.standard like #{bindStandardOrModel} or m.model like #{bindStandardOrModel})
+        </if>
+        <if test="color != null and color !=''">
+            <bind name="bindColor" value="'%'+color+'%'"/>
+            and m.color like #{bindColor}
+        </if>
+        <if test="brand != null and brand !=''">
+            <bind name="bindBrand" value="'%'+brand+'%'"/>
+            and m.brand like #{bindBrand}
+        </if>
+        <if test="mfrs != null and mfrs !=''">
+            <bind name="bindMfrs" value="'%'+mfrs+'%'"/>
+            and m.mfrs like #{bindMfrs}
+        </if>
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="enableSerialNumber != null and enableSerialNumber !=''">
+            and m.enable_serial_number = #{enableSerialNumber}
+        </if>
+        <if test="enableBatchNumber != null and enableBatchNumber !=''">
+            and m.enable_batch_number = #{enableBatchNumber}
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <select id="exportExcel" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultMapList">
+        select m.*,u.name unitName, u.ratio, mc.name categoryName,me.bar_code,me.commodity_unit,me.purchase_decimal, me.commodity_decimal,
+        me.wholesale_decimal, me.low_decimal, me.sku
+        from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left JOIN jsh_unit u on m.unit_id = u.id and ifnull(u.delete_Flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        where 1=1
+        and (me.default_flag=1 or (me.sku is not null and me.sku!=''))
+        <if test="materialParam != null and materialParam !=''">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey})
+        </if>
+        <if test="color != null and color !=''">
+            <bind name="bindColor" value="'%'+color+'%'"/>
+            and m.color like #{bindColor}
+        </if>
+        <if test="materialOther != null and materialOther !=''">
+            <bind name="bindOther" value="'%'+materialOther+'%'"/>
+            and (m.mfrs like #{bindOther} or m.other_field1 like #{bindOther}
+            or m.other_field2 like #{bindOther} or m.other_field3 like #{bindOther})
+        </if>
+        <if test="weight != null and weight !=''">
+            and m.weight = #{weight}
+        </if>
+        <if test="expiryNum != null and expiryNum !=''">
+            and m.expiry_num = #{expiryNum}
+        </if>
+        <if test="enabled != null and enabled !=''">
+            and m.enabled = #{enabled}
+        </if>
+        <if test="enableSerialNumber != null and enableSerialNumber !=''">
+            and m.enable_serial_number = #{enableSerialNumber}
+        </if>
+        <if test="enableBatchNumber != null and enableBatchNumber !=''">
+            and m.enable_batch_number = #{enableBatchNumber}
+        </if>
+        <if test="remark != null and remark !=''">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and m.remark like #{bindRemark}
+        </if>
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        order by m.id desc, me.default_flag desc, me.id asc
+    </select>
+
+    <select id="getOtherMaterialList" resultType="com.jsh.erp.datasource.entities.MaterialExtend">
+        select me.material_id, me.bar_code, me.commodity_unit from jsh_material_extend me
+        where me.default_flag=0 and (me.sku='' or me.sku is null)
+        and ifnull(me.delete_Flag,'0') !='1'
+        group by me.material_id
+    </select>
+
+    <select id="findByMaterialName"  resultType="com.jsh.erp.datasource.entities.Material">
+        select m.*
+        FROM jsh_material m
+        where 1=1
+        <if test="name != null">
+            and m.name =#{name}
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getMaterialEnableSerialNumberList" parameterType="java.util.Map" resultMap="ResultAndUnitMap">
+        select m.*,me.bar_code m_bar_code from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        where 1=1
+        and m.enabled=1
+        and m.enable_serial_number ='1'
+        <if test="q != null and q !=''">
+            <bind name="bindKey" value="'%'+q+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey})
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        order by m.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="getMaterialEnableSerialNumberCount" resultType="java.lang.Long">
+        select count(me.id) from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        where 1=1
+        and m.enabled ='1'
+        and m.enable_serial_number ='1'
+        <if test="q != null and q !=''">
+            <bind name="bindKey" value="'%'+q+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey})
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <update id="batchDeleteMaterialByIds">
+        update jsh_material
+        set delete_flag='1'
+        where 1=1
+        and ifnull(delete_flag,'0') !='1'
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+    <select id="getMaterialListByCategoryIds"  resultMap="com.jsh.erp.datasource.mappers.MaterialMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.MaterialMapper.Base_Column_List" />
+        from jsh_material
+        where 1=1
+        and category_id in (
+        <foreach collection="categoryIds" item="categoryId" separator=",">
+            #{categoryId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <select id="getMaterialListByUnitIds"  resultMap="com.jsh.erp.datasource.mappers.MaterialMapper.BaseResultMap">
+        select
+        <include refid="com.jsh.erp.datasource.mappers.MaterialMapper.Base_Column_List" />
+        from jsh_material
+        where 1=1
+        and unit_id in (
+        <foreach collection="unitIds" item="unitId" separator=",">
+            #{unitId}
+        </foreach>
+        )
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="getMaxBarCode" resultType="java.lang.String">
+        select max(CAST(me.bar_code AS SIGNED)) bar_code from jsh_material_extend me
+        where 1=1
+        and ifnull(me.delete_Flag,'0') !='1'
+    </select>
+
+    <select id="getMaterialByMeId" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultMapList">
+        select m.*,me.bar_code,u.name unitName, mc.name categoryName
+        FROM jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left JOIN jsh_unit u on m.unit_id = u.id and ifnull(u.delete_flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        where 1=1
+        <if test="meId != null">
+            and me.id = #{meId}
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getMaterialNameList" resultType="java.lang.String">
+        select m.name from jsh_material m
+        where m.name is not null and m.name !='' and ifnull(m.delete_flag,'0') !='1'
+        group by m.name
+        order by m.name asc
+    </select>
+
+    <select id="getMaterialByBarCode" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultAndUnitMap">
+        select m.*,u.name unit_name, me.id meId,me.bar_code m_bar_code, me.commodity_unit, me.purchase_decimal, me.commodity_decimal,
+        me.wholesale_decimal, me.low_decimal, me.sku
+        from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        where
+        me.bar_code in (
+        <foreach collection="barCodeArray" item="barCode" separator=",">
+            #{barCode}
+        </foreach>
+        )
+        and ifnull(m.delete_flag,'0') !='1'
+        order by m.id desc, me.default_flag desc, me.id asc
+    </select>
+
+    <select id="getMaterialByBarCodeAndWithOutMId" parameterType="com.jsh.erp.datasource.entities.MaterialExample" resultMap="ResultAndUnitMap">
+        select m.*,u.name unit_name, me.id meId,me.bar_code m_bar_code, me.commodity_unit, me.purchase_decimal, me.commodity_decimal,
+        me.wholesale_decimal, me.low_decimal, me.sku
+        from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_unit u on m.unit_id=u.id and ifnull(u.delete_Flag,'0') !='1'
+        where
+        me.bar_code in (
+        <foreach collection="barCodeArray" item="barCode" separator=",">
+            #{barCode}
+        </foreach>
+        )
+        and me.material_id!=#{mId}
+        and ifnull(m.delete_flag,'0') !='1'
+        order by me.id desc
+    </select>
+
+    <update id="setUnitIdToNull">
+        update jsh_material
+        set unit_id = null
+        where 1=1
+        and ifnull(delete_flag,'0') !='1'
+        and id = #{id}
+    </update>
+
+    <update id="setExpiryNumToNull">
+        update jsh_material
+        set expiry_num = null
+        where 1=1
+        and ifnull(delete_flag,'0') !='1'
+        and id = #{id}
+    </update>
+
+    <select id="getInitialStockWithMaterial" resultMap="InitialStockWithMaterialMap">
+        select material_id, ifnull(sum(mis.number),0) number
+        from jsh_material_initial_stock mis
+        where 1=1
+        <if test="depotList.size()>0">
+            and mis.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        group by mis.material_id
+    </select>
+
+    <select id="getListWithStock" resultMap="ResultMapListWithStock">
+        select m.*, me.commodity_unit unitName, mc.name categoryName, me.bar_code mBarCode,
+        ifnull(me.purchase_decimal,0) purchaseDecimal,
+        ifnull(mcs.current_unit_price,0) currentUnitPrice,
+        ifnull(sum(mcs.current_number),0) currentStock,
+        sum(ifnull(me.purchase_decimal, 0) * ifnull(mcs.current_number, 0)) currentStockPrice,
+        sum(ifnull(mcs.current_unit_price, 0) * ifnull(mcs.current_number, 0)) currentStockMovePrice,
+        sum(ifnull(m.weight, 0) * ifnull(mcs.current_number, 0)) currentWeight
+        FROM jsh_material m
+        left JOIN jsh_material_extend me on m.id = me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_current_stock mcs on m.id = mcs.material_id and ifnull(mcs.delete_flag,'0') !='1'
+        <if test="depotList.size()>0">
+            and mcs.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        left JOIN jsh_unit u on m.unit_id = u.id and ifnull(u.delete_Flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        where 1=1
+        and me.default_flag=1
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="position != null and position !=''">
+            <bind name="bindPosition" value="'%'+position+'%'"/>
+            and m.position like #{bindPosition}
+        </if>
+        <if test="materialParam != null">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        group by m.id
+        <if test="zeroStock == 0">
+            having currentStock!=0
+        </if>
+        <if test="column == 'createTime'">
+            order by m.id desc
+        </if>
+        <if test="column != 'createTime'">
+            order by ${column} ${order}
+        </if>
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="getListWithStockCount" resultType="java.lang.Integer">
+        select count(tb.id) from
+        (select m.id, ifnull(sum(mcs.current_number),0) currentStock from jsh_material m
+        left JOIN jsh_material_extend me on m.id = me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_current_stock mcs on m.id = mcs.material_id and ifnull(mcs.delete_flag,'0') !='1'
+        <if test="depotList.size()>0">
+            and mcs.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        left JOIN jsh_unit u on m.unit_id = u.id and ifnull(u.delete_Flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        where 1=1
+        and me.default_flag=1
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="position != null and position !=''">
+            <bind name="bindPosition" value="'%'+position+'%'"/>
+            and m.position like #{bindPosition}
+        </if>
+        <if test="materialParam != null">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+        group by m.id
+        <if test="zeroStock == 0">
+            having currentStock!=0
+        </if>
+        ) tb
+    </select>
+
+    <select id="getTotalStockAndPrice" resultType="com.jsh.erp.datasource.entities.MaterialVo4Unit">
+        select
+        ifnull(sum(mcs.current_number),0) currentStock,
+        sum(ifnull(me.purchase_decimal,0)*ifnull(mcs.current_number,0)) currentStockPrice,
+        sum(ifnull(mcs.current_unit_price,0)*ifnull(mcs.current_number,0)) currentStockMovePrice,
+        sum(ifnull(m.weight,0)*ifnull(mcs.current_number,0)) currentWeight
+        from jsh_material m
+        left JOIN jsh_material_extend me on m.id = me.material_id and ifnull(me.delete_Flag,'0') !='1'
+        left join jsh_material_current_stock mcs on m.id = mcs.material_id and ifnull(mcs.delete_flag,'0') !='1'
+        left JOIN jsh_unit u on m.unit_id = u.id and ifnull(u.delete_Flag,'0') !='1'
+        left JOIN jsh_material_category mc on m.category_id = mc.id and ifnull(mc.delete_Flag,'0') !='1'
+        where 1=1
+        and me.default_flag=1
+        <if test="depotList.size()>0">
+            and mcs.depot_id in
+            <foreach collection="depotList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="idList.size()>0">
+            and m.category_id in
+            <foreach collection="idList" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="position != null and position !=''">
+            <bind name="bindPosition" value="'%'+position+'%'"/>
+            and m.position like #{bindPosition}
+        </if>
+        <if test="materialParam != null">
+            <bind name="bindKey" value="'%'+materialParam+'%'"/>
+            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey} or m.model like #{bindKey}
+            or m.color like #{bindKey} or m.mfrs like #{bindKey} or m.brand like #{bindKey} or m.other_field1 like #{bindKey}
+            or m.other_field2 like #{bindKey} or m.other_field3 like #{bindKey})
+        </if>
+        and ifnull(m.delete_flag,'0') !='1'
+    </select>
+
+    <select id="checkIsExist" resultType="java.lang.Integer">
+        select count(1) from jsh_material m
+        where ifnull(m.delete_flag,'0') !='1'
+        <if test="name != null">
+            and m.name = #{name}
+        </if>
+        <if test="model != null">
+            and m.model = #{model}
+        </if>
+        <if test="color != null">
+            and m.color = #{color}
+        </if>
+        <if test="standard != null">
+            and m.standard = #{standard}
+        </if>
+        <if test="mfrs != null">
+            and m.mfrs = #{mfrs}
+        </if>
+        <if test="otherField1 != null">
+            and m.other_field1 = #{otherField1}
+        </if>
+        <if test="otherField2 != null">
+            and m.other_field2 = #{otherField2}
+        </if>
+        <if test="otherField3 != null">
+            and m.other_field3 = #{otherField3}
+        </if>
+        <if test="unit != null">
+            and m.unit = #{unit}
+        </if>
+        <if test="unitId != null">
+            and m.unit_id = #{unitId}
+        </if>
+        <if test="id != null">
+            and m.id != #{id}
+        </if>
+    </select>
+
+    <select id="getMaterialExtendBySerialNumber" resultType="com.jsh.erp.datasource.entities.MaterialExtend">
+        select me.bar_code
+        from jsh_material m
+        left join jsh_material_extend me on m.id=me.material_id and ifnull(me.delete_flag,'0') !='1'
+        left join jsh_serial_number sn on sn.material_id=m.id and ifnull(sn.delete_flag,'0') !='1'
+        where sn.serial_number = #{serialNumber}
+        and me.default_flag=1
+        and ifnull(m.delete_flag,'0') !='1'
+        limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialPropertyMapper.xml b/src/main/resources/mapper_xml/MaterialPropertyMapper.xml
new file mode 100644
index 0000000..602cc55
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialPropertyMapper.xml
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialPropertyMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.MaterialProperty">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="native_name" jdbcType="VARCHAR" property="nativeName" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="another_name" jdbcType="VARCHAR" property="anotherName" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, native_name, enabled, sort, another_name, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MaterialPropertyExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_material_property
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_material_property
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_material_property
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MaterialPropertyExample">
+    delete from jsh_material_property
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.MaterialProperty">
+    insert into jsh_material_property (id, native_name, enabled, 
+      sort, another_name, delete_flag
+      )
+    values (#{id,jdbcType=BIGINT}, #{nativeName,jdbcType=VARCHAR}, #{enabled,jdbcType=BIT}, 
+      #{sort,jdbcType=VARCHAR}, #{anotherName,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=VARCHAR}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.MaterialProperty">
+    insert into jsh_material_property
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="nativeName != null">
+        native_name,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="anotherName != null">
+        another_name,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="nativeName != null">
+        #{nativeName,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="anotherName != null">
+        #{anotherName,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MaterialPropertyExample" resultType="java.lang.Long">
+    select count(*) from jsh_material_property
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_material_property
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.nativeName != null">
+        native_name = #{record.nativeName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.anotherName != null">
+        another_name = #{record.anotherName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_material_property
+    set id = #{record.id,jdbcType=BIGINT},
+      native_name = #{record.nativeName,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      another_name = #{record.anotherName,jdbcType=VARCHAR},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.MaterialProperty">
+    update jsh_material_property
+    <set>
+      <if test="nativeName != null">
+        native_name = #{nativeName,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="anotherName != null">
+        another_name = #{anotherName,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.MaterialProperty">
+    update jsh_material_property
+    set native_name = #{nativeName,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      sort = #{sort,jdbcType=VARCHAR},
+      another_name = #{anotherName,jdbcType=VARCHAR},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MaterialPropertyMapperEx.xml b/src/main/resources/mapper_xml/MaterialPropertyMapperEx.xml
new file mode 100644
index 0000000..0dce6de
--- /dev/null
+++ b/src/main/resources/mapper_xml/MaterialPropertyMapperEx.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MaterialPropertyMapperEx">
+    <select id="selectByConditionMaterialProperty" parameterType="com.jsh.erp.datasource.entities.MaterialPropertyExample" resultMap="com.jsh.erp.datasource.mappers.MaterialPropertyMapper.BaseResultMap">
+        select *
+        FROM jsh_material_property
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and native_name like #{bindName}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByMaterialProperty" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_material_property
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and native_name like #{bindName}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <update id="batchDeleteMaterialPropertyByIds">
+        update jsh_material_property
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MsgMapper.xml b/src/main/resources/mapper_xml/MsgMapper.xml
new file mode 100644
index 0000000..22ae238
--- /dev/null
+++ b/src/main/resources/mapper_xml/MsgMapper.xml
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MsgMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Msg">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="msg_title" jdbcType="VARCHAR" property="msgTitle" />
+    <result column="msg_content" jdbcType="VARCHAR" property="msgContent" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="user_id" jdbcType="BIGINT" property="userId" />
+    <result column="status" jdbcType="VARCHAR" property="status" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_Flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, msg_title, msg_content, create_time, type, user_id, status, tenant_id, delete_Flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.MsgExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_msg
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_msg
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_msg
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.MsgExample">
+    delete from jsh_msg
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Msg">
+    insert into jsh_msg (id, msg_title, msg_content, 
+      create_time, type, user_id, 
+      status, tenant_id, delete_Flag
+      )
+    values (#{id,jdbcType=BIGINT}, #{msgTitle,jdbcType=VARCHAR}, #{msgContent,jdbcType=VARCHAR}, 
+      #{createTime,jdbcType=TIMESTAMP}, #{type,jdbcType=VARCHAR}, #{userId,jdbcType=BIGINT}, 
+      #{status,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Msg">
+    insert into jsh_msg
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="msgTitle != null">
+        msg_title,
+      </if>
+      <if test="msgContent != null">
+        msg_content,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="userId != null">
+        user_id,
+      </if>
+      <if test="status != null">
+        status,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_Flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="msgTitle != null">
+        #{msgTitle,jdbcType=VARCHAR},
+      </if>
+      <if test="msgContent != null">
+        #{msgContent,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="userId != null">
+        #{userId,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.MsgExample" resultType="java.lang.Long">
+    select count(*) from jsh_msg
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_msg
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.msgTitle != null">
+        msg_title = #{record.msgTitle,jdbcType=VARCHAR},
+      </if>
+      <if test="record.msgContent != null">
+        msg_content = #{record.msgContent,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.userId != null">
+        user_id = #{record.userId,jdbcType=BIGINT},
+      </if>
+      <if test="record.status != null">
+        status = #{record.status,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_Flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_msg
+    set id = #{record.id,jdbcType=BIGINT},
+      msg_title = #{record.msgTitle,jdbcType=VARCHAR},
+      msg_content = #{record.msgContent,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      type = #{record.type,jdbcType=VARCHAR},
+      user_id = #{record.userId,jdbcType=BIGINT},
+      status = #{record.status,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_Flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Msg">
+    update jsh_msg
+    <set>
+      <if test="msgTitle != null">
+        msg_title = #{msgTitle,jdbcType=VARCHAR},
+      </if>
+      <if test="msgContent != null">
+        msg_content = #{msgContent,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="userId != null">
+        user_id = #{userId,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        status = #{status,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_Flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Msg">
+    update jsh_msg
+    set msg_title = #{msgTitle,jdbcType=VARCHAR},
+      msg_content = #{msgContent,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      type = #{type,jdbcType=VARCHAR},
+      user_id = #{userId,jdbcType=BIGINT},
+      status = #{status,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_Flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/MsgMapperEx.xml b/src/main/resources/mapper_xml/MsgMapperEx.xml
new file mode 100644
index 0000000..bd00baf
--- /dev/null
+++ b/src/main/resources/mapper_xml/MsgMapperEx.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.MsgMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.MsgMapper.BaseResultMap" id="ResultExMap" type="com.jsh.erp.datasource.entities.MsgEx">
+    </resultMap>
+    <select id="selectByConditionMsg" parameterType="com.jsh.erp.datasource.entities.MsgExample" resultMap="ResultExMap">
+        SELECT *
+        FROM jsh_msg
+        WHERE 1=1
+        and ifnull(delete_Flag,'0') !='1'
+        <if test="userId != null">
+            and user_id = #{userId}
+        </if>
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and msg_title like #{bindName}
+        </if>
+        order by create_time desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="countsByMsg" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_msg
+        WHERE 1=1
+        and ifnull(delete_Flag,'0') !='1'
+        <if test="userId != null">
+            and user_id = #{userId}
+        </if>
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and msg_title like #{bindName}
+        </if>
+    </select>
+
+    <update id="batchDeleteMsgByIds">
+        update jsh_msg
+        set delete_Flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <select id="getMsgCountByStatus" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_msg
+        WHERE 1=1
+        and ifnull(delete_Flag,'0') !='1'
+        <if test="status != null">
+            and status = #{status}
+        </if>
+        <if test="userId != null">
+            and user_id = #{userId}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/OrgaUserRelMapper.xml b/src/main/resources/mapper_xml/OrgaUserRelMapper.xml
new file mode 100644
index 0000000..3caf651
--- /dev/null
+++ b/src/main/resources/mapper_xml/OrgaUserRelMapper.xml
@@ -0,0 +1,351 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.OrgaUserRelMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.OrgaUserRel">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="orga_id" jdbcType="BIGINT" property="orgaId" />
+    <result column="user_id" jdbcType="BIGINT" property="userId" />
+    <result column="user_blng_orga_dspl_seq" jdbcType="VARCHAR" property="userBlngOrgaDsplSeq" />
+    <result column="delete_flag" jdbcType="CHAR" property="deleteFlag" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="creator" jdbcType="BIGINT" property="creator" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="updater" jdbcType="BIGINT" property="updater" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    id, orga_id, user_id, user_blng_orga_dspl_seq, delete_flag, create_time, creator, 
+    update_time, updater, tenant_id
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.OrgaUserRelExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_orga_user_rel
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_orga_user_rel
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    delete from jsh_orga_user_rel
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.OrgaUserRelExample">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    delete from jsh_orga_user_rel
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.OrgaUserRel">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    insert into jsh_orga_user_rel (id, orga_id, user_id, 
+      user_blng_orga_dspl_seq, delete_flag, create_time, 
+      creator, update_time, updater, 
+      tenant_id)
+    values (#{id,jdbcType=BIGINT}, #{orgaId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, 
+      #{userBlngOrgaDsplSeq,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=CHAR}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{creator,jdbcType=BIGINT}, #{updateTime,jdbcType=TIMESTAMP}, #{updater,jdbcType=BIGINT}, 
+      #{tenantId,jdbcType=BIGINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.OrgaUserRel">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    insert into jsh_orga_user_rel
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="orgaId != null">
+        orga_id,
+      </if>
+      <if test="userId != null">
+        user_id,
+      </if>
+      <if test="userBlngOrgaDsplSeq != null">
+        user_blng_orga_dspl_seq,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="creator != null">
+        creator,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="updater != null">
+        updater,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="orgaId != null">
+        #{orgaId,jdbcType=BIGINT},
+      </if>
+      <if test="userId != null">
+        #{userId,jdbcType=BIGINT},
+      </if>
+      <if test="userBlngOrgaDsplSeq != null">
+        #{userBlngOrgaDsplSeq,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=CHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="creator != null">
+        #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updater != null">
+        #{updater,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.OrgaUserRelExample" resultType="java.lang.Integer">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    select count(*) from jsh_orga_user_rel
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update jsh_orga_user_rel
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.orgaId != null">
+        orga_id = #{record.orgaId,jdbcType=BIGINT},
+      </if>
+      <if test="record.userId != null">
+        user_id = #{record.userId,jdbcType=BIGINT},
+      </if>
+      <if test="record.userBlngOrgaDsplSeq != null">
+        user_blng_orga_dspl_seq = #{record.userBlngOrgaDsplSeq,jdbcType=VARCHAR},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=CHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.creator != null">
+        creator = #{record.creator,jdbcType=BIGINT},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updater != null">
+        updater = #{record.updater,jdbcType=BIGINT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update jsh_orga_user_rel
+    set id = #{record.id,jdbcType=BIGINT},
+      orga_id = #{record.orgaId,jdbcType=BIGINT},
+      user_id = #{record.userId,jdbcType=BIGINT},
+      user_blng_orga_dspl_seq = #{record.userBlngOrgaDsplSeq,jdbcType=VARCHAR},
+      delete_flag = #{record.deleteFlag,jdbcType=CHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      creator = #{record.creator,jdbcType=BIGINT},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      updater = #{record.updater,jdbcType=BIGINT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.OrgaUserRel">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update jsh_orga_user_rel
+    <set>
+      <if test="orgaId != null">
+        orga_id = #{orgaId,jdbcType=BIGINT},
+      </if>
+      <if test="userId != null">
+        user_id = #{userId,jdbcType=BIGINT},
+      </if>
+      <if test="userBlngOrgaDsplSeq != null">
+        user_blng_orga_dspl_seq = #{userBlngOrgaDsplSeq,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=CHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="creator != null">
+        creator = #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updater != null">
+        updater = #{updater,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.OrgaUserRel">
+    <!--
+      WARNING - @mbggenerated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update jsh_orga_user_rel
+    set orga_id = #{orgaId,jdbcType=BIGINT},
+      user_id = #{userId,jdbcType=BIGINT},
+      user_blng_orga_dspl_seq = #{userBlngOrgaDsplSeq,jdbcType=VARCHAR},
+      delete_flag = #{deleteFlag,jdbcType=CHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      creator = #{creator,jdbcType=BIGINT},
+      update_time = #{updateTime,jdbcType=TIMESTAMP},
+      updater = #{updater,jdbcType=BIGINT},
+      tenant_id = #{tenantId,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/OrgaUserRelMapperEx.xml b/src/main/resources/mapper_xml/OrgaUserRelMapperEx.xml
new file mode 100644
index 0000000..1a18a41
--- /dev/null
+++ b/src/main/resources/mapper_xml/OrgaUserRelMapperEx.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.jsh.erp.datasource.mappers.OrgaUserRelMapperEx" >
+  <resultMap extends="com.jsh.erp.datasource.mappers.OrgaUserRelMapper.BaseResultMap" id="BaseResultMapEx" type="com.jsh.erp.datasource.entities.OrgaUserRelEx" >
+  </resultMap>
+  <insert id="addOrgaUserRel" parameterType="com.jsh.erp.datasource.entities.OrgaUserRel"
+          useGeneratedKeys="true" keyProperty="id" keyColumn="id">
+    insert into jsh_orga_user_rel (orga_id, user_id,
+    user_blng_orga_dspl_seq, delete_flag, create_time,
+    creator, update_time, updater
+    )
+    values (#{orgaId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT},
+    #{userBlngOrgaDsplSeq,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=CHAR}, #{createTime,jdbcType=TIMESTAMP},
+    #{creator,jdbcType=BIGINT}, #{updateTime,jdbcType=TIMESTAMP}, #{updater,jdbcType=BIGINT}
+    )
+  </insert>
+  <update id="updateOrgaUserRel" parameterType="com.jsh.erp.datasource.entities.OrgaUserRel" >
+    update jsh_orga_user_rel
+    <set >
+      <if test="orgaId != null" >
+        orga_id = #{orgaId},
+      </if>
+      <if test="userId != null" >
+        user_id = #{userId},
+      </if>
+      <if test="userBlngOrgaDsplSeq != null" >
+        user_blng_orga_dspl_seq = #{userBlngOrgaDsplSeq},
+      </if>
+      <if test="deleteFlag != null" >
+        delete_flag = #{deleteFlag},
+      </if>
+      <if test="updateTime != null" >
+        update_time = #{updateTime},
+      </if>
+      <if test="updater != null" >
+        updater = #{updater},
+      </if>
+    </set>
+    where 1=1
+    and id=#{id}
+  </update>
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/OrganizationMapper.xml b/src/main/resources/mapper_xml/OrganizationMapper.xml
new file mode 100644
index 0000000..0e2f023
--- /dev/null
+++ b/src/main/resources/mapper_xml/OrganizationMapper.xml
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.OrganizationMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Organization">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="org_no" jdbcType="VARCHAR" property="orgNo" />
+    <result column="org_abr" jdbcType="VARCHAR" property="orgAbr" />
+    <result column="parent_id" jdbcType="BIGINT" property="parentId" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, org_no, org_abr, parent_id, sort, remark, create_time, update_time, tenant_id, 
+    delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.OrganizationExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_organization
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_organization
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_organization
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.OrganizationExample">
+    delete from jsh_organization
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Organization">
+    insert into jsh_organization (id, org_no, org_abr, 
+      parent_id, sort, remark, 
+      create_time, update_time, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{orgNo,jdbcType=VARCHAR}, #{orgAbr,jdbcType=VARCHAR}, 
+      #{parentId,jdbcType=BIGINT}, #{sort,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, 
+      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Organization">
+    insert into jsh_organization
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="orgNo != null">
+        org_no,
+      </if>
+      <if test="orgAbr != null">
+        org_abr,
+      </if>
+      <if test="parentId != null">
+        parent_id,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="orgNo != null">
+        #{orgNo,jdbcType=VARCHAR},
+      </if>
+      <if test="orgAbr != null">
+        #{orgAbr,jdbcType=VARCHAR},
+      </if>
+      <if test="parentId != null">
+        #{parentId,jdbcType=BIGINT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.OrganizationExample" resultType="java.lang.Long">
+    select count(*) from jsh_organization
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_organization
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.orgNo != null">
+        org_no = #{record.orgNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.orgAbr != null">
+        org_abr = #{record.orgAbr,jdbcType=VARCHAR},
+      </if>
+      <if test="record.parentId != null">
+        parent_id = #{record.parentId,jdbcType=BIGINT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_organization
+    set id = #{record.id,jdbcType=BIGINT},
+      org_no = #{record.orgNo,jdbcType=VARCHAR},
+      org_abr = #{record.orgAbr,jdbcType=VARCHAR},
+      parent_id = #{record.parentId,jdbcType=BIGINT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Organization">
+    update jsh_organization
+    <set>
+      <if test="orgNo != null">
+        org_no = #{orgNo,jdbcType=VARCHAR},
+      </if>
+      <if test="orgAbr != null">
+        org_abr = #{orgAbr,jdbcType=VARCHAR},
+      </if>
+      <if test="parentId != null">
+        parent_id = #{parentId,jdbcType=BIGINT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Organization">
+    update jsh_organization
+    set org_no = #{orgNo,jdbcType=VARCHAR},
+      org_abr = #{orgAbr,jdbcType=VARCHAR},
+      parent_id = #{parentId,jdbcType=BIGINT},
+      sort = #{sort,jdbcType=VARCHAR},
+      remark = #{remark,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/OrganizationMapperEx.xml b/src/main/resources/mapper_xml/OrganizationMapperEx.xml
new file mode 100644
index 0000000..4a65be1
--- /dev/null
+++ b/src/main/resources/mapper_xml/OrganizationMapperEx.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.OrganizationMapperEx">
+
+    <resultMap id="BaseTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
+        <result column="id" property="id"/>
+        <result column="id" property="key"/>
+        <result column="id" property="value"/>
+        <result column="org_abr" property="title"/>
+        <result column="org_no" property="attributes"/>
+        <collection column="{currentId=currentId,org_no=org_no,id=id}" property="children" javaType="java.util.ArrayList"
+                    ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
+    </resultMap>
+
+    <resultMap id="NextTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
+        <result column="id" property="id"/>
+        <result column="id" property="key"/>
+        <result column="id" property="value"/>
+        <result column="org_abr" property="title"/>
+        <result column="org_no" property="attributes"/>
+        <collection column="{currentId=currentId,org_no=org_no,id=id}" property="children" javaType="java.util.ArrayList"
+                    ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id, org_abr,org_no
+    </sql>
+
+    <select id="getNextNodeTree" resultMap="NextTreeResultMap">
+        SELECT
+        <include refid="Base_Column_List"/>,#{currentId} as currentId
+        FROM jsh_organization
+        WHERE parent_id = #{id}
+        <if test="currentId != null">
+            and id !=#{currentId}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc
+    </select>
+
+    <select id="getNodeTree" resultMap="BaseTreeResultMap">
+        SELECT
+        <include refid="Base_Column_List"/>,#{currentId} as currentId
+        FROM jsh_organization
+        WHERE parent_id is null
+        <if test="currentId != null">
+            and id !=#{currentId}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc
+    </select>
+    <insert id="addOrganization" parameterType="com.jsh.erp.datasource.entities.Organization"
+            useGeneratedKeys="true" keyProperty="id" keyColumn="id">
+        insert into jsh_organization
+        (org_no, org_abr, delete_flag,
+      parent_id, sort, remark,
+      create_time, update_time)
+        values
+        (#{orgNo,jdbcType=VARCHAR}, #{orgAbr,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=CHAR},
+      #{parentId,jdbcType=BIGINT}, #{sort,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR},
+      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
+    </insert>
+    <select id="getOrganizationByParentIds" resultMap="com.jsh.erp.datasource.mappers.OrganizationMapper.BaseResultMap">
+        select * from  jsh_organization
+        where
+        1=1
+        and ifnull(delete_flag,'0') !='1'
+        and parent_id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </select>
+    <update id="batchDeleteOrganizationByIds">
+        update jsh_organization
+        set update_Time=#{updateTime},delete_flag='1'
+        where id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+    <update id="editOrganization">
+      update jsh_organization
+      set update_time=#{updateTime},
+      org_no = #{orgNo},org_abr = #{orgAbr},
+      parent_id = #{parentId}, sort = #{sort},remark = #{remark}
+      where id =#{id}
+    </update>
+
+    <select id="getOrganizationRootByIds" resultMap="com.jsh.erp.datasource.mappers.OrganizationMapper.BaseResultMap">
+        select * from  jsh_organization
+        where
+        1=1
+        and ifnull(delete_flag,'0') !='1'
+        and parent_id is null
+        and org_abr='根机构'
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/PersonMapper.xml b/src/main/resources/mapper_xml/PersonMapper.xml
new file mode 100644
index 0000000..3f5b8d1
--- /dev/null
+++ b/src/main/resources/mapper_xml/PersonMapper.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.PersonMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Person">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, type, name, enabled, sort, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.PersonExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_person
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_person
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_person
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.PersonExample">
+    delete from jsh_person
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Person">
+    insert into jsh_person (id, type, name, 
+      enabled, sort, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, 
+      #{enabled,jdbcType=BIT}, #{sort,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Person">
+    insert into jsh_person
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.PersonExample" resultType="java.lang.Long">
+    select count(*) from jsh_person
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_person
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_person
+    set id = #{record.id,jdbcType=BIGINT},
+      type = #{record.type,jdbcType=VARCHAR},
+      name = #{record.name,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Person">
+    update jsh_person
+    <set>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Person">
+    update jsh_person
+    set type = #{type,jdbcType=VARCHAR},
+      name = #{name,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      sort = #{sort,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/PersonMapperEx.xml b/src/main/resources/mapper_xml/PersonMapperEx.xml
new file mode 100644
index 0000000..d3c56a2
--- /dev/null
+++ b/src/main/resources/mapper_xml/PersonMapperEx.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.PersonMapperEx">
+    <select id="selectByConditionPerson" parameterType="com.jsh.erp.datasource.entities.PersonExample" resultMap="com.jsh.erp.datasource.mappers.PersonMapper.BaseResultMap">
+        select *
+        FROM jsh_person
+        where 1=1
+        <if test="name != null and name != ''">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null and type != ''">
+            and type=#{type}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc, id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByPerson" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_person
+        WHERE 1=1
+        <if test="name != null and name != ''">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="type != null and type != ''">
+            and type=#{type}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <update id="batchDeletePersonByIds">
+        update jsh_person
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/PlatformConfigMapper.xml b/src/main/resources/mapper_xml/PlatformConfigMapper.xml
new file mode 100644
index 0000000..4c7d7c8
--- /dev/null
+++ b/src/main/resources/mapper_xml/PlatformConfigMapper.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.PlatformConfigMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.PlatformConfig">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="platform_key" jdbcType="VARCHAR" property="platformKey" />
+    <result column="platform_key_info" jdbcType="VARCHAR" property="platformKeyInfo" />
+    <result column="platform_value" jdbcType="VARCHAR" property="platformValue" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, platform_key, platform_key_info, platform_value
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.PlatformConfigExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_platform_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_platform_config
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_platform_config
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.PlatformConfigExample">
+    delete from jsh_platform_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.PlatformConfig">
+    insert into jsh_platform_config (id, platform_key, platform_key_info, 
+      platform_value)
+    values (#{id,jdbcType=BIGINT}, #{platformKey,jdbcType=VARCHAR}, #{platformKeyInfo,jdbcType=VARCHAR}, 
+      #{platformValue,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.PlatformConfig">
+    insert into jsh_platform_config
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="platformKey != null">
+        platform_key,
+      </if>
+      <if test="platformKeyInfo != null">
+        platform_key_info,
+      </if>
+      <if test="platformValue != null">
+        platform_value,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="platformKey != null">
+        #{platformKey,jdbcType=VARCHAR},
+      </if>
+      <if test="platformKeyInfo != null">
+        #{platformKeyInfo,jdbcType=VARCHAR},
+      </if>
+      <if test="platformValue != null">
+        #{platformValue,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.PlatformConfigExample" resultType="java.lang.Long">
+    select count(*) from jsh_platform_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_platform_config
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.platformKey != null">
+        platform_key = #{record.platformKey,jdbcType=VARCHAR},
+      </if>
+      <if test="record.platformKeyInfo != null">
+        platform_key_info = #{record.platformKeyInfo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.platformValue != null">
+        platform_value = #{record.platformValue,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_platform_config
+    set id = #{record.id,jdbcType=BIGINT},
+      platform_key = #{record.platformKey,jdbcType=VARCHAR},
+      platform_key_info = #{record.platformKeyInfo,jdbcType=VARCHAR},
+      platform_value = #{record.platformValue,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.PlatformConfig">
+    update jsh_platform_config
+    <set>
+      <if test="platformKey != null">
+        platform_key = #{platformKey,jdbcType=VARCHAR},
+      </if>
+      <if test="platformKeyInfo != null">
+        platform_key_info = #{platformKeyInfo,jdbcType=VARCHAR},
+      </if>
+      <if test="platformValue != null">
+        platform_value = #{platformValue,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.PlatformConfig">
+    update jsh_platform_config
+    set platform_key = #{platformKey,jdbcType=VARCHAR},
+      platform_key_info = #{platformKeyInfo,jdbcType=VARCHAR},
+      platform_value = #{platformValue,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/PlatformConfigMapperEx.xml b/src/main/resources/mapper_xml/PlatformConfigMapperEx.xml
new file mode 100644
index 0000000..534c09d
--- /dev/null
+++ b/src/main/resources/mapper_xml/PlatformConfigMapperEx.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.PlatformConfigMapperEx">
+  <select id="selectByConditionPlatformConfig" parameterType="com.jsh.erp.datasource.entities.PlatformConfigExample" resultMap="com.jsh.erp.datasource.mappers.PlatformConfigMapper.BaseResultMap">
+    select *
+    FROM jsh_platform_config
+    where 1=1
+    and platform_key!='activation_code'
+    and platform_key!='app_activation_code'
+    <if test="platformKey != null and platformKey != ''">
+      <bind name="bindKey" value="'%'+platformKey+'%'"/>
+      and platform_key like #{bindKey}
+    </if>
+    <if test="offset != null and rows != null">
+      limit #{offset},#{rows}
+    </if>
+  </select>
+  <select id="countsByPlatformConfig" resultType="java.lang.Long">
+    SELECT
+    COUNT(id)
+    FROM jsh_platform_config
+    WHERE 1=1
+    and platform_key!='activation_code'
+    and platform_key!='app_activation_code'
+    <if test="platformKey != null and platformKey != ''">
+      <bind name="bindKey" value="'%'+platformKey+'%'"/>
+      and platform_key like #{bindKey}
+    </if>
+  </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/RoleMapper.xml b/src/main/resources/mapper_xml/RoleMapper.xml
new file mode 100644
index 0000000..b41e6b6
--- /dev/null
+++ b/src/main/resources/mapper_xml/RoleMapper.xml
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.RoleMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Role">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="price_limit" jdbcType="VARCHAR" property="priceLimit" />
+    <result column="value" jdbcType="VARCHAR" property="value" />
+    <result column="description" jdbcType="VARCHAR" property="description" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, name, type, price_limit, value, description, enabled, sort, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.RoleExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_role
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_role
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_role
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.RoleExample">
+    delete from jsh_role
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Role">
+    insert into jsh_role (id, name, type, 
+      price_limit, value, description, 
+      enabled, sort, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, 
+      #{priceLimit,jdbcType=VARCHAR}, #{value,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, 
+      #{enabled,jdbcType=BIT}, #{sort,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Role">
+    insert into jsh_role
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="priceLimit != null">
+        price_limit,
+      </if>
+      <if test="value != null">
+        value,
+      </if>
+      <if test="description != null">
+        description,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="priceLimit != null">
+        #{priceLimit,jdbcType=VARCHAR},
+      </if>
+      <if test="value != null">
+        #{value,jdbcType=VARCHAR},
+      </if>
+      <if test="description != null">
+        #{description,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.RoleExample" resultType="java.lang.Long">
+    select count(*) from jsh_role
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_role
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.priceLimit != null">
+        price_limit = #{record.priceLimit,jdbcType=VARCHAR},
+      </if>
+      <if test="record.value != null">
+        value = #{record.value,jdbcType=VARCHAR},
+      </if>
+      <if test="record.description != null">
+        description = #{record.description,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_role
+    set id = #{record.id,jdbcType=BIGINT},
+      name = #{record.name,jdbcType=VARCHAR},
+      type = #{record.type,jdbcType=VARCHAR},
+      price_limit = #{record.priceLimit,jdbcType=VARCHAR},
+      value = #{record.value,jdbcType=VARCHAR},
+      description = #{record.description,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Role">
+    update jsh_role
+    <set>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="priceLimit != null">
+        price_limit = #{priceLimit,jdbcType=VARCHAR},
+      </if>
+      <if test="value != null">
+        value = #{value,jdbcType=VARCHAR},
+      </if>
+      <if test="description != null">
+        description = #{description,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Role">
+    update jsh_role
+    set name = #{name,jdbcType=VARCHAR},
+      type = #{type,jdbcType=VARCHAR},
+      price_limit = #{priceLimit,jdbcType=VARCHAR},
+      value = #{value,jdbcType=VARCHAR},
+      description = #{description,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      sort = #{sort,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/RoleMapperEx.xml b/src/main/resources/mapper_xml/RoleMapperEx.xml
new file mode 100644
index 0000000..68bd0a9
--- /dev/null
+++ b/src/main/resources/mapper_xml/RoleMapperEx.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.RoleMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.RoleMapper.BaseResultMap" id="ResultExMap" type="com.jsh.erp.datasource.entities.RoleEx">
+    </resultMap>
+    <select id="selectByConditionRole" parameterType="com.jsh.erp.datasource.entities.RoleExample" resultMap="ResultExMap">
+        SELECT *
+        FROM jsh_role
+        WHERE 1=1
+        and ifnull(delete_flag,'0') !='1'
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="description != null">
+            <bind name="bindDescription" value="'%'+description+'%'"/>
+            and description like #{bindDescription}
+        </if>
+        order by sort asc, id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByRole" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_role
+        WHERE 1=1
+        and ifnull(delete_flag,'0') !='1'
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        <if test="description != null">
+            <bind name="bindDescription" value="'%'+description+'%'"/>
+            and description like #{bindDescription}
+        </if>
+    </select>
+    <update id="batchDeleteRoleByIds">
+        update jsh_role
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+    <select id="getRoleWithoutTenant" resultType="com.jsh.erp.datasource.entities.Role">
+        select * from jsh_role
+        where 1=1
+        and ifnull(delete_flag,'0') !='1'
+        and id=#{roleId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SequenceMapperEx.xml b/src/main/resources/mapper_xml/SequenceMapperEx.xml
new file mode 100644
index 0000000..b4eb6c7
--- /dev/null
+++ b/src/main/resources/mapper_xml/SequenceMapperEx.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SequenceMapperEx">
+
+    <update id="updateBuildOnlyNumber">
+        update jsh_sequence set current_val = current_val + 1 where seq_name = 'depot_number_seq'
+    </update>
+
+    <select id="getBuildOnlyNumber" resultType="java.lang.Long">
+      select current_val from jsh_sequence where seq_name = 'depot_number_seq'
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SerialNumberMapper.xml b/src/main/resources/mapper_xml/SerialNumberMapper.xml
new file mode 100644
index 0000000..38d3fba
--- /dev/null
+++ b/src/main/resources/mapper_xml/SerialNumberMapper.xml
@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SerialNumberMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.SerialNumber">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="material_id" jdbcType="BIGINT" property="materialId" />
+    <result column="depot_id" jdbcType="BIGINT" property="depotId" />
+    <result column="serial_number" jdbcType="VARCHAR" property="serialNumber" />
+    <result column="is_sell" jdbcType="VARCHAR" property="isSell" />
+    <result column="in_price" jdbcType="DECIMAL" property="inPrice" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="creator" jdbcType="BIGINT" property="creator" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="updater" jdbcType="BIGINT" property="updater" />
+    <result column="in_bill_no" jdbcType="VARCHAR" property="inBillNo" />
+    <result column="out_bill_no" jdbcType="VARCHAR" property="outBillNo" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, material_id, depot_id, serial_number, is_sell, in_price, remark, delete_flag, 
+    create_time, creator, update_time, updater, in_bill_no, out_bill_no, tenant_id
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.SerialNumberExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_serial_number
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_serial_number
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_serial_number
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.SerialNumberExample">
+    delete from jsh_serial_number
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.SerialNumber">
+    insert into jsh_serial_number (id, material_id, depot_id, 
+      serial_number, is_sell, in_price, 
+      remark, delete_flag, create_time, 
+      creator, update_time, updater, 
+      in_bill_no, out_bill_no, tenant_id
+      )
+    values (#{id,jdbcType=BIGINT}, #{materialId,jdbcType=BIGINT}, #{depotId,jdbcType=BIGINT}, 
+      #{serialNumber,jdbcType=VARCHAR}, #{isSell,jdbcType=VARCHAR}, #{inPrice,jdbcType=DECIMAL}, 
+      #{remark,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{creator,jdbcType=BIGINT}, #{updateTime,jdbcType=TIMESTAMP}, #{updater,jdbcType=BIGINT}, 
+      #{inBillNo,jdbcType=VARCHAR}, #{outBillNo,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.SerialNumber">
+    insert into jsh_serial_number
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="materialId != null">
+        material_id,
+      </if>
+      <if test="depotId != null">
+        depot_id,
+      </if>
+      <if test="serialNumber != null">
+        serial_number,
+      </if>
+      <if test="isSell != null">
+        is_sell,
+      </if>
+      <if test="inPrice != null">
+        in_price,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="creator != null">
+        creator,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="updater != null">
+        updater,
+      </if>
+      <if test="inBillNo != null">
+        in_bill_no,
+      </if>
+      <if test="outBillNo != null">
+        out_bill_no,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="materialId != null">
+        #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="depotId != null">
+        #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="serialNumber != null">
+        #{serialNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="isSell != null">
+        #{isSell,jdbcType=VARCHAR},
+      </if>
+      <if test="inPrice != null">
+        #{inPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="creator != null">
+        #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updater != null">
+        #{updater,jdbcType=BIGINT},
+      </if>
+      <if test="inBillNo != null">
+        #{inBillNo,jdbcType=VARCHAR},
+      </if>
+      <if test="outBillNo != null">
+        #{outBillNo,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.SerialNumberExample" resultType="java.lang.Long">
+    select count(*) from jsh_serial_number
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_serial_number
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.materialId != null">
+        material_id = #{record.materialId,jdbcType=BIGINT},
+      </if>
+      <if test="record.depotId != null">
+        depot_id = #{record.depotId,jdbcType=BIGINT},
+      </if>
+      <if test="record.serialNumber != null">
+        serial_number = #{record.serialNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.isSell != null">
+        is_sell = #{record.isSell,jdbcType=VARCHAR},
+      </if>
+      <if test="record.inPrice != null">
+        in_price = #{record.inPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.creator != null">
+        creator = #{record.creator,jdbcType=BIGINT},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updater != null">
+        updater = #{record.updater,jdbcType=BIGINT},
+      </if>
+      <if test="record.inBillNo != null">
+        in_bill_no = #{record.inBillNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.outBillNo != null">
+        out_bill_no = #{record.outBillNo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_serial_number
+    set id = #{record.id,jdbcType=BIGINT},
+      material_id = #{record.materialId,jdbcType=BIGINT},
+      depot_id = #{record.depotId,jdbcType=BIGINT},
+      serial_number = #{record.serialNumber,jdbcType=VARCHAR},
+      is_sell = #{record.isSell,jdbcType=VARCHAR},
+      in_price = #{record.inPrice,jdbcType=DECIMAL},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      creator = #{record.creator,jdbcType=BIGINT},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      updater = #{record.updater,jdbcType=BIGINT},
+      in_bill_no = #{record.inBillNo,jdbcType=VARCHAR},
+      out_bill_no = #{record.outBillNo,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.SerialNumber">
+    update jsh_serial_number
+    <set>
+      <if test="materialId != null">
+        material_id = #{materialId,jdbcType=BIGINT},
+      </if>
+      <if test="depotId != null">
+        depot_id = #{depotId,jdbcType=BIGINT},
+      </if>
+      <if test="serialNumber != null">
+        serial_number = #{serialNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="isSell != null">
+        is_sell = #{isSell,jdbcType=VARCHAR},
+      </if>
+      <if test="inPrice != null">
+        in_price = #{inPrice,jdbcType=DECIMAL},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="creator != null">
+        creator = #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updater != null">
+        updater = #{updater,jdbcType=BIGINT},
+      </if>
+      <if test="inBillNo != null">
+        in_bill_no = #{inBillNo,jdbcType=VARCHAR},
+      </if>
+      <if test="outBillNo != null">
+        out_bill_no = #{outBillNo,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.SerialNumber">
+    update jsh_serial_number
+    set material_id = #{materialId,jdbcType=BIGINT},
+      depot_id = #{depotId,jdbcType=BIGINT},
+      serial_number = #{serialNumber,jdbcType=VARCHAR},
+      is_sell = #{isSell,jdbcType=VARCHAR},
+      in_price = #{inPrice,jdbcType=DECIMAL},
+      remark = #{remark,jdbcType=VARCHAR},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      creator = #{creator,jdbcType=BIGINT},
+      update_time = #{updateTime,jdbcType=TIMESTAMP},
+      updater = #{updater,jdbcType=BIGINT},
+      in_bill_no = #{inBillNo,jdbcType=VARCHAR},
+      out_bill_no = #{outBillNo,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SerialNumberMapperEx.xml b/src/main/resources/mapper_xml/SerialNumberMapperEx.xml
new file mode 100644
index 0000000..e4912f8
--- /dev/null
+++ b/src/main/resources/mapper_xml/SerialNumberMapperEx.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SerialNumberMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.SerialNumberMapper.BaseResultMap"  id="SerialNumberExBaseResultMap" type="com.jsh.erp.datasource.entities.SerialNumberEx">
+        <id column="id" jdbcType="BIGINT" property="id" />
+        <result column="materialCode" jdbcType="VARCHAR" property="materialCode" />
+        <result column="materialName" jdbcType="VARCHAR" property="materialName" />
+        <result column="creatorName" jdbcType="VARCHAR" property="creatorName" />
+        <result column="updaterName" jdbcType="VARCHAR" property="updaterName" />
+        <result column="depotHeadNumber" jdbcType="VARCHAR" property="depotHeadNumber" />
+        <result column="depotHeadType" jdbcType="VARCHAR" property="depotHeadType" />
+        <result column="depotName" jdbcType="VARCHAR" property="depotName" />
+    </resultMap>
+    <insert id="addSerialNumber" parameterType="com.jsh.erp.datasource.entities.SerialNumberEx"
+            useGeneratedKeys="true" keyProperty="id" keyColumn="id">
+       insert into jsh_serial_number
+        (material_id, serial_number, is_sell, remark,delete_flag,
+        create_time, creator,update_time, updater,in_bill_no, out_bill_no)
+        values
+        (#{materialId},#{serialNumber},#{isSell},#{remark},#{deleteFlag},
+        #{createTime},#{creator},#{updateTime},#{updater},#{inBillNo},#{outBillNo}
+        )
+    </insert>
+    <update id="updateSerialNumber" parameterType="com.jsh.erp.datasource.entities.SerialNumberEx">
+        update jsh_serial_number
+        <set>
+            <if test="materialId != null">
+                material_id = #{materialId,jdbcType=BIGINT},
+            </if>
+            <if test="serialNumber != null">
+                serial_number = #{serialNumber,jdbcType=VARCHAR},
+            </if>
+            <if test="isSell != null">
+                is_sell = #{isSell,jdbcType=VARCHAR},
+            </if>
+            <if test="remark != null">
+                remark = #{remark,jdbcType=VARCHAR},
+            </if>
+            <if test="deleteFlag != null">
+                delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+            </if>
+            <if test="updateTime != null">
+                update_time = #{updateTime,jdbcType=TIMESTAMP},
+            </if>
+            <if test="updater != null">
+                updater = #{updater,jdbcType=BIGINT},
+            </if>
+            <if test="inBillNo != null">
+                in_bill_no = #{inBillNo,jdbcType=VARCHAR},
+            </if>
+            <if test="outBillNo != null">
+                out_bill_no = #{outBillNo,jdbcType=VARCHAR}
+            </if>
+        </set>
+        where id = #{id,jdbcType=BIGINT}
+    </update>
+
+    <select id="findSerialNumberByMaterialId" resultType="java.lang.Integer">
+        SELECT
+        count(ser.id)
+        FROM jsh_serial_number ser
+        where 1=1
+        <if test="materialId != null">
+            and ser.material_Id=#{materialId}
+        </if>
+        and ifnull(ser.delete_flag,'0') !='1'
+        and ser.is_sell !='1'
+    </select>
+    <update id="sellSerialNumber">
+        update jsh_serial_number
+        <set>
+            is_sell = '1',
+            <if test="outBillNo !=null ">
+                out_bill_no = #{outBillNo},
+            </if>
+            <if test="updateTime !=null ">
+                update_time = #{updateTime},
+            </if>
+            <if test="updater != null">
+                updater = #{updater},
+            </if>
+        </set>
+        where 1=1
+        <if test="materialId != null">
+            and material_id = #{materialId}
+        </if>
+            and is_sell != '1'
+            and ifnull(delete_flag,'0') !='1'
+        <if test="snArray != null">
+            and serial_number
+            in (
+            <foreach collection="snArray" item="sn" separator=",">
+                #{sn}
+            </foreach>
+            )
+        </if>
+
+    </update>
+
+    <update id="cancelSerialNumber">
+        update jsh_serial_number
+        <set>
+                is_sell = '0', out_bill_no=null,
+            <if test="updateTime !=null ">
+                update_time = #{updateTime},
+            </if>
+            <if test="updater != null">
+                updater = #{updater},
+            </if>
+        </set>
+        where 1=1
+        <if test="materialId != null">
+            and material_id = #{materialId}
+        </if>
+        <if test="outBillNo !=null ">
+            and out_bill_no = #{outBillNo,jdbcType=VARCHAR}
+        </if>
+            and is_sell != '0'
+            and ifnull(delete_flag,'0') !='1'
+        <if test="count != null">
+            and id in
+            ( select batchSN.id from
+            ( select selFrom.id from jsh_serial_number selFrom
+            where 1=1
+            <if test="materialId != null">
+                and selFrom.material_id = #{materialId}
+            </if>
+            <if test="outBillNo !=null ">
+                and selFrom.out_bill_no = #{outBillNo,jdbcType=VARCHAR}
+            </if>
+                and selFrom.is_sell !='0'
+                and ifnull(selFrom.delete_flag,'0') !='1'
+            limit 0,#{count}
+            ) batchSN
+            )
+        </if>
+    </update>
+    <insert id="batAddSerialNumber"
+            useGeneratedKeys="true" keyProperty="id" keyColumn="id">
+       insert into jsh_serial_number
+        (material_id, serial_number, is_sell, remark,delete_flag,
+        create_time, creator,update_time, updater)
+        values
+        <foreach collection='list' item='each' separator=','>
+        (#{each.materialId},#{each.serialNumber},'0',#{each.remark},'0',
+        #{each.createTime},#{each.creator},#{each.updateTime},#{each.updater}
+        )
+        </foreach>
+    </insert>
+    <update id="batchDeleteSerialNumberByIds">
+        update jsh_serial_number
+        set update_time=#{updateTime},updater=#{updater},delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <select id="getEnableSerialNumberList" resultType="com.jsh.erp.datasource.entities.SerialNumberEx">
+        select
+        ser.id, ser.serial_number, ser.in_bill_no, ser.create_time, ser.update_time
+        FROM jsh_serial_number ser
+        left join jsh_material m on m.id=ser.material_id and ifnull(m.delete_flag, '0') != '1'
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_flag,'0') !='1'
+        where 1=1 and me.default_flag=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and ser.serial_number like #{bindName}
+        </if>
+        <if test="depotId != null">
+            and ser.depot_id = #{depotId}
+        </if>
+        <if test="barCode != null">
+            and me.bar_code= #{barCode}
+        </if>
+        and (ser.is_sell = '0'
+        <if test="number != null">
+            or ser.out_bill_no = #{number}
+        </if>
+        )
+        and ifnull(ser.delete_flag,'0') !='1'
+        order by ser.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="getEnableSerialNumberCount" resultType="java.lang.Long">
+        select
+        count(1)
+        FROM jsh_serial_number ser
+        left join jsh_material m on m.id=ser.material_id and ifnull(m.delete_flag, '0') != '1'
+        left join jsh_material_extend me on me.material_id=m.id and ifnull(me.delete_flag,'0') !='1'
+        where 1=1 and me.default_flag=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and ser.serial_number like #{bindName}
+        </if>
+        <if test="depotId != null">
+            and ser.depot_id = #{depotId}
+        </if>
+        <if test="barCode != null">
+            and me.bar_code= #{barCode}
+        </if>
+        and (ser.is_sell = '0'
+        <if test="number != null">
+            or ser.out_bill_no = #{number}
+        </if>
+        )
+        and ifnull(ser.delete_flag,'0') !='1'
+    </select>
+
+    <select id="getIsNotSellCountByParam" resultType="java.lang.Integer">
+        select count(1) from jsh_serial_number
+        where material_id = #{materialId}
+        and serial_number = #{serialNumber}
+        and is_sell = '0'
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SupplierMapper.xml b/src/main/resources/mapper_xml/SupplierMapper.xml
new file mode 100644
index 0000000..d58d390
--- /dev/null
+++ b/src/main/resources/mapper_xml/SupplierMapper.xml
@@ -0,0 +1,527 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SupplierMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Supplier">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="supplier" jdbcType="VARCHAR" property="supplier" />
+    <result column="contacts" jdbcType="VARCHAR" property="contacts" />
+    <result column="phone_num" jdbcType="VARCHAR" property="phoneNum" />
+    <result column="email" jdbcType="VARCHAR" property="email" />
+    <result column="description" jdbcType="VARCHAR" property="description" />
+    <result column="isystem" jdbcType="TINYINT" property="isystem" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="advance_in" jdbcType="DECIMAL" property="advanceIn" />
+    <result column="begin_need_get" jdbcType="DECIMAL" property="beginNeedGet" />
+    <result column="begin_need_pay" jdbcType="DECIMAL" property="beginNeedPay" />
+    <result column="all_need_get" jdbcType="DECIMAL" property="allNeedGet" />
+    <result column="all_need_pay" jdbcType="DECIMAL" property="allNeedPay" />
+    <result column="fax" jdbcType="VARCHAR" property="fax" />
+    <result column="telephone" jdbcType="VARCHAR" property="telephone" />
+    <result column="address" jdbcType="VARCHAR" property="address" />
+    <result column="tax_num" jdbcType="VARCHAR" property="taxNum" />
+    <result column="bank_name" jdbcType="VARCHAR" property="bankName" />
+    <result column="account_number" jdbcType="VARCHAR" property="accountNumber" />
+    <result column="tax_rate" jdbcType="DECIMAL" property="taxRate" />
+    <result column="sort" jdbcType="VARCHAR" property="sort" />
+    <result column="creator" jdbcType="BIGINT" property="creator" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, supplier, contacts, phone_num, email, description, isystem, type, enabled, advance_in, 
+    begin_need_get, begin_need_pay, all_need_get, all_need_pay, fax, telephone, address, 
+    tax_num, bank_name, account_number, tax_rate, sort, creator, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.SupplierExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_supplier
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_supplier
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_supplier
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.SupplierExample">
+    delete from jsh_supplier
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Supplier">
+    insert into jsh_supplier (id, supplier, contacts, 
+      phone_num, email, description, 
+      isystem, type, enabled, 
+      advance_in, begin_need_get, begin_need_pay, 
+      all_need_get, all_need_pay, fax, 
+      telephone, address, tax_num, 
+      bank_name, account_number, tax_rate, 
+      sort, creator, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{supplier,jdbcType=VARCHAR}, #{contacts,jdbcType=VARCHAR}, 
+      #{phoneNum,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, 
+      #{isystem,jdbcType=TINYINT}, #{type,jdbcType=VARCHAR}, #{enabled,jdbcType=BIT}, 
+      #{advanceIn,jdbcType=DECIMAL}, #{beginNeedGet,jdbcType=DECIMAL}, #{beginNeedPay,jdbcType=DECIMAL}, 
+      #{allNeedGet,jdbcType=DECIMAL}, #{allNeedPay,jdbcType=DECIMAL}, #{fax,jdbcType=VARCHAR}, 
+      #{telephone,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, #{taxNum,jdbcType=VARCHAR}, 
+      #{bankName,jdbcType=VARCHAR}, #{accountNumber,jdbcType=VARCHAR}, #{taxRate,jdbcType=DECIMAL}, 
+      #{sort,jdbcType=VARCHAR}, #{creator,jdbcType=BIGINT}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Supplier">
+    insert into jsh_supplier
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="supplier != null">
+        supplier,
+      </if>
+      <if test="contacts != null">
+        contacts,
+      </if>
+      <if test="phoneNum != null">
+        phone_num,
+      </if>
+      <if test="email != null">
+        email,
+      </if>
+      <if test="description != null">
+        description,
+      </if>
+      <if test="isystem != null">
+        isystem,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="advanceIn != null">
+        advance_in,
+      </if>
+      <if test="beginNeedGet != null">
+        begin_need_get,
+      </if>
+      <if test="beginNeedPay != null">
+        begin_need_pay,
+      </if>
+      <if test="allNeedGet != null">
+        all_need_get,
+      </if>
+      <if test="allNeedPay != null">
+        all_need_pay,
+      </if>
+      <if test="fax != null">
+        fax,
+      </if>
+      <if test="telephone != null">
+        telephone,
+      </if>
+      <if test="address != null">
+        address,
+      </if>
+      <if test="taxNum != null">
+        tax_num,
+      </if>
+      <if test="bankName != null">
+        bank_name,
+      </if>
+      <if test="accountNumber != null">
+        account_number,
+      </if>
+      <if test="taxRate != null">
+        tax_rate,
+      </if>
+      <if test="sort != null">
+        sort,
+      </if>
+      <if test="creator != null">
+        creator,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="supplier != null">
+        #{supplier,jdbcType=VARCHAR},
+      </if>
+      <if test="contacts != null">
+        #{contacts,jdbcType=VARCHAR},
+      </if>
+      <if test="phoneNum != null">
+        #{phoneNum,jdbcType=VARCHAR},
+      </if>
+      <if test="email != null">
+        #{email,jdbcType=VARCHAR},
+      </if>
+      <if test="description != null">
+        #{description,jdbcType=VARCHAR},
+      </if>
+      <if test="isystem != null">
+        #{isystem,jdbcType=TINYINT},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="advanceIn != null">
+        #{advanceIn,jdbcType=DECIMAL},
+      </if>
+      <if test="beginNeedGet != null">
+        #{beginNeedGet,jdbcType=DECIMAL},
+      </if>
+      <if test="beginNeedPay != null">
+        #{beginNeedPay,jdbcType=DECIMAL},
+      </if>
+      <if test="allNeedGet != null">
+        #{allNeedGet,jdbcType=DECIMAL},
+      </if>
+      <if test="allNeedPay != null">
+        #{allNeedPay,jdbcType=DECIMAL},
+      </if>
+      <if test="fax != null">
+        #{fax,jdbcType=VARCHAR},
+      </if>
+      <if test="telephone != null">
+        #{telephone,jdbcType=VARCHAR},
+      </if>
+      <if test="address != null">
+        #{address,jdbcType=VARCHAR},
+      </if>
+      <if test="taxNum != null">
+        #{taxNum,jdbcType=VARCHAR},
+      </if>
+      <if test="bankName != null">
+        #{bankName,jdbcType=VARCHAR},
+      </if>
+      <if test="accountNumber != null">
+        #{accountNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="taxRate != null">
+        #{taxRate,jdbcType=DECIMAL},
+      </if>
+      <if test="sort != null">
+        #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="creator != null">
+        #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.SupplierExample" resultType="java.lang.Long">
+    select count(*) from jsh_supplier
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_supplier
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.supplier != null">
+        supplier = #{record.supplier,jdbcType=VARCHAR},
+      </if>
+      <if test="record.contacts != null">
+        contacts = #{record.contacts,jdbcType=VARCHAR},
+      </if>
+      <if test="record.phoneNum != null">
+        phone_num = #{record.phoneNum,jdbcType=VARCHAR},
+      </if>
+      <if test="record.email != null">
+        email = #{record.email,jdbcType=VARCHAR},
+      </if>
+      <if test="record.description != null">
+        description = #{record.description,jdbcType=VARCHAR},
+      </if>
+      <if test="record.isystem != null">
+        isystem = #{record.isystem,jdbcType=TINYINT},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.advanceIn != null">
+        advance_in = #{record.advanceIn,jdbcType=DECIMAL},
+      </if>
+      <if test="record.beginNeedGet != null">
+        begin_need_get = #{record.beginNeedGet,jdbcType=DECIMAL},
+      </if>
+      <if test="record.beginNeedPay != null">
+        begin_need_pay = #{record.beginNeedPay,jdbcType=DECIMAL},
+      </if>
+      <if test="record.allNeedGet != null">
+        all_need_get = #{record.allNeedGet,jdbcType=DECIMAL},
+      </if>
+      <if test="record.allNeedPay != null">
+        all_need_pay = #{record.allNeedPay,jdbcType=DECIMAL},
+      </if>
+      <if test="record.fax != null">
+        fax = #{record.fax,jdbcType=VARCHAR},
+      </if>
+      <if test="record.telephone != null">
+        telephone = #{record.telephone,jdbcType=VARCHAR},
+      </if>
+      <if test="record.address != null">
+        address = #{record.address,jdbcType=VARCHAR},
+      </if>
+      <if test="record.taxNum != null">
+        tax_num = #{record.taxNum,jdbcType=VARCHAR},
+      </if>
+      <if test="record.bankName != null">
+        bank_name = #{record.bankName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.accountNumber != null">
+        account_number = #{record.accountNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="record.taxRate != null">
+        tax_rate = #{record.taxRate,jdbcType=DECIMAL},
+      </if>
+      <if test="record.sort != null">
+        sort = #{record.sort,jdbcType=VARCHAR},
+      </if>
+      <if test="record.creator != null">
+        creator = #{record.creator,jdbcType=BIGINT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_supplier
+    set id = #{record.id,jdbcType=BIGINT},
+      supplier = #{record.supplier,jdbcType=VARCHAR},
+      contacts = #{record.contacts,jdbcType=VARCHAR},
+      phone_num = #{record.phoneNum,jdbcType=VARCHAR},
+      email = #{record.email,jdbcType=VARCHAR},
+      description = #{record.description,jdbcType=VARCHAR},
+      isystem = #{record.isystem,jdbcType=TINYINT},
+      type = #{record.type,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      advance_in = #{record.advanceIn,jdbcType=DECIMAL},
+      begin_need_get = #{record.beginNeedGet,jdbcType=DECIMAL},
+      begin_need_pay = #{record.beginNeedPay,jdbcType=DECIMAL},
+      all_need_get = #{record.allNeedGet,jdbcType=DECIMAL},
+      all_need_pay = #{record.allNeedPay,jdbcType=DECIMAL},
+      fax = #{record.fax,jdbcType=VARCHAR},
+      telephone = #{record.telephone,jdbcType=VARCHAR},
+      address = #{record.address,jdbcType=VARCHAR},
+      tax_num = #{record.taxNum,jdbcType=VARCHAR},
+      bank_name = #{record.bankName,jdbcType=VARCHAR},
+      account_number = #{record.accountNumber,jdbcType=VARCHAR},
+      tax_rate = #{record.taxRate,jdbcType=DECIMAL},
+      sort = #{record.sort,jdbcType=VARCHAR},
+      creator = #{record.creator,jdbcType=BIGINT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Supplier">
+    update jsh_supplier
+    <set>
+      <if test="supplier != null">
+        supplier = #{supplier,jdbcType=VARCHAR},
+      </if>
+      <if test="contacts != null">
+        contacts = #{contacts,jdbcType=VARCHAR},
+      </if>
+      <if test="phoneNum != null">
+        phone_num = #{phoneNum,jdbcType=VARCHAR},
+      </if>
+      <if test="email != null">
+        email = #{email,jdbcType=VARCHAR},
+      </if>
+      <if test="description != null">
+        description = #{description,jdbcType=VARCHAR},
+      </if>
+      <if test="isystem != null">
+        isystem = #{isystem,jdbcType=TINYINT},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="advanceIn != null">
+        advance_in = #{advanceIn,jdbcType=DECIMAL},
+      </if>
+      <if test="beginNeedGet != null">
+        begin_need_get = #{beginNeedGet,jdbcType=DECIMAL},
+      </if>
+      <if test="beginNeedPay != null">
+        begin_need_pay = #{beginNeedPay,jdbcType=DECIMAL},
+      </if>
+      <if test="allNeedGet != null">
+        all_need_get = #{allNeedGet,jdbcType=DECIMAL},
+      </if>
+      <if test="allNeedPay != null">
+        all_need_pay = #{allNeedPay,jdbcType=DECIMAL},
+      </if>
+      <if test="fax != null">
+        fax = #{fax,jdbcType=VARCHAR},
+      </if>
+      <if test="telephone != null">
+        telephone = #{telephone,jdbcType=VARCHAR},
+      </if>
+      <if test="address != null">
+        address = #{address,jdbcType=VARCHAR},
+      </if>
+      <if test="taxNum != null">
+        tax_num = #{taxNum,jdbcType=VARCHAR},
+      </if>
+      <if test="bankName != null">
+        bank_name = #{bankName,jdbcType=VARCHAR},
+      </if>
+      <if test="accountNumber != null">
+        account_number = #{accountNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="taxRate != null">
+        tax_rate = #{taxRate,jdbcType=DECIMAL},
+      </if>
+      <if test="sort != null">
+        sort = #{sort,jdbcType=VARCHAR},
+      </if>
+      <if test="creator != null">
+        creator = #{creator,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Supplier">
+    update jsh_supplier
+    set supplier = #{supplier,jdbcType=VARCHAR},
+      contacts = #{contacts,jdbcType=VARCHAR},
+      phone_num = #{phoneNum,jdbcType=VARCHAR},
+      email = #{email,jdbcType=VARCHAR},
+      description = #{description,jdbcType=VARCHAR},
+      isystem = #{isystem,jdbcType=TINYINT},
+      type = #{type,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      advance_in = #{advanceIn,jdbcType=DECIMAL},
+      begin_need_get = #{beginNeedGet,jdbcType=DECIMAL},
+      begin_need_pay = #{beginNeedPay,jdbcType=DECIMAL},
+      all_need_get = #{allNeedGet,jdbcType=DECIMAL},
+      all_need_pay = #{allNeedPay,jdbcType=DECIMAL},
+      fax = #{fax,jdbcType=VARCHAR},
+      telephone = #{telephone,jdbcType=VARCHAR},
+      address = #{address,jdbcType=VARCHAR},
+      tax_num = #{taxNum,jdbcType=VARCHAR},
+      bank_name = #{bankName,jdbcType=VARCHAR},
+      account_number = #{accountNumber,jdbcType=VARCHAR},
+      tax_rate = #{taxRate,jdbcType=DECIMAL},
+      sort = #{sort,jdbcType=VARCHAR},
+      creator = #{creator,jdbcType=BIGINT},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SupplierMapperEx.xml b/src/main/resources/mapper_xml/SupplierMapperEx.xml
new file mode 100644
index 0000000..208b1e8
--- /dev/null
+++ b/src/main/resources/mapper_xml/SupplierMapperEx.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SupplierMapperEx">
+    <select id="selectByConditionSupplier" parameterType="com.jsh.erp.datasource.entities.SupplierExample" resultMap="com.jsh.erp.datasource.mappers.SupplierMapper.BaseResultMap">
+        select *
+        FROM jsh_supplier
+        where 1=1
+        <if test="supplier != null and supplier !=''">
+            <bind name="bindSupplier" value="'%'+supplier+'%'"/>
+            and supplier like #{bindSupplier}
+        </if>
+        <if test="type != null and type !=''">
+            and type=#{type}
+        </if>
+        <if test="phonenum != null and phonenum !=''">
+            <bind name="bindPhoneNum" value="'%'+phonenum+'%'"/>
+            and phone_num like #{bindPhoneNum}
+        </if>
+        <if test="telephone != null and telephone !=''">
+            <bind name="bindTelephone" value="'%'+telephone+'%'"/>
+            and telephone like #{bindTelephone}
+        </if>
+        <if test="creatorArray != null">
+            and creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc, id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsBySupplier" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_supplier
+        WHERE 1=1
+        <if test="supplier != null and supplier !=''">
+            <bind name="bindSupplier" value="'%'+supplier+'%'"/>
+            and supplier like #{bindSupplier}
+        </if>
+        <if test="type != null and type !=''">
+            and type=#{type}
+        </if>
+        <if test="phonenum != null and phonenum !=''">
+            <bind name="bindPhoneNum" value="'%'+phonenum+'%'"/>
+            and phone_num like #{bindPhoneNum}
+        </if>
+        <if test="telephone != null and telephone !=''">
+            <bind name="bindTelephone" value="'%'+telephone+'%'"/>
+            and telephone like #{bindTelephone}
+        </if>
+        <if test="creatorArray != null">
+            and creator in (
+            <foreach collection="creatorArray" item="creator" separator=",">
+                #{creator}
+            </foreach>
+            )
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <select id="findByAll" parameterType="com.jsh.erp.datasource.entities.SupplierExample" resultMap="com.jsh.erp.datasource.mappers.SupplierMapper.BaseResultMap">
+        select *
+        FROM jsh_supplier
+        where 1=1
+        <if test="supplier != null and supplier !=''">
+            <bind name="bindSupplier" value="'%'+supplier+'%'"/>
+            and supplier like #{bindSupplier}
+        </if>
+        <if test="type != null and type !=''">
+            and type=#{type}
+        </if>
+        <if test="phonenum != null and phonenum !=''">
+            <bind name="bindPhoneNum" value="'%'+phonenum+'%'"/>
+            and phone_num like #{bindPhoneNum}
+        </if>
+        <if test="telephone != null and telephone !=''">
+            <bind name="bindTelephone" value="'%'+telephone+'%'"/>
+            and telephone like #{bindTelephone}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by sort asc, id desc
+    </select>
+
+    <update id="batchDeleteSupplierByIds">
+        update jsh_supplier
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <select id="getSupplierByNameAndType" resultType="com.jsh.erp.datasource.entities.Supplier">
+        select *
+        from jsh_supplier
+        where supplier = #{supplier} and type = #{type}
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SystemConfigMapper.xml b/src/main/resources/mapper_xml/SystemConfigMapper.xml
new file mode 100644
index 0000000..54d871c
--- /dev/null
+++ b/src/main/resources/mapper_xml/SystemConfigMapper.xml
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SystemConfigMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.SystemConfig">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="company_name" jdbcType="VARCHAR" property="companyName" />
+    <result column="company_contacts" jdbcType="VARCHAR" property="companyContacts" />
+    <result column="company_address" jdbcType="VARCHAR" property="companyAddress" />
+    <result column="company_tel" jdbcType="VARCHAR" property="companyTel" />
+    <result column="company_fax" jdbcType="VARCHAR" property="companyFax" />
+    <result column="company_post_code" jdbcType="VARCHAR" property="companyPostCode" />
+    <result column="sale_agreement" jdbcType="VARCHAR" property="saleAgreement" />
+    <result column="depot_flag" jdbcType="VARCHAR" property="depotFlag" />
+    <result column="customer_flag" jdbcType="VARCHAR" property="customerFlag" />
+    <result column="minus_stock_flag" jdbcType="VARCHAR" property="minusStockFlag" />
+    <result column="purchase_by_sale_flag" jdbcType="VARCHAR" property="purchaseBySaleFlag" />
+    <result column="multi_level_approval_flag" jdbcType="VARCHAR" property="multiLevelApprovalFlag" />
+    <result column="multi_bill_type" jdbcType="VARCHAR" property="multiBillType" />
+    <result column="force_approval_flag" jdbcType="VARCHAR" property="forceApprovalFlag" />
+    <result column="update_unit_price_flag" jdbcType="VARCHAR" property="updateUnitPriceFlag" />
+    <result column="over_link_bill_flag" jdbcType="VARCHAR" property="overLinkBillFlag" />
+    <result column="in_out_manage_flag" jdbcType="VARCHAR" property="inOutManageFlag" />
+    <result column="multi_account_flag" jdbcType="VARCHAR" property="multiAccountFlag" />
+    <result column="move_avg_price_flag" jdbcType="VARCHAR" property="moveAvgPriceFlag" />
+    <result column="audit_print_flag" jdbcType="VARCHAR" property="auditPrintFlag" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, company_name, company_contacts, company_address, company_tel, company_fax, company_post_code, 
+    sale_agreement, depot_flag, customer_flag, minus_stock_flag, purchase_by_sale_flag, 
+    multi_level_approval_flag, multi_bill_type, force_approval_flag, update_unit_price_flag, 
+    over_link_bill_flag, in_out_manage_flag, multi_account_flag, move_avg_price_flag, 
+    audit_print_flag, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.SystemConfigExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_system_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_system_config
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_system_config
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.SystemConfigExample">
+    delete from jsh_system_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.SystemConfig">
+    insert into jsh_system_config (id, company_name, company_contacts, 
+      company_address, company_tel, company_fax, 
+      company_post_code, sale_agreement, depot_flag, 
+      customer_flag, minus_stock_flag, purchase_by_sale_flag, 
+      multi_level_approval_flag, multi_bill_type, 
+      force_approval_flag, update_unit_price_flag, 
+      over_link_bill_flag, in_out_manage_flag, multi_account_flag, 
+      move_avg_price_flag, audit_print_flag, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{companyName,jdbcType=VARCHAR}, #{companyContacts,jdbcType=VARCHAR}, 
+      #{companyAddress,jdbcType=VARCHAR}, #{companyTel,jdbcType=VARCHAR}, #{companyFax,jdbcType=VARCHAR}, 
+      #{companyPostCode,jdbcType=VARCHAR}, #{saleAgreement,jdbcType=VARCHAR}, #{depotFlag,jdbcType=VARCHAR}, 
+      #{customerFlag,jdbcType=VARCHAR}, #{minusStockFlag,jdbcType=VARCHAR}, #{purchaseBySaleFlag,jdbcType=VARCHAR}, 
+      #{multiLevelApprovalFlag,jdbcType=VARCHAR}, #{multiBillType,jdbcType=VARCHAR}, 
+      #{forceApprovalFlag,jdbcType=VARCHAR}, #{updateUnitPriceFlag,jdbcType=VARCHAR}, 
+      #{overLinkBillFlag,jdbcType=VARCHAR}, #{inOutManageFlag,jdbcType=VARCHAR}, #{multiAccountFlag,jdbcType=VARCHAR}, 
+      #{moveAvgPriceFlag,jdbcType=VARCHAR}, #{auditPrintFlag,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.SystemConfig">
+    insert into jsh_system_config
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="companyName != null">
+        company_name,
+      </if>
+      <if test="companyContacts != null">
+        company_contacts,
+      </if>
+      <if test="companyAddress != null">
+        company_address,
+      </if>
+      <if test="companyTel != null">
+        company_tel,
+      </if>
+      <if test="companyFax != null">
+        company_fax,
+      </if>
+      <if test="companyPostCode != null">
+        company_post_code,
+      </if>
+      <if test="saleAgreement != null">
+        sale_agreement,
+      </if>
+      <if test="depotFlag != null">
+        depot_flag,
+      </if>
+      <if test="customerFlag != null">
+        customer_flag,
+      </if>
+      <if test="minusStockFlag != null">
+        minus_stock_flag,
+      </if>
+      <if test="purchaseBySaleFlag != null">
+        purchase_by_sale_flag,
+      </if>
+      <if test="multiLevelApprovalFlag != null">
+        multi_level_approval_flag,
+      </if>
+      <if test="multiBillType != null">
+        multi_bill_type,
+      </if>
+      <if test="forceApprovalFlag != null">
+        force_approval_flag,
+      </if>
+      <if test="updateUnitPriceFlag != null">
+        update_unit_price_flag,
+      </if>
+      <if test="overLinkBillFlag != null">
+        over_link_bill_flag,
+      </if>
+      <if test="inOutManageFlag != null">
+        in_out_manage_flag,
+      </if>
+      <if test="multiAccountFlag != null">
+        multi_account_flag,
+      </if>
+      <if test="moveAvgPriceFlag != null">
+        move_avg_price_flag,
+      </if>
+      <if test="auditPrintFlag != null">
+        audit_print_flag,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="companyName != null">
+        #{companyName,jdbcType=VARCHAR},
+      </if>
+      <if test="companyContacts != null">
+        #{companyContacts,jdbcType=VARCHAR},
+      </if>
+      <if test="companyAddress != null">
+        #{companyAddress,jdbcType=VARCHAR},
+      </if>
+      <if test="companyTel != null">
+        #{companyTel,jdbcType=VARCHAR},
+      </if>
+      <if test="companyFax != null">
+        #{companyFax,jdbcType=VARCHAR},
+      </if>
+      <if test="companyPostCode != null">
+        #{companyPostCode,jdbcType=VARCHAR},
+      </if>
+      <if test="saleAgreement != null">
+        #{saleAgreement,jdbcType=VARCHAR},
+      </if>
+      <if test="depotFlag != null">
+        #{depotFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="customerFlag != null">
+        #{customerFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="minusStockFlag != null">
+        #{minusStockFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="purchaseBySaleFlag != null">
+        #{purchaseBySaleFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="multiLevelApprovalFlag != null">
+        #{multiLevelApprovalFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="multiBillType != null">
+        #{multiBillType,jdbcType=VARCHAR},
+      </if>
+      <if test="forceApprovalFlag != null">
+        #{forceApprovalFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="updateUnitPriceFlag != null">
+        #{updateUnitPriceFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="overLinkBillFlag != null">
+        #{overLinkBillFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="inOutManageFlag != null">
+        #{inOutManageFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="multiAccountFlag != null">
+        #{multiAccountFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="moveAvgPriceFlag != null">
+        #{moveAvgPriceFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="auditPrintFlag != null">
+        #{auditPrintFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.SystemConfigExample" resultType="java.lang.Long">
+    select count(*) from jsh_system_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_system_config
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.companyName != null">
+        company_name = #{record.companyName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.companyContacts != null">
+        company_contacts = #{record.companyContacts,jdbcType=VARCHAR},
+      </if>
+      <if test="record.companyAddress != null">
+        company_address = #{record.companyAddress,jdbcType=VARCHAR},
+      </if>
+      <if test="record.companyTel != null">
+        company_tel = #{record.companyTel,jdbcType=VARCHAR},
+      </if>
+      <if test="record.companyFax != null">
+        company_fax = #{record.companyFax,jdbcType=VARCHAR},
+      </if>
+      <if test="record.companyPostCode != null">
+        company_post_code = #{record.companyPostCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.saleAgreement != null">
+        sale_agreement = #{record.saleAgreement,jdbcType=VARCHAR},
+      </if>
+      <if test="record.depotFlag != null">
+        depot_flag = #{record.depotFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.customerFlag != null">
+        customer_flag = #{record.customerFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.minusStockFlag != null">
+        minus_stock_flag = #{record.minusStockFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.purchaseBySaleFlag != null">
+        purchase_by_sale_flag = #{record.purchaseBySaleFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.multiLevelApprovalFlag != null">
+        multi_level_approval_flag = #{record.multiLevelApprovalFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.multiBillType != null">
+        multi_bill_type = #{record.multiBillType,jdbcType=VARCHAR},
+      </if>
+      <if test="record.forceApprovalFlag != null">
+        force_approval_flag = #{record.forceApprovalFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.updateUnitPriceFlag != null">
+        update_unit_price_flag = #{record.updateUnitPriceFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.overLinkBillFlag != null">
+        over_link_bill_flag = #{record.overLinkBillFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.inOutManageFlag != null">
+        in_out_manage_flag = #{record.inOutManageFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.multiAccountFlag != null">
+        multi_account_flag = #{record.multiAccountFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.moveAvgPriceFlag != null">
+        move_avg_price_flag = #{record.moveAvgPriceFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.auditPrintFlag != null">
+        audit_print_flag = #{record.auditPrintFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_system_config
+    set id = #{record.id,jdbcType=BIGINT},
+      company_name = #{record.companyName,jdbcType=VARCHAR},
+      company_contacts = #{record.companyContacts,jdbcType=VARCHAR},
+      company_address = #{record.companyAddress,jdbcType=VARCHAR},
+      company_tel = #{record.companyTel,jdbcType=VARCHAR},
+      company_fax = #{record.companyFax,jdbcType=VARCHAR},
+      company_post_code = #{record.companyPostCode,jdbcType=VARCHAR},
+      sale_agreement = #{record.saleAgreement,jdbcType=VARCHAR},
+      depot_flag = #{record.depotFlag,jdbcType=VARCHAR},
+      customer_flag = #{record.customerFlag,jdbcType=VARCHAR},
+      minus_stock_flag = #{record.minusStockFlag,jdbcType=VARCHAR},
+      purchase_by_sale_flag = #{record.purchaseBySaleFlag,jdbcType=VARCHAR},
+      multi_level_approval_flag = #{record.multiLevelApprovalFlag,jdbcType=VARCHAR},
+      multi_bill_type = #{record.multiBillType,jdbcType=VARCHAR},
+      force_approval_flag = #{record.forceApprovalFlag,jdbcType=VARCHAR},
+      update_unit_price_flag = #{record.updateUnitPriceFlag,jdbcType=VARCHAR},
+      over_link_bill_flag = #{record.overLinkBillFlag,jdbcType=VARCHAR},
+      in_out_manage_flag = #{record.inOutManageFlag,jdbcType=VARCHAR},
+      multi_account_flag = #{record.multiAccountFlag,jdbcType=VARCHAR},
+      move_avg_price_flag = #{record.moveAvgPriceFlag,jdbcType=VARCHAR},
+      audit_print_flag = #{record.auditPrintFlag,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.SystemConfig">
+    update jsh_system_config
+    <set>
+      <if test="companyName != null">
+        company_name = #{companyName,jdbcType=VARCHAR},
+      </if>
+      <if test="companyContacts != null">
+        company_contacts = #{companyContacts,jdbcType=VARCHAR},
+      </if>
+      <if test="companyAddress != null">
+        company_address = #{companyAddress,jdbcType=VARCHAR},
+      </if>
+      <if test="companyTel != null">
+        company_tel = #{companyTel,jdbcType=VARCHAR},
+      </if>
+      <if test="companyFax != null">
+        company_fax = #{companyFax,jdbcType=VARCHAR},
+      </if>
+      <if test="companyPostCode != null">
+        company_post_code = #{companyPostCode,jdbcType=VARCHAR},
+      </if>
+      <if test="saleAgreement != null">
+        sale_agreement = #{saleAgreement,jdbcType=VARCHAR},
+      </if>
+      <if test="depotFlag != null">
+        depot_flag = #{depotFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="customerFlag != null">
+        customer_flag = #{customerFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="minusStockFlag != null">
+        minus_stock_flag = #{minusStockFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="purchaseBySaleFlag != null">
+        purchase_by_sale_flag = #{purchaseBySaleFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="multiLevelApprovalFlag != null">
+        multi_level_approval_flag = #{multiLevelApprovalFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="multiBillType != null">
+        multi_bill_type = #{multiBillType,jdbcType=VARCHAR},
+      </if>
+      <if test="forceApprovalFlag != null">
+        force_approval_flag = #{forceApprovalFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="updateUnitPriceFlag != null">
+        update_unit_price_flag = #{updateUnitPriceFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="overLinkBillFlag != null">
+        over_link_bill_flag = #{overLinkBillFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="inOutManageFlag != null">
+        in_out_manage_flag = #{inOutManageFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="multiAccountFlag != null">
+        multi_account_flag = #{multiAccountFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="moveAvgPriceFlag != null">
+        move_avg_price_flag = #{moveAvgPriceFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="auditPrintFlag != null">
+        audit_print_flag = #{auditPrintFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.SystemConfig">
+    update jsh_system_config
+    set company_name = #{companyName,jdbcType=VARCHAR},
+      company_contacts = #{companyContacts,jdbcType=VARCHAR},
+      company_address = #{companyAddress,jdbcType=VARCHAR},
+      company_tel = #{companyTel,jdbcType=VARCHAR},
+      company_fax = #{companyFax,jdbcType=VARCHAR},
+      company_post_code = #{companyPostCode,jdbcType=VARCHAR},
+      sale_agreement = #{saleAgreement,jdbcType=VARCHAR},
+      depot_flag = #{depotFlag,jdbcType=VARCHAR},
+      customer_flag = #{customerFlag,jdbcType=VARCHAR},
+      minus_stock_flag = #{minusStockFlag,jdbcType=VARCHAR},
+      purchase_by_sale_flag = #{purchaseBySaleFlag,jdbcType=VARCHAR},
+      multi_level_approval_flag = #{multiLevelApprovalFlag,jdbcType=VARCHAR},
+      multi_bill_type = #{multiBillType,jdbcType=VARCHAR},
+      force_approval_flag = #{forceApprovalFlag,jdbcType=VARCHAR},
+      update_unit_price_flag = #{updateUnitPriceFlag,jdbcType=VARCHAR},
+      over_link_bill_flag = #{overLinkBillFlag,jdbcType=VARCHAR},
+      in_out_manage_flag = #{inOutManageFlag,jdbcType=VARCHAR},
+      multi_account_flag = #{multiAccountFlag,jdbcType=VARCHAR},
+      move_avg_price_flag = #{moveAvgPriceFlag,jdbcType=VARCHAR},
+      audit_print_flag = #{auditPrintFlag,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/SystemConfigMapperEx.xml b/src/main/resources/mapper_xml/SystemConfigMapperEx.xml
new file mode 100644
index 0000000..0473f86
--- /dev/null
+++ b/src/main/resources/mapper_xml/SystemConfigMapperEx.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.SystemConfigMapperEx">
+    <select id="selectByConditionSystemConfig" parameterType="com.jsh.erp.datasource.entities.SystemConfigExample" resultMap="com.jsh.erp.datasource.mappers.SystemConfigMapper.BaseResultMap">
+        select *
+        FROM jsh_system_config
+        where 1=1
+        <if test="companyName != null">
+            <bind name="bindCompanyName" value="'%'+companyName+'%'"/>
+            and company_name like #{bindCompanyName}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsBySystemConfig" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_system_config
+        WHERE 1=1
+        <if test="companyName != null">
+            <bind name="bindCompanyName" value="'%'+companyName+'%'"/>
+            and company_name like #{bindCompanyName}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <update id="batchDeleteSystemConfigByIds">
+        update jsh_system_config
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/TenantMapper.xml b/src/main/resources/mapper_xml/TenantMapper.xml
new file mode 100644
index 0000000..1ab4d27
--- /dev/null
+++ b/src/main/resources/mapper_xml/TenantMapper.xml
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.TenantMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Tenant">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="login_name" jdbcType="VARCHAR" property="loginName" />
+    <result column="user_num_limit" jdbcType="INTEGER" property="userNumLimit" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="expire_time" jdbcType="TIMESTAMP" property="expireTime" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, tenant_id, login_name, user_num_limit, type, enabled, create_time, expire_time, 
+    remark, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.TenantExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_tenant
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_tenant
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_tenant
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.TenantExample">
+    delete from jsh_tenant
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Tenant">
+    insert into jsh_tenant (id, tenant_id, login_name, 
+      user_num_limit, type, enabled, 
+      create_time, expire_time, remark, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{tenantId,jdbcType=BIGINT}, #{loginName,jdbcType=VARCHAR}, 
+      #{userNumLimit,jdbcType=INTEGER}, #{type,jdbcType=VARCHAR}, #{enabled,jdbcType=BIT}, 
+      #{createTime,jdbcType=TIMESTAMP}, #{expireTime,jdbcType=TIMESTAMP}, #{remark,jdbcType=VARCHAR}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Tenant">
+    insert into jsh_tenant
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="loginName != null">
+        login_name,
+      </if>
+      <if test="userNumLimit != null">
+        user_num_limit,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="expireTime != null">
+        expire_time,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="loginName != null">
+        #{loginName,jdbcType=VARCHAR},
+      </if>
+      <if test="userNumLimit != null">
+        #{userNumLimit,jdbcType=INTEGER},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="expireTime != null">
+        #{expireTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.TenantExample" resultType="java.lang.Long">
+    select count(*) from jsh_tenant
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_tenant
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.loginName != null">
+        login_name = #{record.loginName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.userNumLimit != null">
+        user_num_limit = #{record.userNumLimit,jdbcType=INTEGER},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.expireTime != null">
+        expire_time = #{record.expireTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_tenant
+    set id = #{record.id,jdbcType=BIGINT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      login_name = #{record.loginName,jdbcType=VARCHAR},
+      user_num_limit = #{record.userNumLimit,jdbcType=INTEGER},
+      type = #{record.type,jdbcType=VARCHAR},
+      enabled = #{record.enabled,jdbcType=BIT},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      expire_time = #{record.expireTime,jdbcType=TIMESTAMP},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Tenant">
+    update jsh_tenant
+    <set>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="loginName != null">
+        login_name = #{loginName,jdbcType=VARCHAR},
+      </if>
+      <if test="userNumLimit != null">
+        user_num_limit = #{userNumLimit,jdbcType=INTEGER},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="expireTime != null">
+        expire_time = #{expireTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Tenant">
+    update jsh_tenant
+    set tenant_id = #{tenantId,jdbcType=BIGINT},
+      login_name = #{loginName,jdbcType=VARCHAR},
+      user_num_limit = #{userNumLimit,jdbcType=INTEGER},
+      type = #{type,jdbcType=VARCHAR},
+      enabled = #{enabled,jdbcType=BIT},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      expire_time = #{expireTime,jdbcType=TIMESTAMP},
+      remark = #{remark,jdbcType=VARCHAR},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/TenantMapperEx.xml b/src/main/resources/mapper_xml/TenantMapperEx.xml
new file mode 100644
index 0000000..f170457
--- /dev/null
+++ b/src/main/resources/mapper_xml/TenantMapperEx.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.TenantMapperEx">
+
+    <resultMap extends="com.jsh.erp.datasource.mappers.LogMapper.BaseResultMap" id="ResultMapEx" type="com.jsh.erp.datasource.entities.TenantEx">
+        <result column="roleId" jdbcType="VARCHAR" property="roleId" />
+        <result column="roleName" jdbcType="VARCHAR" property="roleName" />
+        <result column="userCount" jdbcType="VARCHAR" property="userCount" />
+    </resultMap>
+
+    <select id="selectByConditionTenant" parameterType="com.jsh.erp.datasource.entities.TenantExample" resultMap="ResultMapEx">
+        select t.*,
+        (select r.id from jsh_user_business ub
+        left join jsh_role r on ub.value=concat("[",r.id,"]") and ifnull(r.delete_flag,'0') !='1'
+        where ub.type='UserRole' and ub.key_id=t.tenant_id limit 0,1) roleId,
+        (select r.name from jsh_user_business ub
+        left join jsh_role r on ub.value=concat("[",r.id,"]") and ifnull(r.delete_flag,'0') !='1'
+        where ub.type='UserRole' and ub.key_id=t.tenant_id limit 0,1) roleName,
+        (select count(jsh_user.id) from jsh_user where jsh_user.status='0' and jsh_user.delete_flag=0 and jsh_user.tenant_id=t.tenant_id) userCount
+        from jsh_tenant t
+        where 1=1
+        <if test="loginName != null">
+            <bind name="bindLoginName" value="'%'+loginName+'%'"/>
+            and t.login_name like #{bindLoginName}
+        </if>
+        <if test="type != null and type != ''">
+            and t.type = #{type}
+        </if>
+        <if test="enabled != null and enabled != ''">
+            and t.enabled = #{enabled}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and t.remark like #{bindRemark}
+        </if>
+        and ifnull(t.delete_flag,'0') !='1'
+        order by t.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+
+    <select id="countsByTenant" resultType="java.lang.Long">
+        select
+        count(t.id)
+        from jsh_tenant t
+        where 1=1
+        <if test="loginName != null">
+            <bind name="bindLoginName" value="'%'+loginName+'%'"/>
+            and t.login_name like #{bindLoginName}
+        </if>
+        <if test="type != null and type != ''">
+            and t.type = #{type}
+        </if>
+        <if test="enabled != null and enabled != ''">
+            and t.enabled = #{enabled}
+        </if>
+        <if test="remark != null">
+            <bind name="bindRemark" value="'%'+remark+'%'"/>
+            and t.remark like #{bindRemark}
+        </if>
+        and ifnull(t.delete_flag,'0') !='1'
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/UnitMapper.xml b/src/main/resources/mapper_xml/UnitMapper.xml
new file mode 100644
index 0000000..ba0ca7f
--- /dev/null
+++ b/src/main/resources/mapper_xml/UnitMapper.xml
@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.UnitMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.Unit">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="basic_unit" jdbcType="VARCHAR" property="basicUnit" />
+    <result column="other_unit" jdbcType="VARCHAR" property="otherUnit" />
+    <result column="other_unit_two" jdbcType="VARCHAR" property="otherUnitTwo" />
+    <result column="other_unit_three" jdbcType="VARCHAR" property="otherUnitThree" />
+    <result column="ratio" jdbcType="DECIMAL" property="ratio" />
+    <result column="ratio_two" jdbcType="DECIMAL" property="ratioTwo" />
+    <result column="ratio_three" jdbcType="DECIMAL" property="ratioThree" />
+    <result column="enabled" jdbcType="BIT" property="enabled" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, name, basic_unit, other_unit, other_unit_two, other_unit_three, ratio, ratio_two, 
+    ratio_three, enabled, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.UnitExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_unit
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_unit
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_unit
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.UnitExample">
+    delete from jsh_unit
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.Unit">
+    insert into jsh_unit (id, name, basic_unit, 
+      other_unit, other_unit_two, other_unit_three, 
+      ratio, ratio_two, ratio_three, 
+      enabled, tenant_id, delete_flag
+      )
+    values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{basicUnit,jdbcType=VARCHAR}, 
+      #{otherUnit,jdbcType=VARCHAR}, #{otherUnitTwo,jdbcType=VARCHAR}, #{otherUnitThree,jdbcType=VARCHAR}, 
+      #{ratio,jdbcType=DECIMAL}, #{ratioTwo,jdbcType=DECIMAL}, #{ratioThree,jdbcType=DECIMAL}, 
+      #{enabled,jdbcType=BIT}, #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.Unit">
+    insert into jsh_unit
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="name != null">
+        name,
+      </if>
+      <if test="basicUnit != null">
+        basic_unit,
+      </if>
+      <if test="otherUnit != null">
+        other_unit,
+      </if>
+      <if test="otherUnitTwo != null">
+        other_unit_two,
+      </if>
+      <if test="otherUnitThree != null">
+        other_unit_three,
+      </if>
+      <if test="ratio != null">
+        ratio,
+      </if>
+      <if test="ratioTwo != null">
+        ratio_two,
+      </if>
+      <if test="ratioThree != null">
+        ratio_three,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="basicUnit != null">
+        #{basicUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="otherUnit != null">
+        #{otherUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="otherUnitTwo != null">
+        #{otherUnitTwo,jdbcType=VARCHAR},
+      </if>
+      <if test="otherUnitThree != null">
+        #{otherUnitThree,jdbcType=VARCHAR},
+      </if>
+      <if test="ratio != null">
+        #{ratio,jdbcType=DECIMAL},
+      </if>
+      <if test="ratioTwo != null">
+        #{ratioTwo,jdbcType=DECIMAL},
+      </if>
+      <if test="ratioThree != null">
+        #{ratioThree,jdbcType=DECIMAL},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=BIT},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.UnitExample" resultType="java.lang.Long">
+    select count(*) from jsh_unit
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_unit
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.name != null">
+        name = #{record.name,jdbcType=VARCHAR},
+      </if>
+      <if test="record.basicUnit != null">
+        basic_unit = #{record.basicUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="record.otherUnit != null">
+        other_unit = #{record.otherUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="record.otherUnitTwo != null">
+        other_unit_two = #{record.otherUnitTwo,jdbcType=VARCHAR},
+      </if>
+      <if test="record.otherUnitThree != null">
+        other_unit_three = #{record.otherUnitThree,jdbcType=VARCHAR},
+      </if>
+      <if test="record.ratio != null">
+        ratio = #{record.ratio,jdbcType=DECIMAL},
+      </if>
+      <if test="record.ratioTwo != null">
+        ratio_two = #{record.ratioTwo,jdbcType=DECIMAL},
+      </if>
+      <if test="record.ratioThree != null">
+        ratio_three = #{record.ratioThree,jdbcType=DECIMAL},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=BIT},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_unit
+    set id = #{record.id,jdbcType=BIGINT},
+      name = #{record.name,jdbcType=VARCHAR},
+      basic_unit = #{record.basicUnit,jdbcType=VARCHAR},
+      other_unit = #{record.otherUnit,jdbcType=VARCHAR},
+      other_unit_two = #{record.otherUnitTwo,jdbcType=VARCHAR},
+      other_unit_three = #{record.otherUnitThree,jdbcType=VARCHAR},
+      ratio = #{record.ratio,jdbcType=DECIMAL},
+      ratio_two = #{record.ratioTwo,jdbcType=DECIMAL},
+      ratio_three = #{record.ratioThree,jdbcType=DECIMAL},
+      enabled = #{record.enabled,jdbcType=BIT},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.Unit">
+    update jsh_unit
+    <set>
+      <if test="name != null">
+        name = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="basicUnit != null">
+        basic_unit = #{basicUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="otherUnit != null">
+        other_unit = #{otherUnit,jdbcType=VARCHAR},
+      </if>
+      <if test="otherUnitTwo != null">
+        other_unit_two = #{otherUnitTwo,jdbcType=VARCHAR},
+      </if>
+      <if test="otherUnitThree != null">
+        other_unit_three = #{otherUnitThree,jdbcType=VARCHAR},
+      </if>
+      <if test="ratio != null">
+        ratio = #{ratio,jdbcType=DECIMAL},
+      </if>
+      <if test="ratioTwo != null">
+        ratio_two = #{ratioTwo,jdbcType=DECIMAL},
+      </if>
+      <if test="ratioThree != null">
+        ratio_three = #{ratioThree,jdbcType=DECIMAL},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=BIT},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.Unit">
+    update jsh_unit
+    set name = #{name,jdbcType=VARCHAR},
+      basic_unit = #{basicUnit,jdbcType=VARCHAR},
+      other_unit = #{otherUnit,jdbcType=VARCHAR},
+      other_unit_two = #{otherUnitTwo,jdbcType=VARCHAR},
+      other_unit_three = #{otherUnitThree,jdbcType=VARCHAR},
+      ratio = #{ratio,jdbcType=DECIMAL},
+      ratio_two = #{ratioTwo,jdbcType=DECIMAL},
+      ratio_three = #{ratioThree,jdbcType=DECIMAL},
+      enabled = #{enabled,jdbcType=BIT},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/UnitMapperEx.xml b/src/main/resources/mapper_xml/UnitMapperEx.xml
new file mode 100644
index 0000000..f828176
--- /dev/null
+++ b/src/main/resources/mapper_xml/UnitMapperEx.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.UnitMapperEx">
+    <select id="selectByConditionUnit" parameterType="com.jsh.erp.datasource.entities.UnitExample" resultMap="com.jsh.erp.datasource.mappers.UnitMapper.BaseResultMap">
+        select *
+        FROM jsh_unit
+        where 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+        order by id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+    </select>
+    <select id="countsByUnit" resultType="java.lang.Long">
+        SELECT
+        COUNT(id)
+        FROM jsh_unit
+        WHERE 1=1
+        <if test="name != null">
+            <bind name="bindName" value="'%'+name+'%'"/>
+            and name like #{bindName}
+        </if>
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+    <update id="batchDeleteUnitByIds">
+        update jsh_unit
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+    <update id="updateRatioTwoById">
+        update jsh_unit
+        set ratio_two=null
+        where id=#{id}
+    </update>
+    <update id="updateRatioThreeById">
+        update jsh_unit
+        set ratio_three=null
+        where id=#{id}
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/UserBusinessMapper.xml b/src/main/resources/mapper_xml/UserBusinessMapper.xml
new file mode 100644
index 0000000..de3bc68
--- /dev/null
+++ b/src/main/resources/mapper_xml/UserBusinessMapper.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.UserBusinessMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.UserBusiness">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="key_id" jdbcType="VARCHAR" property="keyId" />
+    <result column="value" jdbcType="VARCHAR" property="value" />
+    <result column="btn_str" jdbcType="VARCHAR" property="btnStr" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, type, key_id, value, btn_str, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.UserBusinessExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_user_business
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_user_business
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_user_business
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.UserBusinessExample">
+    delete from jsh_user_business
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.UserBusiness">
+    insert into jsh_user_business (id, type, key_id, 
+      value, btn_str, tenant_id, 
+      delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{keyId,jdbcType=VARCHAR}, 
+      #{value,jdbcType=VARCHAR}, #{btnStr,jdbcType=VARCHAR}, #{tenantId,jdbcType=BIGINT}, 
+      #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.UserBusiness">
+    insert into jsh_user_business
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="keyId != null">
+        key_id,
+      </if>
+      <if test="value != null">
+        value,
+      </if>
+      <if test="btnStr != null">
+        btn_str,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="keyId != null">
+        #{keyId,jdbcType=VARCHAR},
+      </if>
+      <if test="value != null">
+        #{value,jdbcType=VARCHAR},
+      </if>
+      <if test="btnStr != null">
+        #{btnStr,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.UserBusinessExample" resultType="java.lang.Long">
+    select count(*) from jsh_user_business
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_user_business
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.keyId != null">
+        key_id = #{record.keyId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.value != null">
+        value = #{record.value,jdbcType=VARCHAR},
+      </if>
+      <if test="record.btnStr != null">
+        btn_str = #{record.btnStr,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_user_business
+    set id = #{record.id,jdbcType=BIGINT},
+      type = #{record.type,jdbcType=VARCHAR},
+      key_id = #{record.keyId,jdbcType=VARCHAR},
+      value = #{record.value,jdbcType=VARCHAR},
+      btn_str = #{record.btnStr,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.UserBusiness">
+    update jsh_user_business
+    <set>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="keyId != null">
+        key_id = #{keyId,jdbcType=VARCHAR},
+      </if>
+      <if test="value != null">
+        value = #{value,jdbcType=VARCHAR},
+      </if>
+      <if test="btnStr != null">
+        btn_str = #{btnStr,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.UserBusiness">
+    update jsh_user_business
+    set type = #{type,jdbcType=VARCHAR},
+      key_id = #{keyId,jdbcType=VARCHAR},
+      value = #{value,jdbcType=VARCHAR},
+      btn_str = #{btnStr,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/UserBusinessMapperEx.xml b/src/main/resources/mapper_xml/UserBusinessMapperEx.xml
new file mode 100644
index 0000000..28c40f3
--- /dev/null
+++ b/src/main/resources/mapper_xml/UserBusinessMapperEx.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.UserBusinessMapperEx">
+    <update id="batchDeleteUserBusinessByIds">
+        update jsh_user_business
+        set delete_flag='1'
+        where 1=1
+        and id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <select id="getBasicDataByKeyIdAndType" resultType="com.jsh.erp.datasource.entities.UserBusiness">
+        select * from jsh_user_business
+        where key_id=#{keyId} and type=#{type}
+        and ifnull(delete_flag,'0') !='1'
+    </select>
+
+    <update id="updateValueByTypeAndKeyId">
+        update jsh_user_business
+        set value= #{ubValue}
+        where type = #{type} and key_id = #{keyId}
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/UserMapper.xml b/src/main/resources/mapper_xml/UserMapper.xml
new file mode 100644
index 0000000..3d81582
--- /dev/null
+++ b/src/main/resources/mapper_xml/UserMapper.xml
@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.UserMapper">
+  <resultMap id="BaseResultMap" type="com.jsh.erp.datasource.entities.User">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="username" jdbcType="VARCHAR" property="username" />
+    <result column="login_name" jdbcType="VARCHAR" property="loginName" />
+    <result column="password" jdbcType="VARCHAR" property="password" />
+    <result column="leader_flag" jdbcType="VARCHAR" property="leaderFlag" />
+    <result column="position" jdbcType="VARCHAR" property="position" />
+    <result column="department" jdbcType="VARCHAR" property="department" />
+    <result column="email" jdbcType="VARCHAR" property="email" />
+    <result column="phonenum" jdbcType="VARCHAR" property="phonenum" />
+    <result column="ismanager" jdbcType="TINYINT" property="ismanager" />
+    <result column="isystem" jdbcType="TINYINT" property="isystem" />
+    <result column="status" jdbcType="TINYINT" property="status" />
+    <result column="description" jdbcType="VARCHAR" property="description" />
+    <result column="remark" jdbcType="VARCHAR" property="remark" />
+    <result column="weixin_open_id" jdbcType="VARCHAR" property="weixinOpenId" />
+    <result column="tenant_id" jdbcType="BIGINT" property="tenantId" />
+    <result column="delete_flag" jdbcType="VARCHAR" property="deleteFlag" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, username, login_name, password, leader_flag, position, department, email, phonenum, 
+    ismanager, isystem, status, description, remark, weixin_open_id, tenant_id, delete_flag
+  </sql>
+  <select id="selectByExample" parameterType="com.jsh.erp.datasource.entities.UserExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from jsh_user
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from jsh_user
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from jsh_user
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.jsh.erp.datasource.entities.UserExample">
+    delete from jsh_user
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.jsh.erp.datasource.entities.User">
+    insert into jsh_user (id, username, login_name, 
+      password, leader_flag, position, 
+      department, email, phonenum, 
+      ismanager, isystem, status, 
+      description, remark, weixin_open_id, 
+      tenant_id, delete_flag)
+    values (#{id,jdbcType=BIGINT}, #{username,jdbcType=VARCHAR}, #{loginName,jdbcType=VARCHAR}, 
+      #{password,jdbcType=VARCHAR}, #{leaderFlag,jdbcType=VARCHAR}, #{position,jdbcType=VARCHAR}, 
+      #{department,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{phonenum,jdbcType=VARCHAR}, 
+      #{ismanager,jdbcType=TINYINT}, #{isystem,jdbcType=TINYINT}, #{status,jdbcType=TINYINT}, 
+      #{description,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{weixinOpenId,jdbcType=VARCHAR}, 
+      #{tenantId,jdbcType=BIGINT}, #{deleteFlag,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.jsh.erp.datasource.entities.User">
+    insert into jsh_user
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="username != null">
+        username,
+      </if>
+      <if test="loginName != null">
+        login_name,
+      </if>
+      <if test="password != null">
+        password,
+      </if>
+      <if test="leaderFlag != null">
+        leader_flag,
+      </if>
+      <if test="position != null">
+        position,
+      </if>
+      <if test="department != null">
+        department,
+      </if>
+      <if test="email != null">
+        email,
+      </if>
+      <if test="phonenum != null">
+        phonenum,
+      </if>
+      <if test="ismanager != null">
+        ismanager,
+      </if>
+      <if test="isystem != null">
+        isystem,
+      </if>
+      <if test="status != null">
+        status,
+      </if>
+      <if test="description != null">
+        description,
+      </if>
+      <if test="remark != null">
+        remark,
+      </if>
+      <if test="weixinOpenId != null">
+        weixin_open_id,
+      </if>
+      <if test="tenantId != null">
+        tenant_id,
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="username != null">
+        #{username,jdbcType=VARCHAR},
+      </if>
+      <if test="loginName != null">
+        #{loginName,jdbcType=VARCHAR},
+      </if>
+      <if test="password != null">
+        #{password,jdbcType=VARCHAR},
+      </if>
+      <if test="leaderFlag != null">
+        #{leaderFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="position != null">
+        #{position,jdbcType=VARCHAR},
+      </if>
+      <if test="department != null">
+        #{department,jdbcType=VARCHAR},
+      </if>
+      <if test="email != null">
+        #{email,jdbcType=VARCHAR},
+      </if>
+      <if test="phonenum != null">
+        #{phonenum,jdbcType=VARCHAR},
+      </if>
+      <if test="ismanager != null">
+        #{ismanager,jdbcType=TINYINT},
+      </if>
+      <if test="isystem != null">
+        #{isystem,jdbcType=TINYINT},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=TINYINT},
+      </if>
+      <if test="description != null">
+        #{description,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="weixinOpenId != null">
+        #{weixinOpenId,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.jsh.erp.datasource.entities.UserExample" resultType="java.lang.Long">
+    select count(*) from jsh_user
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update jsh_user
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.username != null">
+        username = #{record.username,jdbcType=VARCHAR},
+      </if>
+      <if test="record.loginName != null">
+        login_name = #{record.loginName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.password != null">
+        password = #{record.password,jdbcType=VARCHAR},
+      </if>
+      <if test="record.leaderFlag != null">
+        leader_flag = #{record.leaderFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.position != null">
+        position = #{record.position,jdbcType=VARCHAR},
+      </if>
+      <if test="record.department != null">
+        department = #{record.department,jdbcType=VARCHAR},
+      </if>
+      <if test="record.email != null">
+        email = #{record.email,jdbcType=VARCHAR},
+      </if>
+      <if test="record.phonenum != null">
+        phonenum = #{record.phonenum,jdbcType=VARCHAR},
+      </if>
+      <if test="record.ismanager != null">
+        ismanager = #{record.ismanager,jdbcType=TINYINT},
+      </if>
+      <if test="record.isystem != null">
+        isystem = #{record.isystem,jdbcType=TINYINT},
+      </if>
+      <if test="record.status != null">
+        status = #{record.status,jdbcType=TINYINT},
+      </if>
+      <if test="record.description != null">
+        description = #{record.description,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remark != null">
+        remark = #{record.remark,jdbcType=VARCHAR},
+      </if>
+      <if test="record.weixinOpenId != null">
+        weixin_open_id = #{record.weixinOpenId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.tenantId != null">
+        tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="record.deleteFlag != null">
+        delete_flag = #{record.deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update jsh_user
+    set id = #{record.id,jdbcType=BIGINT},
+      username = #{record.username,jdbcType=VARCHAR},
+      login_name = #{record.loginName,jdbcType=VARCHAR},
+      password = #{record.password,jdbcType=VARCHAR},
+      leader_flag = #{record.leaderFlag,jdbcType=VARCHAR},
+      position = #{record.position,jdbcType=VARCHAR},
+      department = #{record.department,jdbcType=VARCHAR},
+      email = #{record.email,jdbcType=VARCHAR},
+      phonenum = #{record.phonenum,jdbcType=VARCHAR},
+      ismanager = #{record.ismanager,jdbcType=TINYINT},
+      isystem = #{record.isystem,jdbcType=TINYINT},
+      status = #{record.status,jdbcType=TINYINT},
+      description = #{record.description,jdbcType=VARCHAR},
+      remark = #{record.remark,jdbcType=VARCHAR},
+      weixin_open_id = #{record.weixinOpenId,jdbcType=VARCHAR},
+      tenant_id = #{record.tenantId,jdbcType=BIGINT},
+      delete_flag = #{record.deleteFlag,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jsh.erp.datasource.entities.User">
+    update jsh_user
+    <set>
+      <if test="username != null">
+        username = #{username,jdbcType=VARCHAR},
+      </if>
+      <if test="loginName != null">
+        login_name = #{loginName,jdbcType=VARCHAR},
+      </if>
+      <if test="password != null">
+        password = #{password,jdbcType=VARCHAR},
+      </if>
+      <if test="leaderFlag != null">
+        leader_flag = #{leaderFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="position != null">
+        position = #{position,jdbcType=VARCHAR},
+      </if>
+      <if test="department != null">
+        department = #{department,jdbcType=VARCHAR},
+      </if>
+      <if test="email != null">
+        email = #{email,jdbcType=VARCHAR},
+      </if>
+      <if test="phonenum != null">
+        phonenum = #{phonenum,jdbcType=VARCHAR},
+      </if>
+      <if test="ismanager != null">
+        ismanager = #{ismanager,jdbcType=TINYINT},
+      </if>
+      <if test="isystem != null">
+        isystem = #{isystem,jdbcType=TINYINT},
+      </if>
+      <if test="status != null">
+        status = #{status,jdbcType=TINYINT},
+      </if>
+      <if test="description != null">
+        description = #{description,jdbcType=VARCHAR},
+      </if>
+      <if test="remark != null">
+        remark = #{remark,jdbcType=VARCHAR},
+      </if>
+      <if test="weixinOpenId != null">
+        weixin_open_id = #{weixinOpenId,jdbcType=VARCHAR},
+      </if>
+      <if test="tenantId != null">
+        tenant_id = #{tenantId,jdbcType=BIGINT},
+      </if>
+      <if test="deleteFlag != null">
+        delete_flag = #{deleteFlag,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.jsh.erp.datasource.entities.User">
+    update jsh_user
+    set username = #{username,jdbcType=VARCHAR},
+      login_name = #{loginName,jdbcType=VARCHAR},
+      password = #{password,jdbcType=VARCHAR},
+      leader_flag = #{leaderFlag,jdbcType=VARCHAR},
+      position = #{position,jdbcType=VARCHAR},
+      department = #{department,jdbcType=VARCHAR},
+      email = #{email,jdbcType=VARCHAR},
+      phonenum = #{phonenum,jdbcType=VARCHAR},
+      ismanager = #{ismanager,jdbcType=TINYINT},
+      isystem = #{isystem,jdbcType=TINYINT},
+      status = #{status,jdbcType=TINYINT},
+      description = #{description,jdbcType=VARCHAR},
+      remark = #{remark,jdbcType=VARCHAR},
+      weixin_open_id = #{weixinOpenId,jdbcType=VARCHAR},
+      tenant_id = #{tenantId,jdbcType=BIGINT},
+      delete_flag = #{deleteFlag,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper_xml/UserMapperEx.xml b/src/main/resources/mapper_xml/UserMapperEx.xml
new file mode 100644
index 0000000..1fcc1b6
--- /dev/null
+++ b/src/main/resources/mapper_xml/UserMapperEx.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jsh.erp.datasource.mappers.UserMapperEx">
+    <resultMap extends="com.jsh.erp.datasource.mappers.UserMapper.BaseResultMap" id="ResultMapEx" type="com.jsh.erp.datasource.entities.UserEx">
+        <result column="orgaId" jdbcType="BIGINT" property="orgaId" />
+        <result column="org_abr" jdbcType="VARCHAR" property="orgAbr" />
+        <result column="user_blng_orga_dspl_seq" jdbcType="VARCHAR" property="userBlngOrgaDsplSeq" />
+        <result column="orgaUserRelId" jdbcType="BIGINT" property="orgaUserRelId" />
+        <result column="roleId" jdbcType="VARCHAR" property="roleId" />
+        <result column="roleName" jdbcType="VARCHAR" property="roleName" />
+    </resultMap>
+
+    <select id="selectByConditionUser" parameterType="com.jsh.erp.datasource.entities.UserExample" resultMap="ResultMapEx">
+        select tb.*,
+        (select r.id from jsh_user_business ub
+        left join jsh_role r on ub.value=concat("[",r.id,"]") and ifnull(r.delete_flag,'0') !='1'
+        where ub.type='UserRole' and ub.key_id=tb.id limit 0,1) roleId,
+        (select r.name from jsh_user_business ub
+        left join jsh_role r on ub.value=concat("[",r.id,"]") and ifnull(r.delete_flag,'0') !='1'
+        where ub.type='UserRole' and ub.key_id=tb.id limit 0,1) roleName
+        from (
+        select user.id, user.username, user.login_name, user.position, user.leader_flag, user.email, user.phonenum,
+        user.description, user.remark,user.isystem,org.id as orgaId,user.tenant_id,user.status,org.org_abr,
+        rel.user_blng_orga_dspl_seq,rel.id as orgaUserRelId
+        FROM jsh_user user
+        left join jsh_orga_user_rel rel on user.id=rel.user_id and ifnull(rel.delete_flag,'0') !='1'
+        left join jsh_organization org on rel.orga_id=org.id and ifnull(org.delete_flag,'0') !='1'
+        where 1=1
+        and ifnull(user.delete_flag,'0') !='1'
+        <if test="userName != null">
+            <bind name="bindUserName" value="'%'+userName+'%'"/>
+            and user.username like #{bindUserName}
+        </if>
+        <if test="loginName != null">
+            <bind name="bindLoginName" value="'%'+loginName+'%'"/>
+            and user.login_name like #{bindLoginName}
+        </if>
+        order by rel.user_blng_orga_dspl_seq,user.id desc
+        <if test="offset != null and rows != null">
+            limit #{offset},#{rows}
+        </if>
+        ) tb
+    </select>
+    <select id="countsByUser" resultType="java.lang.Long">
+        select count(user.id)
+        FROM jsh_user user
+        where 1=1
+        and ifnull(user.delete_flag,'0') !='1'
+        <if test="userName != null">
+            <bind name="bindUserName" value="'%'+userName+'%'"/>
+            and user.username like #{bindUserName}
+        </if>
+        <if test="loginName != null">
+            <bind name="bindLoginName" value="'%'+loginName+'%'"/>
+            and user.login_name like #{bindLoginName}
+        </if>
+    </select>
+    <select id="getUserListByUserNameOrLoginName" resultMap="com.jsh.erp.datasource.mappers.UserMapper.BaseResultMap">
+        select user.id, user.username, user.login_name, user.position, user.email, user.phonenum,
+        user.description, user.remark,user.isystem
+        FROM jsh_user user
+        where 1=1
+        and user.status = 0
+        and ifnull(user.delete_flag,'0') !='1'
+        <if test="userName != null and userName != ''">
+            and user.userName = #{userName}
+        </if>
+        <if test="loginName != null and loginName != ''">
+            and user.login_name = #{loginName}
+        </if>
+        order by user.id desc
+    </select>
+    <update id="batDeleteOrUpdateUser">
+        update jsh_user
+        set delete_flag = '1'
+        where id in (
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </update>
+
+    <resultMap id="BaseTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNodeEx">
+        <result column="id" property="id"/>
+        <result column="text" property="text"/>
+        <association property="attributes" javaType="com.jsh.erp.datasource.vo.NodeAttributes">
+            <id column="orgNo" property="no"></id>
+            <result column="type" property="type"></result>
+        </association>
+        <collection column="{orgId=id,orgNo=orgNo}" property="children" javaType="java.util.ArrayList"
+                    ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
+    </resultMap>
+
+    <resultMap id="NextTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNodeEx">
+        <result column="id" property="id"/>
+        <result column="text" property="text"/>
+        <result column="iconCls" property="iconCls"/>
+        <association property="attributes" javaType="com.jsh.erp.datasource.vo.NodeAttributes">
+            <id column="orgNo" property="no"></id>
+            <result column="type" property="type"></result>
+        </association>
+        <collection column="{orgId=id,orgNo=orgNo}" property="children" javaType="java.util.ArrayList"
+                    ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
+    </resultMap>
+
+    <select id="getNextNodeTree" resultMap="NextTreeResultMap">
+        select id ,	text,orgNo,sort ,iconCls,type from (
+            SELECT
+            org.id, org.org_abr as text,org.org_no as orgNo,org.sort as sort,null as iconCls,'0' as type
+            FROM jsh_organization org
+            WHERE org.org_parent_no = #{orgNo}
+            and ifnull(org.org_stcd,'0') !='5'
+            union all
+            select
+            user.id,user.username as text, null as orgNo,rel.user_blng_orga_dspl_seq as sort,'icon-user' as iconCls,'1' as type
+            from jsh_user user,jsh_orga_user_rel rel
+            where
+            1=1
+            and user.id=rel.user_id
+            and rel.orga_id=#{orgId}
+            and ifnull(rel.delete_flag,'0') !='1'
+            and user.status = 0
+            and ifnull(user.delete_flag,'0') !='1'
+          ) node
+          order by sort asc
+    </select>
+
+    <select id="getNodeTree" resultMap="BaseTreeResultMap">
+        SELECT
+         id, org_abr as text,org_no as orgNo,'0' as type
+        FROM jsh_organization
+        WHERE org_parent_no = -1
+        and ifnull(org_stcd,'0') !='5'
+        order by sort asc
+    </select>
+
+    <update id="disableUserByLimit">
+        update jsh_user set status='2'
+        where tenant_id=#{tenantId} and id!=#{tenantId}
+    </update>
+
+    <select id="getListByOrgaId" resultType="com.jsh.erp.datasource.entities.User">
+        select u.*,our.orga_id from jsh_user u
+        left join jsh_orga_user_rel our on u.id=our.user_id
+        where u.leader_flag='1' and orga_id= #{orgaId}
+        and ifnull(u.delete_flag,'0') !='1'
+        <if test="id != null">
+            and u.id != #{id}
+        </if>
+    </select>
+
+    <select id="getUserByWeixinOpenId" resultType="com.jsh.erp.datasource.entities.User">
+        select u.* from jsh_user u
+        where u.weixin_open_id = #{weixinOpenId}
+        and u.status=0
+        and ifnull(u.delete_flag,'0') !='1'
+    </select>
+
+    <update id="updateUserWithWeixinOpenId">
+        update jsh_user u set u.weixin_open_id = #{weixinOpenId}
+        where u.login_name = #{loginName} and u.password = #{password}
+        and u.status=0
+        and ifnull(u.delete_flag,'0') !='1'
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/test/java/Test.java b/src/test/java/Test.java
new file mode 100644
index 0000000..b5ba8e4
--- /dev/null
+++ b/src/test/java/Test.java
@@ -0,0 +1,12 @@
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class Test {
+
+    public static void main(String args[]){
+        Date date = new Date();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String dateString = formatter.format(date);
+        System.out.println(dateString);
+    }
+}
diff --git a/src/test/resources/generatorConfig.xml b/src/test/resources/generatorConfig.xml
new file mode 100644
index 0000000..830b6de
--- /dev/null
+++ b/src/test/resources/generatorConfig.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE generatorConfiguration
+        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
+        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
+
+<generatorConfiguration>
+    <classPathEntry
+            location="E:\maven\maven-repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/>
+
+    <context id="DB2Tables" targetRuntime="MyBatis3" defaultModelType="flat">
+        <commentGenerator>
+            <property name="suppressAllComments" value="true"/>
+            <property name="suppressDate" value="true"/>
+        </commentGenerator>
+
+        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
+                        connectionURL="jdbc:mysql://localhost:3306/jsh_erp?generateSimpleParameterMetadata=true"
+                        userId="root" password="123456">
+        </jdbcConnection>
+
+        <javaTypeResolver>
+            <property name="forceBigDecimals" value="false"/>
+        </javaTypeResolver>
+
+        <!-- generate Model -->
+        <javaModelGenerator targetPackage="com.jsh.erp.datasource.entities"
+                            targetProject="src\main\java">
+            <property name="enableSubPackages" value="false"/>
+            <property name="trimStrings" value="true"/>
+        </javaModelGenerator>
+
+        <!-- generate xml -->
+        <sqlMapGenerator targetPackage="mapper_xml" targetProject="src\main\resources">
+            <property name="enableSubPackages" value="false"/>
+        </sqlMapGenerator>
+
+        <!-- generate Mapper -->
+        <javaClientGenerator type="XMLMAPPER"
+                             targetPackage="com.jsh.erp.datasource.mappers"
+                             targetProject="src\main\java">
+            <property name="enableSubPackages" value="false"/>
+            <property name="exampleMethodVisibility" value="public"/>
+        </javaClientGenerator>
+        <!-- <table tableName="jsh_account" domainObjectName="Account"></table>
+        <table tableName="jsh_account_head" domainObjectName="AccountHead"></table>
+        <table tableName="jsh_account_item" domainObjectName="AccountItem"></table>
+        <table tableName="jsh_depot" domainObjectName="Depot"></table>
+        <table tableName="jsh_depot_head" domainObjectName="DepotHead"></table>
+        <table tableName="jsh_depot_item" domainObjectName="DepotItem"></table>
+        <table tableName="jsh_function" domainObjectName="Function"></table>
+        <table tableName="jsh_in_out_item" domainObjectName="InOutItem"></table>
+        <table tableName="jsh_log" domainObjectName="Log"></table>
+        <table tableName="jsh_material" domainObjectName="Material"></table>
+        <table tableName="jsh_material_attribute" domainObjectName="MaterialAttribute"></table>
+        <table tableName="jsh_material_extend" domainObjectName="MaterialExtend"></table>
+        <table tableName="jsh_material_current_stock" domainObjectName="MaterialCurrentStock"></table>
+        <table tableName="jsh_material_initial_stock" domainObjectName="MaterialInitialStock"></table>
+        <table tableName="jsh_material_category" domainObjectName="MaterialCategory"></table>
+        <table tableName="jsh_material_property" domainObjectName="MaterialProperty"></table>
+        <table tableName="jsh_person" domainObjectName="Person"></table>
+        <table tableName="jsh_role" domainObjectName="Role"></table>
+        <table tableName="jsh_supplier" domainObjectName="Supplier"></table>
+        <table tableName="jsh_system_config" domainObjectName="SystemConfig"></table>
+        <table tableName="jsh_unit" domainObjectName="Unit"></table>
+        <table tableName="jsh_user" domainObjectName="User"></table>
+        <table tableName="jsh_user_business" domainObjectName="UserBusiness"></table>
+        <table tableName="jsh_serial_number" domainObjectName="SerialNumber"></table>
+        <table tableName="jsh_organization" domainObjectName="Organization"></table>
+        <table tableName="jsh_orga_user_rel" domainObjectName="OrgaUserRel"></table>
+        <table tableName="jsh_tenant" domainObjectName="Tenant"></table>
+        <table tableName="jsh_platform_config" domainObjectName="PlatformConfig"></table>
+        <table tableName="jsh_msg" domainObjectName="Msg"></table> -->
+    </context>
+</generatorConfiguration>

--
Gitblit v1.9.3